简介
Modbus TCP数据帧
PDU详细结构
-
请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
-
响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
-
如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
00 01 00 00 00 06 01 01 00 02 00 08 -
回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
00 01 00 00 00 04 01 01 01 01
-
请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
-
响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
-
如:将地址为0x0003的线圈设为ON
00 01 00 00 00 06 01 05 00 03 FF 00 -
回:写入成功
00 01 00 00 00 06 01 05 00 03 FF 00
-
请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L
-
响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L
-
请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
-
响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
-
如:从地址0x0000开始读0x0012个离散量输入
00 01 00 00 00 06 01 02 00 00 00 12 -
回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
00 01 00 00 00 06 01 02 03 01 04 00
-
请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
-
响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
-
如:读起始地址为0x0002,数量为0x0005的寄存器数据
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
-
请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
-
响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
-
如:起始地址是0x0000,寄存器数量是 0x0003
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
-
请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
-
响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
-
如:向地址是0x0000的寄存器写入数据0x000A
00 01 00 00 00 06 01 06 00 00 00 0A -
回:写入成功
00 01 00 00 00 06 01 06 00 00 00 0A
-
请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
-
响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
-
如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
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示例报文
Modbus TCP通信
-
主站请求:功能码+数据
-
从站正常响应:请求功能码+响应数据
-
从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
-
注意:需要超时管理机制,避免无期限的等待可能不出现的应答
-
connect 建立TCP连接 -
准备Modbus报文 -
使用send命令发送报文 -
在同一连接下等待应答 -
使用recv命令读取报文,完成一次数据交换 -
通信任务结束时,关闭TCP连接
仿真软件
-
Modbus poll 和Modbus slave是一组Modbus仿真软件,可以实现Modbus RTU、TCP、串口仿真等。
-
仿真软件网址:https://modbustools.com/download.html
-
在ModbusTCP中,Modbus poll 作为客户端请求数据,Modbus slave 作为服务器端处理请求。
-
使用c语言编写客户端连接Modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。
-
使用软件时,需要指定功能码,在setup->slave definition或者poll definition中进行设置。
– slave ID:从站编号(事务标识符)
– function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作
– address:开始地址
– quantity:寄存器/线圈/离散量 的数量
一些概念
北京威努特技术有限公司(简称:威努特)是国内工控安全行业领军者,是中国国有资本风险投资基金旗下企业。凭借卓越的技术创新能力成为全球六家荣获国际自动化协会ISASecure 认证企业之一和首批国家级专精特新“小巨人”企业。
威努特依托率先独创的工业网络“白环境”核心技术理念,以自主研发的全系列工控安全产品为基础,为电力、轨道交通、石油石化、市政、烟草、智能制造、军工等国家重要行业用户提供全生命周期纵深防御解决方案和专业化的安全服务,迄今已为国内及“一带一路”沿线国家的4000多家行业客户实现了业务安全合规运行。
作为中国工控安全国家队,威努特积极推动产业集群建设构建生态圈发展,牵头和参与工控安全领域国家、行业标准制定和重大活动网络安全保障工作,始终以保护我国关键信息基础设施网络空间安全为己任,致力成为建设网络强国的中坚力量!
原文始发于微信公众号(威努特工控安全):实用!ModbusTCP协议详解