4、Modbus ASCII模式:帧格式、LRC校验、与RTU模式的区别

聊完RTU,咱们得好好说说ASCII模式。说实话,我入行那会儿,ASCII模式已经用得少了。但有一次去一个老电厂做改造,发现他们的PLC还在跑ASCII模式,我当时就愣住了。后来一查,原来是无线电台通信,RTU那种紧凑的二进制格式在噪声环境下容易出错,ASCII反而更稳。

所以别小看它,老家伙有老家伙的用处。

4.1 什么是ASCII模式?

说白了,ASCII模式就是把每个字节拆成两个ASCII字符来发送。比如一个字节是0x1A,RTU直接发一个字节,ASCII模式要发两个字符:'1''A',也就是0x310x41

你想想看,同样的数据量,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简单多了。它的计算方式就是:

  1. 把地址码、功能码、数据区所有字节加起来
  2. 取和的补码(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模式的核心逻辑串起来了:

Modbus ASCII模式知识体系 帧格式 起始符: ':' (0x3A) 地址码: 2个ASCII字符 功能码: 2个ASCII字符 数据区: N个ASCII字符 LRC校验: 2个ASCII字符 结束符: CR LF LRC校验 1. 累加所有字节 2. 取补码 3. 转2个ASCII字符 校验范围: 地址~数据区 不包括':'和CR LF 与RTU区别 帧格式不同 校验方式不同 数据效率不同 可读性不同 适用场景不同 适用场景 无线通信 噪声环境 调试阶段 老旧设备 核心逻辑:帧格式决定通信规则,LRC保证数据完整性,与RTU的差异决定选型 ⚠ 避坑:LRC校验范围不包括':'和CR LF,从站响应超时需放宽

小技巧:如果你在调试时不确定LRC算得对不对,可以先用串口助手发一条正确的ASCII报文,看看从站有没有响应。没响应的话,八成是LRC算错了。我当年就是这么干的,省了不少时间。

核心要点:

  • ASCII模式用':'开头,CR LF结尾,每字节转2个ASCII字符
  • LRC校验比CRC简单,但可靠性也低一些
  • ASCII模式适合无线通信、噪声环境、调试阶段
  • RTU模式效率高,是工业现场的主流选择

好了,ASCII模式就聊到这儿。记住一句话:RTU是主力,ASCII是备胎。但关键时刻,备胎也能救命。


专注资料整理