由于公司前段时间在做一个能效监管的项目,其中需要读取型号PM5350的施耐德电度表(还有iEM3100 系列 / iEM3200 系列电度表,和PM5350读取方式一样)。这两款表都是通过RS485通信,使用的是标准modbus协议。项目需要读取它的三相电压、电流和总电能量。
通过查看产品技术手册,按modbus协议常规组帧模式用“设备地址”+“功能码为读保持寄存器 03H”+“相应数据寄存器地址”+...去抄读数据进行解析(modbus 协议的传输是RTU模式即16进制码),多次反复读取解析验证每项数据都与实际电度表显示数据不对应。经大量查询相关资料并与施耐德客服多次咨询,最终发现两个问题导致数据不对应。
一、读取施耐德电度表数据时,要把寄存器地址减1后组帧抄读,不能直接按点表中的寄存器地址。如读取A相电流时寄存器地址应为2999。
电流点表如下:
电压点表如下:
电能量点表如下:
二、施耐德电度表内存数据存放模式为大端模式, 我们在读取到数据后要将内存数据按小端模式转化后再解析显示就为正确的数据值。
大端模式和小端模式说明
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
我们常用的X86结构(电脑)是小端模式,而有些单片机为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
施耐德电度表返回数据解析举例:
1、总电量返回帧: 07 03 08 00 00 00 01 A5 02 C5 E8 66 8D 7063,389672 wh
2、电压返回帧: 07 03 0C 45 D6 3C CD 45 D6 11 9A 45 D6 1B 33 F0 D1 6855.6V 6850.2V 6851.4V