在工业自动化领域,位移传感器输出的数字信号需要通过通讯协议与PLC、DCS或数据采集系统交互。其中Modbus RTU是最广泛使用的串行通讯协议,几乎所有的位移传感器厂商都支持这一标准。本文将深入解析Modbus RTU协议细节,并给出位移传感器的实际配置指南。
如果您的传感器采用RS485物理层接口,请结合阅读位移传感器RS485通讯故障排查与解决指南,两者配合使用效果更佳。
一、Modbus RTU协议概述
1.1 什么是Modbus RTU?
Modbus是1979年由Modicon(现施耐德电气)发明的通讯协议,RTU(Remote Terminal Unit)是其三种传输模式之一。Modbus RTU具有以下特点:
- 开放标准:无版权限制,任何厂商都可免费实现
- 结构简单:主从架构,一条指令一个响应
- 可靠性高:CRC-16循环冗余校验,误码率极低
- 兼容性强:支持RS232、RS485、RS422等多种物理层
- 应用广泛:工业自动化、楼宇控制、电力监控等领域通用
1.2 Modbus三种模式对比
| 特性 | Modbus RTU | Modbus ASCII | Modbus TCP |
|---|---|---|---|
| 编码方式 | 二进制 | ASCII十六进制 | 二进制 |
| 物理层 | RS485/RS232 | RS485/RS232 | 以太网 |
| 校验方式 | CRC-16 | LRC(纵向冗余校验) | TCP校验和 |
| 帧定界 | 3.5字符时间间隔 | 冒号(:)开头+CR/LF结尾 | MBAP头部长度 |
| 传输效率 | 高(二进制紧凑) | 低(每字节用2个ASCII字符) | 最高 |
| 位移传感器支持 | 主流方案 | 少数厂商支持 | 高端型号支持 |
位移传感器绝大多数采用Modbus RTU over RS485方案,兼顾传输效率和抗干扰能力。
二、Modbus RTU帧结构详解
2.1 标准帧格式
一个完整的Modbus RTU帧由以下部分组成:
| 字段 | 字节数 | 说明 |
|---|---|---|
| 从站地址(Slave Address) | 1字节 | 1~247,0为广播地址 |
| 功能码(Function Code) | 1字节 | 0x01~0x7F,定义操作类型 |
| 数据区(Data) | N字节 | 内容随功能码变化 |
| CRC校验(CRC-16) | 2字节 | 低字节在前,高字节在后 |
帧与帧之间通过至少3.5个字符时间的空闲间隔来分隔。在9600bps下,一个字符时间约1.04ms,3.5字符时间约3.65ms。
2.2 实际报文示例
以读取位移传感器当前位置值为例(从站地址0x01,功能码0x03,读取保持寄存器0x0000,长度2个寄存器):
主站请求帧:
01 03 00 00 00 02 C4 0B
分解:01=从站地址,03=功能码(读保持寄存器),00 00=起始寄存器地址,00 02=读取2个寄存器,C4 0B=CRC校验
从站响应帧:
01 03 04 00 0A 13 88 7A 33
分解:01=从站地址,03=功能码,04=返回数据字节数(4字节=2个寄存器),00 0A 13 88=数据(0x000A=10, 0x1388=5000),7A 33=CRC校验
这里0x000A和0x1388可能分别代表位移量的整数部分和小数部分,具体含义取决于传感器的寄存器映射表。
三、常用功能码详解
Modbus协议定义了多种功能码,位移传感器常用的有以下几种:
| 功能码 | 操作 | 数据类型 | 位移传感器用途 |
|---|---|---|---|
| 0x03 | 读保持寄存器 | Read Holding Registers | 读取位移值、速度值 |
| 0x04 | 读输入寄存器 | Read Input Registers | 读取只测量的物理量 |
| 0x06 | 写单个寄存器 | Write Single Register | 设置从站地址、波特率 |
| 0x10 | 写多个寄存器 | Write Multiple Registers | 批量配置参数 |
| 0x08 | 诊断功能 | Diagnostics | 通讯链路诊断 |
3.1 功能码0x03:读保持寄存器
这是位移传感器最常用的功能码,用于读取当前测量值。典型寄存器映射:
| 寄存器地址 | 内容 | 数据格式 | 说明 |
|---|---|---|---|
| 0x0000 | 位移值高位 | 16位无符号 | 量程的整数部分 |
| 0x0001 | 位移值低位 | 16位无符号 | 量程的小数部分(放大1000倍) |
| 0x0002 | 速度值 | 16位有符号 | mm/s,含方向 |
| 0x0003 | 状态字 | 16位 | bit0=就绪, bit1=报警, bit2=超量程 |
| 0x0010 | 量程范围 | 16位无符号 | 满量程值(mm) |
注意:不同厂商的寄存器映射表不同,以上为通用示例。ETME拉绳位移传感器的具体寄存器定义请参考ETME拉绳位移传感器RS485协议说明。
3.2 异常响应
当从站无法执行请求时,返回异常响应。异常响应的功能码最高位置1(即原功能码+0x80),并附带异常码:
| 异常码 | 名称 | 含义 | 常见原因 |
|---|---|---|---|
| 0x01 | 非法功能码 | 不支持该功能码 | 传感器不支持此操作 |
| 0x02 | 非法数据地址 | 寄存器地址不存在 | 寄存器映射表查错 |
| 0x03 | 非法数据值 | 数值超出允许范围 | 写入的参数值不合法 |
| 0x04 | 从站设备故障 | 传感器内部错误 | 硬件故障或存储器异常 |
| 0x06 | 从站忙 | 设备正在处理 | 上一条命令未执行完毕 |
四、CRC-16校验详解
CRC(Cyclic Redundancy Check)校验是Modbus RTU保证数据完整性的核心机制。Modbus使用的CRC-16算法参数如下:
- 多项式:0xA001(即0x8005的位反转)
- 初始值:0xFFFF
- 输入反转:是
- 输出反转:是
- 最终异或值:0x0000
4.1 CRC计算步骤
- 预置CRC寄存器为0xFFFF(16位全1)
- 取第一个字节与CRC低8位异或,结果放回CRC寄存器
- CRC寄存器右移1位,最低位填0
- 如果移出的位为1,CRC寄存器异或0xA001
- 重复步骤3~4共8次(处理完1个字节)
- 取下一个字节,重复步骤2~5,直到所有字节处理完毕
- 最终CRC寄存器的值即为校验码,发送时低字节在前
4.2 CRC校验C语言实现
uint16_t Modbus_CRC16(uint8_t *data, uint16_t length)
{
uint16_t crc = 0xFFFF;
uint16_t i, j;
for (i = 0; i < length; i++)
{
crc ^= data[i];
for (j = 0; j < 8; j++)
{
if (crc & 0x0001)
crc = (crc >> 1) ^ 0xA001;
else
crc >>= 1;
}
}
return crc;
}
在实际开发中,CRC校验是最常见的通讯错误来源之一。如果主站计算的CRC与接收到的CRC不一致,整帧数据将被丢弃。
五、位移传感器Modbus RTU配置步骤
5.1 硬件准备
- 位移传感器(支持RS485 Modbus RTU输出)
- RS485转USB转换器(如USB-485)或PLC的RS485通讯口
- 屏蔽双绞线(特性阻抗120Ω)
- 120Ω终端电阻×2(总线首尾各一个)
- 24V DC直流电源
5.2 接线
| 传感器端子 | 连接到 | 说明 |
|---|---|---|
| V+ (24V) | 电源正极 | 注意极性,接反可能损坏 |
| V- (GND) | 电源负极 | 与RS485的GND共地 |
| A (D+) | RS485 A线 | 主站和从站的A对应连接 |
| B (D-) | RS485 B线 | 主站和从站的B对应连接 |
| SG (信号地) | RS485 GND | 长距离时必须连接 |
关于RS485接线和终端电阻的详细说明,请参考RS485通讯故障排查指南。
5.3 串口参数配置
使用串口调试工具(如Modbus Poll、SSCOM、ModScan)前,必须先确认以下参数与传感器出厂默认值一致:
| 参数 | 常见默认值 | 设置方法 |
|---|---|---|
| 波特率 | 9600 | 查看铭牌或说明书 |
| 数据位 | 8 | Modbus RTU固定8位 |
| 校验位 | 无校验(None) | 部分厂商默认偶校验(Even) |
| 停止位 | 1或2 | 无校验时通常为2位停止位 |
| 从站地址 | 1 | 出厂默认,可通过功能码0x06修改 |
5.4 读取位移值实操
使用Modbus Poll软件的配置步骤:
- 打开Modbus Poll,点击Connection → Connect,选择RS485转换器对应的COM口
- 设置波特率9600、数据位8、校验无、停止位1(或2)
- Slave ID填入1(传感器默认地址)
- Function选择03 (Read Holding Registers)
- Start Address填0,Quantity填2
- 点击OK,如果配置正确,数据区会显示实时位移值
如果显示的数据值与实际位移不符,可能需要按照寄存器映射表进行数据解析。例如,两个寄存器合并为一个32位浮点数:高16位在前还是低16位在前,取决于传感器的具体定义。
六、PLC对接配置
6.1 西门子S7-1200/1500 Modbus RTU通讯
西门子PLC通过Modbus RTU库指令实现通讯,主要步骤:
- 在博途(TIA Portal)中添加"Modbus_Comm_Load"指令初始化通讯端口
- 使用"Modbus_Master"指令发送请求,MODE=0表示读取
- DATA_ADDR设置寄存器地址,DATA_LEN设置读取数量
- DATA_PTR指向存储区(如DB块),接收返回的数据
- 通过定时器或循环OB控制轮询周期(建议≥100ms)
6.2 三菱FX系列Modbus RTU通讯
三菱FX5U系列内置Modbus RTU指令:
- 使用MBRW指令(Modbus Read/Write)
- 参数1:从站地址(1~247)
- 参数2:功能码(03=读保持寄存器)
- 参数3:寄存器起始地址
- 参数4:读取数量
- 参数5:数据存储软元件(如D100)
6.3 数据解析注意事项
从Modbus寄存器读到的原始数据需要转换为实际物理量。常见转换方式:
| 数据格式 | 寄存器数量 | 转换公式 | 示例 |
|---|---|---|---|
| 16位无符号整数 | 1 | 实际值 = 原始值 × 分辨率 | 5000 × 0.01mm = 50.00mm |
| 32位整数(双寄存器) | 2 | 高字×65536 + 低字 | 0x0001 × 65536 + 0x3880 = 99968 |
| 32位浮点数(IEEE 754) | 2 | 直接按float解析 | 0x42488000 = 50.125 |
| BCD码 | 1 | 每4位表示1位十进制 | 0x5000 = 5000 |
字节序问题:32位数据在两个寄存器中的排列顺序有四种模式(Big-Endian/Big-Endian Byte Swap/Little-Endian/Little-Endian Byte Swap),必须与传感器说明书一致,否则解析出的数值完全错误。
七、常见问题与排查
7.1 通讯完全不通
排查优先级从高到低:
- 检查A/B线是否接反:交换A/B线测试
- 检查波特率/校验位:用串口工具逐一扫描
- 检查从站地址:确认Modbus Poll中Slave ID与传感器一致
- 检查终端电阻:首尾各120Ω,中间不加
- 检查供电:万用表测量传感器供电电压是否正常
更详细的RS485物理层排查方法,请阅读位移传感器RS485通讯故障排查与解决指南。
7.2 能通讯但数据值不对
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 值固定不变 | 寄存器地址错误/读的是配置区而非测量区 | 核对寄存器映射表 |
| 值超大或出现负数 | 字节序不匹配 | 切换Big/Little Endian |
| 值跳变剧烈 | 电磁干扰/CRC校验失败丢包 | 排查干扰源,参考RS485干扰源排查 |
| 值乘以了固定倍数 | 分辨率系数未应用 | 查看说明书中的resolution参数 |
| 两个传感器值互换 | 从站地址冲突 | 修改其中一个的Slave ID |
7.3 通讯偶尔中断
间歇性通讯失败通常是干扰或总线负载问题:
- 轮询周期过短:主站查询间隔小于传感器响应时间,导致总线冲突。建议轮询间隔≥100ms
- 从站数量过多:RS485标准为32个节点,超出需使用中继器
- 电磁干扰:信号线远离动力电缆,加装磁环,使用屏蔽双绞线。详见位移传感器干扰现象及抗干扰措施
- 线缆过长:9600bps建议不超过1200m,超过需降低波特率或加中继器
八、Modbus RTU vs 其他总线协议
除了Modbus RTU,位移传感器还支持其他总线协议,各有适用场景:
| 协议 | 物理层 | 实时性 | 节点数 | 适用场景 |
|---|---|---|---|---|
| Modbus RTU | RS485 | 中 | 32 | 通用,成本最低 |
| CANopen | CAN | 高 | 127 | 运动控制,多轴同步 |
| Profibus-DP | RS485 | 高 | 126 | 西门子生态 |
| PROFINET | 以太网 | 最高 | 256+ | 高速高精度应用 |
| EtherCAT | 以太网 | 最高 | 65535 | 超高速分布式系统 |
如需了解CAN总线终端电阻配置,可参考CAN总线终端电阻详解。PROFINET方案可查看199系列Profinet磁致伸缩位移传感器,EtherCAT方案可参考197 EtherCAT位移传感器使用说明。
九、总结与建议
Modbus RTU作为工业通讯的"普通话",掌握其帧结构、功能码、CRC校验和寄存器映射是位移传感器数字通讯开发的基础。实际应用中需要注意以下几点:
- 先读说明书:每个厂商的寄存器映射表不同,切勿凭经验猜测
- 先调通物理层:RS485接线正确是前提,参考RS485排查指南
- 用工具调试:Modbus Poll/ModScan直连测试,排除PLC配置干扰
- 注意字节序:32位数据的高低位顺序是最常见的解析错误
- 合理轮询:间隔≥100ms,避免总线拥塞
- 做好防护:终端电阻、屏蔽接地、浪涌保护缺一不可
易测电气全系RS485输出型位移传感器(拉绳式、磁致伸缩式、LVDT式)均支持标准Modbus RTU协议,提供完整寄存器映射表和技术支持。如有选型或通讯调试需求,欢迎咨询。
相关文章推荐
- 位移传感器RS485通讯故障排查与解决指南 — RS485物理层六大故障根因与7步排查流程
- ETME拉绳位移传感器RS485协议说明 — ETME拉绳传感器Modbus寄存器定义与帧格式
- RS485输出接口的干扰源有哪些? — RS485干扰源分类与抗干扰设计措施
- 位移传感器干扰现象及抗干扰措施详解 — 电磁干扰对位移传感器的影响及防护方案
- CAN总线终端电阻为什么如此重要? — CAN总线与RS485终端电阻原理对比
- 位移传感器4-20mA和0-10V怎么选? — 模拟量输出与数字通讯的信号选型对比


客服1