用 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,不暴露公网。
浙公网安备 33010602011771号