From ce83df0657786b340be5cc2e9817fb2392117ac9 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 29 五月 2025 16:23:54 +0800
Subject: [PATCH] 1.理顺CRobotTask(搬送任务)和Glass,Slot, JobData等关系,实现创建调度任务,模拟拔片测试;
---
SourceCode/Bond/Servo/CMaster.cpp | 127 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 125 insertions(+), 2 deletions(-)
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 3bd5d26..e05c2f7 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -228,6 +228,12 @@
}
saveCache();
+ lock();
+ if (m_pActiveRobotTask != nullptr) {
+ delete m_pActiveRobotTask;
+ m_pActiveRobotTask = nullptr;
+ }
+ unlock();
for (auto item : m_listEquipment) {
delete item;
@@ -310,13 +316,60 @@
else if (m_state == MASTERSTATE::RUNNING) {
unlock();
LOGI("调度处理中...");
- Sleep(1000);
+ lock();
+ if (m_pActiveRobotTask != nullptr) {
+ unlock();
+ // 检测到当前有正在下午的任务,确保当前任务完成或中止后继续
+ LOGI("检测到当前有正在下午的任务,确保当前任务完成或中止后继续...");
+ continue;
+ }
// LoadPort -> Fliper(G2)
+ CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
+ CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
+ CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
+ CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
+ ASSERT(pLoadPort1);
+ ASSERT(pLoadPort2);
+ ASSERT(pFliper);
+ ASSERT(pVacuumBack);
+
+ m_pActiveRobotTask = createTransferTask(pLoadPort1, pFliper);
+ if (m_pActiveRobotTask != nullptr) {
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
+
+ m_pActiveRobotTask = createTransferTask(pLoadPort2, pFliper);
+ if (m_pActiveRobotTask != nullptr) {
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
+
// LoadPort -> VacuumBake(G1)
+ m_pActiveRobotTask = createTransferTask(pLoadPort1, pVacuumBack);
+ if (m_pActiveRobotTask != nullptr) {
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ LOGI("创建新任务1<%s>...", strDescription.c_str());
+ continue;
+ }
+
+ m_pActiveRobotTask = createTransferTask(pLoadPort2, pVacuumBack);
+ if (m_pActiveRobotTask != nullptr) {
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ LOGI("创建新任务2<%s>...", strDescription.c_str());
+ continue;
+ }
+
// Fliper(G2) -> Aligner
@@ -338,7 +391,7 @@
-
+ unlock();
}
unlock();
@@ -412,11 +465,57 @@
m_listener.onEqVcrEventReport(this, p, p2);
}
};
+ listener.onPreFethedOutJob = [&](void* pEquipment, CJobDataB* pJobDataB) -> BOOL {
+ CEquipment* p = (CEquipment*)pEquipment;
+
+
+ // 取放片,更新当前搬送任务
+ BOOL bOk = FALSE;
+ lock();
+ if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) {
+ CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getSrcSlot());
+ if (pGlass != nullptr) {
+ CJobDataB* pJobDataBSrc = pGlass->getJobDataB();
+ if (pJobDataBSrc != nullptr
+ && pJobDataBSrc->getCassetteSequenceNo() == pJobDataB->getCassetteSequenceNo()
+ && pJobDataBSrc->getJobSequenceNo() == pJobDataB->getJobSequenceNo()) {
+ bOk = TRUE;
+ LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
+ }
+ }
+ }
+ unlock();
+
+ if (!bOk) {
+ LOGE("<CMaster>onPreFethedOutJob, 数据校验失败.");
+ }
+
+ return bOk;
+
+ };
listener.onDataChanged = [&](void* pEquipment, int code) -> void {
m_bDataModify = TRUE;
CEquipment* p = (CEquipment*)pEquipment;
if (m_listener.onEqDataChanged != nullptr) {
m_listener.onEqDataChanged(this, p, 0);
+ }
+
+ // 取放片,更新当前搬送任务
+ if (code == EDCC_FETCHOUT_JOB) {
+ lock();
+ if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getSrcPosition() == p->getID()) {
+ m_pActiveRobotTask->fetchOut();
+ LOGI("开始取片...");
+ }
+ unlock();
+ }
+ else if (code == EDCC_STORED_JOB) {
+ lock();
+ if (m_pActiveRobotTask != nullptr && m_pActiveRobotTask->getTarPosition() == p->getID()) {
+ m_pActiveRobotTask->stored();
+ LOGI("放片完成...");
+ }
+ unlock();
}
};
@@ -828,4 +927,28 @@
m_listener.onMasterStateChanged(this, m_state);
}
}
+
+ static int taskSeqNo = 0;
+ CRobotTask* CMaster::createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq)
+ {
+ CRobotTask* pTask = nullptr;
+ CSlot* pSrcSlot, * pTarSlot;
+ pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G1);
+ pSrcSlot = pSrcEq->getNonEmptySlot(MaterialsType::G1);
+ if (pSrcSlot == nullptr || nullptr == pTarSlot) {
+ pTarSlot = pTarEq->getAvailableSlotForGlass(MaterialsType::G2);
+ pSrcSlot = pSrcEq->getNonEmptySlot(MaterialsType::G2);
+ }
+
+
+ if (pSrcSlot != nullptr && nullptr != pTarSlot) {
+ pTask = new CRobotTask();
+ pTask->setContext(pSrcSlot->getContext());
+ pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+ pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+ }
+
+
+ return pTask;
+ }
}
--
Gitblit v1.9.3