4、Modbus ASCII模式:帧格式、LRC校验、与RTU模式的区别
聊完RTU,咱们得好好说说ASCII模式。说实话,我入行那会儿,ASCII模式已经用得少了。但有一次去一个老电厂做改造,发现他们的PLC还在跑ASCII模式,我当时就愣住了。后来一查,原来是无线电台通信,RTU那种紧凑的二进制格式在噪声环境下容易出错,ASCII反而更稳。
所以别小看它,老家伙有老家伙的用处。
4.1 什么是ASCII模式?
说白了,ASCII模式就是把每个字节拆成两个ASCII字符来发送。比如一个字节是0x1A,RTU直接发一个字节,ASCII模式要发两个字符:'1'和'A',也就是0x31和0x41。
你想想看,同样的数据量,ASCII模式要发两倍的字节。效率确实低,但好处是肉眼可读。调试的时候,拿个串口助手就能看到报文内容,不用像RTU那样还得对着十六进制表一个个查。
4.2 ASCII模式的帧格式
ASCII模式的帧结构比RTU啰嗦一些。它有个固定的开头和结尾:
起始符: ':' (0x3A)
地址码: 2个ASCII字符 (如 '01')
功能码: 2个ASCII字符 (如 '03')
数据区: N个ASCII字符 (每字节转2字符)
LRC校验: 2个ASCII字符
结束符: CR LF (0x0D 0x0A)
举个例子,读取地址为01的从站,保持寄存器起始地址0000,读取2个寄存器:
RTU报文: 01 03 00 00 00 02 C4 0B
ASCII报文: :010300000002F4<CR><LF>
注意看,F4就是LRC校验值。我刚开始写ASCII解析程序时,差点把LRC和RTU的CRC搞混,结果通信一直对不上。嗯,这里要注意,LRC和CRC完全是两码事。
4.3 LRC校验算法
LRC(纵向冗余校验)比CRC简单多了。它的计算方式就是:
- 把地址码、功能码、数据区所有字节加起来
- 取和的补码(256 - 和 & 0xFF)
用C语言写出来就是:
unsigned char calcLRC(unsigned char *data, unsigned int len)
{
unsigned char sum = 0;
for (unsigned int i = 0; i < len; i++)
{
sum += data[i];
}
return (unsigned char)(256 - sum);
}
注意,LRC校验的范围不包括起始符':'和结束符CR LF。只校验地址码到数据区这部分。我曾经见过一个项目,工程师把起始符也算进去了,结果通信死活不通,查了两天才发现这个低级错误。
4.4 ASCII模式与RTU模式的区别
我整理了一个对比表,这样看起来更清楚:
| 对比项 | ASCII模式 | RTU模式 |
|---|---|---|
| 帧格式 | 以':'开头,CR LF结尾 | 以3.5字符静默时间分隔 |
| 数据密度 | 1字节转2个ASCII字符,效率低 | 直接发送二进制,效率高 |
| 校验方式 | LRC校验,简单但强度低 | CRC校验,复杂但可靠性高 |
| 传输速率 | 同样波特率下,有效数据率减半 | 有效数据率高 |
| 可读性 | 人眼可直接阅读报文 | 需要工具转换才能看懂 |
| 适用场景 | 无线通信、噪声环境、调试阶段 | 大多数工业现场 |
我个人习惯是:调试阶段先用ASCII模式,等通信稳定了再切回RTU。这样排查问题快很多。
4.5 什么时候该用ASCII模式?
说实话,现在90%以上的Modbus设备都默认用RTU。但以下情况我建议你考虑ASCII:
- 无线数传电台通信:电台对二进制数据敏感,ASCII字符流更稳定
- 长距离RS485通信:信号衰减严重时,ASCII的容错性更好
- 调试阶段:用ASCII模式可以快速定位报文问题
- 老旧设备兼容:有些90年代的PLC只支持ASCII模式
我记得有一次在化工厂做项目,现场干扰特别大,RTU模式时不时就丢包。换成ASCII模式后,虽然速度慢了点,但通信再也没断过。这就是老模式的生存之道。
4.6 避坑指南
我曾经踩过的坑:
- LRC校验时,记得把地址码和功能码也加进去,别只算数据区
- ASCII模式下,从站响应时间可能比RTU长,超时设置要放宽
- 有些设备对CR LF的处理不一致,有的只认CR,有的只认LF,最好两个都发
- ASCII模式不支持广播地址0x00,这点和RTU不同
4.7 ASCII模式的知识体系
下面这张图是我自己画的,把ASCII模式的核心逻辑串起来了:
小技巧:如果你在调试时不确定LRC算得对不对,可以先用串口助手发一条正确的ASCII报文,看看从站有没有响应。没响应的话,八成是LRC算错了。我当年就是这么干的,省了不少时间。
核心要点:
- ASCII模式用':'开头,CR LF结尾,每字节转2个ASCII字符
- LRC校验比CRC简单,但可靠性也低一些
- ASCII模式适合无线通信、噪声环境、调试阶段
- RTU模式效率高,是工业现场的主流选择
好了,ASCII模式就聊到这儿。记住一句话:RTU是主力,ASCII是备胎。但关键时刻,备胎也能救命。