第2回 モトローラ製「XP480-JP」のプログラミングを学ぶ


西村 泰洋
富士通株式会社
ビジネスインキュベーション本部
開発部
担当課長
2007年9月4日

 

 メインモジュールのソースコードを読む

 メインモジュールのソースコードは以下のとおりです。

// (1)リーダ/ライタをオープン
printf("Open Reader...\n");

//サンプル用クラスのインスタンスを生成
XR400APIReader reader;
reader.hReader = OpenReader(TEXT("192.168.127.254"), 3000);

if(reader.hReader){
// (2)読み取るタグのタイプをGen2に設定
    printf("Set Read Tag Type Gens...\n");

    //RFID_TAG_TYPE_EPC_CLASSG2にバイトを別途定義済み
    SetTagType(reader.hReader, RFID_TAG_TYPE_EPC_CLASSG2, true);
}

// (3)タグの読み取りイベントを設定
printf("Set Tagevent...\n");
reader.hReadTagEvent = SetReadEvent(reader.hReader);

// (4)Autonomousモードでの読み取り開始
printf("Start Autonomous Read...\n");
for(int i=0; i < 10; i++){
    printf("\nRead:%d",i);


    //タグリストを初期化
    memset(&reader.tagList, 0, sizeof(reader.tagList));
    TAG_LIST_EX1_INIT(reader.tagList, 0);


    //Autonomousモードでの読み取り
    AutonomousRead(reader.hReader, &reader.tagList);

    Sleep(5000);
}


// (5)リーダ/ライタをクローズ
CloseReader(reader.hReader);


return 0;
メインモジュールのソースコード

 (1)の「リーダ/ライタをオープン」で、リーダ/ライタのIPアドレスを「192.168.127.254」、ポート番号を「3000」として通信を開始しています。

 (4)で読み取り処理を指示しています。まず、「reader.tagList」を初期化して、AutonomousReadを10回実行させます。そして、5000ミリ秒待ってからリーダ/ライタのキャッシュに保存されているデータを「reader.tagList」に持ってくるという処理をしています。

 OpenReaderのソースコードを読む

 OpenReaderのソースコードは以下のとおりです。

// リーダ/ライタをオープン
HANDLE OpenReader(TCHAR tszNewIPAddress[32], WORD wPort){
    HANDLE hReader = 0;

    // リーダ/ライタ用APIをオープン
    // RFID_SUCCESSは別途定義済み
    if(RFID_Open(&hReader) == RFID_SUCCESS){

        // リーダ/ライタのIPアドレス、ポート番号を指定
        DWORD dwItems = 1;
        dwItems = (DWORD)wcslen(tszNewIPAddress) + 1;
        if(ConfigureReader(hReader, tszNewIPAddress, wPort)){

            // リーダ/ライタオープン
            if(RFID_OpenReader(hReader, 0) == RFID_SUCCESS){
                printf("Connection Open\n");
            }
            else
                printf("RFID_OpenReader Error\n");
        }
        else
            printf("ConfigureTCPIP Error\n");
    }
    else
        printf("RFID_Open Error\n");

    return hReader;
}
OpenReaderのソースコード

 APIをオープンしてからホストコンピュータとリーダ/ライタの通信をオープンしています。

 通信にエラーが生じる場合、APIのオープンエラーなのか、設定によるエラーなのか、物理的なエラーなのかを表示させます。

 AutonomousReadのソースコードを読む

 AutonomousReadのソースコードは以下のとおりです。

//Autonomousモードでのタグ読み取り
void AutonomousRead(HANDLE hReader, TAG_LIST_EX *pTagList) {
//構造体TAG_LIST_EXは別途定義済み
    printf("\nAutonomous read from Reader\n");

    DWORD dwStatus = RFID_SUCCESS;

    //読み取りモードをAutonomousに設定
    WORD dwParamValue = RFID_READCAP_READMODE_AUTONOMOUS;
    //RFID_READCAP_READMODE_AUTONOMOUSにバイト列を別途定義済み
    DWORD dwNumItems = 1;
    RFID_SetCapCurrValue(hReader, RFID_READCAP_READMODE, &dwNumItems, sizeof(dwParamValue), &dwParamValue);

    //タグの読み取り
    dwStatus = RFID_ReadTagInventoryEX(hReader, pTagList, true);

    if(dwStatus == RFID_SUCCESS){
        //タグリストの表示
        PrintTagList(hReader, pTagList);
    }
    else{

        printf("%S\n", RFID_GetCommandStatusText(hReader, dwStatus));
    }
}
AutonomousReadのソースコード

 読み取りモードがAutonomousに設定されます。

 ここで「RFID_ReadTagInventoryEX」を指定することで、リーダ/ライタのキャッシュにたまったRFIDタグのデータを「pTagList」に取得することができます。しかしながら、それだけでは「pTagList」の内容が見えないので、「PrintTagList」関数ではき出す処理が必要になっています。

 PrintTagListのソースコードを読む

 参考までに、タグリスト表示の一例として「PrintTagList」のソースコードも見ていきましょう。

// タグリストの表示
void PrintTagList(HANDLE hReader, TAG_LIST_EX *pTagList){
    DWORD dwI = 0;
    char *szProtocol;
    char szTagID[32];

    printf("\n");
    TYPE_TAG_EX tag;

    for(dwI = 0; dwI < pTagList->dwTotalTags; dwI++){

        // タグリスト内のタグを抽出
        tag = pTagList->Tags[dwI];

        // convert tag id to ascii text string
        // タグのIDを16進数に変換
        ConvertHexString(tag.tagID, tag.dataLength, szTagID);

        // 読み取ったタグのタイプを取得
        if(tag.dwType == RFID_TAG_TYPE_EPC_CLASSG2){
            szProtocol = "G2";
        }
        else{
            szProtocol = "??";
        }
        // 表示
        printf("Tag %3.3u Reads: %3.3u Type: %s Ant: %2.2u:%s\n", dwI+1, pTagList->Tags[dwI].readCount, szProtocol, pTagList->Tags[dwI].antennaNum, szTagID);
        }
}
AutonomousReadのソースコード

 「pTagList」に取得される値の形式はバイト列です。そのため、RFIDタグのIDをバイト列から16進数へと変換するサブルーチンが必要になります。

 プログラムの前に基礎知識の習得が必須

 以上のソースコードからも分かるように、RFIDシステムのプログラミングに取り掛かるためには、RFIDシステムの基本を押さえておくことがいかに重要であるかがご理解いただけたのではないでしょうか。

 それは、各メーカーの機器とAPIの特徴を理解して、プログラミングに臨むということにほかなりません。「基本?」と思われた方はRFIDシステム導入バイブルの第3回をお読みください。

 今回の重要な部分を復習しますと、

  1. ホストコンピュータとリーダ/ライタの接続開始
    ⇒APIのオープンが不可欠
  2. 読み取りをどのように設定するか(読み取りの方法をどのように考えるか)
    ⇒読み取り処理の設定方法と読み取りしたデータの格納場所を把握する

ということになります。現実のRFIDシステム構築における詳細設計では、オープンのタイミングや読み取りの方法を業務運用に照らして最適な形にする必要があります。

 次回以降、さまざまなメーカーのプログラミングを取り上げていきますが、共通点もあれば特有のコマンドもあり、実に興味深いものです。連載が進めば、メーカーごとにプログラミング方法が異なっていてもソースコードが意味するものに大きな違いはないということがご理解いただけるのではないでしょうか。

2/2
 

Index
モトローラ製「XP480-JP」のプログラミングを学ぶ
  Page1
XP480-JPのプログラミングのクセをおさらい
サンプルプログラムのフローチャート
サンプルプログラムの実行結果
Page2
メインモジュールのソースコードを読む
OpenReaderのソースコードを読む
AutonomousReadのソースコードを読む
PrintTagListのソースコードを読む
プログラムの前に基礎知識の習得が必須

Profile
西村 泰洋(にしむら やすひろ)

富士通株式会社
ビジネスインキュベーション本部
開発部
担当課長

物流システムコンサルタント、新ビジネス企画、マーケティングを経て2004年度よりRFIDビジネスに従事。

RFIDシステム導入のコンサルティングサービスを立ち上げ、自動車製造業、流通業、電力会社など数々のプロジェクトを担当する。

著書に「RFID+ICタグシステム導入構築標準講座(翔泳社)」がある。

RFIDシステムプログラミングバイブル 連載インデックス


RFID+IC フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Master of IP Network 記事ランキング

本日 月間
ソリューションFLASH