Modbus ASCIIはModbusのメッセージフレームであり、RTUと比較して、ASCII伝送は文字に従って行われ、送信されるデータ量はRTUよりも多くなるので、データ量が大きい場合はRTUが一般的に使用され、データ量が小さい場合はASCIIを使用し、ASCIIプロトコルフレーム内に開始と終了を追加し、検証アルゴリズムを置き換えます。
フレーム形式
Modbus ASCIIモードでの通信フレームフォーマットは以下の通りです。
| 名前は | 長さ(バイト) | 説明する。 |
|---|---|---|
| Start | 1 | コロンで。:ASCII 16进値は3Aで始まる |
| Address | 2 | 16进ノードアドレス、文字 |
| Function | 2 | 16進関数コード、文字表示 |
| Data | n x 2 | nは関数コードに依存するデータバイト数です。 |
| LRC | 2 | LRC冗長検査コード |
| End | 2 | CR / LF |
注Address、、Data、LRCは、8ビット値0-255を表す大文字の16进読読み取り可能文字のペアです。すなわち、ASCIIでは、各データバイトは、16进値の2つのASCII文字を表す2バイトに分割されます。
| アセンブリ | 説明する。 | 文字の数 | ASCII表示 |
|---|---|---|---|
| Start | メッセージ開始。 | 1 CHAR | : |
| Address | ノードアドレス16进数 | 2 CHARS | |
| Function | 関数コード(16進数表記) | 2 CHARS | |
| Data | データ(关数コードによって変化、16进) | n CHARS | |
| LRC CHECK | LRC(縦方向冗長検査コード) | 2 CHARS | |
| END | メッセージ終了、リターン改行 | 2 CHARS | CRLF |
ASCI Iモードでは、Modbusメッセージの各部分は、以下のように特定の文字数とフォーマットで表示されます。
:AA BB CC...DD EE<CRLF>
:- メッセージの開始記号。AA- ノードアドレス。16进数。BB- 関数コード、16進数表現。CC...DD- データフィールドは、関数コードと送信するデータ長によって異なります。EE- エラー検出のためのLRCチェックコード。<CRLF>- キャリッジリターンと改行Carriage Return Line Feedを表すメッセージの終了記号。

ASCIIフレームの転送

上記の状態図から得られる情報
1)“アイドル”状態は、処理すべきメッセージの送受信がない正常な状態です。
2“”文字を受信する度に、新しいメッセージのを示す。メッセージの受信中に文字が受信された場合、現在のローカルメッセージは不完全とみなされ、破棄されます。新しい受信バッファが再割り当てされる。
3)フレームの終了を検出した後、LRCの計算と検証を完了します。次に、アドレスフィールドを分析して、フレームがこのデバイスに送信されるかどうかを決定し、送信されない場合は破棄します。受信処理時間を短縮するために、アドレスフィールドはフレーム全体の終了を待たずに受信時に解析できます。
ASCIIフレームの送信
ASCIIメッセージフレームはRTUメッセージフレームとは大きく異なるため、ASCIIメッセージフレームには開始識別子と終了識別子がありますが、RTUフレームにはそのような識別子はありません。したがって、ASCIIメッセージフレームの受信ははるかに簡単で便利であり、t 3.5フレーム間隔時間は必要ありません。
しかし,受信したフレームの連続を保証するために,文字間の転送時間を約束することも可能である.一般に,メッセージ中の文字間隔は1秒に達すると考えられており,この間隔を超えるとエラーが発生したとみなし,このフレームメッセージデータを破棄して受信を再開する.
関数コードの特徴
ASCIIモードで最も一般的に使用される機能コードは、RTUモードで使用される機能コードと同じ定義です。以下は、基本的な機能コードとその説明です。
| アクセスアドレス | マップアドレス | 説明する。 | 機能性は | R/W |
|---|---|---|---|---|
| 1 ~ 10000 | address-1 | Coils | 01/05/15 | R/W |
| 10001 ~ 20000 | address-10001 | Discrete Inputs | 02 | R |
| 30001 ~ 40000 | address-30001 | Input Registers | 04 | R |
| 40001 ~ 50000 | address-40001 | Holding Registers | 03/06/16 | R/W |
ASCII転送の例
例えば、アドレスを読み取るには0x20C1以下のASCIIメッセージを送信する2つのレジスタ:
:010420C1000218<CRLF>
リクエスト:
:- メッセージ開始-0 x 3 A01- スレーブアドレス-0 x 0 104- ファンクションコード読み込み入力レジスタ-0x0420C1- 読み込むレジスタアドレス-0 x 20 C 10002- 読み込むレジスタの长さ(2である必要があります)-0 x 000218- LRCチェックコード<CRLF>- メッセージ終了、リターン改行-0 x 0D 0 A
応答:
:01040400001234B1<CRLF>
応答:
:- メッセージ開始-0 x 3 A01- スレーブアドレス-0 x 0 104- ファンクションコード読み込み入力レジスタ-0x0404- 読み取りデータ長(4バイト)-0 x 0400001234- VAR1から読み込まれた値-0x0001234B1- LRCチェックコード<CRLF>- メッセージ終了、リターン改行-0 x 0D 0 A
共通機能コード操作
Modbusの一般的な関数コードとリクエストとレスポンスの例を以下に示します。
01(01H)読み取りコイル
- 要求:スレーブ中コイルのON/OFF状態を読み取ります。

- 応答:コイル状態応答メッセージは、1つのコイルを表すデータフィールドのビットごとにパッケージ化されます。

02
- リクエスト:スレーブからの離散入力のON/OFFステータスを読み取ります。

- 応答:離散入力状態応答メッセージはコイル状態と同じ構成になります。

03(03H)リードホールドレジスタ
- 要求:スレーブの保持レジスタのバイナリ内容を読み込みます。

- 応答:レジスタデータを各レジスタに2バイトにパックします。

04
- 要求:スレーブから入力レジスタのバイナリ内容を読み込みます。

- 応答:入力レジスタデータを読み取るレスポンスメッセージは、保持レジスタを読み取るのと同じ構造になります。

05(05H)単コイル书き込み
- リクエスト:個々のコイルをONまたはOFFに書き込みます。

- レスポンス:通常のレスポンスはリクエストのエコーです。

06(06H)単一保持レジスタへの书き込み
- 要求は、単一の保持レジスタに値を書き込む。ブロードキャスト時、関数は追加されたすべてのスレーブに同じレジスタ参照を設定します。要求メッセージは、書き込むレジスタ参照(アドレスと数値を指定)を指定します。

- 応答する。

機能15(0FH)複数のコイルを書き込む
- リクエスト:1つのコイルシーケンスの各コイルをオンまたはオフに書き込みます。

- レスポンス:通常のレスポンスは、スレーブアドレス、機能コード、開始アドレス、および書き込まれたコイルの数を返します。

16(10H)
- Request:値を一連の保持レジスタに書き込む。

- レスポンス:通常のレスポンスは、スレーブアドレス、機能コード、開始アドレス、および書き込まれたレジスタ数を返します。

LRCテスト
LRCチェックコードの計算方法は以下の通りです。
unsigned char ucMBLRC( unsigned char * pucFrame, unsigned short usLen )
{
unsigned char ucLRC = 0; /* LRC char initialized */
while( usLen-- )
{
ucLRC += *pucFrame++; /* Add buffer byte without carry */
}
/* Return twos complement */
ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) );
return ucLRC;
}
发表回复