夜雨聆风学习资料网

ARTICLE · 1271230

Modebus协议说明及应用经验

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

高级语言的应用:

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

相关学习资料