誤り検出の必要性
工場内でIoTを実現するためには、色々なデバイスと通信する必要がありますが、
無線、有線にかかわらずノイズやコリジョンで送信側と受信側では異なったデータ認識になることがあります。
データの欠測ではすぐにおかしいと気づきますが、数メガバイトのデータからビットエラーを気づくことは難し
くのまま採用し保存してしまいます。
ビットのエラーを見つける方法
◆パリティチェック
データを一定のビット長さに区切り、区切られたビットの「1」の個数を数えて、その数が偶数か奇数か判断
できるビットを区切られた最後に追加して送信します。
奇数か偶数の判断だけだので、1ビット以上の誤りは検出できない可能性があり、この方法だけだと信用性は
高くありません。
シリアル通信やメモリの読み書きに使われています。
◆サムチェック(チェックサム)
データのバイト単位を数字にして、その数字をすべて足していき、データの最後にチェック用として合計値を
追加して送ります。
合計値は最下位のバイトだけにして1バイトや2バイトにして追加します。
処理が単純で簡単なエラーチェックに使用されているが、足し算なのでバイト単位で順番が入れ替わっていると
検出できない。
*MD5やSHA1ハッシュ値なども、チェックサムと扱われることがあります。
◆CRC(Cyclic Redundancy Code)
データを定数(生成多項式)で割り算して、その乗数を検査用の数値として用います。
パリティや単純な加算によるチェックサムよりも検出精度が高く、Ethernetや圧縮データの誤り検知に使われていて、
パラメータにより計算方法が異なります。
●ビットの幅
多項式の次数
・CRC16 17ビットの定数を用いて16ビットの数値を求める。
・CRC32 33ビットの定数を用いて32ビットの数値を求める。
●生成多項式
CRC16の場合、下記の種類がよく使用されています。
カッコ内の左は標準、右は右送りの場合。
・CRC-16-IBM x16+x15+x2+1(0x8005,0xA001)
・CRC-16-ANSI x16+x15+x5+1(0x8021,0x8401)
・CRC-16-CCITT x16+x12+x5+1(0x1021,0x8408)
・CRC-16-XMODEM x16+x15+x10+x3(0x8408,0x1021)
●初期値、出力XOR
割る前の初期値や出力(余り)した値とのXOR値を設定します。
CRC16の一般的な場合、0xFFFF(ビット反転と同じ)か0x0000(XORしないのと同じ)が入ります。
●比較方向
定数で割る時に、割られる数字を左右どちらかにビットをシフトします。
PLCのシリアル通信例
パリティ、サムチェックはPLCのシリアルポートのパラメータで設定できるので、特に意識しないで大丈夫ですが
CRCの通信仕様を持ったデバイスと通信するときは、計算が必要になります。