4. 电力参数测量与Modicon集成

在能源管理控制系统中,Modicon PLC 承担着“数据汇聚与预处理”的角色。智能电表负责把电压、电流、功率、电能等物理量转换为数字量,而 PLC 需要通过 Modbus 协议把这些数字量读入,再还原成具有工程意义的浮点或整型数值,供上位机、HMI 或能源管理软件使用。本节围绕“读什么、怎么读、读回来怎么算”三个核心问题展开,重点讲清 Modbus 寄存器映射、Control Expert 中的读取指令以及标度变换的实现方法。

一、智能电表的 Modbus 数据模型

绝大多数支持 Modbus 的智能电表,其内部数据按“功能码 + 寄存器地址”组织。常见约定如下:

  • 03 功能码(读保持寄存器):读取测量值、电能累计值、参数设置值,是最常用的功能码。
  • 04 功能码(读输入寄存器):部分电表把实时测量值放在输入寄存器区,只读。
  • 寄存器宽度:单寄存器为 16 位;功率、电能等 32 位量通常占用两个连续寄存器,存在“高字在前”或“低字在前”两种字节序。
  • 数据类型:可能是无符号整数、有符号整数、32 位浮点数(IEEE 754),也可能是带固定倍率的整数。

以某类常见三相多功能电表为例(以下参数为教学示例,实际以设备手册为准):

参数寄存器地址(示例)功能码数据类型倍率单位
A 相电压0x000003UINT160.1V
A 相电流0x000203UINT160.01A
有功功率0x001003INT320.001kW
正向有功电能0x002003UINT320.01kWh

这张表就是后续编程的“字典”。没有它,读回来的数字只是无意义的整数。工程上建议把每个参数的地址、类型、倍率、单位整理成一张点表,作为 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。

若电表本身只有 RS-485,而 PLC 只有以太网口,可加装 Modbus RTU 转 Modbus TCP 网关。此时 PLC 按 TCP 方式访问网关 IP,网关再把请求转发到对应从站地址的电表。

三、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 或相应库函数完成。

字节序错误是调试中最常见的问题。若读回的功率值明显异常(如 1.5e-38 或 3.4e38),通常说明高低字顺序反了,或把浮点数当成了整数处理。应先确认电表手册中的字节序约定,再在 PLC 中调整拼接顺序。

五、从读取到可用的完整链路

把上述环节串起来,就形成了一条从电表到 PLC 内部工程量的数据链。下图展示了这一链路中的关键对象、数据形态和变换关系:

智能电表 → Modicon PLC 数据链路与标度变换 智能电表 电压/电流/功率/电能 内部寄存器 UINT16 / INT32 / FLOAT Modbus 通信 RTU:RS-485 / 9600-8E1 TCP:以太网 / 端口 502 功能码 03 / 04 Modicon PLC READ_VAR 读取 %MW 寄存器数组 GEST 管理字监视 工程值 220.3 V 15.23 kW 1234.56 kWh PLC 内部处理链:解析 → 拼接 → 符号还原 → 标度变换 ① 原始寄存器 %MW100 = 2203 %MW101 = 0 %MW102 = 15230 %MW103 = 0 ② 32位拼接 SHL(高字,16)+低字 电压:2203 功率:15230 电能:123456 ③ 符号与类型 INT32 补码判断 FLOAT 按 IEEE754 DINT_TO_REAL 统一为 REAL ④ 标度变换 × 0.1 → 220.3 V × 0.001 → 15.23 kW × 0.01 → 1234.56 kWh 写入 HMI / 上位机 注:示例数值为教学假设,实际以电表手册点表和现场读取结果为准

图中左侧是电表内部寄存器,中间经过 Modbus 通信进入 PLC 的 %MW 数组,右侧是最终工程量。下方处理链展示了四个关键动作:原始寄存器读取、32 位拼接、符号与类型还原、标度变换。每一步都可能引入错误,因此调试时应逐段验证。

六、调试与验证要点

调试时建议按以下顺序排查:

  1. 通信是否通:观察 READ_VAR 的完成位和错误代码。若错误代码为 0x06,检查从站地址和波特率;若为超时,检查接线极性(A/B 是否接反)和终端电阻。
  2. 地址是否正确:确认寄存器地址是“协议地址”还是“偏移地址”。有些手册写 40001,实际协议地址是 0;有些写 0x0000,直接使用即可。
  3. 字节序是否正确:用已知量验证,例如电表显示电压 220 V,读回原始值应为 2200 左右(倍率 0.1)。若读回值极大或极小,优先怀疑高低字顺序。
  4. 标度是否正确:用钳形表或电表本地显示值对比 PLC 计算值,偏差应在允许范围内。若偏差固定为 10 倍或 100 倍,说明倍率用错。
  5. 数据是否刷新:确认读取周期与电表刷新周期匹配。电能累计值变化慢,可用短周期读取;功率波动快,可适当缩短周期,但不宜过短以免增加总线负载。
工程建议:把点表中的地址、类型、倍率、单位直接做成 PLC 变量命名的一部分,例如 Meter1_Ua_Raw、Meter1_Ua_Eng,这样在程序中一眼就能看出原始值与工程值的对应关系,减少后期维护成本。

完成上述步骤后,PLC 内部就拥有了一组可信的电力参数。这些参数既可以送到 HMI 显示,也可以通过上位机接口供能源管理软件做趋势分析、需量计算和能效评估。下一阶段的工作,就是把这些数据组织成有业务意义的能源指标。