ARTICLE · 1271230
Modebus协议说明及应用经验

Modebus协议的介绍

支持2重物理接口(串口、以太网);该协议标准开关,没有版权限制。严格遵循主从架构:
请求效应机制,所有的通信都必须由主站Master发起,从站Slave响应并返回数据,各种从站之间则不能直接通讯的。

数据类型

Modebus协议当中只支持以下四种数据类型:
1、线圈 只读 开关量 继电器、指示灯、开关输出 占1bit
2、离散输入 读写 开关量 常做按钮开关输入型号站 占1位bit位
3、保持寄存器 读写 模拟量 设备配置参数、控制设定值,累加计数 占16bit位
4、输入寄存器 读写 模拟量 温度、压力、转速等测量值 占16bit位
标准是这样子的,但是我们可以使用多个寄存器进行一个拼接。如:
保存和输入都是16位,2个字节,要传输比16位更大的数据类型就需要占用连续的多个寄存器
1、32位整数,无论是有符合还是无符号的int32/uint32,占2个连续寄存器(共32位4个字节)
2、32位浮点数float 单精度浮点数:占用2个连续寄存器,(共32位4个字节)
3、64位浮点数 double双精度:占用4个连续寄存器(64位/8字节)
4、字符串(String):每个寄存器存放2个字符(高字节和低字节个一个字符),占用N个连续寄存器
由于协议标准对32位以上数据的字节顺序没有强制统一规定,不同的厂商规定不一样,高低位谁在前的问题
ABCD 大端模式
BADC字节交换的小端模式


协议类型

Modebus RTU

物理层:这个机遇串口的(RS-485;RS-232)
特点:这个采用的二进制的编码格式,具备传输效率高,紧凑,是最常用的通讯方式,常用于PLC于触摸屏通讯,PLC与变频器通讯,PLC与温度,传感器通讯
通讯格式
一个完整的报文如下:
从站地址 (1 Byte) + 功能码 (1 Byte) + 数据区 (N Bytes) + CRC 校验 (2 Bytes)
从站地址:指定的目的地址
功能码:常见的功能码有:
0x01:读取线圈状态
0x02:读取离散输入
0x03:读取输入寄存器
0x04:读取输入寄存器
0x05:写单个线圈
0x06:写单个保存寄存器
0x10:写多个保存寄存器16进制
CRC 校验:循环冗余校验,确保数据传输没有出错
低位在前,高位在后;RTU使用的CRC-16的计算公式

与之对应的高级语言通讯库有:
C++语言libmodbus库
C#语言 NModbus
例子:




Modebus ASCII

物理层:也是基于串口的(RS-485;RS-232
特点:这个就与上述的不同,采用的是ASCII码通讯的,每个字节编程2个字符,读写较比RTU就好很多,但是传输效率比较低,因为数据量变大,变慢了
通讯格式
所有的的字节数据都会被转换成ASCII码的十六进制文本来传
例如:一个字节的0x5B,按照RTU模式就直接传送,而到ascii模式就被拆成5和B,对应就是0X35和0X42发送
明确了起始符,始符0X3A,回车换行\r\n对应就是0X0D和0X0A
对应校验从CRC变为LRC了
格式类型

起始符:+从站地址+功能码+数据区+LRC校验+结束符

例如:从地址为1的从站,读取从寄存器0开始的2个保存器功能码0x03
对应原始二进制数据
从站地址:0x01
功能码:0x03
起始地址:0x0000
寄存器数量:0x0002
用Modebus RTU格式为
01 03 00 00 00 02 C4 0B
用Modebus ASCII格式为
:01 03 00 00 00 02 F8 0D 0A


Modubs TCP

物理层:基于以太网RJ45接口,默认的端口号是502;
特点:与上述2种进行一个比较,不需要校验原因是由底层连接方式TCP保证,支持多路同时发送给主站,或者主站同时发送给从站。
帧结构和报文格式
MBAP 报文头 (7 字节) + Modbus PDU (功能码 + 数据)
格式说明:

还是以上述的例子:请求从地址为1的设备读取寄存器0开始的2个保持寄存器功能码0x03
报文结构如下:

00 01 事务处理标识符
00 00 协议标识符 modebus协议
00 06 长度为6字节(标识后面有几个字节,单位地址1字节、功能码1字节+起始地址2字节+寄存器数2字节)
01:单位标识符(从站地址1)
03:功能码(读保持寄存器地址0)
00 00:起始寄存器地址0
00 02:读取寄存器数量2
高级语言的应用:




这个协议只能一个一个读写答,不能并发读写
















































































