Modbusは通信プロトコルであるため、デバイス間でコマンドを受信して識別するための通信フォーマットが必要です。
本稿ではModbusプロトコルのRTUフレームとASCIIフレームに焦点を当てる。
シリアルリンク上のModbusフレームのフォーマットは以下のとおりです。

上の図の形式では、
(1)アドレス領域:子ノードのアドレスを参照します。正当な子ノードアドレスは0 247です。&各子デバイスには、1 ~ 247の范囲のアドレスが付与されます。マスターノードは、子ノードのアドレスをメッセージのアドレスフィールドに置くことによって子ノードにアドレスを指定します。子が応答を返すと、応答メッセージのアドレスフィールドに自分のアドレスを設定し、どの子が応答しているかをマスターに知らせます。
2)機能コード:サーバーが実行するアクションを示します。
3)データ領域:関数コードの後には、リクエストとレスポンスのパラメータを含むデータがあります。
(4)エラーの検出:メッセージ内容に対して“冗長検査”を実行した計算結果である.異なる伝送モードRTUまたはASCIIに応じて、2つの異なる計算方法が使用される。
上記のModbusのフレームフォーマットは、データパッケージングのための規定されたプロトコルです。
Modbusには、RTUモードとASCIIモードの2つのシリアル伝送モードがあります。メッセージフィールドの内容をライン上でシリアルに転送することを定義します。メッセージとしての情報のパッケージングとデコード方法を決定します。
すべてのデバイスはRTUモードを実装する必要があり、ASCIIモードはオプションです。
1. Modbus RTUフレームモード
RTUフレームとは何ですか?簡単に言えば、メッセージ内の各バイトは16進数で表現されます。
RTUフレーム内の各バイトデータのフォーマットは以下のように定義される。
各バイトは8ビットです。
メッセージの各8ビットバイトは、2つの4桁の16進文字(0:9、A(F)を含む。
Bits per Byte
1.スタート地点
8データビット、最初に最下位ビットを送信
1ビットがパリティとして
1ストップで。
注:無検証を使用するには、2つの停止ビットが必要です。各バイトは8ビットです。メッセージの各8ビットバイトは、2つの4桁の16進文字(0:9、A(F)を含む。Bits per Byte:1.スタート地点8データビット、最初に最下位ビットを送信1ビットがパリティとして1ストップで。注:無検証を使用するには、2つの停止ビットが必要です。
文字の転送ストリームは、LSBが最初に送信され、MSBが最後に送信されます。
parityより:
パリティなし:

RTUのメッセージフレームフォーマットに注目してください。 
Modbus RTUフレームの最大長は256バイトである。
Modbus ASCIIフレームモード
Modbus ASCIIフレームでは、メッセージの各バイトデータは2つのASCII文字で送信される。
どう理解するか。
例0X5Bのデータバイトがあり、これは2つの文字0x35と0x42 ASCIIエンコード0x35 ="5"、0x42 ="B"としてエンコードされます。
ASCIIモードセクションの各バイト10ビットは、次の形式です。
各ASCII文字は16進数で構成される。
Bits per Byte
1.スタート地点
7データビット、最初に最下位ビットを送信
1ビットがパリティとして
1ストップで。
注:無検証を使用するには、2つの停止ビットが必要です。各ASCII文字は16進数で構成される。Bits per Byte:1.スタート地点7データビット、最初に最下位ビットを送信1ビットがパリティとして1ストップで。注:無検証を使用するには、2つの停止ビットが必要です。
文字はどのようにシリアル転送されますか
parityより:
パリティなし:

Modbus ASCIIメッセージ形式:

ASCIIメッセージフレームはRTUメッセージフレームとは大きく異なり、ASCIIメッセージフレームには開始識別子と終了識別子があり、デバイスがメッセージフレームを受信するのに便利です。デバイスは、新しいメッセージフレームの開始と、メッセージがいつ終了するかを簡単に知ることができる。
RTUメッセージフレームにはそのような識別子は存在しないため、メッセージがフレームデータの受信を完了したかどうかを判断するために、メッセージフレームを受信する際に何らかの処理を行う必要があります。
ASCIIメッセージフレームは、コロン(ASCIIの16进数は0x3A)で始まり、キャリッジリーンライド(CR LF)(ASCIIの16进数は0x0D 0x0A)で终わります。
ASCIIモードでは、各文字バイトは2文字でエンコードされる必要があるため、ModbusアプリケーションレベルでのASCIIモードとRTUモードの互換性を確保するために、ASCIIデータフィールドの最大データ長(2 × 252)はRTUデータフィールド(252)の2倍である。したがって、ModbusASCIIフレームの最大サイズは513文字です。
RTUフレームとASCIIフレームの違い
前述のRTUメッセージフレームとASCIIメッセージフレームの違いを分析しました。RTUメッセージフレームは開始識別子と終了識別子を持たないのに対し、ASCIIメッセージフレームは開始識別子と終了識別子を持ちます。したがって、デバイスがRTUフレームとASCIIフレームを受信すると、処理が異なります。
(1)RTUフレームのメッセージ転送
RTUフレームには開始識別子と終了識別子がないため、デバイスはどのようにしてメッセージのフレームを受信したことを知るのでしょうか?
メッセージが完全に受信されたことを確認するためには,不完全なメッセージを受信することなくメッセージ解析と処理を行うため,1フレームのメッセージが受信完了したことを確認してから処理する方法を考えなければならない.
RTUモードでは、異なるメッセージフレームを識別するために、メッセージフレーム間に空き時間間隔を挿入し、2つのメッセージフレーム間に少なくとも3.5文字の空き時間を使用して異なるフレームを区別し、フレームの受信が完了したかどうかを識別する。この時間はt 3.5時間間隔とも呼ばれる。
この操作方法は以下の図で理解できます。

以前にメッセージフレームの送信が開始され、受信デバイスがアイドル状態から起動された場合、メッセージフレームが受信されたかどうかを確認するためのタイムアウトタイミングメカニズムを追加受信する必要があります。上図のように、フレーム1とフレーム2の間の間隔がt 3.5で設定されたアイドル待ち時間と等しいかそれ以上であれば、前のフレーム1は受信済みとみなされ、後に来るデータはフレーム2のデータに属します。
RTUフレームにはもう一つ特別な点があります。メッセージフレームは本質的に文字ストリームで送信されるため、異なるメッセージフレームを区別するためにt 3.5の文字間隔が必要です。しかし、メッセージフレーム内の各文字が連続していることを確認するには?
したがって,文字ストリームの送信継続を確認するには,t 1.5文字時間まで使用する.以下の図を参照。 
上の図から明らかなように、2つの文字間の空き間隔が1.5文字を超える場合、メッセージフレームは不完全とみなされ、受信ノードによって破棄される必要があります。1.5文字未満の時間は正常とみなされます。
上記のt 1.5とt 3.5の2つの時間は必ずしも適用されない。なんで?
タイムプロジェクトアプリケーションでは、マルチメッセージフレームの受信は、特に通信速度が高い場合には、中断を伴うことが多いため、頻繁かつ高速な中断が発生し、CPUへの負荷は非常に重く、この時点でt 1.5とt 3.5時間は非常に短くなり、処理は良くありません。
したがって、T 1.5とT 3.5の2つの時間は、通信速度が19200Bps以下の場合に厳密に合意する必要があります。
(2)ASCIIフレームのメッセージ転送
ASCIIメッセージフレームはRTUメッセージフレームとは大きく異なるため、ASCIIメッセージフレームには開始識別子と終了識別子がありますが、RTUフレームにはそのような識別子はありません。したがって、ASCIIメッセージフレームの受信ははるかに簡単で便利であり、t 3.5フレーム間隔時間は必要ありません。
しかし,受信したフレームの連続を保証するために,文字間の転送時間を約束することも可能である.一般に,メッセージ中の文字間隔は1秒に達すると考えられており,この間隔を超えるとエラーが発生したとみなし,このフレームメッセージデータを破棄して受信を再開する.
RTUフレームとASCIIフレームの伝送状態解析
(1)RTUフレームの伝送状態:

上記の状態図で取得できる情報
1)“初期”状態から“アイドル”状態への遷移には、フレーム間遅延を保証するためにt 3.5のタイムアウトが必要です。
2)“アイドル”状態は、処理すべきメッセージの送受信がない正常な状態です。
RTUモードでは、非アクティブな伝送間隔が3.5文字に達すると、通信リンクは“アイドル”状態とみなされます。
4)リンクがアイドル状態の場合、リンク上で検出された送信された文字はフレームの開始として認識される。nbsp;リンクが“アクティブ”になります。そして、リンク上で文字転送がない時間間隔がt 3.5に達すると、フレームの終了として認識されます。
5)フレームの終了を検出した後、CRC計算と検査を完了する。次に、アドレスフィールドを分析して、フレームがこのデバイスに送信されたかどうかを判断し、そうでない場合は、このフレームを破棄する。受信処理時間を短縮するために、アドレスフィールドはフレーム全体の終了を待つことなく、受信直後に解析できます。したがって、CRC計算は、フレームがノードにアドレス指定されているとき(ブロードキャスト·フレームを含む)のみ実行される必要がある。
(2)ASCIIフレームの転送

上記の状態図から得られる情報
1)“アイドル”状態は、処理すべきメッセージの送受信がない正常な状態です。
2“”文字を受信する度に、新しいメッセージのを示す。メッセージの受信中に文字が受信された場合、現在のローカルメッセージは不完全とみなされ、破棄されます。新しい受信バッファが再割り当てされる。
3)フレームの終了を検出した後、LRCの計算と検証を完了します。次に、アドレスフィールドを分析して、フレームがこのデバイスに送信されるかどうかを決定し、送信されない場合は破棄します。受信処理時間を短縮するために、アドレスフィールドはフレーム全体の終了を待たずに受信時に解析できます。
发表回复