前三课讲了串口原理、Modbus RTU 协议和称重传感器的标定原理。这一课全部落地:只用一个 USB 转 RS485 模块和免费的串口调试助手,亲手读出变送器里的重量值,再顺手把秤清零。
>
全课围绕一句话展开——只要懂这串代码:01 03 00 00 00 03 05 CB,Modbus 就入门了。
需要的硬件只有两样:
接线只有两根线,遵循 A 接 A、B 接 B:
接好后打开设备管理器确认 COM 口号,打开串口调试助手,选择对应 COM 口,参数按变送器出厂默认设置:
| 参数 | 值 |
|---|---|
| 波特率 | 9600 |
| 数据位 | 8 |
| 校验位 | 无 |
| 停止位 | 1 |
这四个参数必须和变送器完全一致,否则收到的是乱码或干脆没有应答。
发报文之前先查手册里的寄存器表,这是整个实战最重要的一张表:
| 协议地址 | 内容 | 说明 |
|---|---|---|
| 0 ~ 1 | 重量 | 32 位有符号数,占两个寄存器 |
| 2 | 精度 | 小数位数,比如 2 表示两位小数 |
| 4 | 置零 | 写 1 执行清零(去皮) |
两个关键点:
一帧 RTU 报文 = 地址 + 功能码 + 数据 + CRC。逐字节拆开这帧请求:
| 字节 | 值 | 含义 |
|---|---|---|
| 1 | 01 | 从站地址(变送器拨码设的站号 1) |
| 2 | 03 | 功能码:读保持寄存器 |
| 3-4 | 00 00 | 起始地址 0(重量寄存器的开头) |
| 5-6 | 00 03 | 寄存器数量 3 个(重量 2 个 + 精度 1 个) |
| 7-8 | 05 CB | CRC16 校验(低位在前) |
CRC 不能手算也不能背,它是对前 6 个字节做 CRC16 算法得出的两个字节的校验值。调试助手一般能自动附加 CRC;自己写程序时用代码现算,粘错一个 CRC 总线上的设备就会直接丢弃这帧。
点击发送,模块立刻应答:
01 03 06 00 03 E6 70 00 02 D2 27
紧跟功能码的那个 06 是数据字节数:
为什么是 6?1 个寄存器 = 16 位 = 2 字节,读了 3 个寄存器,就是 3 × 2 = 6 字节。这是检查应答是否合法的第一道关卡:字节数和寄存器数量对不上,说明通讯出了问题。
6 个数据字节分三组:
| 字节 | 含义 |
|---|---|
00 03 | 重量的高 16 位 |
E6 70 | 重量的低 16 位 |
00 02 | 精度:2 位小数 |
把高 16 位和低 16 位拼成一个 32 位数:
0x0003E670 = 255600(十进制)
注意 255600 还不是公斤,它只是变送器内部的整数值。精度寄存器告诉我们小数点在哪:精度 = 2,就把小数点向左移两位——
255600 ÷ 100 = 2556.00 kg
实际项目里变送器的小数位数是可设置的,所以规范做法永远是"重量值 × 精度"一起读,动态移小数点,而不是写死除以 100。
计算机底层只有 0 和 1,数据分有符号 / 无符号两种解读:
那负重量在报文里长什么样?比如秤上挂了 -10 kg:
-10 的 32 位补码 = 0xFFFF FFF6
推导方法:10 的十六进制是 0x0000 000A,取反加一(补码规则)得到 0xFFFF FFF6。
好消息是:只要解析程序里把变量声明成有符号整型(C 的 int32_t、C# 的 int、PLC 的 D 寄存器按有符号读),它会自动完成补码换算,直接得到 -10,不需要手工转换。
秤台上放着包装箱,你想把这部分重量当"皮重"去掉,让读数归零。查表:地址 4,写 1 即清零。
用 06 功能码(写单个寄存器)构造报文:
01 06 00 04 00 01 09 CB │ │ │───│ │───│ └─ CRC │ │ │ │ └─ 数据:写 1 │ │ └─ 寄存器地址 4(置零) │ └─ 功能码 06:写单个寄存器 └─ 站号 1
发送后模块会原样回显这条指令——06 写指令的应答就是请求本身。看到回显就知道清零成功,再发一次读取指令,重量值已经归零。
注意:置零只在空载附近的小范围内有效(防误操作),大重量压秤时发置零指令会被拒绝。
整个流程五步:
01 03 00 00 00 03 05 CB → 01 03 06 00 03 E6 70 00 02 D2 2701 06 00 04 00 01 09 CB,回显即成功常见问题速查:
| 现象 | 原因 |
|---|---|
| 完全无应答 | A/B 接反、站号不对、串口参数不一致 |
| 应答乱码 | 波特率/校验位不匹配 |
| 助手提示 CRC 错误 | 报文抄错、或助手没开 CRC 附加 |
| 读出的数字巨大无比 | 字序没处理,见第五课"高低字大坑" |
下一篇(第五课)就把电脑换成 PLC,让整套读取流程自动跑起来。