4、通信模块测试:RS485、红外、载波(HPLC/RF)通信接口的自动化测试方案

通信模块测试,说白了就是验证电表能不能跟外界“说上话”。

我做了这么多年嵌入式测试,发现通信问题占了现场故障的六成以上。不是丢包,就是波特率对不上,再不然就是载波信号被干扰。嗯,今天咱们就把RS485、红外、还有载波(HPLC和RF)这三个接口的自动化测试方案捋清楚。

4.1 RS485接口测试:最基础也最容易翻车

RS485是电表最常用的有线通信接口。我个人习惯把它叫做“工业界的串口老兵”——稳定、抗干扰、距离远。但老兵也有老兵的脾气。

注意:RS485是半双工通信,收发不能同时进行。很多新手写测试脚本时忘了切换方向,结果数据全堵在缓冲区里。

4.1.1 自动化测试要点

  • 波特率兼容性测试:电表通常支持1200、2400、4800、9600、19200bps。我建议每个波特率都跑一遍“写-读-校验”闭环。
  • 帧格式验证:数据位、停止位、校验位(偶校验/无校验)必须跟协议一致。我曾经遇到一个项目,现场电表配的是偶校验,但测试脚本写的是无校验,结果通信成功率只有30%。
  • 多节点冲突测试:RS485支持多机通信。挂上3-5个从机,同时发数据,看主站能不能正确解析。

4.1.2 自动化测试脚本示例(Python + pyserial)

import serial
import time

def test_rs485_baudrate(port, baudrate):
    ser = serial.Serial(port, baudrate, bytesize=8, parity='N', stopbits=1, timeout=2)
    # 发送读取电表地址的指令(假设协议为DL/T645)
    cmd = bytes.fromhex('68 AA AA AA AA AA AA 68 11 04 33 33 34 33 16')
    ser.write(cmd)
    time.sleep(0.1)
    resp = ser.read(20)
    if len(resp) > 0:
        print(f"[OK] 波特率 {baudrate} 通信成功")
    else:
        print(f"[FAIL] 波特率 {baudrate} 无响应")
    ser.close()

# 遍历常用波特率
for baud in [1200, 2400, 4800, 9600, 19200]:
    test_rs485_baudrate('COM3', baud)
小技巧:测试RS485时,最好在总线上加一个120Ω终端电阻。不然信号反射会导致误码率飙升。我吃过这个亏,排查了整整两天。

4.2 红外通信测试:光信号的“对焦”难题

红外通信,说白了就是用光波传数据。电表上的红外口通常遵循IEC 62056-21标准(也就是咱们常说的“光学接口”)。

你想想看,红外通信最大的坑是什么?是“对不准”。发射管和接收管必须对准,角度偏一点就收不到。自动化测试里,这个“对准”动作必须用机械臂或固定夹具来保证。

4.2.1 自动化测试方案

  • 物理对准验证:用步进电机控制红外探头,在±15°范围内扫描,记录通信成功率最高的角度。
  • 距离测试:标准要求红外通信距离≥2米(有些厂家标称5米)。我建议在0.5m、1m、2m、3m四个距离点各测100次,统计丢包率。
  • 环境光干扰测试:在红外探头旁边放一盏白炽灯或LED灯,看通信是否被干扰。嗯,这个测试经常被忽略,但现场出问题最多的就是它。

4.2.2 测试数据记录表示例

距离(m) 发送次数 成功次数 丢包率 结论
0.5 100 100 0% 通过
1.0 100 99 1% 通过
2.0 100 95 5% 通过
3.0 100 72 28% 不通过
关键指标:红外通信的丢包率在2米内应低于5%。超过这个值,现场运维人员会骂娘的。

4.3 载波通信测试:HPLC和RF的“信号江湖”

载波通信分两种:HPLC(高速电力线载波)和RF(微功率无线)。

HPLC走的是电线,RF走的是空气。两者各有各的脾气。我个人觉得,HPLC的测试难点在于“电力线噪声”,而RF的难点在于“多径衰落”。

4.3.1 HPLC测试方案

  • 信道衰减测试:在电力线上串联不同阻值的衰减器(10dB、20dB、30dB),看HPLC模块能否正常组网。
  • 噪声注入测试:用信号发生器往电力线上注入白噪声、脉冲噪声(比如模拟电钻启动时的干扰)。我遇到过最离谱的情况是,HPLC模块在50kHz附近有一个固有谐振点,一遇到这个频率的噪声就掉线。
  • 跨相区测试:三相电表,A相和B相之间的HPLC信号衰减很大。必须验证模块能否跨相区通信。

4.3.2 RF测试方案

  • 灵敏度测试:用射频信号源输出-100dBm到-80dBm的微弱信号,看RF模块能否正确解调。
  • 多径干扰测试:在屏蔽室里放金属反射板,模拟城市环境中的多径效应。RF信号会叠加出“死点”,这个必须测。
  • 同频干扰测试:在旁边放一个同频段的干扰源(比如另一个RF模块在发数据),看目标模块的误码率。
避坑指南:我曾经在RF测试中犯过一个低级错误——没关掉实验室的Wi-Fi。结果RF模块一直在跟Wi-Fi抢信道,测试数据惨不忍睹。后来才想起来,RF模块的工作频段(比如470MHz~510MHz)跟Wi-Fi的2.4GHz虽然不重叠,但谐波干扰是存在的。所以测试前,一定要清场。

4.4 自动化测试框架设计思路

说了这么多单项测试,咱们得把它们串起来。我建议用以下架构:

  1. 测试调度层:用Python的unittest或pytest做框架,按测试用例优先级排序。
  2. 硬件抽象层:把RS485、红外、HPLC、RF的驱动封装成统一的接口。比如都叫send()receive(),底层实现不同。
  3. 数据采集层:用数据库(SQLite或InfluxDB)记录每次测试的丢包率、误码率、响应时间。
  4. 报告生成层:自动生成HTML报告,带图表和通过/失败标记。
我的习惯:每个通信接口的测试用例,我都会加一个“边界条件测试”。比如RS485的线长超过1000米时,信号会衰减到多少?红外在强光下会不会误码?这些边界条件,往往是现场故障的根源。

4.5 总结

通信模块测试,说白了就是“发出去,收回来,看对不对”。

RS485测的是电气特性和协议兼容性,红外测的是光学对准和环境干扰,载波测的是信道质量和抗干扰能力。这三块都测透了,电表在现场才能稳如老狗。

嗯,下一章咱们聊聊“费控模块测试”,那又是另一番天地了。