4. 电力参数测量与Modicon集成
在能源管理控制系统中,Modicon PLC 承担着“数据汇聚与预处理”的角色。智能电表负责把电压、电流、功率、电能等物理量转换为数字量,而 PLC 需要通过 Modbus 协议把这些数字量读入,再还原成具有工程意义的浮点或整型数值,供上位机、HMI 或能源管理软件使用。本节围绕“读什么、怎么读、读回来怎么算”三个核心问题展开,重点讲清 Modbus 寄存器映射、Control Expert 中的读取指令以及标度变换的实现方法。
一、智能电表的 Modbus 数据模型
绝大多数支持 Modbus 的智能电表,其内部数据按“功能码 + 寄存器地址”组织。常见约定如下:
- 03 功能码(读保持寄存器):读取测量值、电能累计值、参数设置值,是最常用的功能码。
- 04 功能码(读输入寄存器):部分电表把实时测量值放在输入寄存器区,只读。
- 寄存器宽度:单寄存器为 16 位;功率、电能等 32 位量通常占用两个连续寄存器,存在“高字在前”或“低字在前”两种字节序。
- 数据类型:可能是无符号整数、有符号整数、32 位浮点数(IEEE 754),也可能是带固定倍率的整数。
以某类常见三相多功能电表为例(以下参数为教学示例,实际以设备手册为准):
| 参数 | 寄存器地址(示例) | 功能码 | 数据类型 | 倍率 | 单位 |
|---|---|---|---|---|---|
| A 相电压 | 0x0000 | 03 | UINT16 | 0.1 | V |
| A 相电流 | 0x0002 | 03 | UINT16 | 0.01 | A |
| 有功功率 | 0x0010 | 03 | INT32 | 0.001 | kW |
| 正向有功电能 | 0x0020 | 03 | UINT32 | 0.01 | kWh |
这张表就是后续编程的“字典”。没有它,读回来的数字只是无意义的整数。工程上建议把每个参数的地址、类型、倍率、单位整理成一张点表,作为 PLC 变量命名和标度变换的依据。
二、Modbus RTU 与 Modbus TCP 的接入差异
Modbus RTU 走串口(RS-485),需要配置波特率、数据位、停止位、校验方式,以及从站地址。典型配置为 9600/8/E/1,从站地址 1~247。RTU 帧以 3.5 个字符时间的静默间隔作为帧边界,因此通信参数必须与电表完全一致,否则会出现 CRC 错误或超时。
Modbus TCP 走以太网,报文去掉了 CRC,改用 MBAP 头,其中包含事务标识、协议标识、长度和单元标识。单元标识在网关场景下用于区分串口侧的不同从站。TCP 侧不需要波特率,但需要确认 IP 地址、端口(默认 502)和单元 ID。
三、Control Expert 中的读取实现
在 Control Expert 中,Modicon PLC 读取 Modbus 数据通常有两种方式:一是使用 READ_VAR 功能块,二是使用已配置的 DTM/设备描述进行隐式交换。对于能源管理场景,READ_VAR 更灵活,适合按点表批量读取。
READ_VAR 的关键参数包括:
- ADDR:目标设备地址,RTU 下为从站号,TCP 下为单元 ID。
- OBJ:对象类型,如
'%MW'表示保持寄存器。 - NUM:起始寄存器号。
- NB:读取的寄存器数量。
- RECP:接收数据存放的变量数组。
下面是一段教学示例代码,读取从站 1 的 0x0000 开始的 4 个保持寄存器,存入 %MW100~%MW103:
READ_VAR(
ADDR := '1',
OBJ := '%MW',
NUM := 0,
NB := 4,
RECP := %MW100,
GEST := %MW200
);
其中 %MW200 起用于存放管理字,包含完成位、错误位和错误代码。工程上应监视错误代码:0x01 表示非法功能,0x02 表示非法地址,0x03 表示非法数据值,0x04 表示从站故障,0x06 表示从站忙。超时通常由通信参数不匹配或从站未响应引起。
四、数据解析与标度变换
读回来的寄存器是原始整数,必须经过解析和标度变换才能变成工程量。解析的核心是“拼字”和“定符号”,标度变换的核心是“乘倍率”。
对于 16 位无符号量,直接使用即可。对于 32 位量,需要把两个 16 位寄存器拼成一个 32 位值。若高字在前,则:
Value32 := SHL(HighWord, 16) + LowWord;
若低字在前,则交换顺序。对于有符号量,需要判断最高位是否为 1,若是则按补码还原为负数。Control Expert 中可使用 INT_TO_DINT、DINT_TO_REAL 等转换指令配合完成。
标度变换公式为:
EngineeringValue := RawValue * ScaleFactor;
例如,A 相电压原始值为 2203,倍率 0.1,则实际电压为 220.3 V;有功功率原始值为 15230,倍率 0.001,则实际功率为 15.23 kW。若电表返回的是 32 位浮点数,则不需要乘倍率,但需要按 IEEE 754 格式解析,Control Expert 中可用 DWORD_TO_REAL 或相应库函数完成。
五、从读取到可用的完整链路
把上述环节串起来,就形成了一条从电表到 PLC 内部工程量的数据链。下图展示了这一链路中的关键对象、数据形态和变换关系:
图中左侧是电表内部寄存器,中间经过 Modbus 通信进入 PLC 的 %MW 数组,右侧是最终工程量。下方处理链展示了四个关键动作:原始寄存器读取、32 位拼接、符号与类型还原、标度变换。每一步都可能引入错误,因此调试时应逐段验证。
六、调试与验证要点
调试时建议按以下顺序排查:
- 通信是否通:观察
READ_VAR的完成位和错误代码。若错误代码为0x06,检查从站地址和波特率;若为超时,检查接线极性(A/B 是否接反)和终端电阻。 - 地址是否正确:确认寄存器地址是“协议地址”还是“偏移地址”。有些手册写 40001,实际协议地址是 0;有些写 0x0000,直接使用即可。
- 字节序是否正确:用已知量验证,例如电表显示电压 220 V,读回原始值应为 2200 左右(倍率 0.1)。若读回值极大或极小,优先怀疑高低字顺序。
- 标度是否正确:用钳形表或电表本地显示值对比 PLC 计算值,偏差应在允许范围内。若偏差固定为 10 倍或 100 倍,说明倍率用错。
- 数据是否刷新:确认读取周期与电表刷新周期匹配。电能累计值变化慢,可用短周期读取;功率波动快,可适当缩短周期,但不宜过短以免增加总线负载。
Meter1_Ua_Raw、Meter1_Ua_Eng,这样在程序中一眼就能看出原始值与工程值的对应关系,减少后期维护成本。完成上述步骤后,PLC 内部就拥有了一组可信的电力参数。这些参数既可以送到 HMI 显示,也可以通过上位机接口供能源管理软件做趋势分析、需量计算和能效评估。下一阶段的工作,就是把这些数据组织成有业务意义的能源指标。