简介Modbus由MODICON公司于1979年开发,是工业现场总线协议标准。 1996年施耐德公司发布了基于以太网TCP/IP的Modbus协议: ModbusTCP。
Modbus协议是一种APP应用层消息传输协议,包括ASCII、RTU、TCP三种消息类型。
标准Modbus协议物理层接口包括RS232、RS422、RS485和以太网接口,它们通过master/slave方式进行通信。
ModbusTCP数据帧ModbusTCP数据帧分为两个部分: MBAP PDU。
消息报头MBAP MBAP是消息报头,长度为7字节,并且配置为:
内容解释事务标志可以是消息的序列号,通常每个通信加1以区分不同的通信数据消息。 协议标识符00 00表示ModbusTCP协议。 长度表示以下数据的长度,单位为字节。 设备标识符可以理解为设备地址。事务处理标志
传输id用于在请求和未来响应之间建立联系。 因此,在TCP连接上,该标识符在同一时间点必须是唯一的。 有多种方法可以使用此标识符。
例如,作为带有计数器的简单“TCP序列号”,可以为每个请求增加计数器。 也可以用作智能索引或指针来标识事务的内容,并记住当前远程服务和未处理的请求。
服务器接受的请求数取决于服务器资源量和TCP窗口的大小。 同样,客户端同时启动的事务数也取决于客户端的资源容量。 此实现参数称为“NnmberMaxofClientTransaction”,必须将其描述为MODBUS客户端的特性。 此参数取1到16之间的值,具体取决于设备类型。单元标识符
在MODBUS或MODBUS串行链路子网中寻址设备时,此域用于路由。 在这种情况下,“单元标识符”将携带远程设备的MODBUS从站地址。
如果MODBUS服务器连接到MODBUS或MODBUS串行链路子网并通过网桥或网关配置地址服务器,则MODBUS单元标识符是从设备,用于标识连接到网桥或网关的子网目标IP地址识别网桥本身的地址,网桥使用MODBUS单元标识符将请求转发到正确的从设备。 串行链路上MODBUS从设备的地址为1到247 (十进制),地址0被分配为广播地址。
对于TCP/IP,使用IP地址寻址MODBUS服务器; 因此,MODBUS单元标识符是无用的。 必须使用值0xFF。 如果要寻址直接连接到TCP/IP网络的MODBUS服务器,建议不要在“设备标识符”域中使用有效的MODBUS从站地址。 如果在自动系统上重新分配了IP地址,并且以前分配的MODBUS服务器的IP地址分配给网关,则使用有效的从地址可能会导致网关路由失败。 使用无效的从站地址时,网关只销毁MODBUD PDU,没有任何问题。 建议:使用0xFF作为“设备标识符”的无效值。
注: 0也可用于与MODBUS/TCP设备直接通信。 框架结构PDU PDU由功能代码数据组成。 功能代码为1字节,数据长度不定,由具体功能决定。功能码
Modbus的操作对象有线圈、离散输入、输入寄存器、保持寄存器4种。
语义线圈PLC输出比特、开关量,在Modbus中可以写入离散量PLC的输入比特、开关量,在Modbus中只能从模拟输入端子变更的寄存器,在Modbus中通过保持寄存器PLC输出模拟信号
功能代码的含义0x01读取线圈0x05单一线圈0x0F多个线圈0x02读取离散量输入0x04读取输入寄存器0x03读取保存寄存器0x06写入单一保持寄存器0x10多个保持寄存器PDU详细结构0x01:读线圈
从站读取1~2000个连续线圈状态,ON=1、OFF=0
请求: MBAP功能码起始地址h起始地址l数h (共计12字节)响应: MBAP功能码数据长度数据(1个地址的数据为1位)例如在从机0x01中,开始地址为0x0002的线圈解码
0001000000601010000200008次:数据长度为0x01字节,数据为0x01,第一个线圈为ON,其余为OFF
000100000401010101013358 www.Sina.com /
打开或关闭从站的1个输出,打开0xFF00请求输出,关闭0x000请求输出
请求: MBAP功能码输出地址h输出地址l输出值h输出值l (合计12字节)响应: MBAP功能码输出地址h输出地址l输出值h输出值l )合计12字节)例如接通地址0x0003线圈
00 01 00 00 00 06 01 05 00 03 FF 00次:写入成功
000100000601050003 ff 003358 www.Sina.com /
将
从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF 请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L0x02:读离散量输入
从一个从站中读1~2000个连续的离散量输入状态
00 01 00 00 00 06 01 02 00 00 00 12回:数据长度为0x03个字节,数据为0x00 04 01,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
00 01 00 00 00 06 01 02 03 01 04 00
0x04:读输入寄存器
从一个远程设备中读1~2000个连续输入寄存器
00 01 00 00 00 06 01 04 00 02 00 05回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
0x03:读保持寄存器
从远程设备中读保持寄存器连续块的内容
00 01 00 00 00 06 01 03 00 00 00 03回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
0x06:写单个保持寄存器
在一个远程设备中写一个保持寄存器
00 01 00 00 00 06 01 06 00 00 00 0A回:写入成功
00 01 00 00 00 06 01 06 00 00 00 0A
0x10:写多个保持寄存器
在一个远程设备中写连续寄存器块(1~123个寄存器)
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F回:写入成功
00 01 00 00 00 06 01 10 00 00 00 01 Modbus TCP 示例报文
ModBusTcp与串行链路Modbus的数据域是一致的,具体数据域可以参考串行Modbus。这里给出几个ModbusTcp的链路解析说明,辅助新人分析报文。
通信方式
Modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。
IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。
通信过程
connect 建立TCP连接准备Modbus报文使用send命令发送报文在同一连接下等待应答使用recv命令读取报文,完成一次数据交换通信任务结束时,关闭TCP连接本文借鉴两位大佬文章,原文链接:
云逸:https://www.cnblogs.com/ioufev/articles/10830028.html
http://devdiary.blog.sohu.com/188191457.html