C++ Qt实战:微内核方式控制软件设计方案
CIS固晶机控制软件设计方案(C++11 + Qt + 微内核)
一、总体架构设计
采用分层微内核架构,核心逻辑与UI、硬件解耦,支持模块化扩展。
二、微内核设计
1. 核心组件
|
组件 |
职责 |
|---|---|
|
MessageBus |
跨线程/跨模块通信(基于Qt信号槽封装) |
|
Scheduler |
定时任务(100ms传感器轮询、运动节拍) |
|
PluginManager |
动态加载工艺模块(点胶、固晶、晶圆盘) |
|
StateMachine |
全局状态管理(自动/手动/报警/暂停) |
|
ConfigCenter |
参数存储(JSON/SQLite) |
2. 微内核接口示例
// 微内核基类class MicroKernel : public QObject {Q_OBJECTpublic:virtualvoidinit() = 0;virtualvoidstart() = 0;virtualvoidstop() = 0;signals:voiderrorOccurred(int code, QString msg);};
三、模块划分
1. 硬件抽象层(HAL)
传感器管理
class Sensor : public QObject {Q_OBJECTpublic:enum Type { ENTRY, PRESENCE, EXIT };boolread(); // 读取物理IOvoidsetDebounce(int ms); // 防抖signals:voidtriggered(bool state);};
轨道控制
class Track : public QObject {Q_OBJECTpublic:struct Sensors {Sensor* entry; // 进料传感器Sensor* presence; // 有料传感器Sensor* exit; // 出料传感器};voidmoveTo(Track* target); // 移送料板boolhasMaterial() const;};
2. 业务逻辑层

自动流程控制器
class AutoFlow : public QObject {Q_OBJECTprivate:enum Step {CHECK_FEED, TRANSFER_TO_DISPENSE, DISPENSE,TRANSFER_TO_DIEBOND, DIEBOND, UNLOAD};Step currentStep;QTimer pollTimer; // 100ms轮询private slots:voidonPoll();};
3. 手动调试模块
class ManualControl : public QObject {Q_OBJECTpublic slots:voidmanualLoad(); // 手动上料voidmanualTransfer(int fromTrack, int toTrack);voidmanualDispenseSingle(int pointIndex);voidmanualPickAndPlace(int waferId, int posX, int posY);};
四、传感器安全逻辑实现
1. 送料互锁(示例)
bool Track::canSendTo(Track* target) {if (target->hasMaterial()) {emit error("目标轨道有料,禁止移送");return false;}return true;}
2. 异常检测
void AutoFlow::checkSensorTimeout() {if (expectedExitTrigger && !exitSensor.read()) {emergencyStop(ERROR_SENSOR_TIMEOUT);}}
五、调试界面设计(Qt Widgets)
1. 主界面布局


2. 关键控件
|
功能 |
控件 |
|---|---|
|
传感器状态 |
|
|
参数设置 |
|
|
单步调试 |
|
|
实时曲线 |
|
六、数据模型与配置
1. 料板数据结构
struct Substrate {int id;QVector<Point> dispensePoints; // 点胶点位QVector<Die> diePositions; // 固晶点位bool isDispensed;bool isDieBonded;};
2. 配置文件(JSON)
{"tracks": [{"name": "Feeder", "sensor_debounce_ms": 50},{"name": "Dispense", "motor_speed": 300}],"process": {"dispense_pressure": 0.4,"pick_delay_ms": 100}}
七、异常处理机制
1. 急停分级
|
级别 |
响应 |
|---|---|
|
警告 |
弹窗提示,继续运行 |
|
严重 |
暂停当前工位,允许手动退出 |
|
致命 |
全机急停,切断真空/电机 |
2. 报警代码表
enum AlarmCode {ALARM_SENSOR_MISSING = 0x01,ALARM_TRACK_JAM = 0x02,ALARM_VACUUM_FAIL = 0x03};
八、多线程设计
|
线程 |
职责 |
|---|---|
|
UI线程 |
界面刷新、用户输入 |
|
控制线程 |
状态机、传感器轮询 |
|
运动线程 |
电机插补、实时IO |
|
日志线程 |
数据记录、报警存储 |
// 使用QtConcurrent + QThreadPoolQtConcurrent::run(&motionWorker, &MotionWorker::moveToTarget);
九、微内核插件示例(点胶模块)
classDispensePlugin : publicIPlugin{public:void execute(const Substrate& sub) override{for (auto& pt : sub.dispensePoints) {moveTo(pt);fireNozzle(true);wait(pressureTime);fireNozzle(false);}}};
十、项目文件结构
/DiebondController ├── kernel/ # 微内核 ├── hal/ # 硬件抽象 ├── modules/ # 工艺插件 ├── ui/ # Qt界面 ├── config/ # JSON配置 ├── tests/ # 单元测试 └── main.cpp
以下是 自动流程的完整伪代码,覆盖所有业务场景、传感器校验、异常分支、重试与安全保护。
自动流程总控伪代码
classAutoFlowController : publicQObject{Q_OBJECTpublic:enum classState{IDLE,LOADING,WAIT_FOR_DISPENSE_TRACK,TRANSFERRING_TO_DISPENSE,DISPENSING,WAIT_FOR_DIEBOND_TRACK,TRANSFERRING_TO_DIEBOND,DIE_BONDING,UNLOADING,ERROR_STOP};State currentState = State::IDLE;Track* feederTrack;Track* dispenseTrack;Track* diebondTrack;QTimer pollTimer; // 100ms};
自动主循环(核心)
voidAutoFlowController::onPoll(){switch (currentState) {case State::IDLE:handleIdle();break;case State::LOADING:handleLoading();break;case State::WAIT_FOR_DISPENSE_TRACK:handleWaitForDispenseTrack();break;case State::TRANSFERRING_TO_DISPENSE:handleTransferToDispense();break;case State::DISPENSING:handleDispensing();break;case State::WAIT_FOR_DIEBOND_TRACK:handleWaitForDiebondTrack();break;case State::TRANSFERRING_TO_DIEBOND:handleTransferToDiebond();break;case State::DIE_BONDING:handleDieBonding();break;case State::UNLOADING:handleUnloading();break;case State::ERROR_STOP:handleErrorStop();break;}}
各阶段详细伪代码
✅ 1. 空闲态(IDLE)
void AutoFlowController::handleIdle(){if(!isStartButtonPressed())return;if(feederTrack->hasMaterial()) {currentState = State::WAIT_FOR_DISPENSE_TRACK;} else {currentState = State::LOADING;}}
✅ 2. 上料(LOADING)
void AutoFlowController::handleLoading(){if (!feederTrack->hasMaterial()) {pushSubstrateFromMagazine();startFeederConveyor(FEED_SPEED_FAST);}if (feederTrack->entrySensorTriggered()) {startFeederConveyor(FEED_SPEED_SLOW);}if (feederTrack->presenceSensorTriggered()) {stopFeederConveyor();updateSensorState(feederTrack, HAS_MATERIAL);currentState = State::WAIT_FOR_DISPENSE_TRACK;}checkTimeout(LOADING_TIMEOUT);}
✅ 3. 等待点胶轨道空闲
void AutoFlowController::handleWaitForDispenseTrack(){if (!dispenseTrack->hasMaterial()) {currentState = State::TRANSFERRING_TO_DISPENSE;return;}// 每100ms轮询}
✅ 4. 进料 → 点胶轨道
void AutoFlowController::handleTransferToDispense(){startFeederTransferMotor();if (dispenseTrack->entrySensorTriggered()) {slowDownTransfer();}if (dispenseTrack->presenceSensorTriggered()) {stopFeederTransferMotor();updateSensorState(dispenseTrack, HAS_MATERIAL);currentState = State::DISPENSING;}if (feederTrack->exitSensorTriggered()) {updateSensorState(feederTrack, NO_MATERIAL);}checkTimeout(TRANSFER_TIMEOUT);}
✅ 5. 自动点胶
void AutoFlowController::handleDispensing(){if (!dispenseTrack->hasMaterial()) {raiseAlarm(ALARM_DISPENSE_TRACK_EMPTY);return;}runDispenseRecipe(currentSubstrate);if (dispenseCompleted()) {currentSubstrate.isDispensed = true;currentState = State::WAIT_FOR_DIEBOND_TRACK;}checkTimeout(DISPENSE_TIMEOUT);}
✅ 6. 等待固晶轨道空闲
void AutoFlowController::handleWaitForDiebondTrack(){if (!diebondTrack->hasMaterial()) {currentState = State::TRANSFERRING_TO_DIEBOND;}}
✅ 7. 点胶 → 固晶轨道
void AutoFlowController::handleTransferToDiebond(){startDispenseTransferMotor();if (diebondTrack->entrySensorTriggered()) {slowDownTransfer();}if (diebondTrack->presenceSensorTriggered()) {stopDispenseTransferMotor();updateSensorState(diebondTrack, HAS_MATERIAL);currentState = State::DIE_BONDING;}if (dispenseTrack->exitSensorTriggered()) {updateSensorState(dispenseTrack, NO_MATERIAL);}checkTimeout(TRANSFER_TIMEOUT);}
✅ 8. 自动固晶(含单颗循环)
void AutoFlowController::handleDieBonding(){if(!diebondTrack->hasMaterial()) {raiseAlarm(ALARM_DIEBOND_TRACK_EMPTY);return;}for(int i = 0; i < currentSubstrate.dieCount(); ++i) {if(vacuumCheckFailed()) {raiseAlarm(ALARM_VACUUM_FAIL);return;}pickDieFromWaferMap();alignAtPrealigner();placeDieToSubstrate(i);pressDie();}if(allDiesPlaced()) {currentSubstrate.isDieBonded = true;currentState = State::UNLOADING;}checkTimeout(DIEBOND_TIMEOUT);}
✅ 9. 出料
void AutoFlowController::handleUnloading(){startDiebondUnloadMotor();if (diebondTrack->exitSensorTriggered()) {updateSensorState(diebondTrack, NO_MATERIAL);currentState = State::IDLE;logSubstrateComplete(currentSubstrate);}checkTimeout(UNLOAD_TIMEOUT);}
异常与急停逻辑(全覆盖)
void AutoFlowController::checkTimeout(int timeoutMs){if (elapsedTime() > timeoutMs) {emergencyStop();raiseAlarm(ALARM_SENSOR_TIMEOUT);currentState = State::ERROR_STOP;}}void AutoFlowController::emergencyStop(){stopAllMotors();closeAllVacuumValves();disableHeaters();saveCurrentStateToLog();}
传感器一致性校验(关键)
bool verifyTrackSensors(Track* track){bool entry = track->entrySensorTriggered();bool presence = track->presenceSensorTriggered();bool exit = track->exitSensorTriggered();if(presence && exit && !entry)raiseAlarm(ALARM_SENSOR_LOGIC_ERROR);return true;}
自动流程状态转移总结
IDLE↓ StartLOADING↓WAIT_FOR_DISPENSE_TRACK↓TRANSFERRING_TO_DISPENSE↓DISPENSING↓WAIT_FOR_DIEBOND_TRACK↓TRANSFERRING_TO_DIEBOND↓DIE_BONDING↓UNLOADING↓IDLE

夜雨聆风
