2. 能源管理数据对象建模

能源管理数据库工程的第一步不是建表,而是把现场“看得见、摸得着”的能源对象抽象成可存储、可计算、可追溯的数据对象。电、水、气、热四类介质在物理量、采样方式、累积特性和计量层级上差异很大,如果直接套用同一张“测点表”,后期做能效分析、成本分摊和碳排核算时必然出现口径混乱。本节围绕“介质特征—测点分类—设备层级—编码—表结构映射”这条主线,说明如何把现场对象稳定地落到数据库里。

一、四类能源介质的数据特征差异

电是瞬时量与累积量并存的介质:电压、电流、有功功率是瞬时量,有功电能是累积量,且存在三相、正反向、峰平谷等维度。水、气多为体积或质量累积量,通常以脉冲、4-20mA 或 Modbus 寄存器输出,瞬时流量与累积流量需要区分。热则更复杂,热量等于流量与焓差的乘积,必须同时采集供回水温度、流量和压力,才能计算瞬时热功率与累积热量。

从数据库角度看,这些差异决定了三件事:一是量纲与单位必须显式存储,不能只靠字段名隐含;二是累积量要处理翻转与清零,脉冲计数达到上限会回绕,换表会归零;三是瞬时量要处理质量码,通信中断、超量程、人工置数必须可区分。下表给出四类介质的典型数据特征,作为建模时的对照依据。

介质典型瞬时量典型累积量采样特征建模要点
电U、I、P、PF、频率正向/反向有功电能、无功电能1s~15min,三相相别、方向、费率时段
水瞬时流量累积体积脉冲或寄存器,1~60s脉冲当量、翻转、换表
气瞬时流量、压力、温度累积体积/质量1~60s,需温压补偿标况换算、压缩因子
热瞬时热功率、流量、供回温累积热量5~60s,成组采集焓差计算、供回配对

二、测点分类:从“信号”到“语义”

现场一个 Modbus 寄存器或一个 OPC 项,只是“信号点”;而数据库里需要的是带语义的“测点”。建议把测点分为四类:模拟量测点(连续数值,如功率、流量)、累积量测点(单调递增或可回绕,如电能)、状态量测点(开关、运行/停止、报警)、计算量测点(由其他测点派生,如单位产品能耗、热效率)。分类的意义在于:不同类型对应不同的存储策略、质量码规则和聚合函数。

例如累积量在数据库中通常存“原始累积值 + 采集时间”,聚合时用相邻两点差值除以时间间隔得到区间用量;而模拟量直接存瞬时值,聚合时用平均值或最大值。若把两者混在一张表里用同一套聚合逻辑,就会出现“电能被平均”“功率被累加”的错误。

三、设备层级建模与 KKS/资产编码

能源对象天然具有层级:厂区→车间→产线→设备→部件。数据库建模时,推荐用“资产树 + 测点挂接”的方式,而不是把层级压平到测点表里。资产树节点保存层级关系、资产编码、介质类型和计量边界;测点通过外键挂到具体资产节点上。这样,任意层级的能耗汇总都可以通过递归查询或预计算路径实现。

编码方面,KKS 是电力行业常用的标识系统,按“工艺系统—设备—部件”分段编码,例如 10LAC10CT001 可表示某机组某系统的某台设备。资产编码则更贴近企业财务与运维口径,如 AST-EP-001-03。两者不必二选一:可以在资产表中同时保留 KKS 码和资产码,并建立映射,使运行数据既能按 KKS 定位,也能按资产口径出报表。

能源数据对象建模:从现场信号到数据库表结构 现场对象层 电表 / 多功能电力仪表 U、I、P、E(三相) 水表 / 流量计 瞬时流量、累积体积 气表 / 流量计 标况流量、压力、温度 热量表 供回温、流量、热量 PLC / RTU / 网关 Modbus、OPC UA、IEC104 采集 测点分类层 模拟量测点 瞬时值、单位、量程、质量码 累积量测点 累积值、翻转、换表、倍率 状态量测点 开关、运行、报警、事件 计算量测点 单耗、效率、区间用量 统一:测点ID + 资产ID + 介质类型 挂接 资产层级与数据库映射 厂区(asset_id=1,介质=混合) 车间 / 产线(asset_id=2,介质=电) 设备(asset_id=3,KKS=10LAC10CT001) 部件 / 回路(asset_id=4,相别=A) 核心表结构映射 asset(资产树):asset_id、parent_id、kks、asset_code、medium point(测点):point_id、asset_id、point_type、unit、scale ts_value(时序值):point_id、ts、value、quality energy_hourly(小时聚合):asset_id、medium、kwh、m3、gj 聚合表按 asset_id + 介质 + 时段唯一约束

四、数据库表结构映射的落地要点

把上述对象落到关系库时,建议至少拆成四张核心表:asset(资产树,含 parent_id、kks、asset_code、medium)、point(测点,含 point_id、asset_id、point_type、unit、scale、翻转阈值)、ts_value(时序值,含 point_id、ts、value、quality)、energy_hourly(小时聚合,含 asset_id、medium、用量、成本)。asset 表用 parent_id 自关联表达层级,point 表通过 asset_id 挂接,ts_value 只存原始值,聚合表由定时任务从 ts_value 计算生成。

一个容易忽略的点是计量边界。同一台设备可能既有进线电表又有出线电表,若不在 asset 表上标注“计量方向”和“是否用于结算”,汇总时就会重复计算。建议在 asset 表增加 meter_role 字段,取值如 incoming、outgoing、sub_meter,并在聚合逻辑中按角色过滤。

建模顺序建议:先定介质与量纲,再定测点分类,然后建资产树并编码,最后才映射表结构。反过来做,往往会在聚合阶段返工。

五、一个可执行的最小建模示例

假设某车间有一台空压机,现场配置一块电表和一块气表。电表输出三相有功功率和正向有功电能,气表输出标况累积体积。建模过程如下:

  1. 在 asset 表插入三层节点:车间(asset_id=101)、空压机(asset_id=102,kks=10LAC10CT001,asset_code=AST-EP-001)、空压机出线回路(asset_id=103,meter_role=sub_meter)。
  2. 在 point 表插入测点:电表功率(point_type=AI,unit=kW)、电表电能(point_type=ACC,unit=kWh,翻转阈值=999999.9)、气表累积体积(point_type=ACC,unit=Nm³)。
  3. ts_value 按 15 秒写入原始值,quality 字段区分正常、通信中断、超量程。
  4. energy_hourly 每小时计算:电能用量 = 本小时末累积值 − 上小时末累积值;若检测到累积值下降且降幅接近满量程,则判定为翻转,按翻转补偿公式修正。
-- 小时聚合示例(伪SQL)
INSERT INTO energy_hourly(asset_id, medium, stat_hour, usage, unit)
SELECT p.asset_id, a.medium, date_trunc('hour', t.ts),
       max(t.value) - min(t.value) AS usage,
       p.unit
FROM ts_value t
JOIN point p ON p.point_id = t.point_id
JOIN asset a ON a.asset_id = p.asset_id
WHERE p.point_type = 'ACC'
  AND t.ts >= :hour_start AND t.ts < :hour_end
  AND t.quality = 0
GROUP BY p.asset_id, a.medium, date_trunc('hour', t.ts), p.unit;

执行后应检查:同一 asset_id 在同一小时是否只有一条记录;usage 是否为非负;若出现负值,优先排查翻转未补偿或换表未标记。只有这些口径稳定后,后续的能效对标、成本分摊和碳排核算才有可靠的数据基础。