一、初识Modbus
Modbus是应用层的报文传输协议,在不同类型的总线或者网络设备提供主站设备/从站设备通信。是工业领域通信协议的业界标准。Modbus基本报文格式如下:
二、Modbus开发环境
1、使用VSPD创建虚拟端口连接,下载地址:http://www.eltima.com/
2、使用modbus poll 和 modbus slave分别建立主机和从机连接。,下载地址:http://www.modbustools.com/
3、双击单元格可以修改数据,右击改变属性。在主机或从机的Display-Communication 可以查看数据流转的具体报文内容。
三、Modbus协议相关知识
主设备可以采用两种方式向从设备发送Modbus请求报文,即主设备可以对指定的单个从设备或者线路上所有的从设备发送请求报文,而从设备只能在被动接收请求报文后给出响应报文。(主播模式/广播模式)
RTU消息帧格式
起始位:至少3.5个字符时间的空闲线状态。
设备地址:1字节。
功能码:1字节,指示要执行的操作类型。
数据域:可变长度,包含实际的数据。
CRC校验:2字节,循环冗余校验。
结束位:至少3.5个字符时间的空闲线状态。
ASCII消息帧格式
起始字符 | 地址 | 功能码 | 数据 | LRC校验 | 结束 |
: | 2字符 | 2字符 | 0~2*252字符 | 2字符 | 2字符 CR,LF |
Modbus差错校验
基于串行链路的 Modbus 通信需要进行差错校验,根据传输模式(ASCII 或 RTU)的不同,差错校验域采用不同的校验方法。
ASCII模式——校验字段由两个字符组成,其值是基于对全部报文内容执行 LRC 校验的计算结果。计算对象不包括起始的冒号(:)和回车换行符号(CRLF)。
RTU模式——校验字段由 16 个比特位(两个字节)组成,其值是基于对全部报文内容执行 CRC 校验的计算结果。计算对象包括校验域之前的所有字节。
大端小端即使数据在内存中存储地址的模式,数据高位放低地址如00,数据地址放高地址如01就是大端模式,反之即小端。
四、modbus功能码详解
功能码占用一个字节,取值范围是 1~127(即 0x01~0x7F)。同时,使用功能码 + 0x80 表示异常状态,即 129~255 代表异常码。在 Modbus 标准协议中,一共规定了三类 Modbus 功能码:公共功能码、用户自定义功能码和保留功能码。
常用 Modbus 功能码:
01H (读线圈状态): 00001~09999,读取从机线圈寄存器的状态,位操作,可读单个或多个。
02H (读离散输入状态): 10001~19999读取离散输入寄存器的状态,位操作。
03H (读保持寄存器): 40001~49999读取保持寄存器的内容,字节操作,可读单个或多个。
04H (读输入寄存器):30001~39999 读取输入寄存器的内容,字节操作。
05H (写单个线圈): 00001~09999写单个线圈的状态,位操作,只能写一个,用于设置线圈状态为 ON 或 OFF。
06H (写单个保持寄存器): 40001~49999写单个保持寄存器的内容,字节操作,只能写一个。
0FH (写多个线圈): 00001~09999写多个线圈寄存器的状态,位操作,可写多个。
10H (写多个保持寄存器):40001~49999 写多个保持寄存器的内容,字节操作,可写多个。
Modbus协议验证