From b4aa15969fe35ed20b5ef1f15d5d56c386e13f36 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期二, 17 六月 2025 11:55:15 +0800
Subject: [PATCH] 1.增加Send Able信号出现号的事件处理;

---
 SourceCode/Bond/Servo/CMaster.cpp |  293 +++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 176 insertions(+), 117 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 4eca70d..79aff87 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -160,9 +160,9 @@
 		ASSERT(pMeasurement);
 
 		pEfem->setPort(0, pPort1);
-		pEfem->setPort(1, pPort1);
-		pEfem->setPort(2, pPort1);
-		pEfem->setPort(3, pPort1);
+		pEfem->setPort(1, pPort2);
+		pEfem->setPort(2, pPort3);
+		pEfem->setPort(3, pPort4);
 		pEfem->setFliper(pFliper);
 		pEfem->setAligner(pAligner);
 		pEfem->setArmTray(0, pArmTray1);
@@ -343,10 +343,13 @@
 
 			// 调度逻辑处理
 			else if (m_state == MASTERSTATE::RUNNING) {
-				unlock();
-				// LOGI("调度处理中...");
+				// 检测判断robot状态
+				RMDATA& rmd = pEFEM->getRobotMonitoringData();
+				if (rmd.status != ROBOT_STATUS::Idle && rmd.status != ROBOT_STATUS::Run) {
+					unlock();
+					continue;
+				}
 
-				lock();
 				if (m_pActiveRobotTask != nullptr) {
 					unlock();
 					// 检测到当前有正在下午的任务,确保当前任务完成或中止后继续
@@ -376,6 +379,8 @@
 
 
 				// Measurement -> LoadPort
+				LOGI("Arm1 %s, Arm2 %s.", rmd.armState[0] ? _T("不可用") : _T("可用"), 
+					rmd.armState[1] ? _T("不可用") : _T("可用"));
 				CLoadPort* pEqLoadPort[] = { pLoadPort1, pLoadPort2, pLoadPort3, pLoadPort4 };
 				CEquipment* pEqTar[] = { pVacuumBake, pFliper };
 				if (primaryType == MaterialsType::G2) {
@@ -383,7 +388,7 @@
 					pEqTar[1] = pVacuumBake;
 				}
 				for (int s = 0; s < 4; s++) {
-					if (pEqLoadPort[s]->isEnable()
+					if (!rmd.armState[0] && pEqLoadPort[s]->isEnable()
 						&& pEqLoadPort[s]->getPortType() == PortType::Unloading
 						&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToUnload) {
 						m_pActiveRobotTask = createTransferTask(pMeasurement, pEqLoadPort[s], primaryType, secondaryType);
@@ -395,7 +400,7 @@
 
 			PORT_PUT:
 				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
+					m_pActiveRobotTask->pick();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
@@ -407,139 +412,161 @@
 
 
 				// BakeCooling ->Measurement
-				m_pActiveRobotTask = createTransferTask_bakecooling_to_measurement(pBakeCooling, pMeasurement);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0]) {
+					m_pActiveRobotTask = createTransferTask_bakecooling_to_measurement(pBakeCooling, pMeasurement);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
+
 
 				
 				// BakeCooling内部
 				// Bake -> Cooling
-				m_pActiveRobotTask = createTransferTask_bake_to_cooling(pBakeCooling);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0]) {
+					m_pActiveRobotTask = createTransferTask_bake_to_cooling(pBakeCooling);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
 
 				// Bonder -> BakeCooling
-				m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0]) {
+					m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0]) {
+					m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
+
 
 				// Fliper(G2) -> Bonder
 				// VacuumBake(G1) -> Bonder
-				m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[1] && !pBonder1->hasBondClass()) {
+					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[1] && !pBonder2->hasBondClass()) {
+					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
+					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
+					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
+
 
 				// Aligner -> Fliper(G2)
 				// Aligner -> VacuumBake(G1)
-				m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, 2);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[1]) {
+					m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType, 2);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
 
-				m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
-				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
-					std::string strDescription = m_pActiveRobotTask->getDescription();
-					unlock();
-					if (m_listener.onRobotTaskEvent != nullptr) {
-						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+				if (!rmd.armState[0]) {
+					m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
+					if (m_pActiveRobotTask != nullptr) {
+						m_pActiveRobotTask->pick();
+						std::string strDescription = m_pActiveRobotTask->getDescription();
+						unlock();
+						if (m_listener.onRobotTaskEvent != nullptr) {
+							m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+						}
+						LOGI("创建新任务<%s>...", strDescription.c_str());
+						continue;
 					}
-					LOGI("创建新任务<%s>...", strDescription.c_str());
-					continue;
 				}
-
 
 				// LoadPort -> Aligner
 				for (int s = 0; s < 4; s++) {
-					if (pEqLoadPort[s]->isEnable()
+					if (!rmd.armState[0] && pEqLoadPort[s]->isEnable()
 						&& pEqLoadPort[s]->getPortType() == PortType::Loading
 						&& pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
 						m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType);
@@ -551,7 +578,7 @@
 
 PORT_GET:
 				if (m_pActiveRobotTask != nullptr) {
-					m_pActiveRobotTask->run();
+					m_pActiveRobotTask->pick();
 					std::string strDescription = m_pActiveRobotTask->getDescription();
 					unlock();
 					if (m_listener.onRobotTaskEvent != nullptr) {
@@ -586,8 +613,8 @@
 
 			// 读标志位
 			for (auto item : m_listEquipment) {
-				if (item->getID() == EQ_ID_Bonder1 ||
-					item->getID() == EQ_ID_Bonder2) {
+				if (item->getID() == EQ_ID_Bonder1 || item->getID() == EQ_ID_Bonder2
+					|| item->getID() == EQ_ID_EFEM) {
 					const StationIdentifier& station = item->getStation();
 					MemoryBlock& block = item->getReadBitBlock();
 
@@ -677,17 +704,24 @@
 			BOOL bOk = FALSE;
 			lock();
 			if (m_pActiveRobotTask != nullptr) {
-				if (m_pActiveRobotTask->getTarPosition() == p->getID()) {
+				// 是否已经进入手臂(即取片完成),进入下一步,放片
+				if (m_pActiveRobotTask->isPicking() && 
+					((m_pActiveRobotTask->getArmNo() == 1 && p->getID() == EQ_ID_ARM_TRAY1)
+					|| (m_pActiveRobotTask->getArmNo() == 2 && p->getID() == EQ_ID_ARM_TRAY2))
+					) {
+					slot = 1;
+					bOk = TRUE;
+				}
+
+				// 是否放片完成
+				else if (m_pActiveRobotTask->isPlacing() &&
+					m_pActiveRobotTask->getTarPosition() == p->getID()) {
 					CGlass* pGlass = p->getGlassFromSlot(m_pActiveRobotTask->getTarSlot());
 					if (pGlass == nullptr) {
 						bOk = TRUE;
 						slot = m_pActiveRobotTask->getTarSlot();
 						LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
 					}
-				}
-				else if (p->getID() == EQ_ID_ARM_TRAY1 || p->getID() == EQ_ID_ARM_TRAY2) {
-					slot = 1;
-					bOk = TRUE;
 				}
 			}
 			unlock();
@@ -710,21 +744,30 @@
 			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()) {
+				if (m_pActiveRobotTask != nullptr
+					&& m_pActiveRobotTask->isPicking()
+					&& ((m_pActiveRobotTask->getArmNo() == 1 && p->getID() == EQ_ID_ARM_TRAY1)
+						|| (m_pActiveRobotTask->getArmNo() == 2 && p->getID() == EQ_ID_ARM_TRAY2))
+					) {
+					LOGI("取片完成.");
+					m_pActiveRobotTask->fetchOut();
+					m_pActiveRobotTask->place();
+				}
+
+				else if (m_pActiveRobotTask != nullptr
+					&& m_pActiveRobotTask->isPlacing() 
+					&& m_pActiveRobotTask->getTarPosition() == p->getID()) {
 					m_pActiveRobotTask->stored();
 					m_pActiveRobotTask->completed();
 					LOGI("放片完成...");
-
 					// 完成此条搬送任务,但要把数据和消息上抛应用层
 					unlock();
-
 
 
 					lock();
@@ -737,7 +780,9 @@
 				unlock();
 			}
 		};
-
+		listener.onProcessStateChanged = [&](void* pEquipment, PROCESS_STATE state) -> void {
+			LOGI("<Master>onProcessStateChanged<%d>", (int)state);
+		};
 		pEquipment->setListener(listener);
 		pEquipment->setCcLink(&m_cclink);
 		m_listEquipment.push_back(pEquipment);
@@ -1164,7 +1209,7 @@
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			pTask->setRobotTransferParam(++taskSeqNo, armNo, pSrcSlot->getPosition(),
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, armNo, pSrcSlot->getPosition(),
 				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
@@ -1185,7 +1230,7 @@
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
 				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
@@ -1207,7 +1252,7 @@
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
 				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
@@ -1228,7 +1273,7 @@
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
 				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
@@ -1260,4 +1305,18 @@
 
 		return 0;
 	}
+
+	void CMaster::setPortType(unsigned int index, BOOL enable, int type, int mode,
+		int cassetteType, int transferMode, BOOL autoChangeEnable)
+	{
+		ASSERT(index < 4);
+		int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4};
+		CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[index]);
+		pPort->localEanblePort(enable);
+		pPort->localSetPortType((SERVO::PortType)type);
+		pPort->localSetPortMode((SERVO::PortMode)mode);
+		pPort->localSetCessetteType((SERVO::CassetteType)cassetteType);
+		pPort->localSetTransferMode((SERVO::TransferMode)transferMode);
+		pPort->localAutoChangeEnable(autoChangeEnable);
+	}
 }

--
Gitblit v1.9.3