水利水电教学实训沙盘模型控制系统设计:基于STM32与Modbus RTU的水工建筑物-水力发电-抽水蓄能全场景教学联动方案
水利水电教学实训沙盘模型,是职业院校水利类专业、水电专业及实训基地的核心教学设备。一套完整的水利水电教学实训沙盘控制系统,需要同时驱动多段灯带时序演示水工建筑物的水流路径、水力发电站的水能→机械能→电能转换过程、抽水蓄能电站的双工况切换逻辑,多路信号联动展示正常蓄水、防洪泄洪、发电运行、抽水储能等多种教学演示模式的一键切换。与水利水电工程沙盘(聚焦“水力-机械-电能”工程联动)不同,教学实训沙盘控制系统的核心是“结构可视化展示+原理教学演示+工况切换讲解”——大坝结构怎么剖切展示、水能怎么转换为电能、抽水蓄能怎么实现双工况切换,每个环节的控制逻辑必须与水利水电工程实际一致,同时满足课堂教学的可视化需求。
本文结合筑城世纪模型在工业沙盘控制系统开发中的项目经验(2008年成立,2000㎡制作工厂,控制系统自主研发,已为华北电力大学、国机集团、国家电网、清华大学等500+企事业单位提供服务),梳理水利水电教学实训沙盘模型控制系统的设计与实现方案,涵盖系统架构、硬件选型、多段灯带时序控制、Modbus RTU寄存器映射及多场景教学代码实现。
一、水利水电教学实训沙盘控制系统的技术需求
水利水电教学实训沙盘的控制系统需求与工程类水利沙盘有显著差异:
功能模块 技术要求 实现难度
水工建筑物水流路径演示 大坝蓄水→引水→泄洪,多段灯带按水流方向时序流动,展示水工建筑物群的空间关系 中
水力发电原理教学演示 引水→蜗壳→导水机构→转轮→尾水管,多段灯带时序演示水能→机械能→电能转换路径 中高
抽水蓄能双工况切换教学 发电工况(上水库→下水库)与抽水工况(下水库→上水库)一键切换,双色灯带区分流向 高
多教学场景一键切换 正常蓄水/防洪泄洪/发电运行/抽水储能,四种教学演示模式切换 高
剖切结构分区讲解 中控平板控制,逐区独立讲解大坝内部结构、水轮机流道、输水系统走向 中
基于上述需求,采用STM32+Modbus RTU架构。
二、为什么水利水电教学实训沙盘必须用STM32+Modbus RTU方案
水利水电教学实训沙盘的控制系统有几个特殊要求:
第一,教学场景切换的灵活性要求高。 水利水电教学实训沙盘需要支持正常蓄水、防洪泄洪、发电运行、抽水储能四种教学演示模式的一键切换,每种模式的设备状态、灯带逻辑、时序参数完全不同。STM32配合状态机编程可实现灵活的教学场景切换逻辑。
第二,多段灯带独立控制的精度要求高。 教学实训沙盘需要同时控制水库→进水口(蓝色)、压力管道(亮蓝)、水轮机(浅蓝)、尾水管(淡蓝)、泄洪路径(橙色)、电力输出(绿色)等多条灯带路径,每条灯带的颜色、流速、时序参数完全不同。STM32配合WS2812B可寻址LED灯带可实现多路独立并行控制。
第三,教学需求变化频繁。 水利水电教学实训沙盘在交付后经常需要根据课程需求调整(如新增“汛期调度”教学演示模式、调整各工况的时序参数、修改水流路径)。STM32方案通过寄存器在线修改参数即可完成调整,无需重编译代码。
STM32 vs PLC 选型对比:
对比项 PLC方案 STM32方案
硬件成本 8000-15000元 800-1500元
时序控制精度 10-20ms扫描周期 1ms中断响应
多路灯带独立控制 需专用通讯模块 单总线直接驱动
教学场景切换逻辑 梯形图实现困难 C语言状态机灵活可控
后期修改 需编程软件授权 寄存器在线修改
为什么用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(蓝色)
PB1 压力管道灯带 单总线输出 WS2812B(亮蓝)
PB2 水轮机灯带 单总线输出 WS2812B(浅蓝)
PB3 尾水管灯带 单总线输出 WS2812B(淡蓝)
PB4 泄洪路径灯带 单总线输出 WS2812B(橙色)
PB5 电力输出灯带 单总线输出 WS2812B(绿色)
PB6 抽水工况灯带 单总线输出 WS2812B(黄色)
四、Modbus寄存器映射设计
4.1 系统控制寄存器(40001-40008)
寄存器地址 偏移地址 功能 数据类型 读写 取值范围 说明
40001 0x0000 系统启停 bit R/W 0/1 0=停止,1=启动
40002 0x0001 教学场景 uint16 R/W 1-4 1=正常蓄水,2=防洪泄洪,3=发电运行,4=抽水储能
40003 0x0002 当前工序 uint16 R 0-4 0=停止,1=引水,2=发电,3=泄洪,4=抽水
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=故障
4.2 灯带与参数寄存器(40007-40016)
寄存器地址 偏移地址 功能 数据类型 读写 说明
40007 0x0006 水库→进水口灯带 bit R/W 1=点亮(蓝色)
40008 0x0007 压力管道灯带 bit R/W 1=点亮(亮蓝)
40009 0x0008 水轮机灯带 bit R/W 1=点亮(浅蓝)
40010 0x0009 尾水管灯带 bit R/W 1=点亮(淡蓝)
40011 0x000A 泄洪路径灯带 bit R/W 1=点亮(橙色)
40012 0x000B 电力输出灯带 bit R/W 1=点亮(绿色)
40013 0x000C 抽水工况灯带 bit R/W 1=点亮(黄色)
40014 0x000D 水流流速 uint16 R/W 1-100,灯带流动速度
40015 0x000E 工序间延时 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_RESERVOIR PB0 // 水库→进水口(蓝色)
#define LED_PIPELINE PB1 // 压力管道(亮蓝)
#define LED_TURBINE PB2 // 水轮机(浅蓝)
#define LED_TAILWATER PB3 // 尾水管(淡蓝)
#define LED_FLOOD PB4 // 泄洪路径(橙色)[reference:43]
#define LED_POWER PB5 // 电力输出(绿色)
#define LED_PUMP PB6 // 抽水工况(黄色)[reference:44]
#define STAGE_NUM 4 // 引水→发电→泄洪→抽水
#define DEVICE_NUM 3 // 水轮机、发电机、闸门
ModbusRTU mb;
uint16_t holdingRegs[32] = {0};
// 各工序演示时长(ms)
uint16_t stageDurations[STAGE_NUM] = {4000, 6000, 5000, 4000};
uint16_t baseDurations[STAGE_NUM] = {4000, 6000, 5000, 4000};
enum SystemState { STOPPED, RUNNING, PAUSED, FAULT };
SystemState currentState = STOPPED;
volatile uint8_t currentStage = 0;
volatile uint16_t stageElapsedMs = 0;
// 灯带对象
Adafruit_NeoPixel strips[7] = {
Adafruit_NeoPixel(40, LED_RESERVOIR, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_PIPELINE, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_TURBINE, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_TAILWATER, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(40, LED_FLOOD, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_POWER, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(40, LED_PUMP, 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 < 7; i++) {
strips[i].begin();
strips[i].show();
}
Timer1.initialize(1000);
Timer1.attachInterrupt(stateMachineTick);
}
void loop() {
mb.task();
}
5.2 教学场景切换与多工序控制
cpp
// 工序切换(教学演示路径灯带时序)
void switchStage(uint8_t stage) {
allLightsOff();
// 各教学阶段颜色定义[reference:46]
uint32_t colors[STAGE_NUM] = {
0x0066FF, // 引水(蓝色,水库→进水口)
0x0088FF, // 发电(亮蓝,压力管道→水轮机→尾水管)
0xFF6600, // 泄洪(橙色,泄洪路径)[reference:47]
0xFFAA00 // 抽水(黄色,下水库→上水库)[reference:48]
};
// 各阶段对应的灯带索引
int ledIdx[STAGE_NUM] = {0, 1, 2, 6};
// 点亮当前教学阶段路径灯带
flowLight(strips[ledIdx[stage]], colors[stage], stageDurations[stage] / 2);
}
// 教学场景切换(正常蓄水/防洪泄洪/发电运行/抽水储能)[reference:49]
void switchScene(uint16_t scene) {
allLightsOff();
switch(scene) {
case 1: // 正常蓄水模式
// 蓝色灯带缓慢流动:水库蓄水状态
flowLight(strips[0], 0x0066FF, 800);
holdingRegs[5] = 1;
break;
case 2: // 防洪泄洪模式[reference:50]
// 橙色泄洪路径快速流动[reference:51]
flowLight(strips[4], 0xFF6600, 400);
// 模拟水位下降
for (int i = 100; i > 50; i -= 2) {
holdingRegs[25] = i;
delay(50);
}
holdingRegs[5] = 2;
break;
case 3: // 发电运行模式[reference:52]
// 蓝色灯带:上水库→水轮机→下水库[reference:53]
flowLight(strips[0], 0x0066FF, 500);
flowLight(strips[1], 0x0088FF, 400);
flowLight(strips[2], 0x00AAFF, 300);
flowLight(strips[3], 0x44CCFF, 500);
// 绿色电力输出
flowLight(strips[5], 0x00FF00, 400);
holdingRegs[5] = 3;
break;
case 4: // 抽水储能模式[reference:54]
// 黄色灯带:下水库→上水库(反向)
flowLight(strips[6], 0xFFAA00, 600);
holdingRegs[5] = 4;
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 < 7; i++) {
strips[i].clear();
strips[i].show();
}
}
5.3 寄存器读写回调
cpp
uint16_t handleRead(uint16_t offset, uint8_t index) {
// 动态更新水库水位
if (offset == 25) {
// 水位由switchScene动态更新
}
return holdingRegs[offset];
}
void handleWrite(uint16_t offset, uint8_t index, uint16_t value) {
switch(offset) {
case 0: // 系统启停
if (value == 1 && currentState != RUNNING) {
switchScene(holdingRegs[1]);
currentState = RUNNING;
} else if (value == 0) {
currentState = STOPPED;
allLightsOff();
holdingRegs[2] = 0;
holdingRegs[5] = 0;
}
break;
case 1: // 教学场景切换[reference:56]
holdingRegs[1] = value;
if (holdingRegs[0] == 1) switchScene(value);
break;
case 3: // 速度档位
if (value >= 1 && value <= 5) {
for (int i = 0; i < STAGE_NUM; i++) {
stageDurations[i] = baseDurations[i] / value;
}
}
break;
default:
holdingRegs[offset] = value;
break;
}
holdingRegs[offset] = value;
}
六、关键技术细节
6.1 四教学场景状态机设计
水利水电教学实训沙盘的核心价值在于“正常蓄水→防洪泄洪→发电运行→抽水储能”四种教学场景的一键切换:
正常蓄水:蓝色灯带缓慢流动,展示水库正常蓄水状态,适合讲解水工建筑物总体布局
防洪泄洪:橙色灯带快速流动,模拟泄洪调度过程,适合讲解泄洪系统工作原理
发电运行:蓝色→亮蓝→浅蓝→淡蓝灯带时序流动,展示水能→机械能→电能转换路径,适合讲解水力发电原理
抽水储能:黄色灯带反向流动,展示抽水工况(下水库→上水库),适合讲解抽水蓄能双工况切换
各教学场景之间通过寄存器40002一键切换,场景切换时自动重置所有设备状态。
6.2 多段灯带独立控制与水流路径区分
水利水电教学实训沙盘的水流路径演示是核心教学功能,需用多种颜色灯带区分不同教学阶段:
教学阶段 灯带颜色 对应灯带 寄存器
水库→进水口 蓝色 LED_RESERVOIR 40007
压力管道 亮蓝 LED_PIPELINE 40008
水轮机 浅蓝 LED_TURBINE 40009
尾水管 淡蓝 LED_TAILWATER 40010
泄洪路径 橙色 LED_FLOOD 40011
电力输出 绿色 LED_POWER 40012
抽水工况 黄色 LED_PUMP 40013
WS2812B灯带采用单总线控制,每条灯带独立占用一个GPIO,互不干扰。各段灯带的流速可通过寄存器40014统一调节。
6.3 通讯异常处理
策略 实现方式 适用场景
保持当前状态 不改变输出,等待通讯恢复 课堂教学
自动切换安全模式 切换至停止状态 安全要求较高
状态上报 向上位机发送故障码 远程监控
七、现场调试要点
7.1 灯带异常排查
现象 排查方向 解决方案
灯带全亮白光 数据线虚接 重新焊接,确认GPIO输出电平
颜色偏色 电源电压不足 测量末端电压,<4.8V需增加供电点
首灯正常后续不亮 MCU主频配置不当 确认系统时钟72MHz,WS2812B时序正确
教学场景切换灯带不变化 寄存器写入失败 检查Modbus通讯,确认寄存器地址正确
7.2 调试工具推荐
调试阶段推荐使用Modbus Poll(Windows)作为主站调试工具,配合USB转RS485转换器连接目标板。通讯正常后,依次测试各寄存器的读写功能,确认单路控制正常后再进行联调。
八、工程实践能力
基于STM32平台的多系统协同控制方案,已在筑城世纪多个工业模型项目中完成部署验证:
水利水电教学实训沙盘:为职业院校定制水利水电教学实训沙盘模型,涵盖水工建筑物剖切展示、水力发电原理教学、抽水蓄能双工况切换等核心教学模块
燃机电站沙盘:国机集团柬埔寨2×450MW燃机联合循环电站沙盘,总长4.2米、宽2.1米,实现6级全流程动态灯光联动
工业沙盘控制系统:L1-L3三级配置,覆盖工业模型动态演示的完整技术谱系,教学实训场景对应L3级系统级数字联动
水利模型定制:提供水利工程规划沙盘、防汛演练模型、水利教学模型,支持剖切展示水工建筑物内部结构
风光储一体化沙盘:多能互补调度逻辑的物理实现方案,涵盖多工况切换与协同调度
港口物流沙盘:中国物流集团多式联运智慧沙盘,多路电机与灯带协同控制
上述项目验证的核心能力(多路电机独立控制、多段灯带时序联动、多教学场景一键切换、Modbus RTU数据对接),与水利水电教学实训沙盘的控制需求一致。
筑城世纪模型在水利水电教学实训沙盘方向的核心交付能力:
- 水利工程图纸理解能力
技术团队具备读懂水利工程图纸、水工建筑物图纸的能力。能够按图纸精确还原大坝结构、泄洪通道、引水系统、发电厂房、抽水蓄能系统等核心设施。剖切展示水工建筑物内部结构(大坝、溢洪道、消力池),模拟水流运动、水电站发电原理。
- 多教学场景协同控制能力
控制系统基于STM32平台自主研发,支持多段灯带时序联动、多教学场景一键切换(正常蓄水/防洪泄洪/发电运行/抽水储能)。后期可根据课程需求随时修改控制逻辑和教学场景模式。
- 全流程自主交付能力
2000㎡制作工厂,位于北京通州。设计、3D打印、CNC加工、喷涂、组装、控制系统编程全部自主完成,不外包。签约前出具《模型制作工艺说明》,零增项承诺写入合同。
九、总结
水利水电教学实训沙盘模型控制系统的设计,核心在于三个层面:
-
四教学场景差异化控制是核心。 教学实训沙盘的价值在于“正常蓄水→防洪泄洪→发电运行→抽水储能”四种教学场景的差异化还原——每种场景的灯带逻辑、时序参数、教学演示重点完全不同。采用状态机编程,将各教学场景定义为独立状态,通过寄存器一键切换。
-
多段灯带独立控制是基础。 水库→进水口(蓝色)、压力管道(亮蓝)、水轮机(浅蓝)、尾水管(淡蓝)、泄洪路径(橙色)、电力输出(绿色)、抽水工况(黄色)等多路信号,需要精确联动,实现“水流走、灯带亮、原理清”的完整教学演示效果。
-
控制系统自主可控是保障。 教学实训沙盘在交付后经常需要根据课程需求调整控制逻辑(如新增教学场景模式、调整各教学场景的时序参数、修改水流路径)。自主研发的控制系统通过Modbus寄存器在线修改参数即可完成调整。
控制系统基于STM32平台自主研发,支持Modbus RTU协议,支持多段灯带时序联动、多教学场景一键切换(正常蓄水/防洪泄洪/发电运行/抽水储能),后期可根据需求随时修改控制逻辑。
更多推荐



所有评论(0)