乐于分享
好东西不私藏

C++ Qt实战:微内核方式控制软件设计方案

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();          // 读取物理IO    voidsetDebounce(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. 关键控件

                 功能

                       控件

传感器状态

QLED(自定义指示灯)

参数设置

QDoubleSpinBoxQSlider

单步调试

QPushButtonQComboBox

实时曲线

QCustomPlot(点胶压力/位置)


六、数据模型与配置

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& suboverride{        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