一文详解ModbusTCP协议

【导读】【视频+图文】详解modbustcp协议。
概述
modbus由modicon公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网tcp/ip的modbus协议:modbustcp。modbus协议是一项应用层报文传输协议,包括ascii、rtu、tcp三种报文类型。标准的modbus协议物理层接口有rs232、rs422、rs485和以太网接口,采用master/slave方式通信。
modbus tcp数据帧
modbustcp的数据帧可分为两部分:mbap+pdu。
(一)报文头mbap :mbap为报文头,长度为7字节,组成如下:
(二)帧结构pdu :pdu由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。
(1)功能码: modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。
(2)根据对象的不同,modbus的功能码有:
(3)说明更详细的表:
pdu详细结构
(1)0x01:读线圈: 在从站中读1~2000个连续线圈状态,on=1,off=0
请求: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
(2)0x05:写单个线圈: 将从站中的一个输出写成on或off,0xff00请求输出为on,0x000请求输出为off。
请求: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
(3)0x0f:写多个线圈: 将一个从站中的一个线圈序列的每个线圈都强制为on或off,数据域中置1的位请求相应输出位on,置0的位请求响应输出为off。
请求:mbap 功能码 起始地址h 起始地址l 输出数量h 输出数量l 字节长度 输出值h 输出值l
响应:mbap 功能码 起始地址h 起始地址l 输出数量h 输出数量l
(4)0x02:读离散量输入: 从一个从站中读1~2000个连续的离散量输入状态。
请求: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
(5)0x04:读输入寄存器: 从一个远程设备中读1~2000个连续输入寄存器。
请求: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
(6)0x03:读保持寄存器: 从远程设备中读保持寄存器连续块的内容。
请求: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
(7)0x06:写单个保持寄存器: 在一个远程设备中写一个保持寄存器。
请求: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
(8)0x10:写多个保持寄存器: 在一个远程设备中写连续寄存器块(1~123个寄存器)。
请求: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示例报文
modbustcp与串行链路modbus的数据域是一致的,具体数据域可以参考串行modbus。这里给出几个modbustcp的链路解析说明,辅助新人分析报文。
modbus tcp通信
(一)通信方式
modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用tcp通信时,主站为client端,主动建立连接;从站为server端,等待连接。
主站请求:功能码+数据
从站正常响应:请求功能码+响应数据
从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
需要超时管理机制,避免无期限的等待可能不出现的应答
iana(internet assigned numbers authority,互联网编号分配管理机构)给modbus协议赋予tcp端口号为 502 ,这是目前在仪表与自动化行业中唯一分配到的端口号。
(二)通信过程
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:寄存器/线圈/离散量 的数量


最近美台半导体产业小动作有点多
应用材料公司以技术助力极紫外光和三维环绕栅极晶体管实现二维微缩
巧用路由器来防范网络中的恶意攻击
中国气象局将安装多个 Telairity 编码器
小米生态链企业钕娲创造科技推出了一款小丹机器人
一文详解ModbusTCP协议
雅虎日本地图应用推出AR模式
基于MindMotion产品的低压无刷电机驱动方案
谷歌对新一代ARCore进行更新
关于毫米波雷达的介绍与应用
小米MIX 3 5G版搭载骁龙855处理器下载速率最高可达2Gbps以上
努比亚X的8GB+256GB存储组合的黑金版即将到来
AMD发布速龙金牌/银牌处理器,采用14nm工艺,最高双核四线程
浅谈符号IO域和图形IO域
增程式电动车优势是什么?未来会成为主流吗?
PCB布线知识大全,建议收藏!
关于脉冲重复频率和脉宽对脉冲相噪的介绍和应用
2019年一季度通信行业运行报告总结
双面无毛刺冲裁如何实现(一种消除毛刺的加工方法)
黑芝麻智能荣获2021年度高工智能汽车金球奖两项大奖