Modbus ASCII是Modbus的一种メッセージフレーム,相比RTU,ASCII的传输是按照文字传的,传输的データの量会比RTUMore,所以データの量大的时候一般使用的RTU,データの量小的时候才会用ASCII,然后ASCII协议フレーム里面追加了起始和结束,更换了チェック算法,下面详细介绍ASCIIProtocol
フレーム形式
Modbus ASCII モード下的通讯フレーム形式如下:
| Name | Length (byte) | Description |
|---|---|---|
| Start | 1 | 以冒号 : 开头,ASCII 十六进制值为 3A |
| Address | 2 | 十六进制节点アドレス,文字表示 |
| Function | 2 | 十六进制機能コード,文字表示 |
| Data | n x 2 | n 是データBytesの数,它取决于機能コード |
| LRC | 2 | LRC冗余检验码 |
| End | 2 | CR / LF |
注:address、Function、データと LRC 都是表示 8 位值 (0-255) 的大写十六进制可读文字对;即:在 Modbus ASCII 中,每个データバイト被分割成表示十六进制值中的2つ ASCII 文字的两バイト単位。。
| 组件 | Description | 文字数 | ASCII表示 |
|---|---|---|---|
| Start | メッセージ开始 | 1 CHAR | : |
| Address | 节点アドレス(十六进制表示) | 2 CHARS | |
| Function | function code(十六进制表示) | 2 CHARS | |
| Data | data(根据機能コード变化,十六进制表示) | n CHARS | |
| LRC CHECK | 纵向冗余检验码(LRC) | 2 CHARS | |
| END | メッセージ结束,回车换行 | 2 CHARS | CRLF |
在 ASCII モード下,Modbus メッセージ的每个部分都以特定的文字数和格式出现,如下所示:
:AA BB CC...DD EE<CRLF>
:- メッセージ的开始符号。AA- 节点アドレス,十六进制表示。BB- function code,十六进制表示。CC...DD- データ字段,根据関数コードと需要传输的データ長さ变化。EE- LRC checksum,用于エラー检测。<CRLF>- メッセージ的结束符号,代表回车和换行(Carriage Return Line Feed)。

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

上面ステータス图可以得到的信息:
1)“空闲” 态是ない送信和受信报文要処理的正常ステータス。
2)每次受信到 ":" 文字表示新的报文的开始。もし在一个报文的受信过程中收到该文字,则当前地报文被认为不完全并被丢弃。而一个新的受信バッファ。被重新分配。
3)检测到フレーム结束后,Complete LRC 計算和检验。然后,分析アドレス域以确定フレーム是否发往此デバイス,もしではない,则丢弃此フレーム。 为了减少受信処理时间,アドレス域可以在一接到就分析,而必要なし。等到整个フレーム结束。
ASCIIフレーム的报文传输
由于ASCII报文フレーム与RTU报文フレーム有着很大的不同,ASCII报文フレーム是有起始和结束标识符的,而RTUフレームない这样的标识。所以ASCII报文フレーム的受信就简单方便多了,也必要なし。什么t3.5的フレーム間隔时间。
但是呢,为了保证受信的报文フレーム连续,まだ可以约定文字间的传输时间的。一般认为,报文中的文字時間の間隔可以达到一秒,もし超过了这个時間の間隔,就认为发生了エラー,要废弃掉这一フレーム报文データ,再スタート。受信。
function code
ASCII モード下最もよく使われる功能代码与 RTU モード下的功能代码定义相同。以下是一些基本的機能コード及其説明:
| アクセスアドレス | マッピングアドレス | Description | Function | 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 的两1つのレジスタ,需要送信以下 ASCII メッセージ:
:010420C1000218<CRLF>
Request:
:- メッセージ开始 - 0x3A01- slave address - 0x0104- function code (Read input register) - 0x0420C1- 要読み取り的レジスター·アドレス - 0x20C10002- 要読み取り的レジスタ長さ (必须是 2) - 0x000218- LRC checksum<CRLF>- メッセージ结束,回车换行 - 0x0D0A
Response:
:01040400001234B1<CRLF>
Response:
:- メッセージ开始 - 0x3A01- slave address - 0x0104- function code (Read input register) - 0x0404- 読み取りデータ長さ (4 bytes) - 0x0400001234- 从 VAR1 読み取り的值 - 0x00001234B1- LRC checksum<CRLF>- メッセージ结束,回车换行 - 0x0D0A
常用関数コード操作
以下是 Modbus 的常用機能コード及其リクエスト和レスポンスサンプル:
Function 01(01H)リードコイルを読む
- Request:読み取りスレーブ中コイル的 ON/OFF status。

- Response:コイルの状態レスポンスメッセージ被パッキング为データ字段的每比特表示一1つのコイル。

Function 02(02H)read discrete inputs
- Request:読み取りスレーブ中ショップ型入力的 ON/OFF status。

- Response:ショップ型入力ステータスレスポンスメッセージ的构造与コイルの状態相同。

Function 03(03H)read holding registers
- Request:読み取りスレーブ中レジスタを保持する。的二进制内容。

- Response:レジスタを保持する。データ在すべてのレジスタ。中パッキング为两バイト単位。。

Function 04(04H)read input registers
- Request:読み取りスレーブ中入力レジスタ。的二进制内容。

- Response:読み取り入力レジスタデータ的レスポンスメッセージ的构造与リードホールドレジスタ相同。

Function 05(05H)シングルコイルを書く。
- Request:将单1つのコイル写入 ON 或 OFF。

- Response:正常的レスポンス是リクエスト的回显。

Function 06(06H)単一保持レジスタの書き込み
- リクエスト将一个值写入单レジスタを保持する。中。当广播时,该函数在すべての附加的スレーブ上設定相同的レジスタ引用。リクエストメッセージ指定要写入的レジスタ引用(指定アドレス和数值)。

- Response

Function 15(0FH)write multiple coils
- Request:将一1つのコイル序列中的每1つのコイル写入 ON 或 OFF。

- Response:普通の反応戻る住所から。、功能代码、開始アドレス和写入的コイルの数。

Function 16(10H)複数書き込みレジスタを保持する。
- Request:将值写入到一レジスタを保持する。序列中。

- Response:普通の反応戻る住所から。、功能代码、開始アドレス和写入的レジスタの数。

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;
}
Leave a Reply