From 963e6bffaaf6a62a1f764c6633cf6accbb1608c9 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期二, 17 六月 2025 08:54:35 +0800
Subject: [PATCH] 1.两片玻璃贴合后一起搬运的逻辑问题再优化,同时修改Slot信息,贴合后的玻璃应该放置在同一Slot.

---
 SourceCode/Bond/Servo/CArm.cpp         |   18 ---
 SourceCode/Bond/Servo/CGlass.cpp       |   15 ++
 SourceCode/Bond/Servo/CGlass.h         |    1 
 SourceCode/Bond/Servo/CRobotTask.cpp   |   67 ++++++++++++-
 SourceCode/Bond/Servo/CMaster.h        |    1 
 SourceCode/Bond/Servo/CMeasurement.cpp |    4 
 SourceCode/Bond/Servo/CRobotTask.h     |    1 
 SourceCode/Bond/Servo/CEquipment.cpp   |   43 +++++---
 SourceCode/Bond/Servo/CArmTray.cpp     |    4 
 SourceCode/Bond/Servo/CEFEM.cpp        |    4 
 SourceCode/Bond/Servo/CMaster.cpp      |   86 ++--------------
 SourceCode/Bond/Servo/CBonder.h        |    1 
 SourceCode/Bond/Servo/CBonder.cpp      |   24 ++--
 13 files changed, 131 insertions(+), 138 deletions(-)

diff --git a/SourceCode/Bond/Servo/CArm.cpp b/SourceCode/Bond/Servo/CArm.cpp
index cf6320e..7ca9be1 100644
--- a/SourceCode/Bond/Servo/CArm.cpp
+++ b/SourceCode/Bond/Servo/CArm.cpp
@@ -41,10 +41,6 @@
 		m_slot[0].setPosition(m_nID);
 		m_slot[0].setNo(1);
 		m_slot[0].setName("Slot 1(Temp)");
-		m_slot[1].enable();
-		m_slot[1].setPosition(m_nID);
-		m_slot[1].setNo(2);
-		m_slot[1].setName("Slot 2(Temp)");
 	}
 
 	void CArm::onTimer(UINT nTimerid)
@@ -70,22 +66,14 @@
 	int CArm::tempStore(CGlass* pGlass)
 	{
 		// 原:保证列表中只存储一个物料
-		// 修改为:先清空之前的,再添加当前pGlass, 如果pGlass有buddy,也要加入列表中
+		// 修改为:先清空之前的,再添加当前pGlass
 		Lock();
 		CGlass* pPreviousGlass;
 		pPreviousGlass = (CGlass*)m_slot[0].getContext();
 		if (pPreviousGlass != nullptr) {
 			pPreviousGlass->release();
 		}
-		pPreviousGlass = (CGlass*)m_slot[1].getContext();
-		if (pPreviousGlass != nullptr) {
-			pPreviousGlass->release();
-		}
-
 		m_slot[0].setContext(pGlass);
-		if (pGlass->getBuddy() != nullptr) {
-			m_slot[1].setContext(pGlass->getBuddy());
-		}
 		Unlock();
 
 		if (m_listener.onDataChanged != nullptr) {
@@ -106,10 +94,6 @@
 		pGlass = pPreviousGlass;
 		pGlass->addRef();
 		m_slot[0].setContext(nullptr);
-		CGlass* pBuddy = pGlass->getBuddy();
-		if (pBuddy != nullptr) {
-			m_slot[1].setContext(nullptr);
-		}
 		Unlock();
 
 		if (m_listener.onDataChanged != nullptr) {
diff --git a/SourceCode/Bond/Servo/CArmTray.cpp b/SourceCode/Bond/Servo/CArmTray.cpp
index 0a043b6..6e74681 100644
--- a/SourceCode/Bond/Servo/CArmTray.cpp
+++ b/SourceCode/Bond/Servo/CArmTray.cpp
@@ -41,10 +41,6 @@
 		m_slot[0].setPosition(m_nID);
 		m_slot[0].setNo(1);
 		m_slot[0].setName("Slot 1");
-		m_slot[1].enable();
-		m_slot[1].setPosition(m_nID);
-		m_slot[1].setNo(2);
-		m_slot[1].setName("Slot 2");
 	}
 
 	void CArmTray::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CBonder.cpp b/SourceCode/Bond/Servo/CBonder.cpp
index db7cf76..cbeabd5 100644
--- a/SourceCode/Bond/Servo/CBonder.cpp
+++ b/SourceCode/Bond/Servo/CBonder.cpp
@@ -416,6 +416,14 @@
 		return m_nIndex;
 	}
 
+	BOOL CBonder::hasBondClass()
+	{
+		CGlass* pGlass = (CGlass*)m_slot[1].getContext();
+		if (pGlass == nullptr) return FALSE;
+		CGlass* pBuddy = pGlass->getBuddy();
+		return pBuddy != nullptr;
+	}
+
 	int CBonder::onProcessData(CProcessData* pProcessData)
 	{
 		CEquipment::onProcessData(pProcessData);
@@ -423,33 +431,27 @@
 
 		// 检查数据,当前两片玻璃,一片为G1, 一片为G2, 且pProcessData中的id能匹配G1或G2
 		Lock();
-		CGlass* pGlass1 = getGlassFromSlot(1);
-		CGlass* pGlass2 = getGlassFromSlot(2);
+		CGlass* pGlass2 = getGlassFromSlot(1);
+		CGlass* pGlass1 = getGlassFromSlot(2);
 		if (pGlass1 == nullptr || pGlass2 == nullptr) {
 			LOGE("<CBonder-%s>onProcessData,错误!不满足两片玻璃且分别为G1与G2的条件,请检查数据是否正确!", m_strName.c_str());
 			Unlock();
 			return -1;
 		}
-		if (pGlass1->getBuddy() != nullptr || pGlass2->getBuddy() != nullptr) {
+		if (pGlass1->getBuddy() != nullptr) {
 			LOGE("<CBonder-%s>onProcessData,错误!玻璃较早前已被绑定,请检查数据是否正确!", m_strName.c_str());
 			Unlock();
 			return -1;
 		}
 
-		if (pGlass1->getBuddy() != nullptr || pGlass2->getBuddy() != nullptr) {
-			LOGE("<CBonder-%s>onProcessData,错误!玻璃较早前已被贴合,请检查数据是否正确!", m_strName.c_str());
-			Unlock();
-			return -1;
-		}
-
-		if (pGlass1->getType() == pGlass2->getType()) {
+		if (pGlass1->getType() != MaterialsType::G1 || pGlass2->getType() != MaterialsType::G2) {
 			LOGE("<CBonder-%s>onProcessData,错误!两片玻璃未匹配,必须分别为G1和G2类型,请检查数据是否正确!", m_strName.c_str());
 			Unlock();
 			return -1;
 		}
 
 		pGlass1->setBuddy(pGlass2);
-		pGlass2->setBuddy(pGlass1);
+		getSlot(0)->setContext(nullptr);
 		LOGE("<CBonder-%s>onProcessData,%s和%s已贴合!", m_strName.c_str(),
 			pGlass1->getID().c_str(), pGlass2->getID().c_str());
 		Unlock();
diff --git a/SourceCode/Bond/Servo/CBonder.h b/SourceCode/Bond/Servo/CBonder.h
index 28f557f..7771c57 100644
--- a/SourceCode/Bond/Servo/CBonder.h
+++ b/SourceCode/Bond/Servo/CBonder.h
@@ -27,6 +27,7 @@
     public:
         void setIndex(unsigned int index);
         unsigned int getIndex();
+        BOOL hasBondClass();
 
     private:
         unsigned int m_nIndex;
diff --git a/SourceCode/Bond/Servo/CEFEM.cpp b/SourceCode/Bond/Servo/CEFEM.cpp
index 3474d3e..ff4581d 100644
--- a/SourceCode/Bond/Servo/CEFEM.cpp
+++ b/SourceCode/Bond/Servo/CEFEM.cpp
@@ -22,6 +22,10 @@
 		m_pPort[3] = nullptr;
 		m_pAligner = nullptr;
 		m_pFliper = nullptr;
+		m_robotData.status = ROBOT_STATUS::Idle;
+		m_robotData.position = ROBOT_POSITION::Port1;
+		m_robotData.armState[0] = FALSE;
+		m_robotData.armState[1] = FALSE;
 	}
 
 	CEFEM::~CEFEM()
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index db4ab5a..cdc0d73 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -255,13 +255,21 @@
 			if (!m_slot[i].isEnable()) continue;
 
 			CGlass* pGlass = (CGlass*)m_slot[i].getContext();
+			CGlass* pBuddy = nullptr;
 			if (pGlass == nullptr) {
 				attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
 					"", "", weight++));
 			}
 			else {
-				attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
-					pGlass->getID().c_str(), "", weight++));
+				pBuddy = pGlass->getBuddy();
+				if (pBuddy == nullptr) {
+					attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
+						pGlass->getID().c_str(), "", weight++));
+				}
+				else {
+					attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
+						(pGlass->getID() + " -> " + pBuddy->getID()).c_str(), "", weight++));
+				}
 			}
 
 		}
@@ -317,8 +325,13 @@
 			Lock();
 			for (int i = 0; i < SLOT_MAX; i++) {
 				m_slot[i].serialize(ar);
-				if (m_slot[i].getContext() != nullptr) {
-					((CGlass*)m_slot[i].getContext())->serialize(ar);
+				CGlass* pGlass = (CGlass *)m_slot[i].getContext();
+				if (pGlass != nullptr) {					
+					pGlass->serialize(ar);
+					CGlass* pBuddy = pGlass->getBuddy();
+					if (pBuddy != nullptr) {
+						pBuddy->serialize(ar);
+					}
 				}
 			}
 			Unlock();
@@ -330,10 +343,16 @@
 					CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
 					pGlass->serialize(ar);
 					m_slot[i].setContext(pGlass);
+					if (pGlass->getBuddy() != nullptr) {
+						CGlass* pBuddy = theApp.m_model.m_glassPool.allocaGlass();
+						pBuddy->serialize(ar);
+						pGlass->forceSetBuddy(pBuddy);
+					}
 				}
 			}
 			
 			// 梳理各玻璃之间的绑定关系
+			/*
 			Lock();
 			for (int i = 0; i < SLOT_MAX; i++) {
 				CGlass* pGlass = (CGlass*)m_slot[i].getContext();
@@ -351,6 +370,7 @@
 				}
 			}
 			Unlock();
+			*/
 		}
 	}
 
@@ -766,18 +786,6 @@
 			return -3;
 		}
 
-		// 如果此玻璃已经贴合,贴合的玻璃也要从列表中移除
-		CGlass* pBuddy = pContext->getBuddy();
-		if (pBuddy != nullptr) {
-			for (int i = 0; i < SLOT_MAX; i++) {
-				CGlass* pGlass = (CGlass*)m_slot[i].getContext();
-				if (pGlass != nullptr && compareJobDataB(pBuddy->getJobDataB(), pGlass->getJobDataB())) {
-					m_slot[i].setContext(nullptr);
-					break;
-				}
-			}
-		}
-
 
 		((CArm*)m_pArm)->tempStore(pContext);
 		pContext->release();
@@ -811,6 +819,7 @@
 
 
 		// 如果此玻璃已经贴合,贴合的玻璃也要从加入到列表中
+		/*
 		CGlass* pBuddy = pGlass->getBuddy();
 		if (pBuddy != nullptr) {
 			Lock();
@@ -823,7 +832,7 @@
 			}
 			Unlock();
 		}
-
+		*/
 
 		if (m_listener.onDataChanged != nullptr) {
 			m_listener.onDataChanged(this, EDCC_STORED_JOB);
diff --git a/SourceCode/Bond/Servo/CGlass.cpp b/SourceCode/Bond/Servo/CGlass.cpp
index e975351..dc47c5e 100644
--- a/SourceCode/Bond/Servo/CGlass.cpp
+++ b/SourceCode/Bond/Servo/CGlass.cpp
@@ -135,7 +135,7 @@
 			m_jobDataB.unserialize(temp, JOBDATAB_SIZE);
 			ar.Read(temp, JOBDATAS_SIZE);
 			m_jobDataS.unserialize(temp, JOBDATAS_SIZE);
-			ar >> ullPath;					// 这是m_pBuddy, 用不上
+			ar >> ullPath;	m_pBuddy = (CGlass*)ullPath;
 			ReadString(ar, m_strBuddyId);
 			Unlock();
 		}
@@ -166,9 +166,16 @@
 		if (m_pBuddy != nullptr) return FALSE;
 		if (pGlass->getType() == this->getType()) return FALSE;
 		m_pBuddy = pGlass;
-		if (m_type == MaterialsType::G1) {
-			m_pBuddy->addRef();
-		}
+		m_pBuddy->addRef();
+		m_strBuddyId = m_pBuddy->getID();
+
+		return TRUE;
+	}
+
+	BOOL CGlass::forceSetBuddy(CGlass* pGlass)
+	{
+		m_pBuddy = pGlass;
+		m_pBuddy->addRef();
 		m_strBuddyId = m_pBuddy->getID();
 
 		return TRUE;
diff --git a/SourceCode/Bond/Servo/CGlass.h b/SourceCode/Bond/Servo/CGlass.h
index d2f4197..3374f84 100644
--- a/SourceCode/Bond/Servo/CGlass.h
+++ b/SourceCode/Bond/Servo/CGlass.h
@@ -33,6 +33,7 @@
 		void setJobDataS(CJobDataS* pJobDataS);
 		CJobDataS* getJobDataS();
 		BOOL setBuddy(CGlass* pGlass);
+		BOOL forceSetBuddy(CGlass* pGlass);
 		CGlass* getBuddy();
 		std::string& getBuddyId();
 		void processEnd(unsigned int nEqId, unsigned int nUnit);
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 79da60d..18d615c 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -477,7 +477,7 @@
 
 				// Fliper(G2) -> Bonder
 				// VacuumBake(G1) -> Bonder
-				if (!rmd.armState[1]) {
+				if (!rmd.armState[1] && !pBonder1->hasBondClass()) {
 					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
 					if (m_pActiveRobotTask != nullptr) {
 						m_pActiveRobotTask->pick();
@@ -491,7 +491,7 @@
 					}
 				}
 
-				if (!rmd.armState[1]) {
+				if (!rmd.armState[1] && !pBonder2->hasBondClass()) {
 					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
 					if (m_pActiveRobotTask != nullptr) {
 						m_pActiveRobotTask->pick();
@@ -505,7 +505,7 @@
 					}
 				}
 
-				if (!rmd.armState[0]) {
+				if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
 					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
 					if (m_pActiveRobotTask != nullptr) {
 						m_pActiveRobotTask->pick();
@@ -519,7 +519,7 @@
 					}
 				}
 
-				if (!rmd.armState[0]) {
+				if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
 					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
 					if (m_pActiveRobotTask != nullptr) {
 						m_pActiveRobotTask->pick();
@@ -1204,14 +1204,11 @@
 
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
-			int srcPos, srcSlot, tarPos, tarSlot;
-			transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
-			transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, armNo, srcPos,
-				tarPos, srcSlot, tarSlot);
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, armNo, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
 
@@ -1228,14 +1225,11 @@
 		pSrcSlot = pSrcEq->getProcessedSlot(MaterialsType::G1);
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
-			int srcPos, srcSlot, tarPos, tarSlot;
-			transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
-			transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
-				tarPos, srcSlot, tarSlot);
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
 
@@ -1253,14 +1247,11 @@
 		pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slotsSrc);
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
-			int srcPos, srcSlot, tarPos, tarSlot;
-			transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
-			transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
-				tarPos, srcSlot, tarSlot);
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
 
@@ -1277,68 +1268,15 @@
 		pSrcSlot = pSrcEq->getProcessedSlot2(MaterialsType::G1, slots);
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
-			int srcPos, srcSlot, tarPos, tarSlot;
-			transformPosAndSlot(pSrcSlot->getPosition(), pSrcSlot->getNo(), srcPos, srcSlot);
-			transformPosAndSlot(pTarSlot->getPosition(), pTarSlot->getNo(), tarPos, tarSlot);
 			pTask = new CRobotTask();
 			pTask->setContext(pSrcSlot->getContext());
 			pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
-			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, srcPos,
-				tarPos, srcSlot, tarSlot);
+			taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
+				pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
 		}
 
 
 		return pTask;
-	}
-
-	void CMaster::transformPosAndSlot(int srcPos, int srcSlot, int& tarPos, int& tarSlot)
-	{
-		switch (srcPos)
-		{
-		case EQ_ID_LOADPORT1:
-		case EQ_ID_LOADPORT2:
-		case EQ_ID_LOADPORT3:
-		case EQ_ID_LOADPORT4:
-		case EQ_ID_ARM_TRAY1:
-		case EQ_ID_ARM_TRAY2:
-		case EQ_ID_ALIGNER:
-		case EQ_ID_FLIPER:
-			tarPos = srcPos;
-			tarSlot = 1;
-			break;
-		case EQ_ID_Bonder1:
-			if (1 <= srcSlot && srcSlot <= 2) {
-				tarPos = 9 + srcSlot;
-				tarSlot = 1;
-			}
-			break;
-		case EQ_ID_Bonder2:
-			if (1 <= srcSlot && srcSlot <= 2) {
-				tarPos = 11 + srcSlot;
-				tarSlot = 1;
-			}
-			break;
-		case EQ_ID_VACUUMBAKE:
-			if (1 <= srcSlot && srcSlot <= 2) {
-				tarPos = 13 + srcSlot;
-				tarSlot = 1;
-			}
-			break;
-		case EQ_ID_BAKE_COOLING:
-			if (1 <= srcSlot && srcSlot <= 4) {
-				tarPos = 15 + srcSlot;
-				tarSlot = 1;
-			}
-			break;
-		case EQ_ID_MEASUREMENT:
-			tarPos = 19;
-			tarSlot = 1;
-			break;
-		default:
-			tarPos = srcPos;
-			tarSlot = srcSlot;
-			break;
-		}
 	}
 
 	int CMaster::abortCurrentTask()
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 6d2e380..2f8577d 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -93,7 +93,6 @@
         CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq);
         CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq);
         CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq);
-        void transformPosAndSlot(int srcPos, int srcSlot, int& tarPos, int& tarSlot);
 
     private:
         CRITICAL_SECTION m_criticalSection;
diff --git a/SourceCode/Bond/Servo/CMeasurement.cpp b/SourceCode/Bond/Servo/CMeasurement.cpp
index 3531b18..4821891 100644
--- a/SourceCode/Bond/Servo/CMeasurement.cpp
+++ b/SourceCode/Bond/Servo/CMeasurement.cpp
@@ -45,10 +45,6 @@
 		m_slot[0].setPosition(m_nID);
 		m_slot[0].setNo(1);
 		m_slot[0].setName("Slot 1");
-		m_slot[1].enable();
-		m_slot[1].setPosition(m_nID);
-		m_slot[1].setNo(2);
-		m_slot[1].setName("Slot 2");
 	}
 
 	void CMeasurement::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CRobotTask.cpp b/SourceCode/Bond/Servo/CRobotTask.cpp
index 4ac89d3..ed82d43 100644
--- a/SourceCode/Bond/Servo/CRobotTask.cpp
+++ b/SourceCode/Bond/Servo/CRobotTask.cpp
@@ -117,26 +117,31 @@
 		m_robotCmdParam[ACTION_TRANSFER].putPosition = static_cast<short>(toPos);
 		m_robotCmdParam[ACTION_TRANSFER].putSlotNo = static_cast<short>(toSlot);
 
+		// 转换一下源和目标站号
+		int srcPos, srcSlot, tarPos, tarSlot;
+		transformPosAndSlot(fromPos, fromSlot, srcPos, srcSlot);
+		transformPosAndSlot(toPos, toSlot, tarPos, tarSlot);
+
 		m_robotCmdParam[ACTION_PICK] = {};
 		m_robotCmdParam[ACTION_PICK].sequenceNo = static_cast<short>(seq+2);
 		m_robotCmdParam[ACTION_PICK].rcmd = static_cast<short>(SERVO::RCMD::Get);
 		m_robotCmdParam[ACTION_PICK].armNo = static_cast<short>(armNo);
-		m_robotCmdParam[ACTION_PICK].getPosition = static_cast<short>(fromPos);
-		m_robotCmdParam[ACTION_PICK].getSlotNo = static_cast<short>(fromSlot);
+		m_robotCmdParam[ACTION_PICK].getPosition = static_cast<short>(srcPos);
+		m_robotCmdParam[ACTION_PICK].getSlotNo = static_cast<short>(srcSlot);
 
 		m_robotCmdParam[ACTION_PLACE] = {};
 		m_robotCmdParam[ACTION_PLACE].sequenceNo = static_cast<short>(seq + 2);
 		m_robotCmdParam[ACTION_PLACE].rcmd = static_cast<short>(SERVO::RCMD::Put);
 		m_robotCmdParam[ACTION_PLACE].armNo = static_cast<short>(armNo);
-		m_robotCmdParam[ACTION_PLACE].putPosition = static_cast<short>(toPos);
-		m_robotCmdParam[ACTION_PLACE].putSlotNo = static_cast<short>(toSlot);
+		m_robotCmdParam[ACTION_PLACE].putPosition = static_cast<short>(tarPos);
+		m_robotCmdParam[ACTION_PLACE].putSlotNo = static_cast<short>(tarSlot);
 
 		m_robotCmdParam[ACTION_RESTORE] = {};
 		m_robotCmdParam[ACTION_RESTORE].sequenceNo = static_cast<short>(seq + 1);
 		m_robotCmdParam[ACTION_RESTORE].rcmd = static_cast<short>(SERVO::RCMD::Put);
 		m_robotCmdParam[ACTION_RESTORE].armNo = static_cast<short>(armNo);
-		m_robotCmdParam[ACTION_RESTORE].putPosition = static_cast<short>(fromPos);
-		m_robotCmdParam[ACTION_RESTORE].putSlotNo = static_cast<short>(fromSlot);
+		m_robotCmdParam[ACTION_RESTORE].putPosition = static_cast<short>(srcPos);
+		m_robotCmdParam[ACTION_RESTORE].putSlotNo = static_cast<short>(srcSlot);
 
 		return seq + 1;
 	}
@@ -339,4 +344,54 @@
 	{
 		m_timeStored = CToolUnits::getUnixTimestamp();;
 	}
+
+	void CRobotTask::transformPosAndSlot(int srcPos, int srcSlot, int& tarPos, int& tarSlot)
+	{
+		switch (srcPos)
+		{
+		case EQ_ID_LOADPORT1:
+		case EQ_ID_LOADPORT2:
+		case EQ_ID_LOADPORT3:
+		case EQ_ID_LOADPORT4:
+		case EQ_ID_ARM_TRAY1:
+		case EQ_ID_ARM_TRAY2:
+		case EQ_ID_ALIGNER:
+		case EQ_ID_FLIPER:
+			tarPos = srcPos;
+			tarSlot = 1;
+			break;
+		case EQ_ID_Bonder1:
+			if (1 <= srcSlot && srcSlot <= 2) {
+				tarPos = 9 + srcSlot;
+				tarSlot = 1;
+			}
+			break;
+		case EQ_ID_Bonder2:
+			if (1 <= srcSlot && srcSlot <= 2) {
+				tarPos = 11 + srcSlot;
+				tarSlot = 1;
+			}
+			break;
+		case EQ_ID_VACUUMBAKE:
+			if (1 <= srcSlot && srcSlot <= 2) {
+				tarPos = 13 + srcSlot;
+				tarSlot = 1;
+			}
+			break;
+		case EQ_ID_BAKE_COOLING:
+			if (1 <= srcSlot && srcSlot <= 4) {
+				tarPos = 15 + srcSlot;
+				tarSlot = 1;
+			}
+			break;
+		case EQ_ID_MEASUREMENT:
+			tarPos = 19;
+			tarSlot = 1;
+			break;
+		default:
+			tarPos = srcPos;
+			tarSlot = srcSlot;
+			break;
+		}
+	}
 }
diff --git a/SourceCode/Bond/Servo/CRobotTask.h b/SourceCode/Bond/Servo/CRobotTask.h
index 7e83046..990e106 100644
--- a/SourceCode/Bond/Servo/CRobotTask.h
+++ b/SourceCode/Bond/Servo/CRobotTask.h
@@ -55,6 +55,7 @@
 
 	private:
 		static std::string& generateId(std::string& out);
+		void transformPosAndSlot(int srcPos, int srcSlot, int& tarPos, int& tarSlot);
 
 	private:
 		ROBOT_TASK_STATE m_state;					/* 任务状态 */

--
Gitblit v1.9.3