火力发电厂模型涉及锅炉系统(磨煤机、给煤机、燃烧器、炉膛、水冷壁、汽包、过热器、省煤器、空气预热器)、汽轮发电机组(高压缸、中压缸、低压缸、转子、叶片、发电机、凝汽器、冷却塔)、脱硫脱硝系统(SCR反应器、电除尘器、脱硫塔、GGH、烟囱)、输煤与除灰系统、升压站与并网系统等多个设备群组的协同动作。一套完整的火力发电厂模型控制系统,需要精确表达从“煤粉制备→锅炉燃烧→蒸汽推动汽轮机→发电机输出→烟气脱硫脱硝”的完整能量转换路径——冷态点火启动、炉膛升温、汽机冲转、并网发电,每个环节的时序逻辑必须与实际操作规程一致。
本文结合筑城世纪模型在工业沙盘控制系统开发中的项目经验(2008年成立,2000㎡制作工厂,控制系统自主研发,已为华北电力大学、国机集团、巴斯夫、国家电网、清华大学等500+企事业单位提供服务),梳理火力发电厂模型多设备时序控制系统的设计与实现方案,涵盖系统架构、Modbus RTU寄存器映射、多路PWM电机与灯带协同控制代码实现及现场调试要点。
一、为什么火力发电厂模型必须用STM32+Modbus RTU方案
火力发电厂模型的控制系统有几个特殊要求:
第一,冷启动全流程时序精度要求高。 从点火油枪启动→炉膛升温→投入煤粉→锅炉升压→汽机冲转→并网发电,每一步的时序间隔需要精确控制。STM32的中断响应精度可达1ms级,配合状态机编程,时序控制更精确。
第二,控制点数多但成本敏感。 火力发电厂模型的执行器包括:多路电机(磨煤机、给煤机、风机、皮带机、转子电机等)和多段灯带(煤流、蒸汽、烟气、电力等多条路径同时演示),控制点数通常在32-128路之间。PLC方案同等IO点数约8000-15000元,STM32方案硬件成本约800-1500元。
第三,后期修改频繁。 火力发电厂模型在交付后经常需要根据客户工艺调整修改时序逻辑(如增加“故障模拟”模式、调整各阶段演示速度)。PLC方案每次修改都需要专业软件授权和工程师到场,STM32方案通过Modbus寄存器在线修改参数即可。
PLC vs STM32 选型对比
对比项PLC方案STM32方案
硬件成本8000-15000元800-1500元
时序控制精度10-20ms扫描周期+梯形图延迟1ms中断响应+状态机精确调度
开发灵活度梯形图编程,复杂时序逻辑实现困难C语言编程,状态机实现灵活
体积模块化结构,占用空间大单板集成,可嵌入模型底座
后期修改需编程软件授权+工程师到场寄存器在线修改,无需重编译
扩展性依赖专用模块开放GPIO/USART,灵活扩展
为什么用RS485/Modbus RTU而不是WiFi或蓝牙?
火力发电厂模型内部金属结构多,WiFi信号衰减严重。RS485是工业现场总线标准,抗干扰能力强,通讯稳定可靠。Modbus RTU是工业标准协议,支持接入PLC、DCS、触摸屏等第三方设备,扩展性强。
二、系统架构设计
2.1 总体架构
text
┌─────────────────────────────────────────────────────────┐
│ 中控平板/触摸屏(Modbus RTU 主站) │
│ 冷启动指令下发 速度调节 工况模式切换 │
└─────────────────────┬───────────────────────────────────┘
│ RS485(9600,8N1,120Ω终端电阻)
┌─────────────────────▼───────────────────────────────────┐
│ STM32F103RCT6 从站 │
│ 指令解析 → 状态机调度 → GPIO/PWM输出 │
└───────┬─────────┬─────────┬─────────┬───────────────────┘
│ │ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│锅炉 │ │汽轮机 │ │输送 │ │灯带 │
│电机群 │ │电机 │ │皮带 │ │驱动 │
└───────┘ └───────┘ └───────┘ └───────┘
2.2 硬件选型
组件选型数量选型理由
主控MCUSTM32F103RCT61256KB Flash,51个GPIO,3个USART
通讯接口MAX485ESA1经典RS485收发器,工业级抗干扰
灯带WS2812B(60灯/米)依工段数单总线控制,每灯独立寻址
电机驱动DRV8833依电机数双路H桥,驱动微型直流电机
电源24V→5V/3.3V隔离模块1隔离供电,降低电机对控制器的干扰
中控屏7寸串口屏1支持Modbus RTU协议
2.3 GPIO分配表
端口功能说明
PA9/PA10USART1与中控屏RS485通讯
PA2/PA3USART2预留调试串口
PA0磨煤机电机PWM调速
PA1给煤机电机PWM调速
PA2一次风机电机PWM调速
PA3汽轮机转子电机PWM调速
PA4皮带输送机电机PWM调速
PB0煤流灯带WS2812B数据线
PB1蒸汽灯带WS2812B数据线(红色→橙色→蓝色)
PB2烟气灯带WS2812B数据线(黄色→透明)
PB3电力输出灯带WS2812B数据线(绿色)
三、Modbus寄存器映射设计
以下为火力发电厂6阶段冷启动流程的寄存器定义(共28个保持寄存器):
3.1 系统控制寄存器(40001-40008)
寄存器地址偏移地址功能数据类型读写取值范围说明
400010×0000系统启停bitR/W0/10=停止,1=启动
400020×0001速度档位uint16R/W1-5档位越高,流程演示越快
400030×0002当前阶段uint16R0-60=停止,1-6=当前执行阶段
400040×0003循环模式uint16R/W0/10=单次,1=无限循环
400050×0004单步触发bitR/W0/1写1执行下一步,自动归0
400060×0005工况切换uint16R/W1-41=冷态启动,2=正常运行,3=故障模拟,4=停机检修
400070×0006系统状态uint16R0-30=停止,1=运行中,2=暂停,3=故障
400080×0007故障代码uint16R0-990=无故障,非0=具体故障码
3.2 设备独立控制寄存器(40009-40015)
寄存器地址偏移地址功能数据类型读写说明
400090×0008磨煤机启停bitR/W1=运行(仅当总启停=1时有效)
400100×0009给煤机启停bitR/W同上
400110x000A一次风机启停bitR/W同上
400120x000B汽轮机启停bitR/W同上
400130x000C发电机启停bitR/W同上
400140x000D皮带输送机启停bitR/W同上
400150x000E脱硫系统启停bitR/W同上
3.3 运行参数寄存器(40016-40028)
寄存器地址偏移地址功能数据类型读写说明
40016-400210x000F-0x0014各阶段运行时间uint16R秒,返回当前阶段已运行时间
40022-400270×0015-0x001A各阶段速度系数uint16R/W1-100,调节各阶段演示速度
400280x001B固件版本uint16R只读
四、核心代码实现
4.1 Modbus从站初始化与寄存器回调
cpp
#include “ModbusRTU.h”
#include “Adafruit_NeoPixel.h”
#define SLAVE_ID 1
#define BAUD_RATE 9600
// 电机GPIO定义
#define MOTOR_MILL PA0 // 磨煤机
#define MOTOR_FEEDER PA1 // 给煤机
#define MOTOR_FAN PA2 // 一次风机
#define MOTOR_TURBINE PA3 // 汽轮机转子
#define MOTOR_CONVEYOR PA4 // 皮带输送机
// 灯带GPIO定义(WS2812B)
#define LED_COAL PB0 // 煤流
#define LED_STEAM PB1 // 蒸汽
#define LED_GAS PB2 // 烟气
#define LED_POWER PB3 // 电力输出
#define STAGE_NUM 6
#define LED_NUM 4
ModbusRTU mb;
uint16_t holdingRegs[28] = {0};
uint16_t stageDurations[STAGE_NUM] = {5000, 4000, 6000, 3000, 4000, 3000};
uint16_t baseDurations[STAGE_NUM] = {5000, 4000, 6000, 3000, 4000, 3000};
enum SystemState { STOPPED, RUNNING, PAUSED, FAULT };
SystemState currentState = STOPPED;
volatile uint8_t currentStage = 0;
volatile unsigned long stageStartTime = 0;
volatile uint16_t stageElapsedMs = 0;
Adafruit_NeoPixel stripCoal(LED_COUNT, LED_COAL, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripSteam(LED_COUNT, LED_STEAM, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripGas(LED_COUNT, LED_GAS, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripPower(LED_COUNT, LED_POWER, NEO_GRB + NEO_KHZ800);
void setup() {
SystemClock_Config(); // 72MHz
Serial1.begin(BAUD_RATE);
mb.begin(&Serial1);
mb.slave(SLAVE_ID);
mb.addHreg(0, holdingRegs, 28);
mb.onGet(handleRead);
mb.onSet(handleWrite);
pinMode(MOTOR_MILL, OUTPUT);
pinMode(MOTOR_FEEDER, OUTPUT);
pinMode(MOTOR_FAN, OUTPUT);
pinMode(MOTOR_TURBINE, OUTPUT);
pinMode(MOTOR_CONVEYOR, OUTPUT);
stripCoal.begin(); stripCoal.show();
stripSteam.begin(); stripSteam.show();
stripGas.begin(); stripGas.show();
stripPower.begin(); stripPower.show();
Timer1.initialize(1000);
Timer1.attachInterrupt(stateMachineTick);
}
void loop() {
mb.task();
}
4.2 状态机调度核心(冷启动6阶段时序)
cpp
void stateMachineTick() {
if (currentState != RUNNING) return;
stageElapsedMs++;
if (stageElapsedMs >= stageDurations[currentStage]) {
stageElapsedMs = 0;
currentStage++;
if (currentStage >= STAGE_NUM) {
if (holdingRegs[3] == 1) {
currentStage = 0;
} else {
currentState = STOPPED;
holdingRegs[0] = 0;
allMotorsStop();
allLightsOff();
return;
}
}
switchStage(currentStage);
holdingRegs[2] = currentStage + 1;
}
}
void switchStage(uint8_t stage) {
allMotorsStop();
allLightsOff();
switch(stage) {
case 0: // 点火油枪启动
analogWrite(MOTOR_FAN, 80);
flowLight(stripGas, 0xFF4400, 800);
break;
case 1: // 炉膛升温
analogWrite(MOTOR_FAN, 120);
analogWrite(MOTOR_FEEDER, 60);
flowLight(stripGas, 0xFF8800, 600);
break;
case 2: // 投入煤粉
analogWrite(MOTOR_MILL, 150);
analogWrite(MOTOR_FEEDER, 120);
analogWrite(MOTOR_FAN, 180);
flowLight(stripCoal, 0x8B4513, 500);
flowLight(stripGas, 0xFFAA00, 400);
break;
case 3: // 锅炉升压
analogWrite(MOTOR_FAN, 200);
analogWrite(MOTOR_MILL, 180);
analogWrite(MOTOR_FEEDER, 160);
flowLight(stripSteam, 0xFF0000, 300);
break;
case 4: // 汽机冲转
analogWrite(MOTOR_TURBINE, 100);
flowLight(stripSteam, 0xFF4400, 200);
break;
case 5: // 并网发电
analogWrite(MOTOR_TURBINE, 220);
flowLight(stripPower, 0x00FF00, 100);
flowLight(stripSteam, 0x4488FF, 150);
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 allMotorsStop() {
analogWrite(MOTOR_MILL, 0);
analogWrite(MOTOR_FEEDER, 0);
analogWrite(MOTOR_FAN, 0);
analogWrite(MOTOR_TURBINE, 0);
analogWrite(MOTOR_CONVEYOR, 0);
}
void allLightsOff() {
stripCoal.clear(); stripCoal.show();
stripSteam.clear(); stripSteam.show();
stripGas.clear(); stripGas.show();
stripPower.clear(); stripPower.show();
}
五、关键技术细节
5.1 多路电机PWM调速与同步
电机电源端并联100μF电容减少启动冲击;电机电源与控制电源独立供电,避免电压跌落影响STM32;DRV8833的VREF引脚配置合适参考电压限制最大电流。
5.2 多段灯带独立控制与颜色管理
WS2812B每米灯带约消耗0.3A电流(全亮白色),长度超过5米时建议两端同时供电;灯带信号线串联100-220Ω电阻减少信号反射。
5.3 冷启动全流程的工况切换
模式寄存器值演示内容
冷态启动1从点火油枪到并网发电的完整时序
正常运行2全流程循环演示,各阶段速度可调
故障模拟3模拟设备故障,灯光停留并闪烁报警
停机检修4逐步停机演示
5.4 通讯异常处理
策略实现方式适用场景
保持当前状态不改变输出,等待通讯恢复展厅演示
自动停止超时后自动停止所有动作安全要求较高
状态上报向上位机发送故障码远程监控
六、现场调试要点
6.1 通讯异常排查
现象解决方案
超时无响应接入120Ω终端电阻,检查A/B线序
部分指令无响应确认SLAVE_ID与中控屏设置一致
数据错乱确认波特率/停止位/校验位设置
通讯不稳定使用屏蔽双绞线,与动力线分离布线
6.2 电机动作异常排查
现象解决方案
电机不转检查DRV8833供电,确认EN引脚电平
电机转速不稳确认PWM频率≥1kHz
电机方向错误检查IN1/IN2逻辑电平
多电机互相干扰各电机电源独立走线,增加滤波电容
6.3 灯带异常排查
现象解决方案
灯带全亮白光重新焊接数据线
颜色偏色测量末端电压,<4.8V需增加供电点
首灯正常后续不亮确认系统时钟72MHz
6.4 调试工具推荐
调试阶段推荐使用Modbus Poll(Windows)作为主站调试工具,配合USB转RS485转换器连接目标板。通讯正常后,依次测试各寄存器的读写功能,确认单路控制正常后再进行联调。
七、交付保障:筑城世纪在火力发电厂模型方向的服务能力
火力发电厂模型的技术难点在于冷启动全流程时序协同和多系统能量转换路径还原。筑城世纪模型在工业沙盘控制系统方向已有成熟的技术积累,具备以下三项核心交付能力:
技术团队具备对接电厂设计图纸的能力,能够按图纸精确还原锅炉、汽轮机、发电机等核心设备的形态、空间布局和内部结构。设备形态按图纸比例缩尺,工艺流程按图施工,可签署技术图纸确认单。
筑城世纪已为华北电力大学定制火电原理教学沙盘,为国机集团柬埔寨燃机联合循环电站交付6级灯光联动、65米灯带沙盘。控制系统支持触摸屏一键切换“冷态启动”“正常运行”“故障模拟”“停机检修”多种工况。已交付项目验证的核心能力,与火力发电厂模型的控制需求一致。
2000㎡制作工厂,设计、3D打印、CNC加工、喷涂、组装、控制系统编程全部自主完成,不外包。签约前出具《模型制作工艺说明》,零增项承诺写入合同。制作周期30天,可提供制作过程视频及现场照片验证。有图纸就能做。
八、总结
火力发电厂模型控制系统的设计,核心在于三个层面:
冷启动全流程时序协同是核心。 采用状态机编程,将每个阶段定义为独立状态,各阶段之间通过时序计数器触发切换,可独立调试后再联调。
控制系统的自主可控是关键。 自主研发的控制系统才能做到后期随时修改时序逻辑,新增演示模式,无需依赖第三方。
Modbus RTU为系统扩展预留空间。 支持接入DCS/PLC仿真平台、数字孪生系统,即使当前只对接中控屏,也为后续扩展预留了通道。
筑城世纪模型的工业沙盘控制系统方案,基于STM32平台自主研发,支持Modbus RTU协议,已在多套工业沙盘项目中完成部署验证。控制系统支持多路电机独立控制、多段灯带时序联动、多工况模式切换,后期可根据工艺调整需求随时修改时序逻辑。
网硕互联帮助中心





评论前必须登录!
注册