From 1a181b77b4eb7670e668506c10d9de97ca0c20c6 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期五, 13 六月 2025 13:58:44 +0800
Subject: [PATCH] 1.由于EFEM不支持Transfer(直接搬运),将搬运动作拆分为Get和Put

---
 SourceCode/Bond/Servo/CRobotTask.h   |    6 ++
 SourceCode/Bond/Servo/CRobotTask.cpp |   24 ++++++++++++
 SourceCode/Bond/Servo/CMaster.cpp    |   36 +++++++++++++-----
 SourceCode/Bond/Servo/Model.cpp      |    1 
 4 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 8d6bbef..6f60f8c 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -551,7 +551,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) {
@@ -677,17 +677,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 +717,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();
diff --git a/SourceCode/Bond/Servo/CRobotTask.cpp b/SourceCode/Bond/Servo/CRobotTask.cpp
index 9c5596d..4ac89d3 100644
--- a/SourceCode/Bond/Servo/CRobotTask.cpp
+++ b/SourceCode/Bond/Servo/CRobotTask.cpp
@@ -167,9 +167,30 @@
 		return m_timeFinish;
 	}
 
+	int CRobotTask::getArmNo()
+	{
+		return m_robotCmdParam[ACTION_PICK].armNo;
+
+	}
+
 	ROBOT_TASK_STATE CRobotTask::getState()
 	{
 		return m_state;
+	}
+
+	bool CRobotTask::isPicking()
+	{
+		return m_state == ROBOT_TASK_STATE::Picking;
+	}
+
+	bool CRobotTask::isPlacing()
+	{
+		return m_state == ROBOT_TASK_STATE::Placing;
+	}
+
+	bool CRobotTask::isRestoring()
+	{
+		return m_state == ROBOT_TASK_STATE::Restoring;
 	}
 
 	void CRobotTask::run()
@@ -299,6 +320,9 @@
 		switch (m_state) {
 		case ROBOT_TASK_STATE::Ready:     return _T("Ready");
 		case ROBOT_TASK_STATE::Running:   return _T("Running");
+		case ROBOT_TASK_STATE::Picking:   return _T("Picking");
+		case ROBOT_TASK_STATE::Placing:   return _T("Placing");
+		case ROBOT_TASK_STATE::Restoring: return _T("Restoring");
 		case ROBOT_TASK_STATE::Error:     return _T("Error");
 		case ROBOT_TASK_STATE::Abort:     return _T("Abort");
 		case ROBOT_TASK_STATE::Completed: return _T("Completed");
diff --git a/SourceCode/Bond/Servo/CRobotTask.h b/SourceCode/Bond/Servo/CRobotTask.h
index 4c897cd..7e83046 100644
--- a/SourceCode/Bond/Servo/CRobotTask.h
+++ b/SourceCode/Bond/Servo/CRobotTask.h
@@ -29,7 +29,11 @@
 		time_t getFetchoutTime();
 		time_t getStoredTime();
 		time_t getFinishTime();
+		int getArmNo();
 		ROBOT_TASK_STATE getState();
+		bool isPicking();
+		bool isPlacing();
+		bool isRestoring();
 		void run();
 		void pick();
 		void place();
@@ -59,7 +63,7 @@
 		time_t m_timeFetchOut;						/* 取片时间*/
 		time_t m_timeStored;						/* 放片时间 */
 		time_t m_timeFinish;						/* 结束时间 */
-		ROBOT_CMD_PARAM m_robotCmdParam[3];			/* 参数 */
+		ROBOT_CMD_PARAM m_robotCmdParam[4];			/* 参数 */
 		CContext* m_pContext;
 		CEFEM* m_pEFEM;
 	};
diff --git a/SourceCode/Bond/Servo/Model.cpp b/SourceCode/Bond/Servo/Model.cpp
index e39f62d..f68d9cc 100644
--- a/SourceCode/Bond/Servo/Model.cpp
+++ b/SourceCode/Bond/Servo/Model.cpp
@@ -188,7 +188,6 @@
 			break;
 		case ROBOT_EVENT_FINISH:
 			LOGI("<CModel>onRobotTaskEvent: 任务完成(%s, ClassID=%s).", strDesc.c_str(), strClassID.c_str());
-			pTask->completed();
 			break;
 		case ROBOT_EVENT_ERROR:
 			LOGE("<CModel>onRobotTaskEvent: 任务错误(%s, ClassID=%s).", strDesc.c_str(), strClassID.c_str());

--
Gitblit v1.9.3