前言
Modbus是工业自动化领域应用最广泛的通信协议之一,由Modicon(现施耐德电气)于1979年发布,至今仍是PLC、仪表、传感器的首选通信方式。本文将深入讲解Modbus TCP和RTU两种模式的技术细节、编程实现和常见故障排查方法。
一、协议基础
1.1 Modbus协议族
- Modbus RTU:串行通信(RS232/RS485),二进制格式,CRC16校验
- Modbus ASCII:串行通信,ASCII码格式,LRC校验(已少用)
- Modbus TCP:以太网通信,封装在TCP/IP协议中,默认端口502
1.2 数据模型
Modbus定义4种数据类型,分别占用不同的地址空间:
- 线圈(Coils):可读写,地址0xxxx,对应PLC输出继电器
- 离散输入(Discrete Inputs):只读,地址1xxxx,对应PLC输入点
- 保持寄存器(Holding Registers):可读写,地址4xxxx,16位整数
- 输入寄存器(Input Registers):只读,地址3xxxx,模拟量采集值
二、常用功能码
| 功能码 | 名称 | 操作 |
| 01 | Read Coils | 读取线圈状态(批量读取开关量) |
| 02 | Read Discrete Inputs | 读取离散输入状态 |
| 03 | Read Holding Registers | 读取保持寄存器(最常用) |
| 04 | Read Input Registers | 读取输入寄存器 |
| 05 | Write Single Coil | 写单个线圈 |
| 06 | Write Single Register | 写单个寄存器 |
| 15 | Write Multiple Coils | 批量写线圈 |
| 16 | Write Multiple Registers | 批量写寄存器(常用于配方下发) |
三、Modbus TCP实现
3.1 报文结构
MBAP报头(7字节) + PDU(功能码+数据)
- 事务ID(2字节):请求响应配对标识
- 协议标识(2字节):固定0x0000
- 长度(2字节):后续字节数
- 单元标识(1字节):从站地址(TCP中常为0xFF)
- 功能码(1字节)
- 数据域(N字节)
3.2 C#代码示例
使用NModbus4库读取保持寄存器:
- 连接PLC:TcpClient连接IP和端口502
- 创建主站:ModbusTcpMaster
- 读取数据:ReadHoldingRegisters(slaveId=1, startAddress=0, count=10)
- 异常处理:捕获SlaveException(设备错误)和IOException(网络错误)
四、Modbus RTU实现
4.1 报文结构
从站地址(1字节) + 功能码(1字节) + 数据域(N字节) + CRC16校验(2字节)
4.2 时序要求
- 字符间隔:必须小于1.5个字符时间,否则视为新报文
- 报文间隔:至少3.5个字符时间(静默期)
- 字符时间计算:11位/字符(1起始位+8数据位+1校验位+1停止位)÷波特率
例如:9600bps时,字符时间=11/9600≈1.15ms,静默期约4ms。
4.3 Python代码示例
使用minimalmodbus库读取温度传感器:
- 配置串口:/dev/ttyUSB0,波特率9600,8N1
- 读取寄存器:read_register(address=0, decimals=1),自动处理CRC
- 超时设置:timeout=1秒,避免死锁
五、常见问题排查
5.1 无响应(超时)
- TCP模式:检查IP地址、端口、防火墙,用telnet测试连通性
- RTU模式:检查波特率、数据位、校验位、停止位是否匹配
- 从站地址:确认设备实际地址(出厂默认常为1或255)
5.2 CRC校验错误
- RS485接线错误(A/B反接)
- 波特率设置错误导致数据错乱
- 电磁干扰:使用屏蔽线,添加终端电阻120Ω
5.3 异常码返回
- 01 - Illegal Function:设备不支持该功能码
- 02 - Illegal Data Address:寄存器地址超出范围
- 03 - Illegal Data Value:写入数据值非法
- 04 - Slave Device Failure:设备内部故障
六、高级应用
6.1 批量读写优化
单次读取最多125个寄存器(功能码03),写入最多123个寄存器(功能码16)。合并零散读写请求可减少网络开销。
6.2 多主站冲突
RTU总线只能有一个主站,多个上位机需要通过网关或仲裁机制协调。TCP模式可支持多客户端并发连接。
6.3 数据类型转换
32位浮点数(Float)需占用2个寄存器,注意字节序(大端/小端)和字序(高字在前/低字在前)。
总结
Modbus协议简单高效,但细节决定成败。掌握报文结构、功能码含义、超时处理和故障排查方法,是开发稳定工业通信软件的基础。王九智能科技在Modbus、OPC UA、EtherCAT等工业协议领域拥有深厚技术积累,可为设备联网和数据采集提供可靠解决方案。