4. 通信技术详解(上):RS485通信与红外通信

各位同学,大家好。今天我们进入通信技术这个硬核话题。说实话,智能电表如果没有通信,那就是个高级计数器,没啥灵魂。这一章我们重点讲两个最经典的通信方式:RS485和红外通信。这两个技术,一个是有线,一个是无线(红外也算无线的一种),在电表行业里摸爬滚打了几十年,至今仍是主力。

我个人习惯把通信技术分成两派:一派是“干活派”,比如RS485,稳定可靠,适合现场组网;另一派是“运维派”,比如红外,适合现场抄表、参数设置。咱们一个一个来拆解。

4.1 RS485通信:物理层那些事儿

RS485,说白了就是一种差分信号传输技术。它用两根线(A和B)来传数据,靠的是两根线之间的电压差来判断是0还是1。为什么电表行业这么爱它?因为抗干扰能力强,传输距离远,能到1200米以上,而且支持多节点挂载——一条总线上挂32个设备是家常便饭。

物理层关键参数:

  • 传输方式:半双工。同一时刻只能发或收,不能同时干两件事。
  • 信号电平:A线比B线高200mV以上表示逻辑1,反之表示逻辑0。
  • 终端电阻:总线两端各加一个120Ω电阻,防止信号反射。我刚开始做项目时忘了加这个,结果通信时好时坏,查了两天才发现是终端电阻没焊。
  • 共模电压范围:-7V到+12V,这个范围挺宽的,所以RS485在工业现场很皮实。

避坑指南:我曾经在一个项目中,RS485总线长度超过500米,波特率设成了115200bps,结果数据全是乱码。后来降到9600bps,稳如老狗。记住一个经验公式:距离越长,波特率就得越低。别贪快。

4.2 Modbus协议栈实现

RS485只解决了物理层的问题,但数据怎么组织、怎么解析,还得靠协议。Modbus就是电表行业的事实标准。它有两种模式:RTU(二进制模式)和ASCII(文本模式)。电表里99%用RTU,因为效率高。

Modbus RTU帧结构:

字段 长度 说明
地址码 1字节 设备地址,范围1-247
功能码 1字节 比如03读寄存器,06写单个寄存器
数据域 N字节 具体的数据内容
CRC校验 2字节 循环冗余校验,低字节在前

你想想看,一个完整的Modbus报文,其实就这四部分。地址码告诉总线上的设备“这是发给谁的”,功能码告诉设备“你要干什么”,数据域是具体参数,CRC用来检查数据有没有传错。

代码示例:Modbus CRC16计算

uint16_t Modbus_CRC16(uint8_t *buf, uint16_t len)
{
    uint16_t crc = 0xFFFF;
    for (uint16_t i = 0; i < len; i++)
    {
        crc ^= buf[i];
        for (uint8_t j = 0; j < 8; j++)
        {
            if (crc & 0x0001)
                crc = (crc >> 1) ^ 0xA001;
            else
                crc >>= 1;
        }
    }
    return crc;
}

这段代码我用了好多年,基本没改过。注意一点:CRC计算时,初始值是0xFFFF,多项式是0xA001。嗯,这里要注意,很多新手会把高低字节搞反,导致校验通不过。我建议你写完之后,用Modbus调试工具验证一下。

我的经验:实现Modbus协议栈时,别一上来就写完整版。先实现03和06两个功能码,能读能写就够了。等跑通了,再慢慢加其他功能码。我见过有人一口气写了十几个功能码,结果调试时一个都跑不通,心态直接崩了。

4.3 红外通信:IEC62056-21协议

红外通信,说白了就是用红外光来传数据。电表上的红外口,通常是一个透明的窗口,里面藏着红外收发管。它的好处是:非接触、电气隔离、不怕雷击。坏处是:距离短(一般不超过1米),而且必须对准。

IEC62056-21协议要点:

  • 物理层:使用红外光,波长940nm左右,调制频率38kHz。为什么是38kHz?因为这样可以抗环境光的干扰。
  • 数据格式:异步串行,波特率通常为300bps或9600bps。300bps是默认的,握手成功后可以切换到高速。
  • 协议模式:协议定义了三种模式——模式A、模式B、模式C。电表里最常用的是模式C,支持双向通信。

我记得有一次去现场调试,红外抄表死活连不上。折腾了半天,发现是抄表器的红外窗口贴了膜,红外光透不过去。撕掉膜,秒连。所以,红外通信的物理对准和清洁度,真的很重要。

IEC62056-21的通信流程:

  1. 唤醒:抄表器发送一串BREAK信号(至少33个0),唤醒电表。
  2. 识别:电表回复设备标识,比如制造商代码、设备类型等。
  3. 协议协商:双方协商通信模式和数据速率。
  4. 数据交换:按照协商好的参数,进行数据读写。

注意:IEC62056-21协议中,数据帧的结束符是固定的。发送完数据后,必须发送一个特定的结束序列,否则电表会认为数据没传完,一直等在那里。我曾经犯过这个错,结果电表死锁了,只能断电重启。

4.4 RS485 vs 红外:怎么选?

很多同学会问:这两个技术,到底用哪个?我的建议是:

  • 需要远程组网、集中抄表:用RS485。它适合做本地通信网络,一条总线挂几十个表,通过集中器统一采集。
  • 现场运维、参数设置:用红外。运维人员拿着手持终端,对着电表窗口一照,就能读数据、改参数,方便快捷。
  • 两者互补:实际上,大多数智能电表两个接口都有。RS485用于日常数据采集,红外用于现场调试和应急操作。

你想想看,如果只有RS485,现场运维人员还得带电脑、接线,多麻烦。如果只有红外,集中抄表又实现不了。所以,两个都上,才是成熟的设计思路。

总结一下:RS485是电表的“骨架”,负责稳定可靠的数据传输;红外是电表的“触角”,负责灵活便捷的现场交互。两者结合,才能构建一个完整的智能电表通信体系。

好了,这一章的内容就到这里。下一章我们继续讲通信技术,重点聊聊无线通信——LoRa和NB-IoT,那又是另一番天地了。