エコパワーメータ: Modbus(RTU)のCRC-16の計算で使用するデータは8ビット単位か16ビット単位か?
エコパワーメータ: Modbus(RTU)のCRC-16の計算で使用するデータは8ビット単位か16ビット単位か?
番1に対してデータ項目0036Hからデータを読取る場合を例に考えると
送信メッセージは、スレーブアドレス01Hに続いて機能コード03H データ項目0036H データ数0001Hと続きます。
CRC-16の計算は、
① CRC-16 のデータ(X とする)を初期化(FFFFH)します。
② 一つ目のデータとX の排他的論理和(XOR)を取り、X に代入します。
③ X を右に1 ビットシフトし、X に代入します。
④ シフト結果でキャリーが出れば、③の結果X と固定値(A001H)でXOR を取り、X に代入します。キャリーが出なければ⑤へ進みます。
⑤ 8 回シフトするまで、③と④を繰り返します。
⑥ 次のデータとX のXOR を取り、X に代入します。
⑦ ③~⑤を繰り返します。
⑧ 最後のデータまで③~⑤を繰り返します。
⑨ X をCRC-16 として、メッセージに下位上位の順にデータの後にセットします。
(KW1M-Hユーザーズマニュアルより)
このときのデータとは、送信メッセージ先頭から8ビット毎に切り取ったものになります。
今回の例ですとまず01H、次に03H、00H、36H、00H、01Hをデータとして上記①~⑨を計算します。
送信メッセージは、スレーブアドレス01Hに続いて機能コード03H データ項目0036H データ数0001Hと続きます。
CRC-16の計算は、
① CRC-16 のデータ(X とする)を初期化(FFFFH)します。
② 一つ目のデータとX の排他的論理和(XOR)を取り、X に代入します。
③ X を右に1 ビットシフトし、X に代入します。
④ シフト結果でキャリーが出れば、③の結果X と固定値(A001H)でXOR を取り、X に代入します。キャリーが出なければ⑤へ進みます。
⑤ 8 回シフトするまで、③と④を繰り返します。
⑥ 次のデータとX のXOR を取り、X に代入します。
⑦ ③~⑤を繰り返します。
⑧ 最後のデータまで③~⑤を繰り返します。
⑨ X をCRC-16 として、メッセージに下位上位の順にデータの後にセットします。
(KW1M-Hユーザーズマニュアルより)
このときのデータとは、送信メッセージ先頭から8ビット毎に切り取ったものになります。
今回の例ですとまず01H、次に03H、00H、36H、00H、01Hをデータとして上記①~⑨を計算します。