1 简介
modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
2 帧结构
Modbus定义了一个简单的协议数据单元(PDU):功能码+数据。
功能码 | 描述 | 访问类型 | PLC地址 | 数据类型 | 操作数量 |
---|---|---|---|---|---|
01H | 线圈寄存器 | 读 | 00001-09999 | 位 | 单/多 |
02H | 离散输入寄存器 | 只读 | 10001-19999 | 位 | 单/多 |
03H | 保持寄存器 | 读 | 40001-49999 | 字 | 单/多 |
04H | 输入寄存器 | 读 | 30001-39999 | 字 | 单/多 |
05H | 线圈寄存器 | 写 | 00001-09999 | 位 | 单个 |
06H | 保持寄存器 | 写 | 40001-49999 | 位 | 多个 |
0FH | 线圈寄存器 | 写 | 00001-09999 | 位 | 多个 |
10H | 保持寄存器 | 写 | 40001-49999 | 字 | 多个 |
3 事务处理
客户端请求:功能码+数据
服务器正常响应:请求功能码+响应数据
服务器异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型
4 ModbusTCP
IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。
ModbusTCP数据帧
事务处理标识 | 协议标识 | 长度 | 单元标识符 | 功能码 | 数据 |
---|---|---|---|---|---|
2字节 | 2字节 | 2字节 | 1字节 | 1字节 | n字节 |
事务处理标识:一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符:00 00表示ModbusTCP协议。
长度:表示接下来的数据长度,单位为字节。
单元标识符:设备地址。
ModbusTCP通信过程
1.connect 建立TCP连接
2.准备modbus报文
3.使用send命令发送报文
4.在同一连接下等待应答
5.使用recv命令读取报文,完成一次数据交换
6.通信任务结束时,关闭TCP连接
5 Modbus poll / Modbus slave
modbus poll 和modbus slave是一组modbus仿真软件,可以实现modbus RTU、TCP、串口仿真等。
在modbusTCP中,modbus poll 作为客户端请求数据,modbus slave 作为服务器端处理请求。
使用c语言编写客户端连接modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。
Linux C作为客户端连接modbus slave的源码:
链接:https://pan.baidu.com/s/146svXpit0umpk809TV1Sdw 密码:b6gn
参考:
https://wenku.baidu.com/view/c2a9e1cc376baf1ffd4fad5c.html
https://blog.csdn.net/zwxue251/article/details/24154951
https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1