
ModbusRTUで開発中の製品(基板)にコマンド送受信
Modbusは通信プロトコルの一つです。
Modbus RTU(シリアル通信用)は、必ず16ビットのCRC(Cyclic Redundancy Check)を
メッセージの最後に付加し、エラー検出のために必須です。
一方、Modbus TCP(Ethernet/TCP/IP上)の場合は、CRCは存在しません。
理由として、TCP/IP自体がすでに強力なエラー検出・訂正機構を持っている
(TCPのチェックサム + IPヘッダチェックサム + EthernetのFCS(CRC-32))
そのためアプリケーション層(Modbus)で改めてCRCを付ける必要がありません。
Modbus TCPのフレームはMBAPヘッダ(7バイト)+PDUで構成され、
RTUのようなアドレス+CRCの部分が削除されています。
※稀に「Modbus RTU over TCP」という非標準的な実装
(ゲートウェイなどでRTUフレームをそのままTCPでカプセル化するもの)
ではCRCが残っている場合もありますが、
これは純粋なModbus TCPではなく別物です。
基本パラメータ(公式仕様)
多項式 (Polynomial): x16 + x15 + x2 + 1
→ 通常表現:0x8005(正方向)
→ Modbusでは反射(reflected / reversed)形式を使用 → 0xA001
初期値 (Init): 0xFFFF
入力反転 (RefIn): True(各バイトをビット反転してから処理)
出力反転 (RefOut): True(最終結果をビット反転)
最終XOR値 (XorOut): 0x0000(何もしない)
バイト順: 計算結果の低バイト先(LSB first)でメッセージの最後に付加
計算手順(ビットごとの基本アルゴリズム)
Modbus公式仕様に基づく最も一般的なビットシフト方式です。
多くの実装でこの形が使われています。
16ビットCRCレジスタを0xFFFFで初期化
メッセージの各バイト(アドレスからデータまで、CRC自体は含めない)を順番に処理:
現在のバイトをCRCレジスタの下位8ビットとXORする
以下のループを8回繰り返す(1バイト=8ビット分):
CRCレジスタの最下位ビット(LSB)をチェック
LSBが1なら:右シフト(>> 1)した後、0xA001とXOR
LSBが0なら:単に右シフト(>> 1)
すべてのバイトを処理し終えたら、得られた16ビットCRCの
高バイトと低バイトを交換(バイトスワップ)
結果を低バイト → 高バイトの順でメッセージの最後に付加
開発中の製品イメージ画面でテストを行います
システム構成例(空調機省エネシステム+温度計測システム)
ソフトウェアダウンロード
2026.03.05ModbusTESTERセットアップ
動作条件:.NETフレームワーク4.0動作するPC(WindowsXP以上)
画面は、横1024×縦768ドット以上
バージョンアップについて:
1.弊社はお客様に予告なしに改良の為に本ソフトウェアの変更を行うことがあります。
ご要望および不具合報告は受け付けておりますが
(info@eco-bems.com)
本ソフトのバージョンアップタイミングは不定期です、予めご了承ください。
2.弊社は本ソフトウェアを改良した新しいバージョンのソフトウェア(以下「新バージョン」という)を
お客様に対して有償または無償で提供することができます。
免責事項:
弊社は、本ソフトウェアの使用、または使用できないことにより生じた損害に関していかなる責任も負わないものとします。