MODBUSデータの解釈
通信が成功しても読み取り値が誤るのはなぜか?
通信の成功はレジスタの内容が届いたことを示しますが、アプリケーションがそれをどう解釈すべきかまで証明するものではありません。32ビットの値には、ワード単位の正しい配列、データ型、スケーリング、単位が必要です。また、更新タイミングの整合性も必要です。まず機器のレジスタマップを確認し、生の応答を保存してください。これらは一般的な概念であり、特定の計測器の設定や、アトミックなスナップショットを保証するものではありません。
バイト
標準的な16ビットレジスタは、順序の定まった2バイトとして伝送されます。
ワード
機器のマップと正しいデータ型に従い、ワード単位で値を再構成します。
時点
両方のワードが、整合性のある同一の更新に属するか確認します。
アドレス表記、レジスタ数、型、スケール、単位を確認します。
許可された読み取り要求を1件と、それに対応する応答を保存します。
更新動作と、ゲートウェイのキャッシュに付与されたタイムスタンプを確認します。
選定・検証チェックリスト — 展開
| 確認項目 | 確認する内容 | 検証方法 |
|---|---|---|
| エンコーディング | バイト順とワード単位の順序 | 生のバイト列を公式マップと比較する |
| 意味 | データ型、スケール、単位 | 既知の値を複数確認する |
| 鮮度 | 更新の整合性とキャッシュの経過時間 | 実装とタイムスタンプの根拠を確認する |
計測器には25と表示されているのに、コンピューターには不自然な小数値が表示され、通信ログでは成功と報告されることがあります。ケーブルや光ファイバーに障害があるとは限りません。データは損なわれずに届いた後、誤って解釈された可能性があります。Modbusのワード順を理解するために、数式をページいっぱいに並べる必要はありません。レジスタに何が格納され、メッセージでどう運ばれ、ソフトウェアがどう値を再構成するのかをたどれば、伝送の成功と読み取り値の正しさを区別できます。

番号付きのデータ区画から考える
Modbusは、産業用機器のデータを交換するための規則を定めています。保持レジスタや入力レジスタを読み取る際は、機器のデータ領域を、番号付きの区画が一列に並んだものとして考えてください。各レジスタは16ビット、つまり2バイトを保持し、各バイトは8ビットで構成されます。これらは論理的なデータ単位であり、計測器の内部に個別のチップが物理的に一列に並んでいるという意味ではありません。
番号はソフトウェアに参照先を示しますが、そこに何が格納されているかを完全に説明するものではありません。同じ2バイトでも、符号なし整数を表す場合も、複数の状態フラグを表す場合もあります。機器のレジスタマップは、そのデータが温度、圧力、エネルギー、あるいは別の何を意味するかを説明します。マップは梱包明細書のように扱ってください。アドレス、データ型、単位、スケーリング、有効性の条件は、ひとまとまりです。アドレスだけをコピーしても不十分です。
アドレス表記も確認してください。マニュアルでは40001のような保持レジスタの参照番号を使用していても、メッセージでは開始オフセットを使用する場合があります。ソフトウェアによっては、この変換をユーザーに代わって行います。同じ資料内の要求例と比較し、インターフェースが参照番号とオフセットのどちらを要求するかを確認してください。これにより、読み取り位置全体が1区画ずれることを防げます。アドレスの誤りを補おうとしてワードの入れ替えを繰り返すと、診断が難しくなるだけです。
レジスタから先に送られるのはどちらのバイトか?
例のレジスタ値0x1234は、バイト12と34に分けられます。16進表記は、生データを簡潔に記録する方法にすぎず、現場で高度な計算が必要ということではありません。標準のModbusレジスタエンコーディングでは、上位バイト12を下位バイト34より先に配置します。受信側ソフトウェアは、この順序に従って同じ16ビットの内容を復元します。
これはメッセージ内のバイト順を説明したものであり、1バイト内の個々のシリアルビットの順序と混同してはいけません。コンピューターのメモリ配置も別の問題です。プロセッサー固有の格納方式を理由に、アプリケーションがプロトコルのメッセージエンコーディングを変更してよいわけではありません。キャプチャにはメッセージのバイト列が表示されますが、デバッガーには変換済みのメモリ値が表示されている場合があります。比較する前に、どの時点のデータを観測しているかを特定してください。
2つのレジスタではワード順が問題になる
32ビットの値は、1つの16ビットレジスタには収まらず、通常は隣接する2つのレジスタを使用します。各レジスタ内のバイト順に加え、別の疑問が生じます。先のレジスタに格納されるのは、値全体の上位16ビットでしょうか、それとも下位16ビットでしょうか。ここで扱うワード順とは、このことです。機器や設定によって異なる場合があるため、Modbusに対応しているというだけでは、共通の配列が定まるわけではありません。
例えば、IEEE 754単精度浮動小数点形式の25.0は、4バイトの41 C8 00 00で表されます。説明用のレジスタマップの一例では、レジスタNに41C8を、N+1に0000を配置します。別の例では、2つのワードを逆に配置します。それぞれのマップに従って読み取り、再構成すれば、どちらも25.0になります。2番目のマップに1番目の解釈を適用すると、通信が成功していても、まったく誤った値になる可能性があります。これらは学習用の例であり、実際の計測器のアドレスや設定ではありません。

ワードの入れ替えと、ワード内のバイトの入れ替えは異なる
上下のページを持つ2冊の本で、4つのデータバイトを表すと考えてください。本の位置を交換する操作は、2つの16ビットワードの入れ替えに相当します。各本の中でページを交換する操作は、ワード内のバイトの入れ替えに相当します。両者は異なる単位の境界に作用します。ソフトウェア上のビッグエンディアン、リトルエンディアン、スワップといった名称は、異なる階層を指す場合があるため、メニュー名だけでは変換内容を特定できません。
4つの生バイトを受信順に記録し、その横にソフトウェアが再構成に用いる順序を書き出してください。内容を明確に特定した解釈設定を一度に1つずつ変更し、公式のレジスタマップと照合します。すべてのポイントに同じ入れ替えを無条件で適用したり、もっともらしい数値が1つ得られたことをマップ全体が正しい証拠としたりしないでください。ゼロに近い値では順序の誤りが隠れることがあるため、既知の異なる値を複数確認してください。
Modbus RTUフレームの末尾にあるCRCは、伝送された内容が変化していないかを確認するための誤り検出符号です。機器が意図的に下位ワードを先に返す場合でも、そのCRCは有効になり得ます。その後、ソフトウェアが上位ワードを先と解釈しても、CRCがその解釈の誤りを報告することはありません。別の有効なアドレスを読み取った場合も、検査を通過することがあります。何が届いたかと、それをどう解釈したかについて、別々に根拠を残してください。
同じバイト列でも異なる解釈が必要になる
順序が正しいことは、要件の1つにすぎません。32ビット整数と32ビット浮動小数点値では、解釈方法が異なります。浮動小数点形式は小数を表現できますが、すべての4バイトデータを浮動小数点数としてデコードすべきという意味ではありません。符号付き整数は負の値を扱えますが、符号なし整数は値の範囲の解釈が異なります。画面上の値がもっともらしいかどうかで推測せず、機器の資料に基づいて選択してください。
スケーリングと単位も、解釈の一連の処理に含まれます。レジスタマップに、生の整数253は摂氏25.3度を意味すると明記されている場合、ソフトウェアは摂氏253度と表示するのではなく、その規則を適用すべきです。これは、前述の浮動小数点値25.0とは別の例です。無効値の符号化、オフラインを示す値、予約ビットも確認してください。利用不能を示す特別なコードを通常の測定値としてグラフ化すると、実際には存在しないプロセスの異常変動が、もっともらしく見えてしまうことがあります。

順序が正しくてもサンプリング時点の整合性が必要
2つのレジスタを別々の要求で読み取ると、読み取りの間に機器が更新される可能性があります。説明用に、32ビットの符号なしカウンターが0000 FFFFから0001 0000へ変化する場合を考えてください。古い上位ワード0000を読み取り、その後に新しい下位ワード0000を読み取ると、0000 0000が得られます。この結果は、完全な旧値でも完全な新値でもありません。問題はサンプリングの整合性です。
連続する2つのレジスタを1回の要求で読み取ると、通常は別々の要求によって生じる時間差を小さくできますが、すべての機器がアトミックなスナップショットを提供する証拠にはなりません。実装資料で、ラッチ、更新動作、整合性のある更新を識別するシーケンス番号やタイムスタンプを確認してください。ゲートウェイがデータをキャッシュする場合は、キャッシュの更新時刻も記録します。新たに返されたメッセージに、新たに測定された値が含まれるとは限らず、ポーリングを高速化しても整合性を確保する仕組みの代わりにはなりません。
通信経路に沿って役割を切り分ける
FCTELEのウェブサイトには、Modbusシリアル通信を光ファイバー経由でポイントツーポイント伝送するための、産業用DINレール対応FCP-D8G Modbus光モデムが掲載されています。ここから、有用な役割分担が分かります。光リンクは通信データを伝送し、計測器のレジスタマップはその意味を定義します。Modbus光モデムを使用しても、すべての計測器の浮動小数点ワード順の自動認識、単位変換、同期した測定スナップショットが実現することにはなりません。実際の機能は、該当する製品バージョンの資料で確認してください。
検証は、1台の機器と、読み取りが許可された1つの読み取り専用ポイントから始めてください。同じトランザクションの要求と応答を保存し、対象、ファンクションコード、開始アドレスの表記規則、レジスタ数を確認してから、生のレジスタ値、ワード順、データ型、スケーリング、単位、更新時刻を確認します。完全性検査の成功は1つの段階にすぎず、業務上の解釈が正しい証拠ではありません。他のポイントへ作業を広げる前に、この読み取りの全過程を説明し、文書化してください。その記録は、計測器やソフトウェアパッケージが変更された際の体系的な確認に役立ちます。
ローカルツールでは正しく読めるポイントが、光リンク経由では誤って読まれる場合、同じ機器を同じ設定で使用した際の生の応答を比較し、その後にチャネル選択、シリアル設定、ログを調べてください。生のバイト列が同一なのに表示値が異なる場合は、デコーダー設定が原因として考えられます。バイト列が異なる場合やトランザクションが一致しない場合は、通信経路に沿ってさらに調査する必要があります。この順序なら、実際の伝送障害をワード順の問題として片付けることなく、不要なハードウェア交換を減らせます。
参考資料と適用範囲
Modbus Organization:レジスタとデータ形式; アプリケーションプロトコル V1.1b3、第4.2節:バイトエンコーディング; Schneider Electric:レジスタマッピングとワード順の例; Schneider Electric:ワードを入れ替えた浮動小数点値の読み取り; FCTELE FCP-D8G Modbus光モデム情報(中国語)。第三者の設定は、FCTELE製品の機能を裏付けるものではありません。図と例は独自に作成した説明であり、実測結果や配線手順ではありません。
以下の中国語技術記事から翻訳: 中国語の原文記事を読む.
よくある質問
Modbusの通信が成功しても、誤った値が表示されるのはなぜか?
伝送と解釈は別のものです。対象、アドレス表記規則、レジスタ数、ワード順、データ型、スケーリング、単位、更新時刻を確認してください。CRCが有効でも、業務上の解釈が正しい証拠にはなりません。
2つのレジスタの入れ替えと、バイトの入れ替えは同じか?
いいえ。一方は16ビットのワード全体の位置を変更し、もう一方はワード内のバイト位置を変更する場合があります。メニューの名称だけで判断せず、機器のマップと実際の再構成方法を確認してください。
1回の要求で2つのレジスタを読み取れば、同一のサンプリング時点が保証されるか?
いいえ。ブロック読み取りは、別々の要求によって生じる時間差を小さくできますが、アトミックなスナップショット、ラッチ、更新動作は実装によって異なります。ゲートウェイにキャッシュされたデータも、更新時刻の確認が必要です。


