石油天然气沙盘模型覆盖钻井模型、采油机模型、磕头机模型、压裂现场模型、油气集输沙盘、联合站工艺模型、油气储运模型、天然气长输管道模型、城市燃气输配模型、油库储罐沙盘、智能油气田沙盘等多个品类,涉及钻井完井、压裂增产、采油采气、油气集输、联合站处理、储运输配等完整产业链的协同控制与动态演示。一套完整的石油天然气沙盘控制系统,需要同时驱动多路微型电机模拟磕头机驴头往复运动、压裂泵车运行、压缩机运转等机械动作,多段灯带时序演示油气水三相流动路径和集输管网走向,多路信号联动展示“钻井→采油→集输→储运”全流程的工序衔接与工况切换。与石油化工沙盘(聚焦炼油装置多工段时序控制)不同,石油天然气沙盘控制系统的核心是“钻井-采油-集输-储运”四条产业链环节的接力联动——钻井怎么打下去、采油怎么抽上来、油气怎么集输处理、成品怎么储运配送,每个环节的控制逻辑必须与实际油气田生产调度一致。

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

一、石油天然气沙盘控制系统的技术需求
石油天然气沙盘的控制系统需求与普通工业沙盘有显著差异:

功能模块 技术要求 实现难度
钻井作业时序演示 钻杆下放→旋转钻进→泥浆循环→井口返出,多段灯带按钻井工序时序流动 中
磕头机机械动作模拟 驴头上下往复运动模拟,需与采油路径灯带时序联动 中
压裂作业流程演示 压裂液配制→高压注入→地层破裂→支撑剂充填→放喷返排,多色灯带时序流动 中高
油气集输路径演示 井口→计量站→接转站→联合站→外输,多色灯带区分油/气/水路径 中高
四段工序接力联动 钻井→采油→集输→储运,四段接力时序切换 高
多工况模式切换 正常生产/设备检修/应急调度,一键切换 中
筑城世纪模型的工业沙盘控制系统方案,基于上述需求,采用STM32+Modbus RTU架构,已在多套工业沙盘项目中完成部署验证。控制系统已形成L1-L3三级动态联动方案——从基础灯光时序联动到多设备协同控制、再到系统级Modbus数据对接——覆盖工业沙盘模型动态演示的完整技术谱系。

二、为什么石油天然气沙盘必须用STM32+Modbus RTU方案
石油天然气沙盘的控制系统有几个特殊要求:

第一,四段工序接力联动的时序精度要求高。 石油天然气沙盘需要按实际油气田生产调度时序演示“钻井→采油→集输→储运”的完整接力过程。各工序之间的衔接延时需精确控制,模拟真实油气田的生产节奏。STM32的中断响应精度可达1ms级,配合状态机编程可实现精确的多段时序控制。

第二,多设备机械动作与灯带联动控制复杂。 石油天然气沙盘涉及磕头机驴头往复运动、压裂泵车运转、压缩机运行等多路电机动作,同时需要与多段灯带的时序流动精确联动(磕头机每上下一次,采油路径灯带同步流动一次)。WS2812B可寻址LED灯带支持独立控制每个灯珠,配合STM32的GPIO和PWM输出,可实现多段灯带与多路电机的并行独立控制。

第三,后期修改频繁。 石油天然气沙盘在交付后经常需要根据客户需求调整(如新增“应急调度”模式、调整各工序节拍时间、修改集输管网走向)。STM32方案通过寄存器在线修改参数即可完成调整,无需重编译代码。

STM32 vs PLC 选型对比
对比项 PLC方案 STM32方案
硬件成本 8000-15000元 800-1500元
时序控制精度 10-20ms扫描周期 1ms中断响应
多路电机+灯带联动 需专用运动+通讯模块 GPIO+PWM直接驱动
接力联动逻辑 梯形图实现困难 C语言状态机灵活可控
多工况切换 需复杂梯形图逻辑 寄存器在线切换
后期修改 需编程软件授权 寄存器在线修改
为什么用RS485/Modbus RTU?
石油天然气沙盘模型内部设备分布广泛(钻井区、采油区、集输区、储运区等),RS485总线支持多点通讯(理论32个节点),一线串接所有设备,布线简洁。Modbus RTU是工业标准协议,支持接入触摸屏、中控平板等第三方设备。

三、系统架构设计
3.1 总体架构
text
┌─────────────────────────────────────────────────────────────┐
│ 触摸屏/中控平板(Modbus RTU 主站) │
│ 工况切换 速度调节 工序控制 模式切换 │
└─────────────────────────┬───────────────────────────────────┘
│ RS485(9600,8N1,120Ω终端电阻)
┌─────────────────────────▼───────────────────────────────────┐
│ STM32F103RCT6 从站 │
│ 指令解析 → 状态机调度 → GPIO/PWM/单总线输出 │
└───────┬─────────┬─────────┬─────────┬───────────────────────┘
│ │ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│磕头机 │ │压裂 │ │集输 │ │物料 │
│电机 │ │泵车 │ │灯带 │ │灯带 │
│(往复) │ │电机 │ │(油/气/ │ │(钻井/ │
│ │ │ │ │水) │ │采油) │
└───────┘ └───────┘ └───────┘ └───────┘
3.2 硬件选型
组件 选型 数量 选型理由
主控MCU STM32F103RCT6 1 256KB Flash,51个GPIO,3个USART
通讯接口 MAX485ESA 1 RS485收发器,工业级抗干扰
灯带 WS2812B(60灯/米) 依路径数 单总线控制,每灯独立寻址
电机驱动 DRV8833 依电机数 双路H桥,驱动微型直流电机
磕头机电机 微型直流减速电机 1-2 模拟驴头往复运动
压裂泵车电机 微型直流减速电机 1 模拟压裂泵运行
压缩机电机 微型直流减速电机 1 模拟天然气压缩机运行
中控屏 7寸串口屏 1 支持Modbus RTU主站协议
3.3 GPIO分配表(以典型石油天然气沙盘为例)
端口 功能 信号类型 说明
PA9/PA10 USART1 通讯 与中控屏RS485通讯
PA2/PA3 USART2 通讯 预留调试串口
PA0 磕头机1电机 PWM输出 驴头往复运动控制
PA1 磕头机2电机 PWM输出 驴头往复运动控制
PA4 压裂泵车电机 PWM输出 压裂泵运行模拟
PA5 压缩机电机 PWM输出 压缩机运行模拟
PB0 钻井路径灯带 单总线输出 WS2812B(钻杆下行)
PB1 采油路径灯带 单总线输出 WS2812B(原油采出)
PB2 集输油路径灯带 单总线输出 WS2812B(红色)
PB3 集输气路径灯带 单总线输出 WS2812B(黄色)
PB4 集输水路径灯带 单总线输出 WS2812B(蓝色)
PB5 储运路径灯带 单总线输出 WS2812B(绿色)
PB6 联合站区域灯带 单总线输出 WS2812B(工况指示)
四、Modbus寄存器映射设计
以下为石油天然气沙盘控制系统的寄存器定义(共32个保持寄存器):

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=故障
40007 0x0006 故障代码 uint16 R 0-99 0=无故障
40008 0x0007 工序触发 bit R/W 0/1 1=切换至设定工序
4.2 设备控制寄存器(40009-40018)
寄存器地址 偏移地址 功能 数据类型 读写 说明
40009 0x0008 磕头机1启停 bit R/W 1=运行
40010 0x0009 磕头机1速度 uint16 R/W 0-100,PWM占空比
40011 0x000A 磕头机2启停 bit R/W 1=运行
40012 0x000B 磕头机2速度 uint16 R/W 0-100,PWM占空比
40013 0x000C 压裂泵车启停 bit R/W 1=运行
40014 0x000D 压裂泵车速度 uint16 R/W 0-100,PWM占空比
40015 0x000E 压缩机启停 bit R/W 1=运行
40016 0x000F 压缩机速度 uint16 R/W 0-100,PWM占空比
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 集输水路径灯带 bit R/W 1=点亮(蓝色)
40024 0x0017 储运路径灯带 bit R/W 1=点亮(绿色)
40025 0x0018 联合站区域灯带 bit R/W 1=点亮
40026 0x0019 物料流速 uint16 R/W 1-100,灯带流动速度
40027 0x001A 工序间延时 uint16 R/W ms,工序切换间隔
40028-40032 0x001B-0x001F 保留寄存器 — — 预留扩展
五、核心代码实现
5.1 Modbus从站初始化与设备控制
cpp
#include “ModbusRTU.h”
#include “Adafruit_NeoPixel.h”

#define SLAVE_ID 1
#define BAUD_RATE 9600

// 电机GPIO定义
#define MOTOR_PUMP1 PA0 // 磕头机1电机
#define MOTOR_PUMP2 PA1 // 磕头机2电机
#define MOTOR_FRAC PA4 // 压裂泵车电机
#define MOTOR_COMPRESSOR PA5 // 压缩机电机

// 灯带GPIO定义(WS2812B)
#define LED_DRILL PB0 // 钻井路径灯带
#define LED_OIL PB1 // 采油路径灯带
#define LED_PIPE_OIL PB2 // 集输油路径灯带(红色)
#define LED_PIPE_GAS PB3 // 集输气路径灯带(黄色)
#define LED_PIPE_WATER PB4 // 集输水路径灯带(蓝色)
#define LED_STORAGE PB5 // 储运路径灯带(绿色)
#define LED_STATION PB6 // 联合站区域灯带

#define STAGE_NUM 4 // 钻井→采油→集输→储运
#define DEVICE_NUM 4

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

// 设备状态
struct DeviceStatus {
bool running;
uint8_t speed;
unsigned long lastTick;
};

DeviceStatus devices[DEVICE_NUM];

// 各工序演示时长(ms)
uint16_t stageDurations[STAGE_NUM] = {8000, 6000, 10000, 7000};
uint16_t baseDurations[STAGE_NUM] = {8000, 6000, 10000, 7000};

// 状态机变量
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 strips[7] = {
Adafruit_NeoPixel(LED_COUNT, LED_DRILL, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_OIL, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIPE_OIL, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIPE_GAS, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_PIPE_WATER, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_STORAGE, NEO_GRB + NEO_KHZ800),
Adafruit_NeoPixel(LED_COUNT, LED_STATION, 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);

pinMode(MOTOR_PUMP1, OUTPUT);
pinMode(MOTOR_PUMP2, OUTPUT);
pinMode(MOTOR_FRAC, OUTPUT);
pinMode(MOTOR_COMPRESSOR, OUTPUT);

for (int i = 0; i < 7; i++) {
    strips[i].begin();
    strips[i].show();
}

Timer1.initialize(1000);
Timer1.attachInterrupt(stateMachineTick);

}

void loop() {
mb.task(); // Modbus协议处理
}
5.2 磕头机往复运动与多设备协同控制
cpp
// 磕头机驴头往复运动模拟(4相位控制)
void runPump(int motorPin, int speed, unsigned long &lastTick) {
unsigned long now = millis();
unsigned long interval = 2000; // 完整冲程周期

if (now - lastTick >= interval / 4) {
    lastTick = now;
    static int phase = 0;
    phase = (phase + 1) % 4;
    
    switch(phase) {
        case 0: analogWrite(motorPin, speed); break;   // 上升
        case 1: analogWrite(motorPin, 0); break;       // 上死点
        case 2: analogWrite(motorPin, -speed); break;  // 下降
        case 3: analogWrite(motorPin, 0); break;       // 下死点
    }
}

}

void stateMachineTick() {
if (currentState != RUNNING) return;

// 更新各设备状态
for (int i = 0; i < DEVICE_NUM; i++) {
    if (devices[i].running) {
        int pin = (i == 0) ? MOTOR_PUMP1 : 
                 (i == 1) ? MOTOR_PUMP2 :
                 (i == 2) ? MOTOR_FRAC : MOTOR_COMPRESSOR;
        if (i < 2) {
            runPump(pin, devices[i].speed, devices[i].lastTick);
        } else {
            analogWrite(pin, devices[i].speed);
        }
    }
}

// 工序切换逻辑(四段产业链接力演示)
stageElapsedMs++;
if (stageElapsedMs >= stageDurations[currentStage]) {
    stageElapsedMs = 0;
    currentStage++;
    if (currentStage >= STAGE_NUM) {
        if (holdingRegs[4] == 1) currentStage = 0;
        else { currentState = STOPPED; return; }
    }
    switchStage(currentStage);
    holdingRegs[2] = currentStage + 1;
}

}
5.3 产业链接力灯带时序与多工况切换
cpp
// 工序切换(产业链接力灯带时序)
void switchStage(uint8_t stage) {
allLightsOff();
// 先停止所有设备
for (int i = 0; i < DEVICE_NUM; i++) devices[i].running = false;

// 各阶段颜色定义
uint32_t colors[STAGE_NUM] = {
    0x886633,  // 钻井(棕色,钻杆)
    0xFF4400,  // 采油(橙色,原油)
    0xFF0000,  // 集输(红色,油路径)
    0x00FF66   // 储运(绿色,成品输送)
};

// 各阶段对应的灯带索引
int ledIdx[STAGE_NUM] = {0, 1, 2, 5};
int stationIdx[STAGE_NUM] = {6, 6, 6, 6};

// 点亮当前工序物料路径和区域灯带
flowLight(strips[ledIdx[stage]], colors[stage], stageDurations[stage] / 2);
flowLight(strips[stationIdx[stage]], colors[stage], stageDurations[stage] / 3);

// 启动当前工序对应的设备
if (stage == 0) {  // 钻井工序
    devices[2].running = true;  // 压裂泵车(模拟泥浆泵)
    devices[2].speed = 150;
} else if (stage == 1) {  // 采油工序
    devices[0].running = true;
    devices[0].speed = 180;
    devices[1].running = true;
    devices[1].speed = 160;
} else if (stage == 2) {  // 集输工序
    devices[3].running = true;  // 压缩机
    devices[3].speed = 140;
    // 油/气/水三路同时点亮
    flowLight(strips[2], 0xFF0000, 500);
    flowLight(strips[3], 0xFFFF00, 500);
    flowLight(strips[4], 0x0066FF, 500);
} else if (stage == 3) {  // 储运工序
    devices[3].running = true;
    devices[3].speed = 180;
}

}

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();
}
}

// 工况切换
void switchMode(uint16_t mode) {
allMotorsStop();
allLightsOff();

switch(mode) {
    case 1:  // 正常生产模式
        for (int i = 0; i < DEVICE_NUM; i++) {
            devices[i].running = true;
            devices[i].speed = 150 + i * 10;
        }
        currentState = RUNNING;
        currentStage = 0;
        stageElapsedMs = 0;
        switchStage(0);
        holdingRegs[5] = 1;
        break;
        
    case 2:  // 设备检修模式
        // 仅保留采油运行,其他工序暂停
        devices[0].running = true;
        devices[0].speed = 120;
        devices[1].running = true;
        devices[1].speed = 120;
        for (int i = 2; i < DEVICE_NUM; i++) devices[i].running = false;
        // 黄色闪烁提示检修状态
        for (int i = 0; i < 5; i++) {
            strips[1].clear();
            for (int p = 0; p < strips[1].numPixels(); p++) {
                strips[1].setPixelColor(p, (i % 2 == 0) ? 0xFFFF00 : 0x000000);
            }
            strips[1].show();
            delay(300);
        }
        holdingRegs[5] = 2;
        break;
        
    case 3:  // 应急调度模式
        // 储运优先,红色报警指示
        devices[3].running = true;
        devices[3].speed = 200;
        for (int i = 0; i < 3; i++) devices[i].running = false;
        flowLight(strips[5], 0xFF0000, 300);
        holdingRegs[5] = 3;
        holdingRegs[6] = 1;
        break;
}

}
5.4 寄存器读写回调
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]);
} else if (value == 0) {
currentState = STOPPED;
for (int i = 0; i < DEVICE_NUM; i++) devices[i].running = false;
allMotorsStop();
allLightsOff();
holdingRegs[2] = 0;
holdingRegs[5] = 0;
}
break;

    case 1:  // 运行模式切换
        holdingRegs[1] = value;
        if (holdingRegs[0] == 1) switchMode(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:  // 工序触发
        if (value == 1 && holdingRegs[0] == 1) {
            holdingRegs[2] = holdingRegs[3] % 4;
            currentStage = holdingRegs[2] - 1;
            switchStage(currentStage);
        }
        holdingRegs[7] = value;
        break;
        
    case 8: case 10:  // 磕头机控制
        int idx = (offset - 8) / 2;
        devices[idx].running = (value == 1);
        break;
        
    case 9: case 11:  // 磕头机速度
        int idx2 = (offset - 9) / 2;
        devices[idx2].speed = value;
        break;
        
    case 12:  // 压裂泵车启停
        devices[2].running = (value == 1);
        break;
        
    case 13:  // 压裂泵车速度
        devices[2].speed = value;
        break;
        
    case 14:  // 压缩机启停
        devices[3].running = (value == 1);
        break;
        
    case 15:  // 压缩机速度
        devices[3].speed = value;
        break;
        
    default:
        holdingRegs[offset] = value;
        break;
}
holdingRegs[offset] = value;

}

void allMotorsStop() {
analogWrite(MOTOR_PUMP1, 0);
analogWrite(MOTOR_PUMP2, 0);
analogWrite(MOTOR_FRAC, 0);
analogWrite(MOTOR_COMPRESSOR, 0);
}
六、关键技术细节
6.1 四段产业链接力联动的状态机设计
石油天然气沙盘的核心价值在于“钻井-采油-集输-储运”四条产业链环节的接力联动。采用状态机编程,将四个工序定义为独立状态:

阶段0:钻井(棕色灯带,钻杆下行→泥浆循环)

阶段1:采油(橙色灯带,磕头机往复→原油采出)

阶段2:集输(红/黄/蓝三色灯带,油/气/水分路径输送)

阶段3:储运(绿色灯带,成品输送→用户)

各阶段之间通过时序计数器触发切换,工序间延时可通过寄存器40027独立调节,模拟真实油气田从勘探开发到终端配送的完整生产链条。

6.2 多段灯带独立控制与物料路径区分
石油天然气沙盘的物料路径演示是核心功能,需用多种颜色灯带区分不同介质:

介质 灯带颜色 对应阶段 寄存器
钻杆/泥浆 棕色 钻井 40019
原油 橙色→红色 采油→集输 40020-40021
天然气 黄色 集输 40022
采出水 蓝色 集输 40023
成品油 绿色 储运 40024
WS2812B灯带采用单总线控制,每条灯带独立占用一个GPIO,互不干扰。各段灯带的流速可通过寄存器40026统一调节。

6.3 多工况模式切换设计
石油天然气沙盘需要支持三种工况模式:

模式 寄存器值 功能
正常生产 1 全流程接力联动,四工序按序运行
设备检修 2 仅采油运行,其他工序暂停,黄色指示
应急调度 3 储运优先,红色报警指示
工况切换时需同步控制设备启停、灯带状态和系统状态寄存器。在“应急调度”模式下,储运路径灯带快速闪烁红色,模拟紧急输送状态。

6.4 通讯异常处理
策略 实现方式 适用场景
保持当前状态 不改变输出,等待通讯恢复 展厅演示
自动切换安全模式 切换至停止状态 安全要求较高
状态上报 向上位机发送故障码 远程监控
七、现场调试要点
7.1 电机动作异常排查
现象 排查方向 解决方案
磕头机电机不转 电源/驱动 检查DRV8833供电,确认EN引脚电平
电机转速不稳 PWM频率/占空比 确认PWM频率≥1kHz
磕头机只朝一个方向转 驱动逻辑 检查IN1/IN2逻辑电平
多电机互相干扰 电源 各电机电源独立走线,增加滤波电容
7.2 灯带异常排查
现象 排查方向 解决方案
灯带全亮白光 数据线虚接 重新焊接,确认GPIO输出电平
颜色偏色 电源电压不足 测量末端电压,<4.8V需增加供电点
首灯正常后续不亮 MCU主频配置不当 确认系统时钟72MHz,WS2812B时序正确
多路灯带颜色串扰 GPIO/电源 确认各灯带独立GPIO,电源分开走线
7.3 调试工具推荐
调试阶段推荐使用Modbus Poll(Windows)作为主站调试工具,配合USB转RS485转换器连接目标板。通讯正常后,依次测试各寄存器的读写功能,确认单路控制正常后再进行联调。

八、工程实践能力
基于STM32平台的多系统协同控制方案,已在筑城世纪多个工业模型项目中完成部署验证:

中石化油库沙盘模型:储罐区布局与油气储运路径时序控制

国机集团柬埔寨燃机联合循环电站沙盘:6级灯光联动、65米灯带,多节点时序控制

工业沙盘模型控制系统方案:L1-L3三级配置,覆盖工业模型全谱系

上述项目验证的核心能力(多路电机独立控制、多段灯带时序联动、多工序接力切换、Modbus RTU数据对接),与石油天然气沙盘的控制需求一致。

筑城世纪模型在石油天然气沙盘方向具备以下三项核心交付能力:

  1. 油气田工程图纸理解能力

技术团队具备读懂钻井工程图、采油工艺图、集输系统图和储运设计图的能力,能够按图纸精确还原钻井设备、采油装置、集输管网和储运设施。钻井设备、采油装置、集输管网按图施工,可签署技术图纸确认单。

  1. 多工序接力控制能力

控制系统基于STM32平台自主研发,支持多路电机独立PWM调速、多段灯带时序联动、多工况切换(正常生产/设备检修/应急调度)。后期可根据客户需求随时修改控制逻辑和工况模式,无需依赖第三方。

  1. 全流程自主交付能力

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

九、总结
石油天然气沙盘模型多系统协同控制系统的设计,核心在于三个层面:

  1. 四段产业链接力联动是核心。 石油天然气沙盘的价值在于“钻井-采油-集输-储运”四条产业链环节的接力联动——从地下钻井到终端配送,每一段灯光的时序流动都在讲述油气从地下到用户的完整故事。采用状态机编程,将各工序定义为独立状态,各阶段之间通过时序计数器触发切换,工序间延时独立可调。

  2. 多路电机与灯带协同控制是基础。 磕头机往复运动、压裂泵运转、压缩机运行等多路电机动作,需要与多段灯带时序精确联动,实现“设备动、灯带亮、物料走”的完整演示效果。

  3. 控制系统自主可控是保障。 石油天然气沙盘在交付后经常需要根据客户需求调整控制逻辑(如新增应急调度模式、调整各工序节拍时间、修改集输管网走向)。自主研发的控制系统通过Modbus寄存器在线修改参数即可完成调整,无需依赖第三方。

筑城世纪模型的石油天然气沙盘控制系统方案,基于STM32平台自主研发,支持Modbus RTU协议,已在多套工业模型项目中完成部署验证。控制系统支持多路电机独立控制、多段灯带时序联动、多工况模式切换(正常生产/设备检修/应急调度),后期可根据需求随时修改控制逻辑。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐