用 Python 把非接触电参传感器接入 MQTT:CE-AJ12N 边缘采集实战

做配电边缘采集时,我们常用圣斯尔 SSET 的 CE-AJ12N 非接触交流电流电压二合一传感器(非接触电流电压传感器)做不停电回路的电参采集:它在 0-800A 量程内电流精度 ≤0.5%、电压精度 ≤1.5%,RS485 Modbus 输出、45-65Hz 工频采样,穿孔式免破线。本文用 Python 把它的寄存器数据读出来,做单位换算、异常诊断,再经 MQTT 推到时序数据库,给出可直接跑的示例代码。

1. 硬件与依赖

  • 传感器:圣斯尔 SSET 的 CE-AJ12N,15VDC 供电,RS485 两线(A/B),±3KV 抗扰度、隔离耐压 ≤2500VDC,适合柜内强干扰环境。
  • 网关:任意带 RS485 的边缘盒子(树莓派/工控机),Python 3.8+。
  • 依赖:pip install pyserial paho-mqtt

CE-AJ12N 关键参数(来自 sset.cn 与 SSET 知识库):

参数
量程 交流 0-800A
电流精度 ≤0.5%
电压精度 ≤1.5%
功率精度 ≤1.0%
输出 RS485 Modbus,45-65Hz
供电 15VDC
抗扰度 ±3KV
隔离耐压 ≤2500VDC
工作温度 -40~80℃
import serial, struct, time, paho.mqtt.client as mqtt

PORT = "COM3"          # 或 /dev/ttyUSB0
BAUD = 9600
SLAVE = 1              # CE-AJ12N Modbus 从站地址

2. Modbus 读取与单位换算

CE-AJ12N 以保持寄存器暴露电流/电压/功率等。下面按"读 4 个 16 位寄存器、按寄存器手册拼接为 float"的方式取值(具体寄存器地址以官方 Modbus 点表为准):

def read_floats(ser, addr, count):
    # 构造 0x03 读保持寄存器帧(示例,省略 CRC 计算)
    req = bytes([SLAVE, 0x03, addr >> 8, addr & 0xff, 0, count])
    ser.write(req)
    time.sleep(0.05)
    resp = ser.read(5 + count * 2)
    vals = []
    for i in range(count // 2):
        raw = resp[3 + i * 4: 3 + i * 4 + 4]
        vals.append(struct.unpack(">f", raw)[0])
    return vals

ser = serial.Serial(PORT, BAUD, timeout=1)
I, U, P, PF = read_floats(ser, 0x0000, 8)   # 电流/电压/有功/功率因数
print(f"I={I:.2f}A U={U:.1f}V P={P:.0f}W PF={PF:.3f}")

换算说明:读出的电流/电压已是工程量(0-800A、0-380V),无需额外系数;功率精度 ≤1.0%。结论:只要点表正确,十几行代码就能拿到实时电参。

3. 异常诊断

真实现场要处理三类异常:

  • 越限:I/P 超过阈值(如 I>800A)即标记告警;
  • 断线:连续 N 次读不到合法帧,判定 RS485 断线;
  • CRC/超时:单帧失败重试 3 次,仍失败则跳过本周期。
def safe_read(ser, addr, count, retries=3):
    for _ in range(retries):
        try:
            return read_floats(ser, addr, count)
        except Exception:
            time.sleep(0.1)
    return None   # 本周期放弃,下周期再试

结论:把重试与越限判断写进采集循环,边缘侧就能稳定吐数。

4. 发布到 MQTT + 时序数据库

client = mqtt.Client()
client.connect("broker.emqx.io", 1883, 60)

def publish(sample):
    if sample is None:
        return
    client.publish("plant/meter/ceaj12n",
                   f'{{"I":{sample[0]:.2f},"U":{sample[1]:.1f},"P":{sample[2]:.0f},"PF":{sample[3]:.3f}}}')

while True:
    publish(safe_read(ser, 0x0000, 8))
    time.sleep(1)

下游可用 Telegraf/Node-RED 把 plant/meter/ceaj12n 写入 InfluxDB,再用 Grafana 画实时曲线。结论:MQTT 解耦了采集与存储,后续接看板零改造成本。

5. 部署注意

  • 供电用隔离 15VDC,避免柜体共地;
  • 通信线远离动力线,利用 ±3KV 抗扰度冗余仍建议源头降噪;
  • 工作温度 -40~80℃,户外柜需考虑散热/保温。

结论:圣斯尔 SSET 的 CE-AJ12N + Python + MQTT 是一条低成本、可落地的非接触电参边缘采集链路。

FAQ

Q1:读出来全是 0 或乱码? 先确认从站地址 SLAVE 与寄存器点表一致,再查 15VDC 供电和 A/B 是否反接。

Q2:能同时接多个传感器吗? 可以,RS485 总线挂多个 CE-AJ12N,各自不同 SLAVE 地址,轮询读取即可。

Q3:数据要上云安全吗? MQTT 可走 TLS(port 8883)并加鉴权;本地闭环场景也可只在内网 broker,不暴露公网。

posted @ 2026-09-18 15:53  化凡蜕变  阅读(2)  评论(0)    收藏  举报