
边缘计算与云端协同是这两年工业能源领域绕不开的关键词。我做能源管理系统落地也有几年了各种架构都试过——纯本地部署的、纯云端的、混合的这里面的坑和甜点都摸得比较透。这次聊的 MyEMS 项目是我最近在某个制造基地做的一套工业能源实时监测与智能调度系统核心就是用边缘计算做现场数据采集与预处理云端做集中监控与调度策略下发两边协同工作。这套架构跑下来整体效果确实超出预期尤其在实时响应和数据带宽占用这两个维度上比传统的纯云端采集方案有了质的提升。我先说结论如果你正在做或准备做工厂级、园区级的能源管理系统且现场设备多、点位杂、数据量不小那边缘计算加云端协同的架构基本是当前最合理的选择而 MyEMS 这套开源能源管理系统恰好是这个架构里很合适的中枢承载平台。它能做什么呢——实时采集电表、水表、气表等计量设备的数据在边缘侧完成清洗、聚合、计算再把关键结果同步到云端云端负责存储、展示、告警和分析并通过指令下发实现负荷调度和设备联动。适合谁看呢——工厂能源管理员、做能效改造的工程师、做物联网集成的开发者以及正在选型能源管理平台的甲方技术负责人。1. 整体架构怎么拆边缘侧和云端各干各的活能源监测系统最怕什么数据采不上来、采上来没用、用了不可靠。这三个问题纯云端架构很难同时解决因为现场设备数量一上来轮询周期长了数据就失真轮询短了对网络和服务器压力又大。所以我在这套系统里从一开始就把架构定成了边缘计算加云端协同的两级模式。1.1 为什么不能沿用纯云端直采的老路子很多早期的能源管理系统是这么干的——服务器直接去 poll 现场所有电表、水表、网关Modbus TCP 也好、DL/T645 也好一个点位一个点位地读读回来就入库。点位少的时候没问题三五十个点位随便搞。但现场有几百个点位、上千个数据项的时候问题就来了轮询一轮要几十秒实时性变成“延迟性”网络抖动一次一批数据就断了云端数据库要同时扛采集写入和查询分析压力一大就把整个系统拖垮。我刚做这个项目的时候现场一共有 17 个配电间、6 台空压机、3 套冷水机组、11 条产线计量点位加起来快 700 个。按老办法轮询周期 30 秒一轮700 个点下来要将近 40 秒数据曲线跟心电图一样断层。后来改用边缘计算架构每个配电间放一个边缘采集节点节点内部轮询周期压到 5 秒云端只需要接收边缘节点上送的结果问题一下解决了。1.2 MyEMS 在架构里的角色定位MyEMS 是一套开源的能源管理系统后端基于 Python 生态前端有现成的 Dashboard带设备管理、计量点管理、分项能耗、趋势曲线、报表、告警这些模块。我用它作为云端的能源管理平台是因为它不用从零开始写一堆重复的页面逻辑而且数据库模型比较规范方便往里面填自己的业务逻辑。但要注意一点MyEMS 默认的架构偏传统数据采集模块和平台是耦合在一起的。我做这套项目的时候把它的采集功能弱化只保留平台管理和展示分析那一层采集和边缘计算全部下沉到边缘节点上。这样做的原因是边缘节点需要现场独立运行即使云端宕机或者专线断了现场的数据采集和本地存储不能停后面网络恢复再补传——这就不是 MyEMS 默认能力能覆盖的是自己做架构时叠加进去的。1.3 边缘节点硬件怎么选、软件怎么搭边缘节点我用的是一台工控机加一个串口服务器组合工控机装 Ubuntu Server串口服务器用来扩展 RS485 接口对接老式电表和多功能电表。每个配电间的设备类型不一样所以节点配置也不一样——重要的配电间用双网口冗余普通点位单网口就够。软件层面边缘节点跑三样东西协议采集服务、数据处理引擎、本地数据库。协议采集服务负责按 Modbus 轮询各类电表、水表、气表数据数据处理引擎做数据清洗、越限判断、数据聚合把 5 秒一条的原始数据聚合成 1 分钟均值、15 分钟需量这些关键指标本地数据库存最近 30 天的原始数据作为兜底防止云端链路故障导致数据丢失。2. 数据怎么从现场到云端边缘处理与上报机制拆解刚才说了边缘节点和 MyEMS 云端平台的分工这里要展开讲的是边缘侧到底在本地做了哪些处理哪些数据该上报、哪些不该上报这个边界怎么划。2.1 边缘侧计算什么、聚合到什么粒度我总结了一个原则凡是能在边缘算完就不劳烦云端的绝不把原始数据往上堆。边缘侧主要干四件事第一数据清洗。仪表偶发跳变、通信误码、异常毛刺这些脏数据在边缘节点直接过滤掉。比如某个电表瞬间读到几千千瓦的荒谬值肯定是通信错位原始数据直接剔除不留到云端污染曲线。第二数据聚合。5 秒一条的原始数据在边缘侧聚合成 1 分钟平均值、15 分钟最大值、15 分钟需量、累计电量等指标。这样云端不需要面对 700 个点位乘以每 5 秒一条的高频写入只需要处理每个点位每分钟一个值甚至每 15 分钟一个值数据量差了 60 到 180 倍。第三运行状态识别。设备是待机、运行还是停机这在边缘侧可以先判断出来。用功率阈值判定比如一台空压机额定功率 55kW功率低于额定 20% 就认为待机。这个判定逻辑放边缘响应速度能达到秒级放在云端判定至少要延迟一个轮询周期。第四本地存储。边缘节点的本地数据库保留 30 天原始数据用于补传。这个设计在工业现场极其重要——车间里网络施工经常把光纤挖断要是纯云端采集断网那几小时的数据就永久丢失了而边缘节点有本地存储链路恢复后自动按时间戳补偿上报数据完整率能做到 99.9% 以上。2.2 数据上报采用什么策略怎么保证顺序和完整性边缘节点向 MyEMS 云端上报数据采用的策略是“定时全量加变化增量”双轨制。定时全量是指每个整分钟把该节点的关键指标全部上报一次保证云端展示实时性变化增量是指当某个点位出现越限或状态变化时边缘节点立即上报一条事件数据触发云端告警和联动逻辑。上报协议我用的是 MQTT 加 JSON 格式每个边缘节点作为一个 MQTT client订阅自己的下行主题发布自己的上行主题。上行主题从设计上就避免了并发冲突——每个节点有独立 client IDEven 云端是大批量接收MQTT broker 的消息持久化也保证不会丢包。还有个细节是关于时钟同步的边缘节点之间必须做 NTP 时间同步否则多个节点数据到云端后时间戳对不齐后续做设备之间的相关性分析会出大问题。我在现场给所有边缘节点和云端服务器都配置了同一个 NTP 源时间偏差控制在 50 毫秒以内。2.3 与 MyEMS 的数据对接方式MyEMS 平台本身带有数据采集模块但从这套架构的实践来看我更推荐把边缘节点的数据通过 API 或直接写库的方式接入。我采用的是在 MyEMS 的数据库层直接开放一个数据写入接口边缘节点把聚合后的数据按设备、按计量点维度写入对应的数据表。这里实际操作时要注意一个问题——不同版本的 MyEMS 表结构有差异接入前要把表字段、数据类型、时间戳格式核对清楚。我踩过的一个坑是MyEMS 的数据时间字段默认用本地时间而边缘节点上送的是 UTC 时间没做转换导致曲线整体偏移了 8 小时。后来在接入层统一做了时间转换前端展示再转回本地时区这个问题才彻底解决。3. 智能调度是怎么跑起来的从边缘规则到云端联动能源监测只是手段调度的价值才是目标。这套系统的调度分两级边缘侧的实时响应调度和云端侧的全局策略调度。这两级各有各的适用场景也各有各的约束条件设计时需要把它们理清楚。3.1 边缘侧实时调度削峰填谷和就地平衡怎么配边缘侧调度适合那些需要快速响应的场景。最典型的是削峰填谷和需量控制。现场有一台 800kVA 的变压器基本电费按需量计费我设定了一个需量控制策略——当 15 分钟滑动窗口内的需量达到设定值的 90% 时边缘节点开始按优先级切除可中断负荷比如中央空调的冷冻泵、暂不重要的工艺设备当需量回落到 80% 以下再逐步恢复。这个逻辑放在边缘侧是因为它对实时性要求很高。假如放在云端做数据上报到云端、云端算完再下发指令一来一回至少 5 到 10 秒而需量是 15 分钟滑动窗口每一秒的偏差都可能造成需量超标。边缘节点本地计算延迟压缩到了毫秒级。具体的规则配置我放在了边缘节点的规则引擎里规则长这样RULE 需量越限_一级 IF 15min_avg_demand 0.85 * contract_demand THEN send_command(cut_load, level_1)“cut_load”指令下发到现场的智能控制柜控制柜按照设定的优先级顺序依次跳闸。需要注意被切负荷不能是安全关键设备所以我在设计这个规则时把负荷分了三类可切、可调、不可动。可切的是辅助设备可调的是变频设备不可动的是产线主设备和安全设备。3.2 云端侧全局调度多设备协同和跨系统联动怎么做边缘侧只管局部全局的协同得靠云端。比如我在云端做了一个空压机群控的策略现场有 6 台空压机各自带独立电表供气压力是一个公共管网。云端收集到每台空压机的实时功率、排气压力、加载状态按照效率排序低负载时自动停掉效率低的机组高负载时自动加载效率高的机组维持管网压力在设定范围。这种调度任务没法在单个边缘节点完成因为要综合所有机组的运行数据和管网压力数据必须有一个全局视角——这就是云端存在的意义。云端调度的周期我设的是每 30 秒评估一次下发指令给边缘节点边缘节电再通过控制接口执行。整个链路延时虽然比纯边缘侧长但在 30 秒的评估周期内完全够用。3.3 调度模型的几个关键参数阈值怎么定、周期怎么选调度模型里面阈值的设定是最考验经验的。以空压机群控为例我调试时遇到过一个问题加载阈值设得太敏感空压机频繁启停反而增加电能消耗和机械磨损。后来我加了一个滞回区间——加载阈值 5.8bar卸载阈值 6.2bar在这个区间内不动作只有超出区间才触发调整。这个滞回区间就是典型的工程化调优手段避免系统抖动。周期选择上也有讲究。需量控制的滑动窗口是固定的 15 分钟这是电力计费标准给的不能改空压机群控的评估周期 30 秒是我调出来的兼顾了响应速度和指令频次告警检测的周期则是秒级的越限告警必须立刻推。调度的周期设计原则是越靠近计费边界周期越固定越靠近设备保护周期越短越靠近优化调度周期可以适当宽松。4. 实时监测平台的核心功能落地曲线、报表、告警一个都不能少调度做得好不好前提是监测数据看得清、算得准。MyEMS 平台在这块提供了不少开箱即用的功能但直接拿来用是不够的需要按实际场景做二次定制。这节我挑三个核心功能讲讲具体是怎么落地的。4.1 能效曲线和分项能耗统计怎么做才能指导生产MyEMS 的曲线展示功能是基础能力但要做到能指导生产得把数据组织好。我按照能源介质和车间维度把能耗拆成了三层结构总能耗、分介质能耗、分设备能耗。总能耗看整体趋势分介质能耗看电、水、气、蒸汽分别用了多少分设备能耗定位到具体的耗能大户。这里面最核心的一个经验是——分项能耗的拆分逻辑一定要在边缘侧就把口径算好不要在云端临时算。因为云端临时算用的是明细数据不仅慢而且边缘节点上传的原始数据如果不全拆出来的结果就会对不上。我在每个边缘节点上直接按车间、按介质做数据累加云端只需要把各节点的结果汇总口径一致效率也高。实际使用中最受欢迎的是一个“昨日同期对比”的视图——同一时刻今天和昨天的负荷对比曲线工厂的能源管理人员通过这个一眼就能看出今天某个车间是不是多用了电、是哪个时段多用了。这个视图在 MyEMS 里没有现成的我是用它的图表接口自己拼的。4.2 告警规则怎么设计阈值、持续时间和恢复机制告警是最容易做烦的功能。一开始我把阈值设得很严结果现场一天几百条告警能源管理员直接把它屏蔽了。后来我重新设计了告警规则引入了两个关键参数持续时间和恢复机制。持续时间的作用是过滤瞬时波动——功率超过阈值必须连续持续 5 分钟才触发告警避免启动电流或通信毛刺造成误报。恢复机制的作用是降低噪音——告警恢复后自动生成一条恢复记录并且在 2 小时内同一设备同一类型的告警不重复提醒。这样的设计让告警量下降了 80%而且剩下的告警基本条条都有实际处理价值。告警联动也值得展开说一下。我做了告警到工单的联动某台设备告警触发后系统自动在 MyEMS 里创建一条运维工单关联设备信息和最近 30 分钟的能耗曲线运维人员在工单里可以直接看到设备当时的运行状态不用再去翻曲线查历史处理效率提升很明显。4.3 报表体系和数据断点续传的可靠性设计报表这块重点做了两件事——日能源报表和月能源账单报表。日报表在每天凌晨自动生成推送前一天的用电量、用水量、各车间峰平谷电量、需量最大值这些指标月报表按计量点生成账单支持导出 Excel 给财务做成本分摊。做报表时最容易忽略的问题是数据补录。边缘节点断网期间的数据是延后补传的如果报表生成时没有检查补传是否完成生成出来的报表会缺数据。我的做法是报表模块在启动生成任务之前先检查所有边缘节点的数据连续性如果发现断档就等补传完成再生成或者在报表里明确标记“该时段数据可能不完整”宁可晚生成几小时不能生成了错数据。5. 性能优化和踩坑实录数据库、网络、时钟这些环节的教训系统上线容易稳定运行才是考验。我在这套系统运行期间踩了不少坑也做了不少性能调优这里挑几个典型的记录一下给大家一个参考。5.1 数据库写入性能和存储空间怎么平衡刚上线时遇到最直接的问题是MyEMS 默认的数据库表结构在设计上是面向中小规模的当点位数量上来后高频数据写入和查询性能明显下降。我用的是 MySQL优化措施主要有三条第一数据表分区。按时间做 RANGE 分区每个月一个分区历史数据查询和清理都方便。第二批量写入。边缘节点的数据不是一条条插入而是攒批后一次写入写入性能提升了 5 倍以上。第三冷热数据分离。一年前的数据从主表迁移到归档表主表保持轻量查询速度不受影响。存储空间的坑我也提一下如果没有定期删除策略数据量涨得很快。我在边缘节点和云端各设了不同的保留周期——边缘节点保留原始明细 30 天云端保留聚合指标 3 年既照顾了近期排查问题的需求也控制了存储成本。5.2 网络不稳定时怎么保证数据不丢工业现场的网络环境永远不会和大楼办公区一样干净。我在这个项目上遇到过一次持续一整天的光纤中断如果没有边缘节点的本地存储和断点续传机制那一天的数据就全没了。断点续传的实现方式不复杂就是边缘节点在本地数据库里给每条记录标记一个上送状态字段网络恢复后按时间顺序把未上送的数据补传云端在写入前先去重保证同一条记录不会重复入库。还有一个值得注意的细节补传数据不能一股脑全塞进 MQTT因为补传的数据量可能很大单条消息会撑爆 broker buffer。我把补传做了分页切片每次只传 500 条全部传完再传下一个批次。这样即使消息量很大也不会挤占实时数据的通道。5.3 时钟不同步和数据错位问题排查实录这是最隐蔽的一个问题。有段时间我发现某个配电间的数据曲线总是整体滞后其他配电间几十秒到几分钟一开始以为是网络延迟后来排查了半天才发现是边缘节点的系统时钟漂移了。工控机常年不关机又没有配置 NTP 自动同步时间越偏越远数据到云端后时间戳就乱了。解决方法是双保险所有边缘节点和云端服务器统一配置同一个 NTP 服务器同步周期 5 分钟同时在边缘节点的数据上送逻辑里加了一个时间偏差校验如果本机时间和云端时间偏差超过 1 秒就拒绝上送并触发告警。这个校验不一定每个系统都需要但对于跨多节点的协同系统来说能帮你尽早发现问题而不是等到数据对不上了才回头查。5.4 设备通信隔离当现场设备和信息网络放在一起做系统集成的人都知道工业现场的网络往往不是特别干净。我在这个项目里把设备通信网络和管理网络做了 VLAN 隔离边缘节点的采集网口和管理网口分开采集网口对接计量设备的通信网络管理网口对接云端的专线网络。这样即使某个设备通信异常广播风暴也不会影响到数据上送云端的通道。另外还有 Modbus 通信本身的问题。RS485 总线上挂的设备多了轮询周期会拉长而且个别设备响应超时会导致整个链路阻塞。我的做法是把多点挂载改为分组轮询每个串口只挂不超过 20 台设备这样单个设备响应超时只影响本组不影响其他组。这么做也让我在后面排查某个型号电表老是不响应的时候能快速定位到具体是哪个设备的问题。6. 这套方案的整体收益和可复用的经验清单系统从上线到现在运行了相当一段时间整体收益可以从几个维度来量化。从数据采集的完整率来说稳定在 99.9% 以上包括断网补传的那几天在内都达到了这个水平从需量控制的效果来说每月的基本电费节省了大概 12% 到 15%这部分钱是能直接看到的从告警的效率来说从每天几千条无效告警降到了每天不到三十条有效告警这让能源管理员终于愿意处理告警而不是屏蔽告警了。6.1 边缘与云端协同架构的适用边界虽然这套架构效果不错但它不是银弹。什么样的场景适合边缘加云端协同我判断有三个条件现场点位多、分布式特征明显、有实时调度需求。如果只是几个电表几个水表的小作坊项目纯云端直采就够了上边缘计算反而是过度设计。还有一种是现场设备极少但地理位置分散的场景比如分布在几个不同城市的站点每个站点一个网关这种情况网关加云端直连可能比每个站点都部署工控机更经济。所谓边缘计算节点不一定非得是工控机也可以是具备计算能力的智能网关。关键看边缘节点能承载多少业务逻辑有没有本地存储和独立的运行能力。如果说边缘节点只是个数据透传的转发器那它和传统网关没本质区别这套架构的真正价值是“边缘能独立执行规则、能独立存储、能独立决策”这三个能力缺一不可。6.2 复现这套系统需要准备的技术清单如果照着这套方案做需要的技术栈大概是这些边缘侧用 Python 写采集和规则引擎用 SQLite 或轻量数据库做本地存储用 Modbus 协议对接计量设备云端用 MyEMS 做平台底座用 MySQL 或 PostgreSQL 存业务数据用 MQTT 加 EMQX 这类 broker 做消息传输现场设备侧需要有支持 Modbus 的电表、水表、气表再加上智能控制柜或 PLC 做负荷切除和联动的执行机构。硬件层面每个边缘节点需要一台稳定可靠的工控机或高性能网关性能要求不算高但稳定性要求很高——工业现场最怕的就是设备宕机。云端服务器按点位规模配置500 个点位以内用一台 8 核 16G 的服务器足够。如果点位上万就需要考虑集群和负载均衡了。6.3 最终的一点个人体会从做这套系统到现在我最大的体会是能源管理系统的价值不在于采集了多少数据、做了多少漂亮的图表而在于数据能不能真正驱动决策和动作。边缘计算加云端协同这套架构价值恰好就在这——边缘侧让数据“采得及时”云端让数据“用得明白”调度让数据“产生收益”。一套系统如果只是采集了数据却没有任何行动反馈那和没有装系统没有本质区别。我个人的建议是如果你正在规划能源管理系统不要一上来就纠结选哪家的平台先想清楚自己的现场是什么情况、有多少点位、有哪些需要实时响应的场景然后根据这些需求反推架构。MyEMS 作为一个开源的能源管理底座最大的优势就是可定制、可改造、可控配合边缘计算的架构思路能做出来的东西上限很高。这套组合我实测下来是稳的。