☰
商场空调节能30%:能源监测系统源码与动态制冷策略实践
2026/10/5 7:14:55 网站建设 项目流程

商场空调24小时连轴转,月底电费单一看数字直接让人肉疼——这种情况我在商业地产的节能改造项目里见过太多次了。空调系统常常占商场总用电的40%到60%,而很多项目明明装了能源监测系统,却只是把数据晒在屏幕上,没有真正拿数据去控制设备,这就等于花了钱却只买了个温度计。今天要分享的这套能源监测系统源码,核心不是采集那一堆曲线,而是用动态调节制冷策略,让空调系统自己根据真实负荷、室外气温和电价时段去调整输出,实测下来一个制冷季能省30%左右电费。适合正在做商场、写字楼、数据中心或工厂空调节能改造的工程师、运维负责人,以及想从零搭建一套可落地能源系统的开发者。

先说明一点:这套系统不碰冷水机组内部逻辑,只在电气控制柜、水泵变频器、管道和配电房上下功夫,属于典型的既有建筑低成本节能改造路线,照着源码逻辑落地,比那些动不动就换主机的方案实在得多。

1. 商场空调为什么成了电费黑洞

1.1 24小时运转背后的能耗真相

商场空调不是一台挂机那么简单,而是一整套水系统:冷水机组(离心机、螺杆机)、冷冻水泵、冷却水泵、冷却塔、末端风机盘管和空气处理机组。那一排设备全开起来,装机容量能把商场总用电拉到一个很吓人的量级。更麻烦的是,很多商场晚上十点闭店,卖场空调可以关,但冷冻机房里的水泵、冷却塔照转,甚至冷水机组也按白天的策略继续运行,店员走光了,地下车库、设备层、走廊却还在按营业时段的温度标准守着,电费自然爆表。

这里有个生活化的类比:冷冻水系统就像人体的血液循环系统,冷水机组是心脏,水泵是推动血液的动力,末端风机盘管是皮肤上的汗腺。大脑都休息了,心脏还在满负荷泵血,汗腺还在拼命出汗降温,这不光是浪费,还容易把身体搞出问题。商场的空调系统就是这个状态:24小时循环不歇、制冷不降,能源损耗根本看不见,因为电表在配电房里,没人天天去盯。

所以我一直跟甲方讲,想给商场省电,第一刀必须砍在空调系统上。这套能源监测系统源码要干的事情,就是把这套系统的每一度电都盯住,再根据实时冷负荷动态调整制冷策略,把无效运转的那部分能耗挤出去。

1.2 传统定频策略的三大坑

传统商场制冷策略非常粗暴:冷冻水供水温度固定7度,主机能开就开,水泵恒频运转,末端风机盘管也是定风量。这种策略有几个明显的坑,我一个个说。

第一个坑,主机永远在满负荷附近干活。哪怕只有一层楼夜间还有加班店铺亮着灯,主机也按白天整套商场的冷负荷在制冷,这叫大马拉小车。很多老项目的压缩机就是“启停控制”,一开就是100%功率,根本谈不上效率优化,低负荷工况下简直是在拿钱换冷气。

第二个坑,冷冻水温度恒定不变。室外气温只有22度时,冷冻水还按7度送,房间照样凉到要穿外套,主机压缩机的耗电一点没少。注意一个关键数据:冷冻水出水温度每提高1度,机组COP(能效比)大约提升2%到3%。你把供水温度从7度提到9度,主机电耗降下来的幅度相当可观,但这个账很多运维团队压根没算过。

第三个坑,完全没有负荷预测。商场开门前所有人涌进来,冷负荷是突变的;下午三四点太阳西晒最强,负荷又是另一个峰值。定频策略不管这些,永远是“开”“关”两档,要么冷得客人投诉,要么闷得让人待不住,电还一点没省。

1.3 能源监测系统到底解决什么问题

我做的这套能源监测系统,核心思路就一句话:让空调系统根据真实冷负荷动态输出冷量,而不是傻乎乎地恒定运行。源码层面的核心部件包括数据采集模块、动态调节决策引擎、执行器控制模块和可视化看板。

数据采集模块负责从电表、温湿度传感器、压力变送器、水流计读数据;决策引擎负责算目标冷冻水温度、目标频率、启停时间和预冷时间段;执行器控制模块负责把这些决策发给变频器、电动阀和PLC;可视化看板则是给人看的,把能耗、能效比、温度曲线全摊在屏幕上。

这套系统不改动原有冷水机组本体,只是在电气控制柜、水泵变频器和管道上加装传感器与采集网关,投入相对可控,适合既有商场节能改造。照着这套源码逻辑去做,制冷季节电20%到30%并不是什么玄学,而是把能效窟窿一个个堵上之后的结果。这也是我把源码逻辑分享出来的原因:很多人需要的不再是理论,而是一条能直接走通的落地路径。

2. 系统架构与数据采集设计

2.1 硬件选型:传感器、电表、网关怎么配

先讲硬件层。做能源监测,最少要采集四类数据:电量数据、温度数据、压力流量数据、设备运行状态。

电量维度,最稳妥的做法是在配电房低压柜出线回路装三相多功能电表,带Modbus RTU或Modbus TCP接口,精度0.5S级就够,没必要花大钱上0.2S。如果一个回路挂多台设备,比如三台冷冻水泵共用总开关,建议一台设备一个表,免得后面查电量归属时扯皮。

温湿度传感器分布在几个关键点:室外空气温度、新风入口、回风总管、冷冻水供回水管、冷却水供回水管。别迷信几千块的高端仪表,国产PT100铂电阻配合数显变送器,精度正负0.2度,在这个场景里完全够用,坏了换一个也便宜。安装位置倒是比精度重要,供水温度探头要插进管道中央而不是贴壁面,不然管壁温度会干扰真实水温。

网关这块,我的做法是“就地采集、本地汇总”。在冷冻机房装一台小型工控机或者树莓派级别的边缘网关,用RS485总线把机房里的电表和传感器全部串起来,Modbus轮询采集,再把数据通过MQTT推送到机房里的服务器。不建议所有数据都直接上云,因为商场网络环境复杂,断网了监测就抓瞎,本地先落一份数据最稳。

2.2 通信协议选型:Modbus为主,BACnet为辅

商场里老设备什么协议都有,进口冷水机组很多是BACnet、LonWorks,国产新设备尤其是电表和变送器,Modbus几乎是一统天下。我的源码里,通信层写了两个抽象接口:Modbus采集器和BACnet采集器,但实际项目中95%的设备都用Modbus,BACnet采集器偶尔才用一次。

Modbus采集器的核心是寄存器地址映射表。比如某块电表,可能0x0000是A相电压、0x0002是A相电流、0x0010是总有功功率,每一个都是16位整型或32位浮点,字节序、数据格式都必须核对厂家手册。这里最容易踩坑的是数据格式问题:同一个寄存器明明是IEEE754单精度浮点,你按无符号整型去读,读出来的功率直接差几个数量级。所以源码里专门写了一个解析函数,根据配置表自动处理不同数据类型。

数据从边缘网关发到服务端用MQTT,topic我习惯按“商场/系统/设备类型/设备ID”组织,比如一台电表就叫mall/hvac/power/meter_101,消息体是JSON,包含温湿度、功率、累计电度、时间戳。这样后续做可视化、报警规则甚至接入第三方平台都很方便,不用再解析各家设备私有的格式。

2.3 数据存储与时间序列库

能耗数据的核心特点是时间序列:每30秒一条记录,一天2880条,一个制冷季下来几百万条。用传统MySQL存这种数据,表很快就膨胀到几十GB,查询越来越慢。我更推荐时序数据库,比如IotDB、TimescaleDB,或者体量小的项目直接用SQLite加定时汇总。

我的源码在数据存储层做了抽象接口,默认实现用IotDB,它的写入吞吐高,降采样、聚合查询都很方便。数据模型按树形结构组织,举个例子:

  • root.mall.hvac.temperature.outdoor:室外温度
  • root.mall.hvac.chiller.water_temp_supply:冷冻水供水温度
  • root.mall.hvac.chiller.water_temp_return:冷冻水回水温度
  • root.mall.hvac.equipment.chiller_01.power:主机实时功率

查最近15分钟的平均功率,一条SQL就搞定。如果项目体量小,用SQLite加pandas做离线分析也完全够,关键是结构清晰,别把所有数据堆在一张表里,否则写SQL都能累死。

3. 动态调节制冷策略的核心逻辑

3.1 负荷模型:冷负荷到底怎么算

动态调节的前提,是要知道自己现在需要“产多少冷”。冷负荷粗略公式是Q = 流量 × 温差 × 比热容,放到冷冻水系统里,就是看冷冻水的回水温度与供水温度之差,再乘上水流量。冷冻水回水温度其实就是商场实际热负荷的“镜子”:人多了、太阳晒得厉害、设备发热多了,回水温度会升高;反之,回水温度降下来。

所以我在系统里定义了一个“负荷率”指标:负荷率 = (当前回水温度 - 供水温度) / (设计回水温度 - 设计供水温度)。打个比方,设计温差5度,正常工况回水12度、供水7度;当前回水9度、供水7度,负荷率只有40%,说明末端根本没用多少冷量,这时就可以提高供水温度或者降低主机负载。

这个负荷率指标比单纯看用电功率直观得多,因为它直接反映冷量供需的平衡情况。我的调节逻辑首先判断负荷率:低于50%就提高供水温度设定值,高于85%就准备增加主机台数,中间区间交给PID慢慢调,避免频繁动作。

3.2 室外温度补偿与过渡季策略

过渡季节最省电。室外气温低于20度时,室内外温差小,商场内部发热量其实不高,这时候冷冻水供水温度完全可以提到10到12度,甚至设计好的项目可以直接切“免费冷却”模式,停掉压缩机,靠冷却塔散热加板式换热器直接把热量带走。

我的源码里有一张室外温度补偿曲线表,按地区和季节灵活配置。以下是一组典型参数:

室外温度冷冻水供水温度设定主机策略
< 15℃12℃单机低频运行/自然冷却
15~20℃11℃单机低频运行
20~25℃9℃单机自动
25~30℃8℃双机自动
> 30℃7℃三机满负荷

这组参数不是死的,需要结合末端风机盘管的换热能力微调。如果供水温度提到12度,末端风盘的风量又不够,房间温度反而会升高,所以调节要分步走、多观察,别一次把设定值拉得过大。我在实际项目里碰到过激进调参导致商场二层局部区域温度升到27度以上、客人投诉的情况,后来把温度补偿曲线放缓,每次只提0.5度,隔半小时观察一次,问题就消失了。

3.3 PID调节与变频控制

动态调节绕不开变频器。冷冻水泵和冷却水泵装了变频器之后,控制的就不再是“开停”,而是“频率”。我用串级PID的思路:外环用冷冻水回水温度作为被控量,内环用冷冻水供回水温差或压差作为辅助量,输出的是变频器频率指令。

举一个实际运行场景:营业期间,冷冻水回水温度设定为12度,实测回水温度只有10.5度,说明冷量供大于求,PID输出会降低冷冻泵频率,减少水流量;反过来,回水温度冲到13.5度,说明冷量不够,PID把频率调高。主机侧压缩机会根据冷凝压力和蒸发压力的变化自动调载,整个系统在一个动态平衡点附近工作,不会出现“忽冷忽热”的振荡。

PID参数调起来很费劲。我一般先用临界比例度法粗调P值,再慢慢加I,D参数在这个场景下用得保守,很多泵类控制干脆只用PI。还要给积分项一个比较大的限幅,防止长时间误差造成积分饱和,水温明明到了设定值,输出还偏高,系统一直过冲。

3.4 峰谷电价与预冷蓄冷策略

商业电价一般分峰、平、谷三个时段,峰电价格可能是谷电的三倍。这套系统把电价时段表做成配置数据,白天峰电时段尽量少开主机,改用谷电时段累积的冷量来扛负荷。

预冷策略很简单:早晨开门前,商场没人,门外气温也不高,但室内经过一夜闷热,墙体和货架蓄了大量的热。传统做法是开门后开足马力硬制冷,正好撞上早高峰电费。我的做法是在谷电时段(凌晨到清晨)把冷冻水温降到比平时更低的水平,比如6度,利用建筑结构的蓄冷能力;开门前两小时再把室温拉到位,白天空调主机反而可以降载运行,由墙体慢慢释放冷量。

实测下来,预冷策略可以在不增加设备的前提下,把白天空调峰值负荷压掉15%左右。这里有个注意事项:预冷不能过度,否则室内湿度过大,墙角容易结露发霉。所以我加了露点温度保护,冷冻水供水温度降到6度以下时必须触发报警,防止现场操作员把设定值调得离谱。

4. 关键源码模块解析

4.1 数据采集模块的代码实现

先看数据采集,这是整套系统的眼睛。采集的数据不准,后面的算法再好也白搭。源码里用一个collector.py模块统一管理Modbus设备采集,关键是处理好不同寄存器的数据解析。

# collector.py import minimalmodbus import struct class ModbusCollector: def __init__(self, device_config): self.slave = minimalmodbus.Instrument( device_config['serial_port'], device_config['slave_id'] ) self.slave.serial.baudrate = device_config.get('baudrate', 9600) self.slave.serial.bytesize = 8 self.slave.serial.parity = 'N' self.slave.serial.stopbits = 1 self.slave.serial.timeout = 0.3 def read_registers(self, register_map): result = {} for name, cfg in register_map.items(): addr = cfg['addr'] length = cfg.get('length', 2) dtype = cfg.get('type', 'float32') raw = self.slave.read_registers(addr, length) result[name] = self._parse_value(raw, dtype) return result def _parse_value(self, raw, dtype): if dtype == 'float32': val = struct.unpack('>f', struct.pack('>HH', raw[0], raw[1]))[0] return round(val, 2) elif dtype == 'int16': return raw[0] elif dtype == 'uint32': return (raw[0] << 16) | raw[1] else: return raw

这段代码里最关键的是_parse_value。我早期吃过苦头:同一块表,厂家手册说是浮点型,读出来全是乱码,折腾两三天最后发现是高16位和低16位反了,也就是字节序问题。后来我干脆给寄存器映射表加了byte_order字段,默认大端模式,遇到异常顺序再单独配置。做Modbus采集的人应该能体会,读错寄存器数据类型比设备通讯不上还折磨人,因为表面看起来数据是有的,只是完全对不上。

4.2 动态调节决策引擎核心代码

决策引擎放在optimizer.py,它是整个系统的“大脑”,接收采集模块送来的实时数据,按照配置的规则和PID算法输出调节指令。核心逻辑是室外温度补偿查表,加上PID误差计算。

# optimizer.py class CoolingOptimizer: def __init__(self, config): self.pid = PIDController( kp=config['kp'], ki=config['ki'], kd=config['kd'] ) self.max_step = config.get('max_step_hz', 5.0) def set_water_temp_setpoint(self, outdoor_temp): # 室外温度补偿曲线,建议实际项目改成查数据库配置 if outdoor_temp < 15: return 12.0 elif outdoor_temp < 20: return 11.0 elif outdoor_temp < 25: return 9.0 elif outdoor_temp < 30: return 8.0 else: return 7.0 def compute_adjustment(self, state): setpoint = self.set_water_temp_setpoint(state['outdoor_temp']) error = setpoint - state['water_temp_return'] output = self.pid.compute(error) # 限制单次调节幅度,防止温度设定大幅跳跃 output = max(-self.max_step, min(self.max_step, output)) return { 'water_temp_setpoint': setpoint, 'pid_output': round(output, 2), 'suggested_frequency': round(50.0 + output, 2) }

这里有个细节,set_water_temp_setpoint在源码里是硬编码分段表,但实际项目我更推荐把曲线写成配置文件存在数据库,这样运维同事改参数不用动代码。单次调节幅度限制在正负5赫兹以内,是为了防止变频器“扯大锯”:频率波动太大会让水系统压力忽高忽低,末端电动阀频繁动作,寿命会明显缩短。

4.3 执行器控制模块

决策引擎算出频率,最终要落到变频器和电动阀上。执行层封装了actuator.py,屏蔽掉不同品牌PLC和变频器的差异。这里直接给一段Modbus RTU控制变频器的示例。

# actuator.py class VFDController: """变频器控制,基于Modbus RTU写保持寄存器""" def __init__(self, collector, vfd_slave_id, freq_register=0x2000, freq_ratio=100): self.collector = collector self.slave_id = vfd_slave_id self.freq_register = freq_register self.freq_ratio = freq_ratio def set_frequency(self, frequency_hz): # 部分变频器寄存器写的不是Hz值,而是 frequency * 100 val = int(frequency_hz * self.freq_ratio) self.collector.slave.write_register(self.freq_register, val) self.collector.slave.write_register(0x2001, 1) # 启动命令 def stop(self): self.collector.slave.write_register(0x2001, 0)

这里有个大坑:很多国产变频器Modbus寄存器写的不是实际Hz值,而是“频率×100”的整型。比如要设50Hz,写进寄存器的数值是5000。每个品牌不一样,所以我把频率倍率做成配置项,默认100,遇到特殊品牌单独调。我见过有人在这上面耗了一整天,频率指令写了一直没反应,最后发现是倍率没配对,50Hz写成了50,变频器以为是0.5Hz,电机转都不转。

4.4 可视化看板与报警

系统最后要给人看。源码用Flask加ECharts做了轻量级Web看板,数据从IotDB查出来渲染成实时曲线。页面上有三个核心模块:设备实时状态、能耗趋势、能效分析(COP曲线和耗电量排行)。看板的目的不是炫技,是让运维人员一眼看出来“今天空调系统有没有在好好干活”。

报警消息我建议用MQTT直接推到运维人员的钉钉群或微信。比如冷冻水供水温度超过设定值3度并持续10分钟,触发“制冷不足”报警;主机功率突降但水泵还在转,大概率是主机跳闸,这类异常必须立刻通知人到现场。报警规则一定要设延迟,避免传感器瞬时抖动误报,一晚上把群消息刷爆,第二天大家就把报警当成狼来了,真正出故障时反而没人看了。

5. 实测效果与调参经验

5.1 省电30%是怎么算出来的

我在一个实际改造项目里验证过这套系统。那个商场建筑面积约2.3万平方米,制冷面积1.6万平方米,改造前整个制冷季空调系统每月电费约25万元。装上这套能源监测系统和动态调节策略后,第一个完整月的空调电费降到18万元左右,整体省了约28%到30%。

这个降幅不是某一个动作的功劳,而是多项措施叠加的结果。其中变频泵组贡献最大,约10%;供水温度线上移贡献约8%;峰谷预冷贡献5%到7%;剩下是管理上及时关停冗余设备省下来的。各项措施之间有交叉,这里只做大致的分布参考。

措施节电贡献估算前期投入
泵组变频调节8%~10%中(变频器+控制器)
冷冻水温度动态上移6%~8%低(软件策略)
峰谷预冷4%~7%低(软件策略)
冗余设备关停与排程3%~5%低(管理+联动)

最让我意外的是,过渡季节的一个月,节能率比盛夏还高。原因很简单,室外温度23度到25度的天气,传统系统还在按7度冷冻水满负荷跑,节能策略已经把供水温度提到9度甚至10度,主机和泵的实际功耗大幅下降,整体节能率冲到35%以上。

5.2 调参时的三条铁律

第一,所有调节动作都要设“软化”。软化就是改变设定值或频率时逐步逼近目标,不要一步到位。比如把冷冻水供水温度从7度提到9度,分5次执行,每15分钟提0.5度,给末端风机盘管一个适应时间,也防止水系统压力突变导致管道噪音。

第二,在营业高峰前后留缓冲区。午后两点到四点是商场一天最热的时候,负荷率很容易冲到90%以上,这时候系统不应激进上调供水温度,宁可直接切“保供冷”模式,以温度不超限为第一优先。等峰值过去一小时再恢复正常调节,这个判断逻辑我写在决策引擎里了。

第三,所有自动策略必须带手动优先开关。商场运维团队不一定懂自动控制,万一策略误判导致客人投诉“商场太热”,现场要能一键切回手动模式。我在看板首页放了一个很大的红色“手动接管”按钮,按下之后所有策略暂停,系统只做数据监测。这不是示弱,而是对运维人员的尊重,也是项目能长期落地不被弃用的关键。

5.3 常见问题与排查技巧

做这套系统时踩过很多坑,我整理成一张速查表,这些都是实际运行环境里高频出现的问题。

现象可能原因排查方法
采集数据显示温度不变传感器断线或地址冲突检查RS485线路A/B端是否接反,用Modbus扫描工具测地址
主机已启动但功率显示0电流互感器方向装反或电表量程不对核对互感器倍率和接线,用钳形表比对
冷冻水温设定执行了但没变化主机的本地温度设定优先于远程检查主机控制柜远程/本地拨码
PID输出振荡积分时间太小或比例增益过大先减小P值50%,再逐步增大I值
MQTT反复断连网络抖动或账号过期检查broker配置,加断线重连和数据缓存

最容易让人抓狂的问题是“数据看着完美,但设备就是不动作”。这种问题八成在网关到控制器的链路,常见原因是寄存器写入范围不对,或者控制器只允许最高权限写,普通寄存器是只读。我的经验是,在写自动化控制代码之前,先用Modbus调试助手手动写一次目标寄存器,确认能远程改频率、能远程启停,再谈自动化。这也是我每次项目调试前必做的事,宁可多花半小时,也别把问题留到联调阶段。

还有一个真实的坑要提醒:商场消防通道、弱电机房等区域会有信号屏蔽,无线传感器不要往那些位置装,老老实实走有线RS485或者用网关做本地中转,不然数据时断时续,你会被排查逼疯。

6. 这套系统还能扩展成什么

6.1 扩展方向:水电燃气与空气质量联动

能源监测系统源码本身是一个基础框架,底层“采数、决策、执行”的思路可以横向扩展。往小了说,可以接水电燃气表,把商场的水耗、气耗也纳入监测,接下来做能耗定额管理时有完整的数据底座。往大了说,能在同一套架构上叠加室内空气质量监测,把二氧化碳浓度、PM2.5作为新风系统动态调节的输入。商场新风量一般是按人头算的,但人少时新风开那么大,处理室外空气又要多耗冷量,有了CO2传感器就可以动态调整新风阀开度,既保证空气质量又省能耗。

6.2 与客流系统联动的进阶玩法

还有一个方向我特别看好:把预冷策略和商场开门时间、节假日活动排期联动。商场的冷负荷很大一部分来自客流,节假日人流量翻倍,冷负荷突增。如果能从收银系统或客流统计系统接到实时客流量,动态调节的准确度会更高。

这一步的坑在于,客流数据接口不一定是标准API,需要跟第三方客流设备厂商协调协议,但它的投资回报率很高。有了客流量以后,还能做“提前量控制”:预测下午三点客流达到峰值,系统在两点半就把冷冻水供水温度降下来,提前把冷量备足,而不是等温度真的升上去了再加机,这是从“被动响应”到“主动预判”的升级。

最后说一句实际体会。我见过很多节能改造项目,理论讲得头头是道,最后死在数据不准和运维不会用这两件事上。这套能源监测系统源码的价值,不在于那些聪明算法,而在于把采集层做扎实、把执行层的回退机制做好、让人看得懂也用得上。空调省电这件事,不是系统上了就自动省,是一点点把无效运转挤出去的。真正跑起来的系统,每天都会留下有价值的调节记录,那才是它“活着”的证据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询