什么是Modbus RTUProtocol?
Modbus RTU协议是一种允许可プログラミング逻辑コントローラーは(PLC)和計算机之间进行データ交換的通信の形態。 電子デバイス可以使用Modbusプロトコル経由串行线路交換信息。
它已被广泛接受并广泛用于 建筑管理系统 的建设 (BMS) 和工业自動化系统(IAS)。 它的易用性,可靠性以及它是开源的,并且可以在任何デバイス或应用程序中無料使用。
该协议由Modicon®于1979年开发和发布,用于其可プログラミング逻辑コントローラーは。 它使用主/从架构构建,并サポート使用RS232 / RS485 / RS422协议的串行デバイス。 Modbus通常用于多个仪器和控制デバイス将信号传输到中央コントローラーは或系统以收集和分析データ的情况。 工业自動化和监督控制和データの収集 (SCADA) 系统通常采用ModbusProtocol。
Modbus RTU代表什么?
Modbus RTU(远程终端ユニット)是元のModbus规范中定义的两种传输モード之一。 这2つのモデル是Modbus RTU和ASCII,它们都设计用于サポートRS232,RS485和RS422协议的串行デバイス。 Modbus RTU的一个显着特点是它使用二进制编码和强大的CRCエラーチェック。 Modbus RTU是Modbusプロトコル的実装,最もよく使われる于工业应用和自動化生产设施。
Modbus RTU如何工作?
Modbusプロトコル基本上是一个処理来自電子デバイス的リクエスト和レスポンス的系统。 主/从体系構造与主デバイスリクエスト一起使用,这些リクエスト由从デバイスレスポンス。
什么是Modbus RTUmaster?
Modbus RTUマスター是从连接的スレーブデバイスリクエスト信息的中央デバイス。 自動化生产系统中的中央コントローラーは可以扮演Modbus RTUマスター的角色。 Modbus実装有一个主サーバー·サーバー。 主デバイス从从デバイス取得信息,也可以写入从デバイス的レジスタ。
什么是Modbus RTUslave?
Modbus RTUスレーブ是レスポンス主デバイスリクエスト的デバイス。 它无法启动信息传输,并且在レスポンス主サーバー·サーバー发出的リクエスト之前处于保持モード。
Modbusプロトコル的核心是被称为的组件 协议データユニット (PDU). PDU由功能代码和データ组成,无论使用何种Modbus传输モード,都可以一致地构建。 功能代码指定マスターリクエスト的データ。
在Modbus RTU传输モード中,附加信息パッケージはこちらPDU周围以作成完全的应用データユニット(ADU)。 在信号流中和功能代码之前,在Modbus RTUモード下,send1バイト的从ID以识别应满足リクエスト的从デバイス。 附加到PDU的是2バイトCRC,确保送信和受信正确数量的バイト。
Modbusデバイスサポート四个データ表,用于促进デバイス之间的通信。 它们是ショップ型入力,离散出力(コイル),入力レジスタ。和レジスタを保持する。。 レジスタ执行不同的功能,并ではない每个デバイス都包含在内。 在某些情况下,只有レジスタを保持する。用于I / OFunction。
| 领域 | アクセス | 尺寸 | Description |
|---|---|---|---|
| ショップ型入力 | 読み取り専用 | 1位 | 用作入力 |
| コイル出力 | 读/写 | 1位 | 用于控制离散 |
| 入力レジスタ。 | 読み取り専用 | 16位 | 用于入力 |
| 持有レジスタ | 读/写 | 16位 | 用于各种事物,包括入力,出力,設定データ等。 |
功能代码指示主デバイス如何与从デバイスID中指定的从デバイス进行交互。 根据送信的功能代码,主デバイス可以読み取りスレーブ的一1つのレジスタ,或写入它们。
当スレーブ受信到包含リクエスト中的エラー的データパケットは时,它们会戻るエラー代码。 对于诸如違法な機能リクエスト,指定スレーブ无法アクセス的非法レジスター·アドレス以及指示从デバイスビジー或已经发生故障的メッセージ等問題,将戻るエラー代码。
Modbus RTU要求您在启动通信时知道或定义ボーレート,文字格式(8位パリティなし等)和スレーブID等参数。 任何这些参数不マッチング都会导致あなたの通信尝试失敗。
下面让我们详细解释一下Modbus RTUデータ报文:
フレーム構造
フレーム構造 = address + 功能吗 + data + check
address: 占用一バイト単位。,範囲0-255,其中有效範囲是1-247,其他有特殊用途,比如255是放送アドレス(放送アドレス就是应答すべてのアドレス,正常的需要2つデバイス的アドレス一样才能进行查询和回复)。
function code:占用一バイト単位。,機能コード的意义就是,知道这个指令是干啥的,比如你可以查询スレーブ的データ,也可以修改データ,所以不同じ機能コード。对应不同功能。
data:機能コードにより異なる,有不同構造,在后续的实例中有説明。
check:为了保证データ不エラー,增加这个,然后再把前面的データ进行計算看データ是否一致,もし一致,就説明这フレームデータ是正确的,我再回复;もし不一样,説明你这个データ在传输的时候出了問題,データは間違ってる的,所以就抛弃了。
下面経由機能コード03和06解释详细解释一下:
function code0x03(读)
マスター送信: 01 03 00 00 00 01 84 0A
スレーブ回复: 01 03 02 19 98 B2 7E
那么这一组データ是什么意思呢?
从上面的構造图中,可以看出,マスター送信的データ大致是 address+function code+data+check;
所以解析如下:
送信データの解析

01 - address,也就是你センサーは的アドレス
03 - function code,03代表查询功能,查询センサーは的データ
00 00 - 代表查询的起始レジスター·アドレス.説明从0x0000开始查询。这里需要説明以下,Modbus把データは保存放在レジスタ中,経由查询レジスタ来得到不同变量的值,一个レジスター·アドレス对应2Bytesのデータ
00 01 - 代表查询了一1つのレジスタ.结合前面的00 00,意思就是查询Start from 0的1个レジスタの値
84 0A - 循环冗余チェック,是modbus的チェック公式,从首バイト単位。开始到84前面为止;回复データの解析

01 - address,也就是你センサーは的アドレス
03 - 功機能コード,03代表查询功能,查询センサーは的データ。这里要注意的是注意发给スレーブ的機能コード是啥,スレーブ就要回复同样的機能コード,もし不一样説明这一フレームデータ有エラー
02 - 代表后面データ的Bytesの数,因为上面说到,一1つのレジスタ有2バイト単位。,所以后面的Bytesの数肯定是2*查询的レジスタ个数;
19 98 - レジスタ的值是19 98,结合送信的データ看出,01这1つのレジスタ的值为19 98
B2 7E - 循环冗余チェック
基本流程:
send:スレーブ的アドレス+我要干嘛的機能コード+我要查的レジスタ的アドレス+我要查的レジスター·アドレス的个数+checksum
Reply:スレーブ的アドレス+マスター发我的機能コード+要送信给マスターデータ的Bytesの数+data+checksum
function code0x06(写)
もし我要修改スレーブ的データ呢?那么这个协议有吗,答案是Yes!
マスター送信: 01 06 00 00 00 01 48 0A
スレーブ回复: 01 06 00 00 00 01 48 0A送信データの解析

01-マスター要查询的スレーブアドレス
06-function code,06代表修改单1つのレジスタ功能,修改一部の不同,有修改一1つのレジスタ和修改多1つのレジスタ;
00 00-代表修改的起始レジスター·アドレス.説明从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号レジスタの値为00 01;
48 0A-循环冗余チェック,是modbus的チェック公式,从首バイト単位。开始到48前面为止;回复データの解析

01-スレーブ戻る给マスター自己的アドレス,説明这就是マスター查的スレーブ
06-function code,代表修改单1つのレジスタ功能,マスター发啥機能コード,スレーブ就必须回什么機能コード;
00 00-代表修改的起始レジスター·アドレス.説明是0x0000.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号レジスタの値为00 01;
48 0A-循环冗余チェック,是modbus的チェック公式,从首バイト単位。开始到48前面为止;常用機能コードの詳細
常用機能コード表格
| function code | Name | data type | 作用 |
|---|---|---|---|
| 0x01 | リードコイルを読むレジスタ | 位 | 取得一组逻辑コイル的当前ステータス(ON/OFF) |
| 0x02 | 读离散入力レジスタ。 | 位 | 取得一组开关入力的当前ステータス(ON/OFF) |
| 0x03 | read holding registers | 整型、浮点型、文字型 | 在一个或多レジスタを保持する。中取得当前的二进制值 |
| 0x04 | read input registers | 整型、浮点型 | 在一个或多入力レジスタです。中取得当前的二进制值 |
| 0x05 | シングルコイルを書く。レジスタ | 位 | 强置一个逻辑コイル的通断ステータス |
| 0x06 | 単一保持レジスタの書き込み | 整型、浮点型、文字型 | 把具体二进制值装入一レジスタを保持する。 |
| 0x0F | 複数のコイルを書く。レジスタ | 位 | 强置一串连续逻辑コイル的通断 |
| 0x10 | 複数書き込みレジスタを保持する。 | 整型、浮点型、文字型 | 把具体的二进制值装入一串连续保持レジスタです。 |
01H-read coil status
1)Description:读スレーブコイルレジスタ,ビット操作。,可単一読み込み个或者多个;
2)送信指令:
假设スレーブアドレス位0x01,レジスタ开始アドレス0x0023,レジスタ结束抵制0x0038,总共読み取り211つのコイル。协议图如下:

3)Response:
戻るデータ的每一位对应コイルの状態,1-ON,0-OFF,如下图;

上表中data1表示0x0023-0x002a的コイルの状態,data1的最低位代表最低アドレス的コイルの状態,可以理解为リトルエンディアンモード;
data2表示アドレス0x002b-0x0033的コイルの状態,如下表:

data3表示アドレス0x0034-0x0038的コイルの状態,不够8位,バイト高位填充为0,如下表:

02H-離散入力の読み取りステータス
1):读离散入力レジスタ。,ビット操作。,可単一読み込み个或多个,协议类似機能コード0X01协议,此处省;
03H-read holding registers
1)Description:read holding registers,バイト指令操作,可単一読み込み个或者多个;
2)送信指令:
スレーブアドレス0x01,保持レジスタ開始アドレス0x0032,读2レジスタを保持する。

3)Response:

データストア顺序

04H-read input registers
1)Description:read input registers,バイト指令操作,可単一読み込み个或者多个;
2)送信指令:同03H;
3)Response:同03H;
05H-write single coil
1)Description:write single coil,ビット操作。,只能写一个,写0xff00表示設定コイルの状態为ON,写0x0000表示設定コイルの状態为OFF
2)送信指令:
設定0x0032コイル为ON;

3)Response:
同送信指令;
06H-単一保持レジスタの書き込み
1)Description:単一保持レジスタの書き込み,バイト指令操作,只能写一个;
2)送信指令:
写0x0032レジスタを保持する。为0x1232;

3)Response:同送信指令;
0F-write multiple coils
1)Description:複数のコイルを書く。レジスタ。若データ区的某位值为“1”表示被リクエスト的相应コイルの状態为ON,若某位值为“0”,则为ステータス为OFF。
2)送信指令:
コイルアドレス为0x04a5,写121つのコイル,

上图中DATA1为0x0c,表示:

DATA2为0x02,不够8位,バイト高位填充0:

3)Response:

10H-複数書き込みレジスタを保持する。
1)Description:複数書き込みレジスタを保持する。,バイト指令操作,可もっと書く。;
2)送信指令:
保持レジスタ開始アドレス为0x0034,写21つのレジスタ4バイト単位。的データ;

3)Response:

Leave a Reply