打开:
examples/server_example_basic_io/server_example_basic_io.c
根据实际 BMU 控制器或 Modbus TCP 模拟器修改:
#define MB_TCP_IP “192.168.1.168”
#define MB_TCP_PORT 1502
#define MB_SLAVE_ID 1
#define MB_TIMEOUT_MS 1000
#define MB_INPUT_START_ADDR 30
#define MB_INPUT_REG_COUNT 4
#define MB_RUN_CTRL_REG_ADDR 42
#define MB_RESET_REG_ADDR 44
如果只是复现 Demo,可以使用 Modbus TCP Slave 模拟器建立以下点位:
Unit ID:1;
TCP 端口:1502;
输入寄存器协议地址 30~33:可读;
保持寄存器协议地址 42 和 44:可写。
注意 Modbus 地址基准
代码中的地址均为 Modbus PDU 中使用的 0 基协议地址。
例如:
协议地址 42,在部分工具中可能显示为 40043;
协议地址 30,在部分工具中可能显示为 30031。
联调时应确认 BMU 通信手册和调试工具使用的是 0 基地址还是 1 基显示地址,不要直接把带有 3xxxx/4xxxx 前缀的编号填入代码。
十、在 ARM64 Ubuntu 上构建
- 确认设备架构
uname -m
预期输出:
aarch64
2. 执行一键构建
chmod +x build_on_arm64.sh
./build_on_arm64.sh
如果设备缺少编译依赖,脚本会调用 sudo apt 安装。离线环境需要提前准备相关软件包。
构建成功后的程序位于:
dist/iec61850_arm64
3. 检查构建结果
file dist/iec61850_arm64
ls -l dist/iec61850_arm64
file 输出中应包含 ARM aarch64 相关信息。
十一、运行 Demo
IEC 61850 MMS 默认使用 TCP 102 端口。Linux 普通用户绑定低端口可能受到权限限制,因此复现时可以先使用 8102:
cd dist
./iec61850_arm64 8102
程序的第一个参数是 MMS 监听端口。不传参数时默认使用 102。
启动后可以看到类似日志:
Using libIEC61850 version …
[MODBUS] config: ip=192.168.1.168, port=1502, slave_id=1, …
[MODBUS] control map: SPCSO1 -> HR42=0xFF00, …
[MODBUS] read OK: 04 addr=30…33 => AnIn1=…, AnIn2=…
按 Ctrl+C 可以停止程序。程序会依次停止 MMS Server,释放 Modbus Socket、锁和相关上下文。
十二、验证 Modbus 到 IEC 61850 的遥测方向
步骤 1:准备 Modbus 数据
在 BMU 控制器或 Modbus 模拟器中设置输入寄存器协议地址 30~33,例如:
30 = 101
31 = 202
32 = 303
33 = 404
步骤 2:启动 ARM64 程序
确认终端出现:
[MODBUS] read OK
步骤 3:连接 MMS Server
使用 IEC 61850 MMS 客户端连接:
ARM64设备IP:8102
浏览 GenericIO/GGIO1,读取:
AnIn1.mag.f
AnIn2.mag.f
AnIn3.mag.f
AnIn4.mag.f
步骤 4:修改寄存器并观察变化
修改 Modbus 输入寄存器值,等待约 1 秒,确认 MMS 客户端中的数值和时间戳同步更新。
十三、验证 IEC 61850 到 Modbus 的遥控方向
在 IEC 61850 客户端中分别执行:
对 GGIO1.SPCSO1 下发 true,确认 HR42 变为 0xFF00;
对 GGIO1.SPCSO2 下发 true,确认 HR42 变为 0x00FF;
对 GGIO1.SPCSO3 下发 true,确认 HR44 变为 0xFF00。
同时观察 ARM64 设备日志:
[CONTROL] … command accepted
[MODBUS] process … command
[MODBUS] write OK
这三类日志分别对应:
MMS 控制命令已经通过回调检查;
主循环开始处理 pending 命令;
BMU 寄存器实际写入成功。
十四、验证断线重连
为了验证嵌入式控制器长期运行时的恢复能力,可以进行以下测试:
正常运行 Demo;
临时停止 Modbus 模拟器,或者断开 BMU 网络;
确认程序报告读取失败,并保留最近一次成功遥测值;
恢复网络或重新启动从站;
观察 Modbus Master 按退避策略重新连接;
确认重新出现 read OK,MMS 遥测继续更新。
十五、常见问题
现象 优先检查
MMS Server 启动失败 端口是否被占用;使用 102 时是否有低端口权限;可先使用 8102
Modbus 一直连接失败 BMU IP、端口、路由、防火墙和从站服务状态
返回 Modbus exception Unit ID、功能码、地址范围和寄存器权限
数据整体错一个地址 BMU 手册或调试工具使用的是 0 基还是 1 基地址
数值数量级不正确 比例系数、符号数、32 位组合、大小端和寄存器字序
遥控没有写入 BMU 是否下发 true;对象是否为 SPCSO1~3;检查 pending 和 write 日志
十六、从通信 Demo 到一体化 BAU 控制器
当前 Demo 已经验证了两个关键方向:
BMU Modbus 遥测
→ ARM64 本地采集与转换
→ IEC 61850 数据模型
→ MMS 提供给 EMS 或站控系统
EMS / 站控系统遥控
→ IEC 61850 控制对象
→ ARM64 本地控制逻辑
→ Modbus 写 BMU 寄存器
这为一体化 BAU 控制器建立了通信基础。下一步不是继续增加一个外部 PLC,而是结合 ARM64 BAU 硬件,把原 PLC 的模拟量采集、数字量 IO、联锁和本地控制逻辑逐步移植到同一设备中。
目标系统还需要形成第三条本地采集控制链路:
模拟量输入 / DI / 设备反馈
→ ARM64 硬件驱动与采集任务
→ 滤波、标定、联锁和 BAU 状态机
→ IEC 61850 数据模型与告警
EMS 遥控 / BAU 本地控制策略
→ 权限与联锁判断
→ DO / 继电器 / 执行器输出
→ 输出反馈与状态确认
这条链路属于一体化 BAU 的目标设计,当前开源 Demo 尚未包含具体 ADC、GPIO、DI、DO 板卡驱动。
配置化点表
将 BMU IP、端口、Unit ID、寄存器地址、数据类型、缩放系数和 IEC 61850 对象映射移到配置文件,避免每次修改点表都重新编译。完整数据类型转换
增加以下数据处理能力:
有符号 16 位和 32 位整数;
IEEE 754 浮点数;
双寄存器和多寄存器组合;
大小端和不同字序;
状态位拆分与组合;
工程量单位和量程转换。
3. 数据品质和通信状态
BAU 不应只提供最近一次数值,还应维护:
数据时间戳;
IEC 61850 Quality;
数据陈旧时间;
BMU 在线状态;
连续失败次数;
最后一次成功通信时间。
4. 移植原 PLC 的模拟量和 IO 能力
不同 ARM64 BAU 硬件的 ADC、GPIO、隔离输入输出和继电器驱动并不相同,建议先建立统一的硬件抽象接口,再由上层 BAU 逻辑调用。需要重点实现:
模拟量采样、量程转换、零点与增益标定;
采样滤波、越限判断和断线检测;
DI 输入消抖、状态保持和变化事件记录;
DO/继电器输出、输出反馈和故障检测;
上电默认状态、通信中断状态和安全失效状态;
采集周期、控制周期和任务优先级设计;
硬件看门狗和输出安全回落机制。
上层数据模型不应直接依赖某一块硬件板卡。可以把模拟量、DI 和 DO 统一抽象为 BAU 内部点表,再分别映射到 IEC 61850 数据对象、控制对象和本地状态机。这样更换 ARM64 主板或 IO 扩展板时,上层业务逻辑不需要整体重写。
- BAU 控制逻辑
在通信基础上增加:
启停状态机;
运行条件判断;
告警和保护逻辑;
远方/就地模式;
控制互锁;
命令超时和反馈确认;
异常降级与安全停机策略。
6. 更符合业务语义的 IEC 61850 模型
GGIO 适合快速验证通用数据,但实际产品应根据设备业务建立更合适的逻辑节点、数据对象、数据集和报告控制块。
- 嵌入式运行保障
还需要补充:
systemd 服务和开机启动;
进程看门狗;
日志轮转;
配置校验和版本管理;
在线升级和回滚;
长期稳定性及压力测试;
TLS、访问控制和网络隔离。
完成这些工作后,ARM64 设备才会从“协议转换 Demo”逐步演进为同时具备采集、控制、保护、通信和运维能力的一体化 BAU 控制器。
十七、开源说明
本文项目基于 MZ Automation 开源的 libIEC61850。再次感谢上游项目维护者和所有贡献者提供的协议实现、示例代码与跨平台基础。
上游项目: mz-automation/libiec61850
本文项目仓库中保留了 COPYING 许可证文件。下载、修改和再次发布代码时,应阅读并遵守上游项目的许可证要求,保留必要的版权和许可证信息,并清楚标注上游代码与新增修改内容。
用于闭源商业产品之前,应单独评估相关授权义务。
开源仓库后续建议持续补充:
上游 libIEC61850 版本或提交号;
ARM64 系统版本和编译环境;
脱敏后的示例点表;
完整测试拓扑和联调日志;
配置文件示例;
已知限制和安全说明。
结语
libIEC61850 的 ARM64 移植解决了 IEC 61850 通信能力在嵌入式 Linux 设备上的运行问题,Modbus TCP Master 负责连接 BMU 控制器设备。在此基础上继续移植 PLC 原有的模拟量采集、数字量 IO、联锁和本地控制能力,ARM64 设备就可以同时完成南向 BMU 通信与现场控制、北向 MMS 数据服务和遥控接收。
这项实现的核心意义,是为一体化 BAU 控制器提供一条可复现的技术路径:底层继续兼容 BMU 的 Modbus 接口,同时由 ARM64 硬件承接原 PLC 的模拟量和 IO;上层通过 IEC 61850 接入 EMS 或站控系统;中间的数据映射、状态处理、联锁和控制逻辑则统一沉淀到嵌入式控制器内部。
当前 Demo 已经打通了从源码下载、ARM64 构建、BMU Modbus 遥测采集、IEC 61850 数据更新,到 MMS 遥控转换为 BMU 寄存器写入的通信链路。模拟量、数字量 IO 和完整控制逻辑可在这一通信主干上继续实现,从而逐步形成一体化 BAU 控制器。
项目地址: https://gitee.com/wangchaogitee/LIBIEC61850_ARM64