
1. 从三个盒子到一个盒子ARMxy 模块化控制器的整合逻辑1.1 传统方案为什么越来越不划算做过储能项目或者非标自动化产线的人都有体会一个中等规模的柜子里PLC 负责逻辑控制网关负责协议转换和数据上云工控机跑 SCADA 和本地 HMI三台设备各占一层导轨各自有电源、各自有接线端子、各自有通信口。柜内空间被切得七零八落光是 24V 配电就要多分好几路出来。我去年帮一个做工商业储能的朋友算过一笔账一个 100kW/215kWh 的储能柜传统方案里 PLC 用汇川 AM 系列或者西门子 S7-200 SMART网关用某品牌 Modbus 转 MQTT 的盒子工控机用无风扇嵌入式 i5三样加起来硬件成本大概在 6000 到 9000 元之间还没算柜内多出来的端子、线束和装配工时。更麻烦的是调试阶段——PLC 的编程软件一套、网关的配置工具一套、工控机的组态软件一套三套工具链互不相通出了问题要逐个排查现场调试周期经常被拉长两三天。储能行业现在卷得厉害48V-2kW 这种小功率储能逆变器已经量产铺开工商业储能按一般用电负荷曲线放电功率一半的场景也很常见甲方对成本敏感度极高。这种背景下把三个盒子合并成一个模块化控制器就不是“锦上添花”而是“能不能拿到单子”的问题。1.2 ARMxy 到底是个什么东西ARMxy 这个名字拆开看就明白了ARM 代表它用的是 ARM 架构处理器xy 暗示模块化的可组合性。它本质上是一台基于 ARM 的工业级边缘控制器核心思路是把 PLC 的逻辑控制能力、网关的协议转换能力、工控机的计算和显示能力全部收进一个模块化的硬件平台里。它的硬件形态通常是“主控底板 可插拔 IO 模块 通信模块”的结构。主控底板负责运算和系统运行IO 模块负责数字量、模拟量的采集和输出通信模块负责 RS485、RS232、CAN、以太网这些接口。你需要几个 DI、几个 DO、几路 AI、几路 AO就插对应的模块不用为用不到的点位买单。这一点对储能项目特别友好——储能柜的 IO 需求往往很固定比如 8 路 DI 做状态检测、4 路 DO 做接触器控制、4 路 AI 做电压电流采样传统 PLC 买最小型号可能都富余但价格并不便宜。软件层面ARMxy 一般跑 Linux 系统支持 IEC 61131-3 的 PLC 编程环境同时可以跑 Python、C 或者 Node-RED 做数据处理和协议转换。也就是说你可以在同一台设备上既写梯形图做逻辑联锁又写 Python 脚本把数据推到 MQTT 或者本地数据库。SCADA 层面它可以直接跑轻量级 Web SCADA通过浏览器访问不需要额外配一台工控机。1.3 哪些场景最适合换这套方案不是所有项目都适合上 ARMxy。我自己的判断标准是看三个维度IO 点数是否中等偏少、是否需要协议转换和上云、是否有本地显示或边缘计算需求。三个都占那 ARMxy 的整合优势就非常明显。储能项目是典型的三占场景。储能柜需要采集电池簇电压电流温度、控制接触器和风扇、和 PCS 通信、和 EMS 通信、还要把数据推到云平台。传统方案里 PLC 管采集和控制网关管协议转换和上云工控机管本地 HMI 和 EMS 逻辑三台设备缺一不可。ARMxy 一台就能覆盖柜内空间省了接线省了调试工具链也统一了。非标自动化产线也适合。很多非标设备 IO 点数不多但通信协议杂——可能同时要接 Modbus RTU 的传感器、OPC UA 的上位机、还有自定义串口协议的仪表。传统做法是 PLC 加协议网关ARMxy 可以直接在 Linux 层用 Python 写协议解析灵活得多。反过来如果项目是大型流程工业IO 点数上千对扫描周期和确定性要求极高那还是老老实实用大型 PLC 加冗余方案ARMxy 不适合这种场景。它的定位是中小型、边缘侧、需要灵活性的项目。2. 硬件选型与模块搭配把钱花在刀刃上2.1 主控底板的选型逻辑ARMxy 的主控底板通常有几个档位区别主要在 CPU 主频、内存大小、存储容量和接口数量。选型时不要盲目追高够用就行但也不能抠得太狠否则后面跑边缘计算会卡。我的经验是看三个指标第一是否需要跑 Web SCADA 或者本地数据库如果要内存至少 1GB推荐 2GB第二是否需要做数据缓存和断点续传如果要存储至少 8GB eMMC推荐 16GB第三通信接口数量是否够用储能项目一般需要 2 路以太网一路接 PCS一路接云或者本地网络、2 路 RS485一路接电表一路接 BMS、1 路 CAN接电池簇选底板时要把这些口数清楚。CPU 主频方面做纯逻辑控制和协议转换800MHz 到 1GHz 的 ARM Cortex-A7 或 A9 就够。如果要做本地 AI 推理比如用 AI 做 PLC 代码生成或者异常检测那就要上 Cortex-A53 或 A72主频 1.5GHz 以上最好带 NPU。不过说实话目前大部分储能和自动化项目还用不到本地 AI 推理AI PLC 代码生成更多还是在 PC 端做生成好了再下载到控制器里。2.2 IO 模块的搭配与点数计算IO 模块是 ARMxy 模块化优势最明显的地方。传统 PLC 买的时候是按型号买比如西门子 S7-200 SMART 的 CPU SR20 自带 12 路 DI、8 路 DO你只需要 8 路 DI、4 路 DO但多出来的点位你也得付钱。ARMxy 是按模块插需要多少插多少。储能柜的典型 IO 需求可以这样拆DI 用来检测接触器状态、断路器状态、门禁开关、急停按钮一般 8 到 12 路DO 用来控制接触器线圈、风扇、指示灯、蜂鸣器一般 4 到 8 路AI 用来采集电池簇电压、电流、温度一般 4 到 8 路精度要求 12 位以上AO 用来控制 PCS 功率给定或者风扇调速一般 2 到 4 路。选 IO 模块时要注意几个参数。DI 模块要看输入类型是源型还是漏型储能柜里一般用漏型接法比较多因为 NPN 传感器便宜。DO 模块要看输出类型是继电器还是晶体管继电器输出可以接交流负载但寿命有限晶体管输出响应快但只能接直流负载储能柜里控制接触器一般用继电器输出控制指示灯可以用晶体管。AI 模块要看信号类型是 4-20mA 还是 0-10V储能柜里电流传感器一般输出 4-20mA电压传感器可能输出 0-10V选模块时要匹配。注意IO 模块的点数不要刚好卡着用建议留 10% 到 20% 的余量。储能项目后期经常要加传感器或者改逻辑如果 IO 刚好用完就得再加一个模块柜内空间和成本都会增加。2.3 通信模块的选择与协议匹配通信模块是 ARMxy 替代网关的关键。传统方案里网关专门做协议转换比如 Modbus RTU 转 MQTT、OPC UA 转 Modbus TCPARMxy 直接在 Linux 层用软件做这些转换省掉一个硬件盒子。储能项目常用的通信协议有几种和 BMS 通信一般用 Modbus RTU 或者 CAN和 PCS 通信一般用 Modbus TCP 或者 CAN和电表通信一般用 Modbus RTU和云平台通信一般用 MQTT 或者 HTTP。ARMxy 的通信模块要覆盖这些接口RS485 模块至少 2 路CAN 模块至少 1 路以太网口至少 2 路。选通信模块时要注意隔离。工业现场电磁干扰大RS485 和 CAN 最好选带隔离的模块否则通信不稳定数据丢包排查起来很头疼。以太网口最好也带隔离尤其是储能柜里有大功率逆变器的情况下。协议转换的软件实现我一般用 Python 写。比如用 pymodbus 库读 Modbus RTU 设备用 paho-mqtt 库推 MQTT中间做数据映射和单位换算。ARMxy 跑 LinuxPython 环境现成的写起来比网关的配置工具灵活得多。如果不想写代码也可以用 Node-RED 做可视化编排拖拖拽拽就能完成协议转换。2.4 电源与散热设计要点ARMxy 一般用 24V 直流供电和传统 PLC 一样。但要注意功耗计算主控底板加 IO 模块加通信模块总功耗可能在 5W 到 15W 之间比传统 PLC 加网关加工控机的总功耗低不少但电源选型时还是要留余量建议用 24V/2A 的电源模块。散热方面ARMxy 一般是无风扇设计靠外壳散热。储能柜内温度可能比较高尤其是夏天柜内温度可能到 50 度以上。选型时要看 ARMxy 的工作温度范围工业级一般支持 -20 到 70 度商业级只支持 0 到 50 度储能项目一定要选工业级。如果柜内温度实在太高可以考虑加装柜内空调或者风扇但那是柜体设计的问题不是控制器的问题。接线方面ARMxy 的端子一般是可插拔的凤凰端子接线比传统 PLC 的螺丝端子方便但要注意线径匹配。DI/DO 信号线一般用 0.5 到 1.0 平方毫米AI 信号线要用屏蔽线屏蔽层单端接地。RS485 和 CAN 要用双绞线终端电阻要接对否则通信距离长了会出问题。3. 软件架构与实操落地从梯形图到 Python 脚本3.1 系统架构的分层设计ARMxy 的软件架构可以分成四层底层是 Linux 系统负责硬件驱动和资源管理中间层是 PLC 运行时负责 IEC 61131-3 逻辑控制上层是协议转换和数据处理层用 Python 或 Node-RED 实现最上层是应用层跑 Web SCADA 或者本地 HMI。这种分层的好处是各司其职互不干扰。PLC 运行时负责硬实时逻辑比如接触器联锁、急停响应扫描周期可以做到 1ms 到 10ms。协议转换和数据处理跑在 Linux 用户空间实时性要求没那么高但灵活性要求高用 Python 写最合适。Web SCADA 跑在浏览器里通过 HTTP 或者 WebSocket 和底层通信用户可以在手机或者电脑上查看储能柜状态。我一般建议把安全相关的逻辑放在 PLC 层比如过压保护、过流保护、温度保护这些逻辑响应要快不能受上层软件影响。数据采集、协议转换、上云这些放在 Python 层即使 Python 脚本挂了PLC 层的保护逻辑还在系统不会失控。3.2 PLC 编程环境的配置与使用ARMxy 支持的 PLC 编程环境一般是基于 CODESYS 或者 OpenPLC 的。CODESYS 在工业界用得比较多支持梯形图、功能块图、结构化文本等多种语言编程体验和传统 PLC 接近。OpenPLC 是开源的免费但功能相对简单。配置 PLC 环境时第一步是安装运行时第二步是配置 IO 映射第三步是写程序下载。IO 映射是关键要把物理 IO 模块的通道和 PLC 变量对应起来。比如 DI 模块的第 1 路对应变量DI_01DO 模块的第 1 路对应变量DO_01AI 模块的第 1 路对应变量AI_01。映射配置一般在 Web 界面或者配置文件里做不同厂商的 ARMxy 可能略有差异。写 PLC 程序时储能项目的逻辑一般包括状态检测读 DI 判断接触器、断路器状态、控制输出写 DO 控制接触器、风扇、模拟量处理读 AI 做电压电流温度计算、联锁保护过压过流温度超限时切断输出、通信交互和 BMS、PCS 交换数据。梯形图写这些逻辑很直观比如接触器控制就是典型的起保停电路过流保护就是比较指令加输出切断。提示PLC 程序里要加看门狗和心跳检测。如果 Python 层挂了PLC 层要能检测到并做出安全响应比如切断输出或者报警。这个逻辑用梯形图写很简单就是一个定时器加比较指令。3.3 Python 脚本做协议转换和数据上云Python 层是 ARMxy 替代网关的核心。传统网关的协议转换是配置出来的ARMxy 的协议转换是写出来的灵活度完全不是一个级别。以 Modbus RTU 读电表为例用 pymodbus 库的代码大概是这样from pymodbus.client import ModbusSerialClient import time client ModbusSerialClient( port/dev/ttyS1, baudrate9600, parityN, stopbits1, bytesize8, timeout1 ) def read_meter(): try: client.connect() result client.read_holding_registers( address0x0000, count10, slave1 ) if not result.isError(): voltage result.registers[0] / 10.0 current result.registers[1] / 100.0 power result.registers[2] / 10.0 return voltage, current, power except Exception as e: print(fRead error: {e}) finally: client.close() return None while True: data read_meter() if data: print(fV{data[0]}V, I{data[1]}A, P{data[2]}W) time.sleep(1)这段代码读的是 Modbus 保持寄存器地址 0x0000 开始读 10 个寄存器从站地址 1。电压电流功率的换算系数根据电表手册来不同电表不一样。读到的数据可以存本地数据库也可以推 MQTT。推 MQTT 用 paho-mqtt 库import paho.mqtt.client as mqtt import json client mqtt.Client() client.connect(localhost, 1883, 60) def publish_data(voltage, current, power): payload { voltage: voltage, current: current, power: power, timestamp: time.time() } client.publish(energy/meter1, json.dumps(payload))这样就把电表数据推到 MQTT 主题energy/meter1了。云平台订阅这个主题就能收到数据。如果要断点续传可以在本地用 SQLite 缓存网络恢复后再补推。3.4 Web SCADA 的搭建与远程访问ARMxy 跑 Linux可以直接在上面跑轻量级 Web SCADA。我一般用 Node-RED 加 Grafana 的组合Node-RED 做数据采集和转发Grafana 做可视化。Node-RED 有现成的 Modbus 和 MQTT 节点拖拖拽拽就能完成数据流编排不用写代码。Grafana 做仪表盘很漂亮支持实时刷新和历史查询。如果不想跑 Grafana也可以用 Python 的 Flask 或者 FastAPI 写一个简单的 Web 界面用 ECharts 做图表。这种方式更轻量但开发工作量大一些。对于储能项目我一般推荐 Node-RED 加 Grafana因为开发快界面好看甲方满意。远程访问方面ARMxy 可以通过 4G 模块或者以太网接入网络云平台可以通过 MQTT 或者 HTTP 拉数据。本地访问可以通过浏览器直接访问 ARMxy 的 IP 地址查看 Web SCADA 界面。如果要远程访问本地 Web SCADA可以用反向代理或者组网方案但要注意安全不要暴露到公网。注意Web SCADA 的访问要加认证和加密。储能项目涉及电力数据安全性要求高。至少要用 HTTPS 和用户认证不要用默认密码。我见过太多项目用默认密码结果被扫到数据泄露。4. 现场调试与常见问题排查实录4.1 通信不通的排查思路通信问题是现场调试最常见的。ARMxy 替代网关后通信链路变成ARMxy 的 RS485 口接设备Python 脚本读数据然后推 MQTT。任何一环出问题数据都上不去。排查时我一般按这个顺序第一检查物理接线RS485 的 A/B 线有没有接反终端电阻有没有接屏蔽层有没有接地第二检查串口参数波特率、数据位、停止位、校验位是否和设备手册一致第三用调试工具单独测试比如用 minicom 或者 screen 直接读串口看有没有数据第四检查 Python 脚本的从站地址和寄存器地址是否正确第五检查 MQTT 连接是否正常broker 地址和端口是否正确。储能项目里BMS 和 PCS 的通信协议往往有自定义部分不是标准 Modbus。这时候要用串口调试工具抓包分析协议格式然后在 Python 里写解析代码。这个过程比较耗时但一旦调通后面就很稳定。4.2 IO 模块不识别或读数异常IO 模块不识别一般是接触不良或者配置错误。先检查模块有没有插紧再检查 Web 界面或者配置文件里有没有正确识别到模块。如果模块识别了但读数异常比如 DI 一直为高或者一直为低可能是输入类型不匹配源型漏型接反了。DO 输出异常可能是负载电流超过模块额定值或者输出类型不对继电器输出接了高频开关负载。AI 读数异常最常见的原因是信号类型不匹配。4-20mA 的传感器接到 0-10V 的模块上读数肯定不对。另外AI 模块的精度和分辨率也要注意12 位分辨率的模块4-20mA 对应 0-4095换算时要按这个比例算。如果读数跳动大可能是屏蔽没做好或者电源纹波大可以加滤波电容或者用隔离模块。4.3 系统死机或重启的排查ARMxy 跑 Linux系统死机或者重启一般是电源问题、散热问题或者软件问题。电源问题最常见24V 电源功率不够或者纹波大导致系统不稳定。用万用表测一下 24V 电压带载时不能低于 22V纹波不能超过 200mV。散热问题在夏天常见柜内温度太高CPU 过热保护系统重启。摸一下外壳如果烫手就要加散热或者降低环境温度。软件问题一般是内存泄漏或者看门狗触发。Python 脚本如果长时间运行可能有内存泄漏用top或者free命令看一下内存占用。如果内存持续增长就要检查代码看看有没有未释放的资源。看门狗触发一般是 PLC 程序或者 Python 脚本卡死系统检测到心跳丢失自动重启。这时候要查日志看是哪个进程卡死了。4.4 常见问题速查表问题现象可能原因排查方法解决措施RS485 通信不通A/B 线接反、终端电阻未接、波特率不对用调试工具直接读串口调换 A/B 线、接 120 欧终端电阻、核对波特率DI 读数一直为高输入类型不匹配、传感器故障万用表测 DI 端子电压改源型漏型接法、更换传感器DO 输出不动作负载电流超限、输出类型不对万用表测 DO 端子电压加中间继电器、更换输出类型AI 读数跳动大屏蔽未做好、电源纹波大示波器看信号波形加屏蔽线、加滤波电容系统频繁重启电源功率不够、散热不良测 24V 电压、摸外壳温度换大功率电源、加散热MQTT 数据上不去broker 地址错、网络不通ping broker、看 MQTT 日志核对 broker 地址、检查网络PLC 程序不运行运行时未启动、IO 映射错看 PLC 运行时状态启动运行时、重新映射 IOWeb SCADA 打不开服务未启动、端口被占看服务状态、netstat 查端口启动服务、换端口4.5 几个踩过的坑和实操心得第一个坑是 RS485 终端电阻。我一开始觉得终端电阻可有可无结果通信距离超过 50 米后数据丢包严重。后来在总线两端各接了一个 120 欧电阻通信立刻稳定了。储能柜里 RS485 线往往要走十几米终端电阻一定要接。第二个坑是 AI 模块的共地问题。4-20mA 传感器如果和 ARMxy 不共地读数会漂。我一般把传感器的电源地和 ARMxy 的电源地接在一起但要注意不要形成地环路。如果传感器是隔离输出的那就不用共地。第三个坑是 Python 脚本的异常处理。现场调试时Python 脚本因为一个未捕获的异常挂掉导致数据上不去但 PLC 层还在跑系统看起来正常实际上数据已经断了。后来我在脚本里加了全局异常捕获和自动重启脚本挂了会自动拉起数据不会断。第四个坑是 Web SCADA 的浏览器兼容性。有些甲方用老版本浏览器Web SCADA 打不开。后来我改用响应式设计兼容主流浏览器问题解决了。第五个坑是固件升级。ARMxy 的固件升级一般通过 Web 界面或者 U 盘升级过程中不能断电否则可能变砖。我一般建议在调试完成后备份固件万一出问题可以恢复。5. 成本对比与选型建议5.1 硬件成本对比以储能柜为例传统方案和 ARMxy 方案的硬件成本对比如下项目传统方案ARMxy 方案节省控制器PLC 2000-4000 元ARMxy 主控 1500-3000 元500-1000 元网关协议网关 1000-2000 元无软件实现1000-2000 元工控机嵌入式工控机 2000-3000 元无Web SCADA2000-3000 元IO 模块PLC 自带或扩展 1000-2000 元模块化 IO 800-1500 元200-500 元柜内端子线束多设备接线 500-1000 元单设备接线 200-500 元300-500 元合计6500-12000 元2500-5000 元4000-7000 元这个对比是粗略估算具体项目会有差异但趋势很明显ARMxy 方案能省掉网关和工控机两个硬件硬件成本降低 40% 到 60%。再加上柜内空间节省、接线简化、调试工具链统一综合成本降低更多。5.2 调试工时对比传统方案调试时PLC 用一套软件网关用一套配置工具工控机用一套组态软件三套工具链要分别学、分别调。ARMxy 方案只有一套 Linux 环境PLC 编程、Python 脚本、Web SCADA 都在同一个设备上调试时不用切换工具效率高很多。我自己的经验是一个中等复杂度的储能柜传统方案调试周期大概 3 到 5 天ARMxy 方案大概 2 到 3 天节省 30% 到 40% 的调试时间。如果项目多这个时间节省累积起来很可观。5.3 什么情况下不建议用 ARMxyARMxy 不是万能的。如果项目 IO 点数超过 200 点或者对扫描周期要求小于 1ms或者需要冗余配置那还是用大型 PLC 更合适。ARMxy 的定位是中小型、边缘侧、需要灵活性的项目不要硬套到所有场景。另外如果团队完全没有 Linux 和 Python 基础上手 ARMxy 会有学习成本。虽然 PLC 编程部分和传统 PLC 类似但协议转换和数据上云部分需要写代码对团队技能有要求。如果团队只会梯形图那要么培训要么还是用传统网关方案。5.4 选型时的几个关键决策点第一主控底板选什么档位。纯逻辑控制和协议转换低配够用要跑 Web SCADA 和本地数据库中配要做本地 AI 推理高配。第二IO 模块选什么类型。DI 选漏型还是源型看传感器类型DO 选继电器还是晶体管看负载类型AI 选 4-20mA 还是 0-10V看传感器输出。第三通信模块选什么接口。RS485 至少 2 路CAN 至少 1 路以太网至少 2 路最好都带隔离。第四软件方案选什么组合。PLC 用 CODESYS 还是 OpenPLC协议转换用 Python 还是 Node-REDWeb SCADA 用 Grafana 还是自己写根据团队技能和项目需求定。我个人在实际操作中的体会是ARMxy 这套方案最大的价值不是硬件省了多少钱而是把原本分散的三个技术栈整合到一个平台上调试和维护的效率提升非常明显。储能项目现场调试时间紧、任务重能省一天调试时间可能就是能不能按时并网的区别。当然前提是团队要愿意学 Linux 和 Python如果固守传统 PLC 那一套ARMxy 的优势发挥不出来。最后再分享一个小技巧ARMxy 的 Python 脚本可以用 systemd 做成服务开机自启崩溃自动重启这样现场运行更稳定不用人工干预。