2010年01月22日

CRCの計算

お客さん指定でヘルツ電子の生産管理表示装置にPLCで数字を表示することに。

無線機をつかうなら特に問題は無いのだろうけども、21DシリーズをRS− 458で接続。ちょっと問題が。

データの最後にCRC-16-CCITTを計算して付けないといけない。なくても良いが、 2回同じデータを受信すると正しいデータと認識はしてくれるのだが、1200bpsと遅いのでタイミングが遅れる。 気になるか気にならないかは分からないが、現場で気になると嫌なのでCRCを計算することにする。

CRCそのものがよく分からないがググると解説と計算方法はある。多項式は「x16 + x12 + x5 + 1」だよlとマニュアルに指定してあるのでそれを用いる計算方法を探す。 「プログラミングのメモ帳」 さんに「CRC16テーブルで計算(CRC-CCITT)」 を発見。テーブルは初期スキャンでデータレジスタに展開しておいて、

// メモリのCRC16コードを計算
extern unsigned short getMemCRC16( unsigned short crc16, unsigned const char buff[], size_t size )
{
while ( size != 0 ){
    crc16 = CRC16Table[ (crc16 >> (16 - CHAR_BIT)) ^ *buff ] ^ (crc16 << CHAR_BIT);
    buff++;
    size--;
}
return crc16;
}

を参考にラダーを作成。作成したラダーで計算したものと、 Cで計算したものを比較すると同じになったので良しとする。

っで、実際にRS−458で通信すると表示されない。でもCRCを無視する設定にすると表示される。 どうもCRCがおかしい模様。そこでCRCの初期値には今設定している「FFFFH」の場合の他に「0000H」 とかの場合があることを思い出したので、「0000H」でやってみるとうまく表示。

っと言うことでヘルツ電子21DシリーズをRS− 458で接続して、CRCを計算するときは初期値を「0000H」にして指定のデータの範囲を計算し、 それぞれの桁を50HとORをとればよろしいと言うことになりました。

posted by 金銀堂 at 15:01| 兵庫 ☁| Comment(0) | TrackBack(0) | 電気、電機、電器 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック