Modbus常用
1. 功能码
modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。
线圈:PLC的输出位,开关量,在MODBUS中可读可写
离散量:PLC的输入位,开关量,在MODBUS中只读
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读
保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写
根据对象的不同,modbus的常用功能码有:
- 0x01:读线圈
- 0x05:写单个线圈
- 0x0F:写多个线圈
- 0x02:读离散量输入
- 0x04:读输入寄存器
- 0x03:读保持寄存器
- 0x06:写单个保持寄存器
- 0x10:写多个保持寄存器
通用采集器一般包含DI,DO,AI相关接口,对此类接口主要应用功能码01~06。
3类接口具体对应关系示例如下:
继电器定义,功能码01/05(01:读线圈,05写线圈)
序号 地址 数据描述
01 00001 DO1
08 00008 DO8
开关量输入定义,功能码02(02:读取输入状态)
序号 地址 数据描述
01 10001 DI1
02 10002 DI2
08 10008 DI8
输入寄存器定义,功能码04(04:读取输入寄存器)
序号 地址 数据描述
01 30001 AI1
08 30008 AI8
保持寄存器定义,功能码03/06(03:读取保持寄存器,06:写单个寄存器)
序号 地址 数据描述
01 40001 系统实际时间的低16位
02 40002 系统实际时间的高16位
03 40003 第一路开关量32位计数器低16位。
04 40004 第一路开关量32位计数器高16位。
19 40019 为串口1收发延时设置,16位,以1ms为单位。
20 40020 为串口2收发延时设置,16位,以1ms为单位。
21 40021 串口1波特率设置
22 40022 串口2波特率设置。
我们都知道ModbusRTU一帧数据包含1字节地址(物理地址),1字节功能码(上述对应功能码01~06),数据和2字节CRC。
2. 数据
一帧报文中数据内容根据功能码不同而不同,详见“ModBus协议”。
例如:
01功能码(读DI):功能码:02--1字节,起始地址:0x0000~0xFFFF--2字节,
线圈数量:1~2000--2字节
响应PDU:功能码:02--1字节,字节数:N*,输出数量/8[+1](未整除+1),
输入状态:N*X1个字节
错误:差错码:0x82--1字节,异常码:0x1~0x4--1字节。
3. 模拟软件
modbus设备分为主站(poll)和从站(slave),主站只有一个,从站有多个,主站向各个从站发送请求帧,从站给予响应。一般情况下,主站是client端,从站是server端。
modbus poll和modbus slave是一组modbus仿真软件,可以实现modbus RTU、TCP、串口仿真等。
4. 简述
参考:
1. modbusTCP协议
2. http://www.modbus.org/tech.php modbus官网及各语言code
3. https://github.com/stephane/libmodbus/ libmodbus
4. https://libmodbus.org/docs/v3.1.6/ libmodbus官网及API
6. 纯 c 的modbus源码编译(windows和linux) libmodbus编译
7. windows使用modbus开源纯C库通过TCP 读写寄存器的值 libmodbus应用
9. Modbus RTU通用规约说明、模板及规约配置(DOC) 配置文件参考
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步