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