From d801f8999ad7cdbee7a5652b4bb512c47b9a2668 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期三, 04 六月 2025 18:05:01 +0800
Subject: [PATCH] 1.搬送条件检测,增加一个条件,必须是已加工处理完成的Glass才符合搬出条件。 2.根据1,为CGlass增加相应工位的处理标志位,及标志位在后processDataReport修改为TRUE,以符合搬出条件;

---
 SourceCode/Bond/Servo/CPath.h          |    3 
 SourceCode/Bond/Servo/CGlass.cpp       |   30 +++++++
 SourceCode/Bond/Servo/CEquipment.cpp   |   61 +++++++++++++++
 SourceCode/Bond/Servo/CGlass.h         |    3 
 SourceCode/Bond/Servo/CPath.cpp        |   14 +++
 SourceCode/Bond/Servo/CRobotTask.cpp   |    4 
 SourceCode/Bond/Servo/CMaster.cpp      |   62 +++++++++++++--
 SourceCode/Bond/Servo/CMaster.h        |    2 
 SourceCode/Bond/Servo/CEquipment.h     |    9 ++
 SourceCode/Bond/Servo/CLoadPort.cpp    |    2 
 SourceCode/Bond/Servo/CBakeCooling.cpp |   14 +++
 11 files changed, 192 insertions(+), 12 deletions(-)

diff --git a/SourceCode/Bond/Servo/CBakeCooling.cpp b/SourceCode/Bond/Servo/CBakeCooling.cpp
index 4850fb6..cf4caf4 100644
--- a/SourceCode/Bond/Servo/CBakeCooling.cpp
+++ b/SourceCode/Bond/Servo/CBakeCooling.cpp
@@ -44,7 +44,19 @@
 		m_slot[0].enable();
 		m_slot[0].setPosition(m_nID);
 		m_slot[0].setNo(1);
-		m_slot[0].setName("Slot 1");
+		m_slot[0].setName("Bake 1");
+		m_slot[1].enable();
+		m_slot[1].setPosition(m_nID);
+		m_slot[1].setNo(2);
+		m_slot[1].setName("Bake 2");
+		m_slot[2].enable();
+		m_slot[2].setPosition(m_nID);
+		m_slot[2].setNo(3);
+		m_slot[2].setName("Cooling 1");
+		m_slot[3].enable();
+		m_slot[3].setPosition(m_nID);
+		m_slot[3].setNo(4);
+		m_slot[3].setName("Cooling 2");
 	}
 
 	void CBakeCooling::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index 098a942..0a7d384 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -722,6 +722,7 @@
 			CGlass* pGlass = (CGlass*)m_slot[i].getContext();
 			if (pGlass != nullptr && compareJobDataB(pJobDataB, pGlass->getJobDataB())) {
 				pContext = pGlass;
+				if (pGlass != nullptr) pGlass->addRef();
 				m_slot[i].setContext(nullptr);
 				break;
 			}
@@ -737,7 +738,6 @@
 			for (int i = 0; i < SLOT_MAX; i++) {
 				CGlass* pGlass = (CGlass*)m_slot[i].getContext();
 				if (pGlass != nullptr && compareJobDataB(pBuddy->getJobDataB(), pGlass->getJobDataB())) {
-					pContext->release();
 					m_slot[i].setContext(nullptr);
 					break;
 				}
@@ -804,6 +804,20 @@
 		}
 
 		return FALSE;
+	}
+
+	CGlass* CEquipment::getGlass(const char* pszGlassId)
+	{
+		for (int i = 0; i < SLOT_MAX; i++) {
+			if (!m_slot[i].isEnable()) continue;
+			CGlass* pGlass = (CGlass*)m_slot[i].getContext();
+			if (pGlass == nullptr) continue;
+			if (pGlass->getID().compare(pszGlassId) == 0) {
+				return pGlass;
+			}
+		}
+
+		return nullptr;
 	}
 
 	bool CEquipment::isAlarmStep(SERVO::CStep* pStep)
@@ -1051,6 +1065,27 @@
 		return nullptr;
 	}
 
+	CSlot* CEquipment::getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates)
+	{
+		for (auto item : candidates) {
+			for (int i = 0; i < SLOT_MAX; i++) {
+				if (item == i + 1) {
+					if (!m_slot[i].isEnable()) continue;
+					if (m_slot[i].isLock()) continue;
+					if (!m_slot[i].isEmpty()) continue;
+
+					MaterialsType slotType = m_slot[i].getType();
+					if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
+					if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
+
+					return &m_slot[i];
+				}
+			}
+		}
+
+		return nullptr;
+	}
+
 	CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType)
 	{
 		for (int i = 0; i < SLOT_MAX; i++) {
@@ -1062,6 +1097,25 @@
 			MaterialsType glassType = pGlass->getType();
 			if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
 			if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
+
+			return &m_slot[i];
+		}
+
+		return nullptr;
+	}
+
+	CSlot* CEquipment::getProcessedSlot(MaterialsType putSlotType)
+	{
+		for (int i = 0; i < SLOT_MAX; i++) {
+			if (!m_slot[i].isEnable()) continue;
+			if (m_slot[i].isLock()) continue;
+			CGlass* pGlass = (CGlass*)m_slot[i].getContext();
+			if (pGlass == nullptr) continue;
+
+			MaterialsType glassType = pGlass->getType();
+			if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
+			if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
+			if (!pGlass->isProcessed(m_nID)) continue;
 
 			return &m_slot[i];
 		}
@@ -1384,6 +1438,11 @@
 	int CEquipment::onProcessData(CProcessData* pProcessData)
 	{
 		LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str());
+		CGlass* pGlass = getGlass(pProcessData->getGlassId().c_str());
+		if (pGlass != nullptr) {
+			pGlass->processEnd(m_nID);
+		}
+
 		return 0;
 	}
 
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index df7e015..95e5555 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -151,8 +151,14 @@
 		// 获取一个指定物料类型(G1,G2,G1&G2)的空槽位
 		CSlot* getAvailableSlotForGlass(MaterialsType type);
 
+		// 在指定的槽列表中,获取一个指定物料类型(G1,G2,G1&G2)的空槽位
+		CSlot* getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates);
+
 		// 获取一个指定物料类型(G1,G2,G1&G2)的非空槽位
 		CSlot* getNonEmptySlot(MaterialsType type);
+
+		// 获取一个指定物料类型(G1,G2,G1&G2)的且已经加工处理的槽位
+		CSlot* getProcessedSlot(MaterialsType putSlotType);
 
 		// 获取玻璃物料
 		CGlass* getGlassFromSlot(int slotNo);
@@ -164,6 +170,9 @@
 		// 是否有玻璃
 		BOOL hasGlass();
 
+		// 获取指定ID的glass
+		CGlass * getGlass(const char* pszGlassId);
+
 		// 指定槽位是否可以放置玻璃
 		BOOL canPlaceGlassInSlot(const short slotIndex);
 
diff --git a/SourceCode/Bond/Servo/CGlass.cpp b/SourceCode/Bond/Servo/CGlass.cpp
index 77e292f..029f39f 100644
--- a/SourceCode/Bond/Servo/CGlass.cpp
+++ b/SourceCode/Bond/Servo/CGlass.cpp
@@ -84,6 +84,20 @@
 		return m_pPath;
 	}
 
+	CPath* CGlass::getPathWithSiteId(unsigned int nSiteId)
+	{
+		CPath* pTemp = m_pPath;
+		while (pTemp != nullptr) {
+			if (pTemp->getSiteID() == nSiteId) {
+				return pTemp;
+			}
+
+			pTemp = pTemp->getNext();
+		}
+
+		return nullptr;
+	}
+
 	void CGlass::addPath(unsigned int nSiteId)
 	{
 		CPath* pPath = new CPath(nSiteId);
@@ -182,4 +196,20 @@
 	{
 		return m_strBuddyId;
 	}
+
+	void CGlass::processEnd(unsigned int nSiteId)
+	{
+		CPath* pPath = getPathWithSiteID(nSiteId);
+		if (pPath != nullptr) {
+			pPath->processEnd();
+		}
+	}
+
+	BOOL CGlass::isProcessed(unsigned int nSiteId)
+	{
+		CPath* pPath = getPathWithSiteID(nSiteId);
+		if (pPath == nullptr) return FALSE;
+
+		return pPath->isProcessEnd();
+	}
 }
diff --git a/SourceCode/Bond/Servo/CGlass.h b/SourceCode/Bond/Servo/CGlass.h
index be44aaa..1235c8e 100644
--- a/SourceCode/Bond/Servo/CGlass.h
+++ b/SourceCode/Bond/Servo/CGlass.h
@@ -26,6 +26,7 @@
 		std::string& getID();
 		CPath* getPathWithSiteID(unsigned int nSiteId);
 		CPath* getPath();
+		CPath* getPathWithSiteId(unsigned int nSiteId);
 		void addPath(unsigned int nSiteId);
 		void serialize(CArchive& ar);
 		void setJobDataB(CJobDataB* pJobDataB);
@@ -35,6 +36,8 @@
 		BOOL setBuddy(CGlass* pGlass);
 		CGlass* getBuddy();
 		std::string& getBuddyId();
+		void processEnd(unsigned int nSiteId);
+		BOOL isProcessed(unsigned int nSiteId);
 
 	private:
 		MaterialsType m_type;
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index 6e689a9..5217337 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1097,6 +1097,8 @@
 			}
 
 			CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
+			pGlass->addPath(m_nID);
+			pGlass->processEnd(m_nID);
 			pGlass->setID(szBuffer);
 			pGlass->setJobDataB(&jb);
 			pGlass->setType(type);
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 2783329..4bee7eb 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -294,6 +294,7 @@
 		CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
 		CBonder* pBonder1 = (CBonder*)getEquipment(EQ_ID_Bonder1);
 		CBonder* pBonder2 = (CBonder*)getEquipment(EQ_ID_Bonder2);
+		CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
 
 		ASSERT(pLoadPort1);
 		ASSERT(pLoadPort2);
@@ -302,6 +303,7 @@
 		ASSERT(pAligner);
 		ASSERT(pBonder1);
 		ASSERT(pBonder2);
+		ASSERT(pBakeCooling);
 
 		while (1) {
 			// 待退出信号或时间到
@@ -365,6 +367,28 @@
 				}
 
 
+				// Bonder -> BakeCooling
+				m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling, primaryType, secondaryType);
+				if (m_pActiveRobotTask != nullptr) {
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
+
+				m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling, primaryType, secondaryType);
+				if (m_pActiveRobotTask != nullptr) {
+					std::string strDescription = m_pActiveRobotTask->getDescription();
+					unlock();
+					if (m_listener.onRobotTaskEvent != nullptr) {
+						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+					}
+					LOGI("创建新任务<%s>...", strDescription.c_str());
+					continue;
+				}
 
 				// Aligner -> Bonder
 				m_pActiveRobotTask = createTransferTask(pAligner, pBonder1, primaryType, secondaryType);
@@ -469,9 +493,6 @@
 					LOGI("创建新任务<%s>...", strDescription.c_str());
 					continue;
 				}
-
-
-				// Bonder -> BakeCooling
 
 
 				// BakeCooling ->Measurement
@@ -647,12 +668,11 @@
 
 
 					lock();
-					delete m_pActiveRobotTask;
-					m_pActiveRobotTask = nullptr;
-
 					if (m_listener.onRobotTaskEvent != nullptr) {
 						m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
 					}
+					delete m_pActiveRobotTask;
+					m_pActiveRobotTask = nullptr;
 				}
 				unlock();
 			}
@@ -1074,10 +1094,36 @@
 		CRobotTask* pTask = nullptr;
 		CSlot* pSrcSlot, * pTarSlot;
 		pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
-		pSrcSlot = pSrcEq->getNonEmptySlot(primaryType);
+		pSrcSlot = pSrcEq->getProcessedSlot(primaryType);
 		if (pSrcSlot == nullptr || nullptr == pTarSlot) {
 			pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
-			pSrcSlot = pSrcEq->getNonEmptySlot(secondaryType);
+			pSrcSlot = pSrcEq->getProcessedSlot(secondaryType);
+		}
+
+
+		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;
+	}
+
+	CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq,
+		MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/)
+	{
+		std::vector<int> slots = {1, 2};
+
+		CRobotTask* pTask = nullptr;
+		CSlot* pSrcSlot, * pTarSlot;
+		pTarSlot = pTarEq->getAvailableSlotForGlass2(primaryType, slots);
+		pSrcSlot = pSrcEq->getProcessedSlot(primaryType);
+		if (pSrcSlot == nullptr || nullptr == pTarSlot) {
+			pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
+			pSrcSlot = pSrcEq->getProcessedSlot(secondaryType);
 		}
 
 
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 621a773..7eeffad 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -86,6 +86,8 @@
         void setState(MASTERSTATE state);
         CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq,
             MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2);
+        CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq,
+            MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2);
 
     private:
         CRITICAL_SECTION m_criticalSection;
diff --git a/SourceCode/Bond/Servo/CPath.cpp b/SourceCode/Bond/Servo/CPath.cpp
index 30c004c..1633b5a 100644
--- a/SourceCode/Bond/Servo/CPath.cpp
+++ b/SourceCode/Bond/Servo/CPath.cpp
@@ -9,6 +9,7 @@
 		m_nSiteID = 0;
 		m_timeOut = 0;
 		m_timeIn = CToolUnits::getTimestamp();
+		m_bProcessed = FALSE;
 		m_pPrev = nullptr;
 		m_pNext = nullptr;
 	}
@@ -20,6 +21,7 @@
 		m_timeIn = CToolUnits::getTimestamp();
 		m_pPrev = nullptr;
 		m_pNext = nullptr;
+		m_bProcessed = FALSE;
 	}
 
 	CPath::~CPath()
@@ -45,6 +47,7 @@
 			ar << m_nSiteID;
 			ar << m_timeIn;
 			ar << m_timeOut;
+			ar << m_bProcessed;
 			ar << (ULONGLONG)m_pNext;
 			if (m_pNext != nullptr) {
 				m_pNext->serialize(ar);
@@ -54,6 +57,7 @@
 			ar >> m_nSiteID;
 			ar >> m_timeIn;
 			ar >> m_timeOut;
+			ar >> m_bProcessed;
 			ULONGLONG ulNext;
 			ar >> ulNext;
 			if ((CPath*)ulNext != nullptr) {
@@ -85,6 +89,16 @@
 		return m_timeOut;
 	}
 
+	void CPath::processEnd()
+	{
+		m_bProcessed = TRUE;
+	}
+
+	BOOL CPath::isProcessEnd()
+	{
+		return m_bProcessed;
+	}
+
 	CPath* CPath::getPrev()
 	{
 		return m_pPrev;
diff --git a/SourceCode/Bond/Servo/CPath.h b/SourceCode/Bond/Servo/CPath.h
index f61c4c3..af53f62 100644
--- a/SourceCode/Bond/Servo/CPath.h
+++ b/SourceCode/Bond/Servo/CPath.h
@@ -21,11 +21,14 @@
 		ULONGLONG getInTime();
 		void setOutTime(ULONGLONG time);
 		ULONGLONG getOutTime();
+		void processEnd();
+		BOOL isProcessEnd();
 
 	private:	
 		unsigned int m_nSiteID;
 		ULONGLONG m_timeIn;
 		ULONGLONG m_timeOut;
+		BOOL m_bProcessed;
 		CPath* m_pPrev;
 		CPath* m_pNext;
 	};
diff --git a/SourceCode/Bond/Servo/CRobotTask.cpp b/SourceCode/Bond/Servo/CRobotTask.cpp
index 6a223de..4b2a970 100644
--- a/SourceCode/Bond/Servo/CRobotTask.cpp
+++ b/SourceCode/Bond/Servo/CRobotTask.cpp
@@ -63,8 +63,8 @@
 
 	void CRobotTask::setContext(CContext* pContext)
 	{
-		if (pContext != nullptr) {
-			pContext->release();
+		if (m_pContext != nullptr) {
+			m_pContext->release();
 		}
 
 		m_pContext = pContext;

--
Gitblit v1.9.3