Modbus ASCIIデータ报文構造详解

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

Modbus ASCIIデータ报文構造详解

Modbus ASCII是Modbus的一种メッセージフレーム,相比RTU,ASCII的传输是按照文字传的,传输的データの量会比RTUMore,所以データの量大的时候一般使用的RTU,データの量小的时候才会用ASCII,然后ASCII协议フレーム里面追加了起始和结束,更换了チェック算法,下面详细介绍ASCIIProtocol

フレーム形式

Modbus ASCII モード下的通讯フレーム形式如下:

NameLength (byte)Description
Start1以冒号 : 开头,ASCII 十六进制值为 3A
Address2十六进制节点アドレス,文字表示
Function2十六进制機能コード,文字表示
Datan x 2n 是データBytesの数,它取决于機能コード
LRC2LRC冗余检验码
End2CR / LF

注:address、Function、データと LRC 都是表示 8 位值 (0-255) 的大写十六进制可读文字对;即:在 Modbus ASCII 中,每个データバイト被分割成表示十六进制值中的2つ ASCII 文字的两バイト単位。。

组件Description文字数ASCII表示
Startメッセージ开始1 CHAR:
Address节点アドレス(十六进制表示)2 CHARS
Functionfunction code(十六进制表示)2 CHARS
Datadata(根据機能コード变化,十六进制表示)n CHARS
LRC CHECK纵向冗余检验码(LRC)2 CHARS
ENDメッセージ结束,回车换行2 CHARSCRLF

在 ASCII モード下,Modbus メッセージ的每个部分都以特定的文字数和格式出现,如下所示:

:AA BB CC...DD EE<CRLF>
  • : - メッセージ的开始符号。
  • AA - 节点アドレス,十六进制表示。
  • BB - function code,十六进制表示。
  • CC...DD - データ字段,根据関数コードと需要传输的データ長さ变化。
  • EE - LRC checksum,用于エラー检测。
  • <CRLF> - メッセージ的结束符号,代表回车和换行(Carriage Return Line Feed)。
Modbus ASCIIデータ报文構造详解イラスト

ASCIIフレーム的传输ステータス

Modbus ASCIIデータ报文構造详解イラスト1

上面ステータス图可以得到的信息:

1)“空闲” 态是ない送信和受信报文要処理的正常ステータス。

2)每次受信到 ":" 文字表示新的报文的开始。もし在一个报文的受信过程中收到该文字,则当前地报文被认为不完全并被丢弃。而一个新的受信バッファ。被重新分配。

3)检测到フレーム结束后,Complete LRC 計算和检验。然后,分析アドレス域以确定フレーム是否发往此デバイス,もしではない,则丢弃此フレーム。 为了减少受信処理时间,アドレス域可以在一接到就分析,而必要なし。等到整个フレーム结束。

ASCIIフレーム的报文传输

由于ASCII报文フレーム与RTU报文フレーム有着很大的不同,ASCII报文フレーム是有起始和结束标识符的,而RTUフレームない这样的标识。所以ASCII报文フレーム的受信就简单方便多了,也必要なし。什么t3.5的フレーム間隔时间。

但是呢,为了保证受信的报文フレーム连续,まだ可以约定文字间的传输时间的。一般认为,报文中的文字時間の間隔可以达到一秒,もし超过了这个時間の間隔,就认为发生了エラー,要废弃掉这一フレーム报文データ,再スタート。受信。

function code

ASCII モード下最もよく使われる功能代码与 RTU モード下的功能代码定义相同。以下是一些基本的機能コード及其説明:

アクセスアドレスマッピングアドレスDescriptionFunctionR/W
1 ~ 10000address-1Coils01/05/15R/W
10001 ~ 20000address-10001Discrete Inputs02R
30001 ~ 40000address-30001Input Registers04R
40001 ~ 50000address-40001Holding Registers03/06/16R/W

ASCII传输サンプル

例如,要読み取りアドレス 0x20C1 的两1つのレジスタ,需要送信以下 ASCII メッセージ:

:010420C1000218<CRLF>

Request:

  • : - メッセージ开始 - 0x3A
  • 01 - slave address - 0x01
  • 04 - function code (Read input register) - 0x04
  • 20C1 - 要読み取り的レジスター·アドレス - 0x20C1
  • 0002 - 要読み取り的レジスタ長さ (必须是 2) - 0x0002
  • 18 - LRC checksum
  • <CRLF> - メッセージ结束,回车换行 - 0x0D0A

Response:

:01040400001234B1<CRLF>

Response:

  • : - メッセージ开始 - 0x3A
  • 01 - slave address - 0x01
  • 04 - function code (Read input register) - 0x04
  • 04 - 読み取りデータ長さ (4 bytes) - 0x04
  • 00001234 - 从 VAR1 読み取り的值 - 0x00001234
  • B1 - LRC checksum
  • <CRLF> - メッセージ结束,回车换行 - 0x0D0A

常用関数コード操作

以下是 Modbus 的常用機能コード及其リクエスト和レスポンスサンプル:

Function 01(01H)リードコイルを読む

  • Request:読み取りスレーブ中コイル的 ON/OFF status。
Modbus ASCIIデータ报文構造详解イラスト2
  • Response:コイルの状態レスポンスメッセージ被パッキング为データ字段的每比特表示一1つのコイル。
Modbus ASCIIデータ报文構造详解イラスト3

Function 02(02H)read discrete inputs

  • Request:読み取りスレーブ中ショップ型入力的 ON/OFF status。
Modbus ASCIIデータ报文構造详解イラスト4
  • Response:ショップ型入力ステータスレスポンスメッセージ的构造与コイルの状態相同。
Modbus ASCIIデータ报文構造详解イラスト5

Function 03(03H)read holding registers

  • Request:読み取りスレーブ中レジスタを保持する。的二进制内容。
Modbus ASCIIデータ报文構造详解イラスト6
  • Response:レジスタを保持する。データ在すべてのレジスタ。中パッキング为两バイト単位。。
Modbus ASCIIデータ报文構造详解イラスト7

Function 04(04H)read input registers

  • Request:読み取りスレーブ中入力レジスタ。的二进制内容。
Modbus ASCIIデータ报文構造详解イラスト8
  • Response:読み取り入力レジスタデータ的レスポンスメッセージ的构造与リードホールドレジスタ相同。
Modbus ASCIIデータ报文構造详解イラスト9

Function 05(05H)シングルコイルを書く。

  • Request:将单1つのコイル写入 ON 或 OFF。
Modbus ASCIIデータ报文構造详解イラスト10
  • Response:正常的レスポンス是リクエスト的回显。
Modbus ASCIIデータ报文構造详解イラスト11

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

  • リクエスト将一个值写入单レジスタを保持する。中。当广播时,该函数在すべての附加的スレーブ上設定相同的レジスタ引用。リクエストメッセージ指定要写入的レジスタ引用(指定アドレス和数值)。
Modbus ASCIIデータ报文構造详解イラスト12
  • Response

    正常的レスポンス是リクエスト的回显,在書き込み保持レジスタ内容之后戻る。

Modbus ASCIIデータ报文構造详解イラスト13

Function 15(0FH)write multiple coils

  • Request:将一1つのコイル序列中的每1つのコイル写入 ON 或 OFF。
Modbus ASCIIデータ报文構造详解イラスト14
  • Response:普通の反応戻る住所から。、功能代码、開始アドレス和写入的コイルの数。
Modbus ASCIIデータ报文構造详解イラスト15

Function 16(10H)複数書き込みレジスタを保持する。

  • Request:将值写入到一レジスタを保持する。序列中。
Modbus ASCIIデータ报文構造详解イラスト16
  • Response:普通の反応戻る住所から。、功能代码、開始アドレス和写入的レジスタの数。
Modbus ASCIIデータ报文構造详解イラスト17

LRC verification

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;
}
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.