双碳沙盘模型控制系统,涉及碳捕集(吸收塔、再生塔、压缩机、注入井)、零碳园区(光伏阵列、风机、储能站、微电网、充电桩)、综合能源(可再生能源、储能、氢能、碳捕集、碳汇)等多个模块的协同控制与动态演示。与能源电力沙盘不同,双碳沙盘控制系统的核心是"碳从哪里来、怎么捕集、怎么利用、怎么中和"的完整碳管理闭环------碳捕集的时序控制、零碳园区的源网荷储协同、综合能源的多模块联动,每个环节的控制逻辑必须与实际双碳管理路径一致。
本文结合筑城世纪模型在工业沙盘控制系统开发中的项目经验(2008年成立,2000㎡制作工厂,控制系统自主研发,已为华北电力大学、国机集团、巴斯夫、国家电网、清华大学等500+企事业单位提供服务),梳理双碳沙盘模型多系统协同控制系统的设计与实现方案,涵盖系统架构、硬件选型、多段灯带与传感器协同控制、Modbus RTU寄存器映射及多场景代码实现。
一、双碳沙盘控制系统的技术需求
双碳沙盘的控制系统需求与普通工业沙盘有显著差异:
功能模块 技术要求 实现难度
碳捕集时序演示 烟气→吸收→再生→压缩→输送→注入,多段灯带按碳捕集流程时序流动 中高
零碳园区源网荷储协同 绿电发电→储能调峰→绿电直供→负荷使用,四段接力联动 中高
多能互补联动演示 可再生能源+储能+氢能+碳捕集多模块并行控制 高
多工况一键切换 正常捕集/检修状态/应急停机、日常运行/高峰调度/应急备用、碳中和路径/碳达峰场景/净零排放 高
碳足迹数据可视化 多色灯带区分不同碳流路径,与碳排放数据联动 中
筑城世纪模型的工业沙盘控制系统方案,基于上述需求,采用STM32+Modbus RTU架构,已在多套工业沙盘项目中完成部署验证。
二、为什么双碳沙盘必须用STM32+Modbus RTU方案
双碳沙盘的控制系统有几个特殊要求:
第一,多模块并行控制的时序精度要求高。 双碳沙盘需要按实际碳管理路径时序演示"碳捕集→零碳园区→综合能源"的完整链条。各模块之间的衔接延时需精确控制,模拟真实双碳管理场景。STM32的中断响应精度可达1ms级,配合状态机编程可实现精确的多段时序控制。
第二,多技术路线的协同控制复杂。 双碳沙盘可能同时涉及碳捕集、零碳园区、综合能源等多条技术路线,每条路线的设备状态、灯带逻辑、时序参数完全不同。STM32配合状态机编程可实现多路线并行独立控制。
第三,后期修改频繁。 双碳沙盘在交付后经常需要根据客户需求调整(如新增"应急停机"模式、调整各模块的时序参数、修改碳流路径)。STM32方案通过寄存器在线修改参数即可完成调整,无需重编译代码。
STM32 vs PLC 选型对比:
对比项 PLC方案 STM32方案
硬件成本 8000-15000元 800-1500元
时序控制精度 10-20ms扫描周期 1ms中断响应
多模块并行控制 需多个PLC或复杂梯形图 多状态机独立调度
后期修改 需编程软件授权 寄存器在线修改
为什么用RS485/Modbus RTU?
双碳沙盘模型内部设备分布广泛(碳捕集区、零碳园区、综合能源区等),RS485总线支持多点通讯(理论32个节点),一线串接所有设备,布线简洁。Modbus RTU是工业标准协议,支持接入触摸屏、中控平板等第三方设备。
三、系统架构设计
3.1 总体架构
text
┌─────────────────────────────────────────────────────────────────┐
│ 触摸屏/中控平板(Modbus RTU 主站) │
│ 工况切换 速度调节 模块控制 模式切换 │
└─────────────────────────┬───────────────────────────────────────┘
│ RS485(9600,8N1,120Ω终端电阻)
┌─────────────────────────▼───────────────────────────────────────┐
│ STM32F103RCT6 从站 │
│ 指令解析 → 状态机调度 → GPIO/PWM/单总线输出 │
└───────┬─────────┬─────────┬─────────┬───────────────────────────┘
│ │ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│碳捕集 │ │零碳 │ │综合 │ │碳足迹 │
│模块 │ │园区 │ │能源 │ │灯带 │
│灯带 │ │灯带 │ │灯带 │ │ │
└───────┘ └───────┘ └───────┘ └───────┘
3.2 硬件选型
组件 选型 选型理由
主控MCU STM32F103RCT6 256KB Flash,51个GPIO,3个USART
通讯接口 MAX485ESA RS485收发器,工业级抗干扰
灯带 WS2812B(60灯/米) 单总线控制,每灯独立寻址
中控屏 7寸串口屏 支持Modbus RTU主站协议
3.3 GPIO分配表(以典型双碳沙盘为例)
端口 功能 信号类型 说明
PA9/PA10 USART1 通讯 与中控屏RS485通讯
PB0 碳捕集模块灯带 单总线输出 WS2812B(烟气灰色→CO₂蓝色→封存绿色)
PB1 零碳园区灯带 单总线输出 WS2812B(绿电绿色→储能蓝色→负荷橙色)
PB2 综合能源灯带 单总线输出 WS2812B(绿电绿色→氢能蓝色→碳流灰色)
PB3 碳足迹灯带 单总线输出 WS2812B(碳排放路径指示)
四、Modbus寄存器映射设计
以下为双碳沙盘控制系统的寄存器定义(共32个保持寄存器):
4.1 系统控制寄存器(40001-40008)
寄存器地址 偏移地址 功能 数据类型 读写 取值范围 说明
40001 0x0000 系统启停 bit R/W 0/1 0=停止,1=启动
40002 0x0001 运行场景 uint16 R/W 1-3 1=碳捕集,2=零碳园区,3=综合能源
40003 0x0002 当前工况 uint16 R 0-3 0=停止,1=正常,2=检修,3=应急
40004 0x0003 速度档位 uint16 R/W 1-5 档位越高,演示节奏越快
40005 0x0004 循环模式 uint16 R/W 0/1 0=单次,1=无限循环
40006 0x0005 系统状态 uint16 R 0-3 0=停止,1=运行中,2=告警,3=故障
40007 0x0006 故障代码 uint16 R 0-99 0=无故障
40008 0x0007 碳中和目标 uint16 R/W 1-3 1=碳中和,2=碳达峰,3=净零排放
4.2 模块控制寄存器(40009-40018)
寄存器地址 偏移地址 功能 数据类型 读写 说明
40009 0x0008 碳捕集模块启停 bit R/W 1=运行
40010 0x0009 碳捕集阶段 uint16 R/W 1-6 1=烟气,2=吸收,3=再生,4=压缩,5=输送,6=注入
40011 0x000A 零碳园区模块启停 bit R/W 1=运行
40012 0x000B 零碳园区阶段 uint16 R/W 1-4 1=绿电,2=储能,3=直供,4=负荷
40013 0x000C 综合能源模块启停 bit R/W 1=运行
40014 0x000D 碳足迹追踪 bit R/W 1=开启
4.3 灯带与参数寄存器(40019-40032)
寄存器地址 偏移地址 功能 数据类型 读写 说明
40019 0x0012 碳捕集灯带 bit R/W 1=点亮
40020 0x0013 零碳园区灯带 bit R/W 1=点亮
40021 0x0014 综合能源灯带 bit R/W 1=点亮
40022 0x0015 碳足迹灯带 bit R/W 1=点亮
40023 0x0016 碳流流速 uint16 R/W 1-100,灯带流动速度
40024 0x0017 模块间延时 uint16 R/W ms,模块切换间隔
五、核心代码实现
5.1 Modbus从站初始化与多模块控制
cpp
#include "ModbusRTU.h"
#include "Adafruit_NeoPixel.h"
#define SLAVE_ID 1
#define BAUD_RATE 9600
// 灯带GPIO定义(WS2812B)
#define LED_CCUS PB0 // 碳捕集模块灯带
#define LED_PARK PB1 // 零碳园区灯带
#define LED_ENERGY PB2 // 综合能源灯带
#define LED_CARBON PB3 // 碳足迹灯带
#define MODULE_NUM 3 // 碳捕集、零碳园区、综合能源
#define SCENE_NUM 3 // 碳捕集、零碳园区、综合能源
ModbusRTU mb;
uint16_t holdingRegs32 = {0};
// 各模块演示时长(ms)
uint16_t moduleDurationsMODULE_NUM = {8000, 6000, 10000};
uint16_t baseDurationsMODULE_NUM = {8000, 6000, 10000};
enum SystemState { STOPPED, RUNNING, PAUSED, FAULT };
SystemState currentState = STOPPED;
volatile uint8_t currentModule = 0;
volatile uint16_t moduleElapsedMs = 0;
volatile uint8_t currentScene = 1; // 1=碳捕集,2=零碳园区,3=综合能源
// 灯带对象
Adafruit_NeoPixel strips4 = {
Adafruit_NeoPixel(60, LED_CCUS, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(50, LED_PARK, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(40, LED_ENERGY, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(40, LED_CARBON, NEO_GRB + NEO_KHZ800)
};
void setup() {
SystemClock_Config(); // 72MHz
Serial1.begin(BAUD_RATE);
mb.begin(&Serial1);
mb.slave(SLAVE_ID);
mb.addHreg(0, holdingRegs, 32);
mb.onGet(handleRead);
mb.onSet(handleWrite);
for (int i = 0; i < 4; i++) {
strips[i].begin();
strips[i].show();
}
Timer1.initialize(1000);
Timer1.attachInterrupt(stateMachineTick);
}
void loop() {
mb.task();
}
5.2 多模块切换与多场景控制
cpp
// 模块切换(碳捕集/零碳园区/综合能源)
void switchModule(uint8_t module) {
allLightsOff();
// 各模块颜色定义
uint32_t colors[MODULE_NUM][3] = {
{0x888888, 0x0066FF, 0x00FF66}, // 碳捕集:烟气灰→CO₂蓝→封存绿[reference:17]
{0x00FF66, 0x0066FF, 0xFF6600}, // 零碳园区:绿电绿→储能蓝→负荷橙[reference:18]
{0x00FF66, 0x0066FF, 0x888888} // 综合能源:绿电绿→氢能蓝→碳流灰
};
for (int i = 0; i < 3; i++) {
flowLight(strips[module], colors[module][i], moduleDurations[module] / 6);
}
}
// 场景切换(碳捕集/零碳园区/综合能源)
void switchScene(uint16_t scene) {
allLightsOff();
currentScene = scene;
switch(scene) {
case 1: // 碳捕集场景
flowLight(strips[0], 0x888888, 400); // 烟气(灰色)
flowLight(strips[0], 0x0066FF, 300); // CO₂(蓝色)
flowLight(strips[0], 0x00FF66, 300); // 封存(绿色)
flowLight(strips[3], 0x00FF66, 500); // 碳足迹绿色指示
holdingRegs[5] = 1;
break;
case 2: // 零碳园区场景
flowLight(strips[1], 0x00FF66, 400); // 绿电(绿色)[reference:19]
flowLight(strips[1], 0x0066FF, 300); // 储能(蓝色)
flowLight(strips[1], 0xFF6600, 300); // 负荷(橙色)
flowLight(strips[3], 0x00FF66, 400); // 碳足迹绿色指示
holdingRegs[5] = 2;
break;
case 3: // 综合能源场景
flowLight(strips[2], 0x00FF66, 400); // 绿电(绿色)
flowLight(strips[2], 0x0066FF, 300); // 氢能(蓝色)
flowLight(strips[2], 0x888888, 300); // 碳流(灰色)[reference:20]
flowLight(strips[3], 0x888888, 400); // 碳足迹灰色指示
holdingRegs[5] = 3;
break;
case 4: // 应急模式
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
strips[j].clear();
for (int p = 0; p < strips[j].numPixels(); p++) {
strips[j].setPixelColor(p, (i % 2 == 0) ? 0xFF0000 : 0x000000);
}
strips[j].show();
}
delay(200);
}
holdingRegs[5] = 4;
holdingRegs[6] = 1;
break;
}
}
void flowLight(Adafruit_NeoPixel &strip, uint32_t color, int duration) {
int len = strip.numPixels();
int steps = 20;
for (int step = 0; step < steps; step++) {
strip.clear();
int pos = (len * step) / steps;
strip.setPixelColor(pos, color);
if (pos > 0) strip.setPixelColor(pos - 1, color);
strip.show();
delay(duration / steps);
}
}
void allLightsOff() {
for (int i = 0; i < 4; i++) {
stripsi.clear();
stripsi.show();
}
}
5.3 寄存器读写回调
cpp
uint16_t handleRead(uint16_t offset, uint8_t index) {
return holdingRegsoffset;
}
void handleWrite(uint16_t offset, uint8_t index, uint16_t value) {
switch(offset) {
case 0: // 系统启停
if (value == 1 && currentState != RUNNING) {
switchScene(holdingRegs1);
currentState = RUNNING;
} else if (value == 0) {
currentState = STOPPED;
allLightsOff();
holdingRegs2 = 0;
holdingRegs5 = 0;
}
break;
case 1: // 场景切换
holdingRegs[1] = value;
if (holdingRegs[0] == 1) switchScene(value);
break;
case 3: // 速度档位
if (value >= 1 && value <= 5) {
for (int i = 0; i < MODULE_NUM; i++) {
moduleDurations[i] = baseDurations[i] / value;
}
}
break;
case 7: // 碳中和目标
holdingRegs[7] = value;
break;
case 9: // 碳捕集模块启停
if (value == 1) {
switchModule(0);
} else {
strips[0].clear();
strips[0].show();
}
break;
case 10: // 碳捕集阶段
// 不同阶段对应不同颜色[reference:21]
uint32_t stageColors[6] = {0x888888, 0x666666, 0x0066FF, 0x0044CC, 0x00FF66, 0x00CC44};
for (int p = 0; p < strips[0].numPixels(); p++) {
strips[0].setPixelColor(p, stageColors[value - 1]);
}
strips[0].show();
holdingRegs[10] = value;
break;
default:
holdingRegs[offset] = value;
break;
}
holdingRegs[offset] = value;
}
六、关键技术细节
6.1 三场景状态机设计
双碳沙盘的核心价值在于"碳捕集→零碳园区→综合能源"三种场景的一键切换。采用状态机编程,将三个场景定义为独立状态:
碳捕集场景:烟气灰色→CO₂蓝色→封存绿色灯带时序流动,模拟CCUS全流程
零碳园区场景:绿电绿色→储能蓝色→负荷橙色灯带时序流动,模拟源网荷储协同
综合能源场景:绿电绿色→氢能蓝色→碳流灰色灯带时序流动,模拟多能互补与碳足迹追踪
各场景之间通过寄存器40002一键切换,场景切换时自动重置所有设备状态。
6.2 多模块独立控制与碳流路径区分
双碳沙盘的碳流路径演示是核心功能,需用多种颜色灯带区分不同碳管理阶段:
碳管理阶段 灯带颜色 对应灯带 寄存器
碳捕集路径 灰色→蓝色→绿色 LED_CCUS 40019
零碳园区路径 绿色→蓝色→橙色 LED_PARK 40020
综合能源路径 绿色→蓝色→灰色 LED_ENERGY 40021
碳足迹追踪 绿色/灰色 LED_CARBON 40022
WS2812B灯带采用单总线控制,每条灯带独立占用一个GPIO,互不干扰。各段灯带的流速可通过寄存器40023统一调节。
6.3 通讯异常处理
策略 实现方式 适用场景
保持当前状态 不改变输出,等待通讯恢复 展厅演示
自动切换安全模式 切换至停止状态 安全要求较高
状态上报 向上位机发送故障码 远程监控
七、现场调试要点
7.1 灯带异常排查
现象 排查方向 解决方案
灯带全亮白光 数据线虚接 重新焊接,确认GPIO输出电平
颜色偏色 电源电压不足 测量末端电压,<4.8V需增加供电点
首灯正常后续不亮 MCU主频配置不当 确认系统时钟72MHz,WS2812B时序正确
多路灯带颜色串扰 GPIO/电源 确认各灯带独立GPIO,电源分开走线
碳流路径颜色不变化 寄存器写入失败 检查Modbus通讯,确认寄存器地址正确
7.2 调试工具推荐
调试阶段推荐使用Modbus Poll(Windows)作为主站调试工具,配合USB转RS485转换器连接目标板。通讯正常后,依次测试各寄存器的读写功能,确认单路控制正常后再进行联调。
八、工程实践能力
基于STM32平台的多系统协同控制方案,已在筑城世纪多个工业模型项目中完成部署验证:
风光储一体化沙盘:多能互补调度逻辑的物理实现方案,涵盖多工况切换与协同调度
能源电力模型:从光伏风电到源网荷储的全品类结构还原与控制系统方案
智慧城市沙盘:园区-城市-数字孪生多系统协同控制方案
燃机电站沙盘:国机集团柬埔寨2×450MW燃机联合循环电站沙盘,实现6级全流程动态灯光联动
上述项目验证的核心能力(多路电机独立控制、多段灯带时序联动、多模块协同控制、Modbus RTU数据对接),与双碳沙盘的控制需求一致。
筑城世纪模型在双碳沙盘方向的核心交付能力:
- 双碳管理理解能力
技术团队具备读懂双碳管理路径、碳捕集工艺流程、零碳园区规划图纸的能力。能够按图纸精确还原碳捕集装置、零碳园区源网荷储系统、综合能源多模块等核心设施。
- 多场景协同控制能力
控制系统基于STM32平台自主研发,支持多模块时序联动、多场景一键切换(碳捕集/零碳园区/综合能源)、多工况模式(正常/检修/应急)。后期可根据客户需求随时修改控制逻辑和场景模式。
- 全流程自主交付能力
2000㎡制作工厂,位于北京通州。设计、3D打印、CNC加工、喷涂、组装、控制系统编程全部自主完成,不外包。签约前出具《模型制作工艺说明》,零增项承诺写入合同。
九、总结
双碳沙盘模型多系统协同控制系统的设计,核心在于三个层面:
-
多场景差异化控制是核心。 双碳沙盘的价值在于"碳捕集→零碳园区→综合能源"三种场景的差异化还原------每种场景的灯带逻辑、时序参数、碳流路径完全不同。采用状态机编程,将各场景定义为独立状态,通过寄存器一键切换。
-
多模块协同控制是基础。 碳捕集时序、零碳园区源网荷储协同、综合能源多模块联动等多路信号,需要精确联动,实现"碳流路径清晰、能源逻辑准确"的完整演示效果。
-
控制系统自主可控是保障。 双碳沙盘在交付后经常需要根据客户需求调整控制逻辑(如新增应急停机模式、调整各模块的时序参数、修改碳流路径)。自主研发的控制系统通过Modbus寄存器在线修改参数即可完成调整。
筑城世纪模型的双碳沙盘控制系统方案,基于STM32平台自主研发,支持Modbus RTU协议。控制系统支持多模块协同控制、多场景一键切换(碳捕集/零碳园区/综合能源)、多工况模式(正常/检修/应急),后期可根据需求随时修改控制逻辑。
搜索 "筑城世纪模型" 访问官网,查看更多双碳与能源环保沙盘模型案例。