Modbus ASCIIデータ構造の詳細

無料無料技术资料

这篇内容可直接阅读,适合用于基础学习和検索引流。

Modbus ASCIIデータ構造の詳細

Modbus ASCIIはModbusのメッセージフレームであり、RTUと比較して、ASCII伝送は文字に従って行われ、送信されるデータ量はRTUよりも多くなるので、データ量が大きい場合はRTUが一般的に使用され、データ量が小さい場合はASCIIを使用し、ASCIIプロトコルフレーム内に開始と終了を追加し、検証アルゴリズムを置き換えます。

フレーム形式

Modbus ASCIIモードでの通信フレームフォーマットは以下の通りです。

名前は長さ(バイト)説明する。
Start1コロンで。:ASCII 16进値は3Aで始まる
Address216进ノードアドレス、文字
Function216進関数コード、文字表示
Datan x 2nは関数コードに依存するデータバイト数です。
LRC2LRC冗長検査コード
End2CR / 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 CHECKLRC(縦方向冗長検査コード)2 CHARS
ENDメッセージ終了、リターン改行2 CHARSCRLF

ASCI Iモードでは、Modbusメッセージの各部分は、以下のように特定の文字数とフォーマットで表示されます。

:AA BB CC...DD EE<CRLF>
  • :- メッセージの開始記号。
  • AA- ノードアドレス。16进数。
  • BB- 関数コード、16進数表現。
  • CC...DD- データフィールドは、関数コードと送信するデータ長によって異なります。
  • EE- エラー検出のためのLRCチェックコード。
  • <CRLF>- キャリッジリターンと改行Carriage Return Line Feedを表すメッセージの終了記号。
Modbus ASCIIデータ構造の詳細插图

ASCIIフレームの転送

Modbus ASCIIデータ構造の詳細插图1

上記の状態図から得られる情報

1)“アイドル”状態は、処理すべきメッセージの送受信がない正常な状態です。

2“”文字を受信する度に、新しいメッセージのを示す。メッセージの受信中に文字が受信された場合、現在のローカルメッセージは不完全とみなされ、破棄されます。新しい受信バッファが再割り当てされる。

3)フレームの終了を検出した後、LRCの計算と検証を完了します。次に、アドレスフィールドを分析して、フレームがこのデバイスに送信されるかどうかを決定し、送信されない場合は破棄します。受信処理時間を短縮するために、アドレスフィールドはフレーム全体の終了を待たずに受信時に解析できます。

ASCIIフレームの送信

ASCIIメッセージフレームはRTUメッセージフレームとは大きく異なるため、ASCIIメッセージフレームには開始識別子と終了識別子がありますが、RTUフレームにはそのような識別子はありません。したがって、ASCIIメッセージフレームの受信ははるかに簡単で便利であり、t 3.5フレーム間隔時間は必要ありません。

しかし,受信したフレームの連続を保証するために,文字間の転送時間を約束することも可能である.一般に,メッセージ中の文字間隔は1秒に達すると考えられており,この間隔を超えるとエラーが発生したとみなし,このフレームメッセージデータを破棄して受信を再開する.

関数コードの特徴

ASCIIモードで最も一般的に使用される機能コードは、RTUモードで使用される機能コードと同じ定義です。以下は、基本的な機能コードとその説明です。

アクセスアドレスマップアドレス説明する。機能性はR/W
1 ~ 10000address-1Coils01/05/15R/W
10001 ~ 20000address-10001Discrete Inputs02R
30001 ~ 40000address-30001Input Registers04R
40001 ~ 50000address-40001Holding Registers03/06/16R/W

ASCII転送の例

例えば、アドレスを読み取るには0x20C1以下のASCIIメッセージを送信する2つのレジスタ:

:010420C1000218<CRLF>

リクエスト:

  • :- メッセージ開始-0 x 3 A
  • 01- スレーブアドレス-0 x 0 1
  • 04- ファンクションコード読み込み入力レジスタ-0x04
  • 20C1- 読み込むレジスタアドレス-0 x 20 C 1
  • 0002- 読み込むレジスタの长さ(2である必要があります)-0 x 0002
  • 18- LRCチェックコード
  • <CRLF>- メッセージ終了、リターン改行-0 x 0D 0 A

応答:

:01040400001234B1<CRLF>

応答:

  • :- メッセージ開始-0 x 3 A
  • 01- スレーブアドレス-0 x 0 1
  • 04- ファンクションコード読み込み入力レジスタ-0x04
  • 04- 読み取りデータ長(4バイト)-0 x 04
  • 00001234- VAR1から読み込まれた値-0x0001234
  • B1- LRCチェックコード
  • <CRLF>- メッセージ終了、リターン改行-0 x 0D 0 A

共通機能コード操作

Modbusの一般的な関数コードとリクエストとレスポンスの例を以下に示します。

01(01H)読み取りコイル

  • 要求:スレーブ中コイルのON/OFF状態を読み取ります。
Modbus ASCIIデータ構造の詳細插图2
  • 応答:コイル状態応答メッセージは、1つのコイルを表すデータフィールドのビットごとにパッケージ化されます。
Modbus ASCIIデータ構造の詳細插图3

02

  • リクエスト:スレーブからの離散入力のON/OFFステータスを読み取ります。
Modbus ASCIIデータ構造の詳細插图4
  • 応答:離散入力状態応答メッセージはコイル状態と同じ構成になります。
Modbus ASCIIデータ構造の詳細插图5

03(03H)リードホールドレジスタ

  • 要求:スレーブの保持レジスタのバイナリ内容を読み込みます。
Modbus ASCIIデータ構造の詳細插图6
  • 応答:レジスタデータを各レジスタに2バイトにパックします。
Modbus ASCIIデータ構造の詳細插图7

04

  • 要求:スレーブから入力レジスタのバイナリ内容を読み込みます。
Modbus ASCIIデータ構造の詳細插图8
  • 応答:入力レジスタデータを読み取るレスポンスメッセージは、保持レジスタを読み取るのと同じ構造になります。
Modbus ASCIIデータ構造の詳細插图9

05(05H)単コイル书き込み

  • リクエスト:個々のコイルをONまたはOFFに書き込みます。
Modbus ASCIIデータ構造の詳細插图10
  • レスポンス:通常のレスポンスはリクエストのエコーです。
Modbus ASCIIデータ構造の詳細插图11

06(06H)単一保持レジスタへの书き込み

  • 要求は、単一の保持レジスタに値を書き込む。ブロードキャスト時、関数は追加されたすべてのスレーブに同じレジスタ参照を設定します。要求メッセージは、書き込むレジスタ参照(アドレスと数値を指定)を指定します。
Modbus ASCIIデータ構造の詳細插图12
  • 応答する。

    通常の応答はリクエストのエコーであり、保持レジスタの内容が書き込まれた後に返される。

Modbus ASCIIデータ構造の詳細插图13

機能15(0FH)複数のコイルを書き込む

  • リクエスト:1つのコイルシーケンスの各コイルをオンまたはオフに書き込みます。
Modbus ASCIIデータ構造の詳細插图14
  • レスポンス:通常のレスポンスは、スレーブアドレス、機能コード、開始アドレス、および書き込まれたコイルの数を返します。
Modbus ASCIIデータ構造の詳細插图15

16(10H)

  • Request:値を一連の保持レジスタに書き込む。
Modbus ASCIIデータ構造の詳細插图16
  • レスポンス:通常のレスポンスは、スレーブアドレス、機能コード、開始アドレス、および書き込まれたレジスタ数を返します。
Modbus ASCIIデータ構造の詳細插图17

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;
}
この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口

发表回复

あなたのメールアドレスアドレス不会被公开。 必須項目已用 * 标注