Skip to content

总体设计

先定边界再写代码:能碳系统的业务范围、角色、功能架构、数据流、碳核算方法和部署架构。

更新于

能碳系统最常见的失败方式,不是技术选错,而是边界没定清:有人把它当电表抄表系统,有人要求它直接出碳中和报告,还有人希望它顺便接管生产排程。边界不清,表结构会反复改,硬件点位会反复加,最后谁也说不清“这个数准不准”。

这一章先把边界、角色、功能和数据流定下来。技术栈在下一章,硬件在再下一章。

1. 建设目标

一套工厂级能碳系统,通常要同时满足四类诉求:

诉求 具体表现 系统能力
看得见 现在用了多少电、哪条线在跑、哪块表断了 实时采集、能流图、设备状态、通信状态
算得清 昨天/上月/本季度用了多少、花了多少钱、谁用得多 分项统计、同比环比、排名、定额考核、成本核算
管得住 超限报警、需量越限、异常用能、跑冒滴漏 报警规则、工单、需量预测、异常检测
报得出 碳排放多少、范围一/二各多少、碳强度多少 碳核算、因子库、核算报告、数据溯源

再往上,才是碳资产、碳交易、绿电绿证、CCER、供应链碳足迹这些扩展能力。第一版不要做,除非合同明确要求。

2. 业务边界

2.1 建议纳入第一版的范围

  • 能源介质:电、水、天然气、蒸汽、压缩空气。有余力再加冷/热量、氧气/氮气、光伏和储能。
  • 组织层级:园区 → 车间 → 产线 → 班组。至少支持三级。
  • 计量层级:园区总表、车间分表、重点设备表。总表与分表要能对账。
  • 碳核算:组织级范围一、范围二;范围三做成可配置的选填项。
  • 报表:日报、月报、年报、碳核算报告、异常报告。
  • 对接:现有 PLC、电表、水表、燃气表;MES/ERP 只做产量、产值等少量数据接口。

2.2 第一版明确不做

  • 碳交易撮合、绿证交易、CCER 项目开发。
  • 产品级碳足迹(LCA)全生命周期建模。
  • 生产排程、设备预测性维护、EMS 需量控制闭环。
  • 直接控制现场设备(除非有独立的安全联锁和变更管理)。

3. 用户角色

角色 关心什么 典型操作
能源管理员 今天用了多少、哪块表异常、有没有超定额 看驾驶舱、处理报警、导出报表、维护计量点
车间 / 产线负责人 本车间能耗、同比环比、班组排名 看本组织数据、确认异常、填报产量
碳管理员 活动数据是否完整、因子是否正确、核算结果 发起核算、选择因子、锁定数据、生成报告
管理层 总能耗、总成本、碳强度、趋势 看驾驶舱、看月报、看排名
运维人员 网关在线率、仪表故障、数据质量 看通信状态、派工单、维护设备台账
系统管理员 用户、角色、菜单、字典、参数 若依系统管理

权限设计上,若依的角色 + 菜单权限 + 数据权限足够覆盖前五类。碳管理员和能源管理员通常是不同角色,因为碳核算涉及“数据锁定”和“因子版本”,不能让所有人改。

4. 功能架构

能碳管理系统
├── 驾驶舱
│   ├── 今日/本月能耗总览
│   ├── 能源成本与碳排总览
│   ├── 能流图(总表→分表)
│   ├── 趋势与排名
│   └── 报警与通信状态
├── 能源监控
│   ├── 实时数据(点位级)
│   ├── 设备/计量点状态
│   ├── 通信在线率
│   └── 历史曲线
├── 能耗分析
│   ├── 分项/分组织/分介质统计
│   ├── 同比环比
│   ├── 排名与占比
│   ├── 定额与考核
│   ├── 需量分析
│   └── 成本分析
├── 碳管理
│   ├── 排放源与核算边界
│   ├── 活动数据管理
│   ├── 排放因子库
│   ├── 核算任务与结果
│   ├── 碳强度
│   └── 核算报告
├── 报警与工单
│   ├── 报警规则
│   ├── 实时报警
│   ├── 报警确认/屏蔽
│   └── 工单流转
├── 基础数据
│   ├── 组织与班组
│   ├── 能源介质
│   ├── 计量点与点位
│   ├── 设备台账
│   ├── 班次与日历
│   └── 能源单价
└── 系统管理(若依自带)
    ├── 用户/角色/菜单/部门
    ├── 字典/参数/通知
    ├── 定时任务
    └── 日志/监控

4.1 驾驶舱

驾驶舱不是“把所有图表堆在一起”,而是回答管理层每天早上最关心的五个问题:

  1. 今天到现在用了多少能、花了多少钱?
  2. 和昨天/上月同期比,是升还是降?
  3. 哪个车间/介质排第一?
  4. 碳排放到多少了,离年度目标还有多远?
  5. 有没有表断了、报警没处理?

技术上用 ECharts 的组合图:KPI 卡片 + 趋势折线 + 占比环图 + 排名条形图 + 能流桑基图。数据来自预聚合的日/月统计表,不要让驾驶舱直接查秒级原始数据。

4.2 能源监控

监控页的核心是“点位级可下钻”:

  • 园区 → 车间 → 计量点 → 点位,四级下钻。
  • 每个点位显示实时值、单位、采集时间、数据质量。
  • 通信状态单独一栏:在线、离线、超时、数据异常。
  • 历史曲线支持任意时间范围,超过 7 天自动降采样。

4.3 能耗分析

分析页的难点不是画图,而是口径。同一个“本月用电”,按自然月、抄表月、班次、生产日算出来可能都不一样。系统必须在页面上明确显示口径,并允许配置:

口径 说明 适用
自然月 每月 1 日 00:00 到月末 23:59 对外报表、碳核算
抄表月 按电费单的抄表起止日 与电费对账
生产日 例如 08:00 到次日 08:00 班组考核
班次 早/中/晚班 车间考核

定额考核建议做成“基准值 + 调整系数”:基准值来自历史同期或工艺定额,调整系数考虑产量、天气、设备检修。不要用一条固定线卡死所有月份。

4.4 碳管理

碳管理不是“能耗乘以一个系数”这么简单,至少要拆成五步:

  1. 定边界:组织边界(哪些法人/厂区)、运营边界(范围一/二/三)、时间边界(核算期间)。
  2. 识别排放源:燃烧设备、外购电、外购蒸汽、制冷剂逸散、车辆、废弃物等。
  3. 采集活动数据:电量、燃气量、蒸汽量、制冷剂补充量、产量/产值。
  4. 选择排放因子:电网因子、燃料因子、蒸汽因子、GWP 值,全部带版本和来源。
  5. 计算与报告:按范围汇总,出总排放、碳强度、同比、明细和凭证。

4.5 报警与工单

报警规则至少支持四类:

类型 例子 判定方式
阈值报警 有功功率超过 800 kW 点位值 + 比较符 + 持续时间
变化率报警 10 分钟内电量突增 50% 滑动窗口斜率
通信报警 连续 3 个周期没收到数据 采集心跳/超时
业务报警 车间月能耗超定额 10% 统计结果 + 规则

报警要能去重、抑制、升级:同一块表反复跳变,不能每分钟发一条短信;检修期间可以屏蔽;超过 30 分钟未确认自动升级给主管。

5. 核心业务流程

5.1 采集流程

仪表产生数据
   ↓(RS-485 / 4-20mA / 脉冲 / 以太网)
网关按周期轮询或主动上报
   ↓(本地缓存、越限判断、时间戳)
MQTT 发布到 EMQX
   ↓(QoS 1,断线重连)
采集服务订阅、解析、校验
   ↓
写时序库(原始值)+ 写 Redis(最新值)
   ↓
报警引擎判断 → 生成报警/工单
   ↓
定时任务聚合小时/日/月统计

关键原则:原始数据只写一次,统计结果可重算。原始数据是事实,统计口径可能变;口径变了要能重跑,而不是改历史。

5.2 能耗统计流程

  1. 采集服务写入分钟级原始值。
  2. 每小时聚合一次小时值:累计量取首尾差,瞬时量取平均/最大/最小。
  3. 每天聚合日值,并处理跨零点、缺数、补数。
  4. 每月生成月报,锁定后不允许直接改,只能走调整单。
  5. 统计结果带上数据完整率:应采点数、实采点数、缺失点数。完整率低于阈值时,报表要标黄。

5.3 碳核算流程

选择核算期间与组织边界
   ↓
系统汇总活动数据(电、气、汽、制冷剂……)
   ↓
数据完整性检查(缺数、异常、单位)
   ↓
匹配排放因子(按介质、地区、年份、版本)
   ↓
按范围一/二/三计算
   ↓
生成核算结果与明细
   ↓
碳管理员复核 → 锁定 → 导出报告

6. 碳核算方法

这一节给出足够写代码的公式和口径。正式项目请以 GB/T 32150、ISO 14064-1、GHG Protocol 以及生态环境部发布的最新行业核算指南为准。

6.1 基本公式

排放量(tCO₂e)= Σ(活动数据 AD_i × 排放因子 EF_i × GWP_i)
  • 活动数据 AD:用了多少能源或物料,单位要与因子匹配。
  • 排放因子 EF:每单位活动数据的排放量。
  • GWP:全球变暖潜势,CO₂ 取 1,CH₄ 取 28 或 29,N₂O 取 265 或 273(AR5/AR6 口径不同,必须固定并记录)。

6.2 范围划分

范围 包含 本系统数据来源
范围一 自有锅炉/窑炉燃烧、厂内车辆、制冷剂逸散、化粪池等 燃气表、油品台账、制冷剂采购记录
范围二 外购电力、外购蒸汽、外购热/冷 电表、蒸汽流量计、热量表
范围三 采购商品、上游运输、废弃物、差旅、通勤等 采购/财务/人事系统,第一版可只做选填台账

6.3 常用计算方式

外购电力(范围二)

排放量 = 外购电量(MWh)× 电网排放因子(tCO₂/MWh)

示例:120,000 kWh = 120 MWh,因子取 0.5568 tCO₂/MWh,则排放 66.816 tCO₂。

化石燃料燃烧(范围一)

排放量 = 消耗量 × 低位热值 × 单位热值含碳量 × 碳氧化率 × 44/12

很多指南会直接给出“每吨/每万立方米的排放因子”,系统里两种方式都要支持:直接因子和分项计算。

外购蒸汽/热(范围二)

排放量 = 蒸汽/热量(GJ)× 供汽排放因子(tCO₂/GJ)

制冷剂逸散(范围一)

排放量 = 补充量(kg)× GWP / 1000

6.4 一个完整的示例

假设某月:

排放源 活动数据 因子(示例) 排放量
外购电 120,000 kWh 0.5568 tCO₂/MWh 66.816 tCO₂
天然气 8,000 Nm³ 21.84 tCO₂/万 Nm³ 17.472 tCO₂
外购蒸汽 300 GJ 0.11 tCO₂/GJ 33.000 tCO₂
制冷剂 R410A 2 kg GWP 2088 4.176 tCO₂e
  • 范围一 = 17.472 + 4.176 = 21.648 tCO₂e
  • 范围二 = 66.816 + 33.000 = 99.816 tCO₂e
  • 合计 = 121.464 tCO₂e
  • 若当月产值 500 万元,碳强度 = 121.464 / 500 = 0.243 tCO₂e/万元

6.5 组织边界与合并方式

方式 规则 适用
运营控制权法 对拥有运营控制权的设施 100% 计入 大多数企业首选
财务控制权法 对财务控制的设施 100% 计入 与财务合并报表一致
股权比例法 按持股比例计入 合资、参股较多时

系统里应把“组织边界”做成核算任务的一个属性,而不是写死在代码里。同一套数据,换一种合并方式,结果会不同。

7. 数据架构

7.1 分层

ODS  原始层:采集原始值、原始报文、质量码
DWD  明细层:清洗后的分钟/小时明细,统一单位与时区
DWS  汇总层:日、月、年,按组织/介质/计量点
ADS  应用层:驾驶舱、报表、碳核算结果

小项目不必上大数据平台,用“时序库 + MySQL 统计表”就能实现这四层。关键是每层职责清楚:

  • ODS 只追加,不修改。
  • DWD 做单位换算、异常标记、补数。
  • DWS 可重算,保留计算版本。
  • ADS 面向页面,允许冗余。

7.2 数据量估算

假设 1,000 个点位,每分钟采一次:

1,000 × 60 × 24 = 1,440,000 条/天
× 365 ≈ 5.26 亿条/年

这还没算报文和报警。MySQL 单表存这个量级会非常吃力,所以原始数据必须进时序库。时序库按列压缩后,一年通常只有几十 GB,具体取决于标签基数和压缩策略。

7.3 保留策略

数据 保留 说明
秒/分钟原始值 1~3 年 碳核查通常要看历史,建议至少 3 年
小时值 5~10 年 报表和趋势分析
日/月值 长期 归档到 MySQL 或对象存储
报警/操作日志 3 年 审计要求
核算报告与因子版本 长期 碳报告的可追溯性

8. 部署架构

8.1 推荐:单体应用 + 独立采集服务

                    ┌─────────────────────┐
   浏览器 ──HTTPS──▶│ Nginx               │
                    │ 静态资源 + 反向代理  │
                    └──────────┬──────────┘
                               │
                    ┌──────────▼──────────┐
                    │ RuoYi 应用(单体)    │
                    │ 业务 + 权限 + 报表    │
                    └───┬──────────┬──────┘
                        │          │
              ┌─────────▼──┐  ┌────▼─────────┐
              │ MySQL      │  │ Redis        │
              └────────────┘  └──────────────┘
                        │
              ┌─────────▼──────────┐
              │ TDengine           │
              └─────────▲──────────┘
                        │
              ┌─────────┴──────────┐      ┌──────────────┐
              │ Collector 服务      │◀────▶│ EMQX         │
              │ 协议适配 + 清洗      │ MQTT │ MQTT Broker  │
              └─────────▲──────────┘      └──────▲───────┘
                        │                        │
                        └──── 网关 / DTU ────────┘

为什么把采集服务独立出去:

  • 协议库(Modbus、OPC UA、IEC 104)经常是阻塞 IO,和 Web 应用混在一起会拖慢页面。
  • 采集服务需要独立重启、独立扩容、独立部署到靠近现场的网络区域。
  • 采集服务权限更敏感,独立后可以只开放 MQTT 和时序库写权限,降低攻击面。

8.2 什么时候上微服务

条件 建议
1 个园区、1 个团队、点位少于 5,000 单体 + 独立采集,足够
多园区、多租户、多个团队并行开发 RuoYi-Cloud 微服务
需要独立扩容采集/报表/碳核算 至少把采集和报表拆出去
客户强制要求信创或国产中间件 单独评估,不要为了微服务而微服务

9. 与若依模块的映射

若依模块 在本系统中的职责 是否改造
ruoyi-admin Web 入口、业务 Controller、启动类 增加业务包
ruoyi-framework Spring Security、JWT、数据源、拦截器 少量扩展
ruoyi-system 用户、角色、菜单、部门、字典、参数 基本复用
ruoyi-common 工具类、注解、统一返回、异常 增加能源/碳相关工具
ruoyi-quartz 定时聚合、报表生成、核算任务 复用
ruoyi-generator 单表 CRUD 代码生成 复用,生成后手工改
新增 ruoyi-energy 计量点、采集、统计、报警、碳核算 新建业务模块
新增 collector 协议适配、MQTT 接入、数据清洗 独立 Spring Boot 服务

业务模块建议单独建 Maven 模块,而不是全部塞进 ruoyi-system。这样采集、统计、碳核算的依赖不会污染系统模块,未来也更容易拆服务。

10. 非功能设计

维度 目标 做法
性能 页面接口 P95 小于 500ms,驾驶舱小于 3s 预聚合、Redis 缓存、时序库降采样
采集能力 单采集服务 5,000 点位,1 分钟周期 连接池、批量写、异步队列
可用性 采集服务断线自动重连,网关离线缓存 7 天 MQTT QoS 1、本地缓存、补传
数据质量 通信在线率 ≥ 98%,电量与电费单偏差 ≤ 1% 心跳、质量码、对账报表
安全 OT/IT 隔离,最小权限,全量审计 防火墙、VLAN、角色权限、操作日志
可扩展 新增介质/协议不改核心表 介质字典、协议适配器、点位模板
可运维 5 分钟内定位是仪表、网关还是平台问题 分层健康检查、链路追踪、告警

11. 实施路线

阶段 周期(参考) 交付物 验收标准
P0 调研 1~2 周 计量点清单、点位表、网络图 甲方确认点位和边界
P1 底座 1~2 周 若依工程、数据库、权限、菜单 登录、组织、角色可用
P2 采集 2~3 周 网关配置、采集服务、时序库 一条介质的数据稳定入库
P3 业务 3~4 周 监控、统计、报警、报表 总表与分表对账通过
P4 碳核算 2~3 周 因子库、核算任务、报告 与手工 Excel 核算一致
P5 上线 1~2 周 部署、培训、验收文档 连续 7 天稳定运行

实际项目里 P2 和 P3 会交叉:硬件到货晚,就先用 Modbus 模拟器开发;现场网络没通,就先用 MQTT 压测。不要等硬件全部到位才开始写软件。

12. 设计检查清单

在进入技术选型前,确认下面这些问题都有答案:

  • 管哪些能源介质?每种介质的计量单位是什么?
  • 组织层级几级?是否多园区、多法人?
  • 总表、分表、设备表各多少个?是否需要总表-分表对账?
  • 碳核算做到范围几?组织边界用哪种合并方式?
  • 是否需要对接现有 PLC、DCS、MES、ERP?接口和责任人是谁?
  • 现场有没有可用的网络?能否布线?谁负责施工?
  • 报表口径按自然月还是抄表月?谁有权锁定数据?
  • 数据保留几年?有没有等保、审计、国产化要求?

这些答案会直接决定下一章的选型。带着它们读技术栈会更有针对性。

Type to search…

↑↓ navigate↵ selectEsc close