三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

炼油厂核心装置沙盘模型控制系统设计:基于STM32与Modbus RTU的常减压蒸馏-催化裂化-乙烯裂解全流程联动方案

炼油厂核心装置沙盘模型控制系统设计:基于STM32与Modbus RTU的常减压蒸馏-催化裂化-乙烯裂解全流程联动方案

炼油厂核心装置沙盘模型控制系统,涉及常减压蒸馏(常压塔、减压塔、加热炉、换热器)、催化裂化(提升管反应器、再生器、分馏塔、吸收稳定系统)、乙烯裂解(裂解炉、急冷器、压缩机组、分离塔)三套核心装置的协同控制与动态演示。与泛工业沙盘控制系统不同,炼油厂核心装置沙盘控制系统的核心是“三套装置独立控制+全流程物料接力联动”——常减压怎么分、催化裂化怎么转、乙烯裂解怎么切,每个环节的控制逻辑必须与实际炼油厂生产调度一致。

本文结合筑城世纪模型在工业沙盘控制系统开发中的项目经验(2008年成立,2000㎡制作工厂,控制系统自主研发,已为中石化、国机集团、华北电力大学、国家电网、清华大学等500+企事业单位提供服务),梳理炼油厂核心装置沙盘模型控制系统的设计与实现方案,涵盖系统架构、硬件选型、多段灯带时序控制、Modbus RTU寄存器映射及多工况代码实现。

一、炼油厂核心装置沙盘控制系统的技术需求
功能模块 技术要求 实现难度
常减压蒸馏时序演示 原油换热→常压蒸馏→减压蒸馏,多段灯带按工艺流程时序流动,不同颜色区分不同馏分路径 中
催化裂化时序演示 原料油→反应→再生→分馏→吸收稳定,多段灯带时序流动,油气/催化剂/烟气三路区分 中高
乙烯裂解时序演示 原料→裂解→急冷→压缩→分离,多段灯带时序流动,裂解气/乙烯/丙烯/C4+多路区分 中高
三装置独立/联动控制 单装置独立演示与全流程物料接力联动两种模式切换 高
温度分区指示 常压塔/减压塔/裂解炉不同温度分区用不同颜色灯带指示 中
多工况一键切换 正常生产/产品切换/催化剂再生/裂解炉切换,四种工况模式切换 高
基于上述需求,采用STM32+Modbus RTU架构。

二、为什么炼油厂核心装置沙盘必须用STM32+Modbus RTU方案
炼油厂核心装置沙盘的控制系统有几个特殊要求:

第一,多装置独立与联动的时序精度要求高。 炼油厂沙盘需要支持单装置独立演示和全流程物料接力联动两种模式,各装置之间的物料衔接延时需精确控制。STM32的中断响应精度可达1ms级,配合状态机编程可实现精确的多段时序控制。

第二,多相流灯带独立控制的复杂度高。 炼油厂沙盘需要同时控制油气、催化剂、烟气、裂解气、乙烯、丙烯等多条物料路径,每条路径的颜色、流速、时序参数完全不同。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-40007)

寄存器地址 偏移地址 功能 数据类型 读写 取值范围 说明
40001 0x0000 系统启停 bit R/W 0/1 0=停止,1=启动
40002 0x0001 运行模式 uint16 R/W 1-4 1=常减压蒸馏,2=催化裂化,3=乙烯裂解,4=全流程联动
40003 0x0002 运行工况 uint16 R/W 1-4 1=正常生产,2=产品切换,3=催化剂再生,4=裂解炉切换
40004 0x0003 速度档位 uint16 R/W 1-5 档位越高,生产节奏越快
40005 0x0004 系统状态 uint16 R 0-3 0=停止,1=运行中,2=告警,3=故障
40006 0x0005 故障代码 uint16 R 0-99 0=无故障
4.2 灯带与参数寄存器(40007-40016)

寄存器地址 偏移地址 功能 数据类型 读写 说明
40007 0x0006 常减压蒸馏灯带 bit R/W 1=点亮
40008 0x0007 常压塔温度分区 uint16 R/W 1-3
40009 0x0008 减压塔温度分区 uint16 R/W 1-3
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定义
#define LED_CDU PB0
#define LED_CDU_ATMP PB1
#define LED_CDU_VTMP PB2
#define LED_FCC_OIL PB3
#define LED_FCC_CAT PB4
#define LED_FCC_FLUE PB5
#define LED_ETHYLENE PB6

#define MODE_NUM 4
#define STAGE_NUM 5

ModbusRTU mb;
uint16_t holdingRegs[32] = {0};

uint16_t stageDurations[STAGE_NUM] = {3000, 4000, 5000, 3000, 3000};
uint16_t baseDurations[STAGE_NUM] = {3000, 4000, 5000, 3000, 3000};

enum SystemState { STOPPED, RUNNING, PAUSED, FAULT };
SystemState currentState = STOPPED;
volatile uint8_t currentStage = 0;
volatile uint16_t stageElapsedMs = 0;
volatile uint8_t currentMode = 1;

Adafruit_NeoPixel strips[7] = {
Adafruit_NeoPixel(50, LED_CDU, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_CDU_ATMP, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_CDU_VTMP, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(40, LED_FCC_OIL, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_FCC_CAT, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(30, LED_FCC_FLUE, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(50, LED_ETHYLENE, NEO_GRB + NEO_KHZ800)
};

void setup() {
SystemClock_Config();
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 switchMode(uint16_t mode) {
allLightsOff();
currentMode = mode;

switch(mode) { case 1: // 常减压蒸馏 flowLight(strips[0], 0x884422, 400); flowLight(strips[0], 0xFF6600, 300); flowLight(strips[0], 0xCC8833, 300); setTempZone(strips[1], 1); setTempZone(strips[2], 2); holdingRegs[5] = 1; break; case 2: // 催化裂化 flowLight(strips[3], 0xFF6600, 400); flowLight(strips[4], 0xFFFF00, 300); flowLight(strips[5], 0x888888, 300); holdingRegs[5] = 2; break; case 3: // 乙烯裂解 flowLight(strips[6], 0xFF0000, 400); flowLight(strips[6], 0x0066FF, 300); flowLight(strips[6], 0xFF6600, 300); holdingRegs[5] = 3; break; case 4: // 全流程联动 flowLight(strips[0], 0x884422, 300); delay(500); flowLight(strips[3], 0xFF6600, 300); delay(500); flowLight(strips[6], 0xFF0000, 300); holdingRegs[5] = 4; break; }

}

void switchWorkMode(uint16_t workMode) {
switch(workMode) {
case 1: // 正常生产
switchMode(currentMode);
holdingRegs[5] = 1;
break;
case 2: // 产品切换
flowLight(strips[0], 0x00FF66, 200);
flowLight(strips[3], 0x00FF66, 200);
flowLight(strips[6], 0x00FF66, 200);
holdingRegs[5] = 2;
break;
case 3: // 催化剂再生
for (int i = 0; i < 5; i++) {
strips[4].clear();
for (int p = 0; p < strips[4].numPixels(); p++) {
strips[4].setPixelColor(p, (i % 2 == 0) ? 0xFFFF00 : 0xFF0000);
}
strips[4].show();
delay(300);
}
holdingRegs[5] = 3;
break;
case 4: // 裂解炉切换
for (int i = 0; i < 5; i++) {
strips[6].clear();
for (int p = 0; p < strips[6].numPixels(); p++) {
strips[6].setPixelColor(p, (i % 2 == 0) ? 0xFF6600 : 0x0066FF);
}
strips[6].show();
delay(300);
}
holdingRegs[5] = 4;
break;
}
}

void setTempZone(Adafruit_NeoPixel &strip, int level) {
uint32_t color = (level == 1) ? 0xFF0000 : (level == 2) ? 0xFF6600 : 0xFFFF00;
for (int p = 0; p < strip.numPixels(); p++) {
strip.setPixelColor(p, color);
}
strip.show();
}

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) {
return holdingRegs[offset];
}

void handleWrite(uint16_t offset, uint8_t index, uint16_t value) {
switch(offset) {
case 0:
if (value == 1 && currentState != RUNNING) {
switchMode(holdingRegs[1]);
currentState = RUNNING;
} else if (value == 0) {
currentState = STOPPED;
allLightsOff();
holdingRegs[2] = 0;
holdingRegs[5] = 0;
}
break;
case 1:
holdingRegs[1] = value;
if (holdingRegs[0] == 1) switchMode(value);
break;
case 2:
holdingRegs[2] = value;
if (holdingRegs[0] == 1) switchWorkMode(value);
break;
case 3:
if (value >= 1 && value <= 5) {
for (int i = 0; i < STAGE_NUM; i++) {
stageDurations[i] = baseDurations[i] / value;
}
}
break;
case 7:
setTempZone(strips[1], value);
holdingRegs[7] = value;
break;
case 8:
setTempZone(strips[2], value);
holdingRegs[8] = value;
break;
default:
holdingRegs[offset] = value;
break;
}
holdingRegs[offset] = value;
}
六、关键技术细节
6.1 三装置独立/联动状态机设计

常减压蒸馏模式:棕色→橙色→金黄色灯带时序流动,展示原油→常压馏分→减压馏分的分离路径

催化裂化模式:橙色(油气)、黄色(催化剂)、灰色(烟气)三路并行

乙烯裂解模式:红色(裂解气)→蓝色(乙烯)→橙色(丙烯)灯带时序流动

全流程联动模式:常减压→催化裂化→乙烯裂解物料接力

6.2 温度分区与多相流灯带独立控制

功能 灯带颜色 对应灯带 寄存器
常减压原油路径 棕色→橙色→金黄色 LED_CDU 40007
常压塔温度分区 红/橙/黄 LED_CDU_ATMP 40008
减压塔温度分区 红/橙/黄 LED_CDU_VTMP 40009
催化裂化油气 橙色 LED_FCC_OIL 40010
催化裂化催化剂 黄色 LED_FCC_CAT 40011
催化裂化烟气 灰色 LED_FCC_FLUE 40012
乙烯裂解 红/蓝/橙 LED_ETHYLENE 40013
6.3 通讯异常处理

策略 实现方式 适用场景
保持当前状态 不改变输出,等待通讯恢复 展厅演示
自动切换安全模式 切换至停止状态 安全要求较高
状态上报 向上位机发送故障码 远程监控
七、现场调试要点
现象 排查方向 解决方案
灯带全亮白光 数据线虚接 重新焊接,确认GPIO输出电平
颜色偏色 电源电压不足 测量末端电压,<4.8V需增加供电点
首灯正常后续不亮 MCU主频配置不当 确认系统时钟72MHz
温度分区颜色不变化 寄存器写入失败 检查Modbus通讯
八、工程实践能力
基于STM32平台的多系统协同控制方案,已在筑城世纪多个工业模型项目中完成部署验证:

燃机电站沙盘:国机集团柬埔寨2×450MW燃机联合循环电站沙盘,实现6级全流程动态灯光联动

工业沙盘控制系统:L1-L3三级配置,覆盖工业模型动态演示的完整技术谱系

石油化工沙盘:为中石化定制石油化工沙盘模型,精准还原炼化装置、储罐区、管廊布局

筑城世纪模型在炼油厂核心装置沙盘方向的核心交付能力:

  1. 炼油工艺理解能力

技术团队具备读懂炼油工艺流程图、化工装置图纸的能力。能够按图纸精确还原常压塔、减压塔、提升管反应器、再生器、裂解炉等核心设备。

  1. 三装置独立/联动控制能力

控制系统基于STM32平台自主研发,支持三装置独立控制、全流程物料接力联动、多工况一键切换(正常生产/产品切换/催化剂再生/裂解炉切换)、温度分区指示。

  1. 全流程自主交付能力

2000㎡制作工厂,位于北京通州。设计、3D打印、CNC加工、喷涂、组装、控制系统编程全部自主完成,不外包。签约前出具《模型制作工艺说明》,零增项承诺写入合同。

九、总结
炼油厂核心装置沙盘模型控制系统的设计,核心在于三个层面:

  1. 三装置独立/联动控制是核心。 炼油厂沙盘的价值在于“常减压蒸馏→催化裂化→乙烯裂解”三套装置的独立控制与全流程联动。采用状态机编程,将各装置定义为独立状态,通过寄存器一键切换运行模式。

  2. 多相流灯带独立控制是基础。 油气路径(橙色)、催化剂路径(黄色)、烟气路径(灰色)、裂解气(红色)、乙烯(蓝色)、丙烯(橙色)等多路信号,需要精确联动。

  3. 控制系统自主可控是保障。 自主研发的控制系统通过Modbus寄存器在线修改参数即可完成调整,无需依赖外部支持。

控制系统基于STM32平台自主研发,支持Modbus RTU协议,支持三装置独立控制、全流程物料接力联动、多工况一键切换(正常生产/产品切换/催化剂再生/裂解炉切换)、温度分区指示,后期可根据需求随时修改控制逻辑。

← 返回列表