1.LoadPort1装G1,LoadPort2装G2, LoadPort3装G1, LoadPort4装G4, 加工完成回到G1的原位。按此增加生产模式的调度和连接图;
已修改7个文件
206 ■■■■ 文件已修改
SourceCode/Bond/Servo/CAligner.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Configuration.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Configuration.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/EqsGraph.ini 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CAligner.cpp
@@ -35,6 +35,8 @@
        LOGD("<CAligner>initPins");
        addPin(SERVO::PinType::INPUT, _T("In1"));
        addPin(SERVO::PinType::INPUT, _T("In2"));
        addPin(SERVO::PinType::INPUT, _T("In3"));
        addPin(SERVO::PinType::INPUT, _T("In4"));
        addPin(SERVO::PinType::OUTPUT, _T("Out1"));
        addPin(SERVO::PinType::OUTPUT, _T("Out2"));
    }
SourceCode/Bond/Servo/CMaster.cpp
@@ -63,6 +63,7 @@
        m_ullRunTime = 0;
        m_state = MASTERSTATE::READY;
        m_curveMode = CurveMode::Production;
        m_schedulingMode = SchedulingMode::Production;
        m_pActiveRobotTask = nullptr;
        m_nLastError = ER_CODE_NOERROR;
        m_isCompareMapsBeforeProceeding = FALSE;
@@ -310,6 +311,17 @@
    CurveMode CMaster::getCurveMode() const
    {
        return m_curveMode;
    }
    void CMaster::setSchedulingMode(SchedulingMode mode)
    {
        m_schedulingMode = mode;
        LOGI("<Master>SchedulingMode=%s", mode == SchedulingMode::Production ? "Production" : "Tuning");
    }
    SchedulingMode CMaster::getSchedulingMode() const
    {
        return m_schedulingMode;
    }
    int CMaster::term()
@@ -746,6 +758,13 @@
                // Measurement -> LoadPort
                if (m_schedulingMode == SchedulingMode::Production) {
                    if (!rmd.armState[0]) {
                        m_pActiveRobotTask = createTransferTask_returnOrigin(pMeasurement, pLoadPorts);
                        CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                    }
                }
                else {
                for (int s = 0; s < 4; s++) {
                    PortType pt = pLoadPorts[s]->getPortType();
                    if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
@@ -754,6 +773,7 @@
                        m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
                        if (m_pActiveRobotTask != nullptr) {
                            goto PORT_PUT;
                            }
                        }
                    }
                }
@@ -1008,12 +1028,19 @@
                // 组数门限:≥2 组时不再从 LP 上片,避免堆积(与单片一致)
                bool blockLoadFromLP = (nGlassGroup >= 2);
                // 7) Measurement -> LoadPort(固定:G1 优先回 LP)
                // 7) Measurement -> LoadPort
                if (rmd.armState[0] || rmd.armState[1]) {
                    LOGD("Arm1 %s, Arm2 %s.",
                        rmd.armState[0] ? _T("不可用") : _T("可用"),
                        rmd.armState[1] ? _T("不可用") : _T("可用"));
                }
                if (m_schedulingMode == SchedulingMode::Production) {
                    if (!rmd.armState[0]) {
                        m_pActiveRobotTask = createTransferTask_returnOrigin(pMeasurement, pLoadPorts);
                        CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
                    }
                }
                else {
                for (int s = 0; s < 4; s++) {
                    PortType pt = pLoadPorts[s]->getPortType();
                    if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
@@ -1021,6 +1048,7 @@
                        && pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
                        m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
                        if (m_pActiveRobotTask != nullptr) { goto BATCH_PORT_PUT; }
                        }
                    }
                }
@@ -2449,11 +2477,19 @@
        nRet = pLoadPort1->getPin("Out")->connectPin(pAligner->getPin("In1"));
        if (nRet < 0) {
            LOGE("连接LoadPort1-Fliper失败");
            LOGE("连接LoadPort1-Aligner失败");
        }
        nRet = pLoadPort2->getPin("Out")->connectPin(pAligner->getPin("In2"));
        if (nRet < 0) {
            LOGE("连接LoadPort1-Fliper失败");
            LOGE("连接LoadPort2-Aligner失败");
        }
        nRet = pLoadPort3->getPin("Out")->connectPin(pAligner->getPin("In3"));
        if (nRet < 0) {
            LOGE("连接LoadPort3-Aligner失败");
        }
        nRet = pLoadPort4->getPin("Out")->connectPin(pAligner->getPin("In4"));
        if (nRet < 0) {
            LOGE("连接LoadPort4-Aligner失败");
        }
        nRet = pAligner->getPin("Out1")->connectPin(pFliper->getPin("In"));
@@ -2498,14 +2534,29 @@
            LOGE("连接BakeCooling-LoadPort3失败");
        }
        if (m_schedulingMode == SchedulingMode::Production) {
            // 生产模式:测量输出回到 G1 原位(默认 Port1 / Port3)
            nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort1->getPin("In"));
            if (nRet < 0) {
                LOGE("连接Measurement-LoadPort1失败");
            }
            nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort3->getPin("In"));
            if (nRet < 0) {
                LOGE("连接Measurement-LoadPort3失败");
            }
        }
        else {
            // 调机模式:维持原连接(Out1->Port3, Out2->Port4)
        nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort3->getPin("In"));
        if (nRet < 0) {
            LOGE("连接BakeCooling-LoadPort3失败");
                LOGE("连接Measurement-LoadPort3失败");
        }
        nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort4->getPin("In"));
        if (nRet < 0) {
            LOGE("连接BakeCooling-LoadPort4失败");
                LOGE("连接Measurement-LoadPort4失败");
            }
        }
    }
@@ -2735,6 +2786,57 @@
        return pTask;
    }
    CRobotTask* CMaster::createTransferTask_returnOrigin(CEquipment* pEqSrc, CLoadPort** pPorts)
    {
        if (!pEqSrc->IsEnabled()) {
            return nullptr;
        }
        CSlot* pSrcSlot = pEqSrc->getProcessedSlot(MaterialsType::G1, m_bJobMode);
        if (pSrcSlot == nullptr) {
            return nullptr;
        }
        CGlass* pGlass = (CGlass*)pSrcSlot->getContext();
        if (pGlass == nullptr) {
            return nullptr;
        }
        int port = 0, slot = 0;
        pGlass->getOrginPort(port, slot);
        if (port < 0 || port >= 4 || slot < 0 || slot >= SLOT_MAX) {
            return nullptr;
        }
        CLoadPort* pPort = pPorts[port];
        if (pPort == nullptr || !pPort->isEnable()) {
            return nullptr;
        }
        PortType pt = pPort->getPortType();
        if (!(pt == PortType::Unloading || pt == PortType::Both)) {
            return nullptr;
        }
        if (pPort->getPortStatus() != PORT_INUSE) {
            return nullptr;
        }
        CSlot* pTarSlot = pPort->getSlot(slot);
        if (pTarSlot == nullptr) {
            return nullptr;
        }
        if (!pTarSlot->isEnable() || pTarSlot->isLock() || pTarSlot->getContext() != nullptr) {
            return nullptr;
        }
        CRobotTask* pTask = new CRobotTask();
        pTask->setContext(pSrcSlot->getContext());
        pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
        taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
            pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
        return pTask;
    }
    CRobotTask* CMaster::createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
        CEquipment* pTarEq, int nTarSlot, int armNo/* = 1*/)
    {
@@ -2844,6 +2946,19 @@
        pPort->localSetCessetteType(type);
    }
    void CMaster::applySchedulingModePortMapping()
    {
        // 生产模式:固定 Port1/Port3 为 G1,Port2/Port4 为 G2(G4 未定义,按 G2 处理)
        if (m_schedulingMode != SchedulingMode::Production) {
            return;
        }
        setPortCassetteType(0, SERVO::CassetteType::G1);
        setPortCassetteType(1, SERVO::CassetteType::G2);
        setPortCassetteType(2, SERVO::CassetteType::G1);
        setPortCassetteType(3, SERVO::CassetteType::G2);
    }
    void CMaster::setPortEnable(unsigned int index, BOOL bEnable)
    {
        ASSERT(index < 4);
SourceCode/Bond/Servo/CMaster.h
@@ -59,6 +59,11 @@
        EmptyChamber
    };
    enum class SchedulingMode {
        Production = 0, // 生产模式(按客户指定Port映射)
        Tuning = 1      // 调机模式(原有调度逻辑)
    };
    typedef std::function<void(void* pMaster, MASTERSTATE state)> ONMASTERSTATECHANGED;
    typedef std::function<void(void* pMaster, CEquipment* pEiuipment, BOOL bAlive)> ONEQALIVE;
    typedef std::function<void(CStep* pStep, int code, void* pData)> ONEQSTEPEVENT;
@@ -124,6 +129,9 @@
        MASTERSTATE getState();
        void setCurveMode(CurveMode mode);
        CurveMode getCurveMode() const;
        void setSchedulingMode(SchedulingMode mode);
        SchedulingMode getSchedulingMode() const;
        void applySchedulingModePortMapping();
        unsigned DispatchProc();
        unsigned ReadBitsProc();
        void onTimer(UINT nTimerid);
@@ -194,6 +202,7 @@
        CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq);
        CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq);
        CRobotTask* createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts);
        CRobotTask* createTransferTask_returnOrigin(CEquipment* pEqSrc, CLoadPort** pPorts);
        CRobotTask* createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
            CEquipment* pTarEq, int nTarSlot, int armNo = 1);
@@ -278,6 +287,7 @@
        // 在开始工艺前是否需要先比较 map
        BOOL m_isCompareMapsBeforeProceeding;
        BOOL m_bJobMode;
        SchedulingMode m_schedulingMode;
        // 千传圈数计数
        int m_nContinuousTransferCount;
SourceCode/Bond/Servo/Configuration.cpp
@@ -175,6 +175,12 @@
    return GetPrivateProfileInt(_T("Master"), _T("JobMode"), 0, m_strFilepath);
}
int CConfiguration::getSchedulingMode()
{
    // 0: Production, 1: Tuning (default to Production)
    return GetPrivateProfileInt(_T("Master"), _T("SchedulingMode"), 0, m_strFilepath);
}
void CConfiguration::setContinuousTransferCount(int round)
{
    WritePrivateProfileString(_T("Master"), _T("CTRound"),
SourceCode/Bond/Servo/Configuration.h
@@ -29,6 +29,7 @@
    BOOL setPortEnable(unsigned int index, BOOL bEnable);
    BOOL isCompareMapsBeforeProceeding();
    BOOL isJobMode();
    int getSchedulingMode();
    void setContinuousTransferCount(int round);
    int getContinuousTransferCount();
    int getPortCassetteSnSeed(int port);
SourceCode/Bond/Servo/Model.cpp
@@ -272,6 +272,9 @@
        int seed = m_configuration.getPortCassetteSnSeed(i + 1);
        m_master.setPortCassetteSnSeed(i + 1, seed);
    }
    // 按调度模式覆写生产端口配置
    m_master.applySchedulingModePortMapping();
}
void CModel::setPortType(unsigned int index, SERVO::PortType type)
@@ -1129,6 +1132,7 @@
    m_master.setCacheFilepath((LPTSTR)(LPCTSTR)strMasterDataFile);
    m_master.setCompareMapsBeforeProceeding(m_configuration.isCompareMapsBeforeProceeding());
    m_master.setJobMode(m_configuration.isJobMode());
    m_master.setSchedulingMode((SERVO::SchedulingMode)m_configuration.getSchedulingMode());
    // 加截Job
    strMasterDataFile.Format(_T("%s\\MasterState.dat"), (LPTSTR)(LPCTSTR)m_strWorkDir);
SourceCode/Bond/x64/Debug/EqsGraph.ini
@@ -1,51 +1,51 @@
[LoadPort 1]
Left=23
Top=87
Left=44
Top=64
[LoadPort 2]
Left=23
Top=437
Left=30
Top=317
[LoadPort 3]
Left=1253
Top=297
Left=70
Top=615
[LoadPort 4]
Left=1253
Top=457
Left=57
Top=466
[EFEM(ROBOT)]
Left=294
Top=63
Left=381
Top=42
[Bonder 1]
Left=659
Top=297
Left=762
Top=317
[Bonder 2]
Left=659
Top=437
Left=781
Top=504
[Fliper]
Left=279
Top=297
[Aligner]
Left=210
Left=320
Top=317
[VacuumBake]
Left=279
Top=437
[BakeCooling]
Left=853
Top=363
Left=994
Top=317
[ARM]
Left=628
Top=63
Left=722
Top=42
[Arm Tray1]
Left=467
Top=63
Left=554
Top=42
[Arm Tray2]
Left=467
Top=167
Left=554
Top=141
[Fliper(G2)]
Left=413
Top=285
Left=529
Top=317
[VacuumBake(G1)]
Left=413
Top=437
Left=529
Top=466
[Measurement]
Left=1041
Top=363
Left=1207
Top=317