- 1. 什么是Modbus RTU协议?
- 2. Modbus RTU代表什么?
- 3. Modbus RTU如何工作?
- 4. 什么是Modbus RTU主站?
- 5. 什么是Modbus RTU从站?
- 6. 帧结构
- 7. function code0x03(读)
- 8. function code0x06(写)
- 9. 01H-读Coil status
- 10. 02H-读离散input state
- 11. 03H-读保持register
- 12. 04H-读输入register
- 13. 05H-写单个线圈
- 14. 06H-写单个保持register
- 15. 0F-写多个线圈
- 16. 10H-写多个保持register
什么是Modbus RTU协议?
Modbus RTU协议是一种允许可编程逻辑控制器(PLC)和计算机之间进行data交换的通信方式。 电子设备可以使用Modbus协议通过串行线路交换信息。
它已被广泛接受并广泛用于 建筑管理system 的建设 (BMS) 和Automationsystem(IAS)。 它的易用性,可靠性以及它是开源的,并且可以在任何设备或应用程序中free使用。
该协议由Modicon®于1979年开发和发布,用于其可编程逻辑控制器。 它使用主/从架构构建,并支持使用RS232 / RS485 / RS422协议的串行设备。 Modbus通常用于多个仪器和控制设备将信号传输到中央控制器或system以收集和分析data的情况。 Automation和监督控制和Data Acquisition (SCADA) system通常采用Modbus协议。
Modbus RTU代表什么?
Modbus RTU(远程终端单元)是原始Modbus规范中定义的两种传输模式之一。 这两种模式是Modbus RTU和ASCII,它们都设计用于支持RS232,RS485和RS422协议的串行设备。 Modbus RTU的一个显着特点是它使用binaryCoding和强大的CRCError检查。 Modbus RTU是Modbus协议的实现,最常用于工业应用和自动化生产设施。
Modbus RTU如何工作?
Modbus协议基本上是一个处理来自电子设备的Request和Response的system。 主/从体系结构与主设备Request一起使用,这些Request由从设备Response。
什么是Modbus RTU主站?
Modbus RTU主站是从connect的从站设备Request信息的中央设备。 自动化生产system中的中央控制器可以扮演Modbus RTU主站的角色。 Modbus实现有一个主服务器。 主设备从从设备获取信息,也可以写入从设备的register。
什么是Modbus RTU从站?
Modbus RTU从站是Response主设备Requestequipment。 它无法启动信息传输,并且在Response主服务器发出的Request之前处于保持模式。
Modbus协议的核心是被称为的组件 协议data单元 (PDU). PDU由Function代码和data组成,无论使用何种Modbus传输模式,都可以一致地构建。 Function代码指定主站Request的data。
在Modbus RTU传输模式中,附加信息包裹在PDU周围以创建完整的应用data单元(ADU)。 在信号流中和Function代码之前,在Modbus RTU模式下,send1byte的从ID以识别应满足Request的从设备。 附加到PDU的是2byteCRC,确保send和receive正确quantity的byte。
Modbus设备支持四个data表,用于促进设备之间的通信。 它们是离散输入,离散输出(线圈),输入register和保持register。 register执行不同的Function,并不是每A device都包含在内。 在某些情况下,只有保持register用于I / OFunction。
| 领域 | 访问 | 尺寸 | 描述 |
|---|---|---|---|
| 离散输入 | 只读 | 1位 | 用作输入 |
| 线圈输出 | 读/写 | 1位 | 用于控制离散 |
| 输入register | 只读 | 16位 | 用于输入 |
| 持有register | 读/写 | 16位 | 用于各种事物,包括输入,输出,配置data等。 |
Function代码指示主设备如何与从设备ID中指定的从设备进行交互。 根据send的Function代码,主设备可以读取从机的一个register,或写入它们。
当从站receive到包含Request中的Error的data包时,它们会返回Error代码。 对于诸如Illegal functionRequest,指定从站无法访问的非法register address以及指示从设备忙或已经发生故障的消息等问题,将返回Error代码。
Modbus RTU要求您在启动通信时知道或定义Baud rate,字符format(8位无奇even parity等)和从站ID等参数。 任何这些参数不匹配都会导致您的通信尝试失败。
下面让我们详细解释一下Modbus RTUdatamessage:
帧结构
帧结构 = address + Function吗 + data + 校验
address: 占用一个byte,范围0-255,其中effective范围是1-247,其他有特殊用途,比如255是广播address(广播address就是应答所有address,正常的需要两A device的address一样才能进行查询和回复)。
function code:占用一个byte,function code的意义就是,知道这个指令是干啥的,比如你可以查询从机的data,也可以修改data,所以不同function code对应不同Function。
data:根据function code不同,有不同结构,在后续的实例中有说明。
校验:为了保证data不Error,增加这个,然后再把前面的data进行计算看data是否一致,如果一致,就说明这帧data是正确的,我再回复;如果不一样,说明你这个data在传输的时候出了问题,data不对的,所以就抛弃了。
下面通过function code03和06解释详细解释一下:
function code0x03(读)
主机send: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E
那么这一组data是什么意思呢?
从上面的结构图中,可以看出,主机send的data大致是 address+function code+data+校验;
所以Parse如下:
senddataParse

01 - address,也就是你传感器的address
03 - function code,03代表查询Function,查询传感器的data
00 00 - 代表查询的Starting register address.说明从0x0000Start Query。这里需要说明以下,Modbus把data存放在register中,通过查询register来得到不同变量的值,一个register address对应2byte count据
00 01 - 代表查询了一个register.结合前面的00 00,意思就是查询从0开始的1个register value
84 0A - 循环冗余校验,是modbus的校验公式,从首个byte开始到84前面为止;回复dataParse

01 - address,也就是你传感器的address
03 - 功function code,03代表查询Function,查询传感器的data。这里要注意的是注意发给从机的function code是啥,从机就要回复同样的function code,如果不一样说明这一帧data有Error
02 - 代表后面data的byte count,因为上面说到,一个register有2个byte,所以后面的byte count肯定是2*查询的register个数;
19 98 - register的值是19 98,结合send的data看出,01这个register的值为19 98
B2 7E - 循环冗余校验
基本流程:
send:从机的address+我要干嘛的function code+我要查的register的address+我要查的register address的个数+校验码
回复:从机的address+主机发我的function code+要send给主机data的byte count+data+校验码
function code0x06(写)
如果我要修改从机的data呢?那么这个协议有吗,答案是Yes!
主机send: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0AsenddataParse

01-主机要查询的从机address
06-function code,06代表修改单个registerFunction,修改有些不同,有修改一个register和修改多个register;
00 00-代表修改的Starting register address.说明从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号register value为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个byte开始到48前面为止;回复dataParse

01-从机返回给主机自己的address,说明这就是主机查的从机
06-function code,代表修改单个registerFunction,主机发啥function code,从机就必须回什么function code;
00 00-代表修改的Starting register address.说明是0x0000.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号register value为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个byte开始到48前面为止;常用function code详解
常用function code表格
| function code | 名称 | data type | 作用 |
|---|---|---|---|
| 0x01 | 读线圈register | 位 | 取得一组逻辑线圈的当前状态(ON/OFF) |
| 0x02 | 读离散输入register | 位 | 取得一组switch输入的当前状态(ON/OFF) |
| 0x03 | 读保持register | 整型、浮点型、字符型 | 在一个或多个保持register中取得当前的binary值 |
| 0x04 | 读输入register | 整型、浮点型 | 在一个或多个输入register中取得当前的binary值 |
| 0x05 | 写单个线圈register | 位 | 强置一个逻辑线圈的通断状态 |
| 0x06 | 写单个保持register | 整型、浮点型、字符型 | 把具体binary值装入一个保持register |
| 0x0F | 写多个线圈register | 位 | 强置一串连续逻辑线圈的通断 |
| 0x10 | 写多个保持register | 整型、浮点型、字符型 | 把具体的binary值装入一串连续的保持register |
01H-读Coil status
1)描述:读从机线圈register,位Operation,可读单个或者多个;
2)send指令:
假设从机address位0x01,register开始address0x0023,registerEnd抵制0x0038,总共读取21个线圈。协议图如下:

3)Response:
返回data的每一位对应Coil status,1-ON,0-OFF,如下图;

上表中data1表示0x0023-0x002a的Coil status,data1的最低位代表最低address的Coil status,可以理解为小端模式;
data2表示address0x002b-0x0033的Coil status,如下表:

data3表示address0x0034-0x0038的Coil status,不够8位,byte高位填充为0,如下表:

02H-读离散input state
1):读离散输入register,位Operation,可读单个或多个,协议类似function code0X01协议,此处省;
03H-读保持register
1)描述:读保持register,byte指令Operation,可读单个或者多个;
2)send指令:
从机address0x01,保持registerstarting address0x0032,读2个保持register

3)Response:

data存储顺序

04H-读输入register
1)描述:读输入register,byte指令Operation,可读单个或者多个;
2)send指令:同03H;
3)Response:同03H;
05H-写单个线圈
1)描述:写单个线圈,位Operation,只能写一个,写0xff00表示设置Coil status为ON,写0x0000表示设置Coil status为OFF
2)send指令:
设置0x0032线圈为ON;

3)Response:
同send指令;
06H-写单个保持register
1)描述:写单个保持register,byte指令Operation,只能写一个;
2)send指令:
写0x0032保持register为0x1232;

3)Response:同send指令;
0F-写多个线圈
1)描述:写多个线圈register。若data area的某位值为“1”表示被Request的相应Coil status为ON,若某位值为“0”,则为状态为OFF。
2)send指令:
Coil address为0x04a5,写12个线圈,

上图中DATA1为0x0c,表示:

DATA2为0x02,不够8位,byte高位填充0:

3)Response:

10H-写多个保持register
1)描述:写多个保持register,byte指令Operation,可写多个;
2)send指令:
保持registerstarting address为0x0034,写2个register4个byte的data;

3)Response:

发表回复