From be01318968aed5e55c511eedc6c1f72a961c3f13 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 19 六月 2025 14:49:02 +0800
Subject: [PATCH] 1.重新梳理JobDataS的传递和更新;

---
 SourceCode/Bond/Servo/CGlass.cpp     |    5 +
 SourceCode/Bond/Servo/CJobDataS.h    |    1 
 SourceCode/Bond/Servo/CEquipment.cpp |  126 ++++--------------------
 SourceCode/Bond/Servo/CGlass.h       |    1 
 SourceCode/Bond/Servo/CEFEM.cpp      |  115 ++++++++++++++++++----
 SourceCode/Bond/Servo/CJobDataS.cpp  |   36 +++++++
 SourceCode/Bond/Servo/CEquipment.h   |    8 -
 7 files changed, 159 insertions(+), 133 deletions(-)

diff --git a/SourceCode/Bond/Servo/CEFEM.cpp b/SourceCode/Bond/Servo/CEFEM.cpp
index 7d54c05..a331c96 100644
--- a/SourceCode/Bond/Servo/CEFEM.cpp
+++ b/SourceCode/Bond/Servo/CEFEM.cpp
@@ -531,11 +531,59 @@
 			}
 		}
 
+		// 使用CEqReadStep替换CEqJobEventStep
 		{
-			// Received Job Report Upstream#1~9
+			// Received Job Report Upstream #1~9
 			char szBuffer[256];
-			for (int i = 0; i < 9; i++) {
+			for (int i = 0; i < 8; i++) {
 				CEqReadStep* pStep = new CEqReadStep(0x4c90 + 320 * i, 320 * 2,
+					[&](void* pFrom, int code, const char* pszData, size_t size) -> int {
+						if (code == ROK && pszData != nullptr && size > 0) {
+							int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
+							if (port > 0) {
+								decodeReceivedJobReport((CStep*)pFrom, port, pszData, size);
+							}
+						}
+						return -1;
+					});
+				sprintf_s(szBuffer, "%s%d", STEP_EQ_RECEIVED_JOB_UPSn, i + 1);
+				pStep->setName(szBuffer);
+				pStep->setProp("Port", (void*)(__int64)(i + 1));
+				pStep->setWriteSignalDev(0x0 + i);
+				if (addStep(STEP_ID_RECIVE_JOB_UPS1 + i, pStep) != 0) {
+					delete pStep;
+				}
+			}
+		}
+		{
+			// Sent Out Job Report Downstream #1~9
+			char szBuffer[256];
+			for (int i = 0; i < 8; i++) {
+				CEqReadStep* pStep = new CEqReadStep(0x4000 + 320 * i, 320 * 2,
+					[&](void* pFrom, int code, const char* pszData, size_t size) -> int {
+						if (code == ROK && pszData != nullptr && size > 0) {
+							int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
+							if (port > 0) {
+								decodeSentOutJobReport((CStep*)pFrom, port, pszData, size);
+							}
+						}
+						return -1;
+					});
+				sprintf_s(szBuffer, "%s%d", STEP_EQ_SENT_OUT_JOB_DOWNSn, i + 1);
+				pStep->setName(szBuffer);
+				pStep->setProp("Port", (void*)(__int64)(i + 1));
+				pStep->setWriteSignalDev(0x00a + i);
+				if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS1 + i, pStep) != 0) {
+					delete pStep;
+				}
+			}
+		}
+
+		{
+			// Fetched Out Job Report #1~15
+			char szBuffer[256];
+			for (int i = 0; i < 8; i++) {
+				CEqReadStep* pStep = new CEqReadStep(0x5c31 + 18 * i, 18 * 2,
 					[&](void* pFrom, int code, const char* pszData, size_t size) -> int {
 						if (code == ROK && pszData != nullptr && size > 0) {
 							int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
@@ -545,15 +593,40 @@
 						}
 						return -1;
 					});
-				sprintf_s(szBuffer, "%s%d", STEP_EQ_RECEIVED_JOBn, i + 1);
+				sprintf_s(szBuffer, "%s%d", STEP_EQ_FETCHED_OUT_JOBn, i + 1);
 				pStep->setName(szBuffer);
-				pStep->setProp("Upstream", (void*)(__int64)(i + 1));
-				pStep->setWriteSignalDev(0x0 + i);
-				if (addStep(STEP_ID_RECIVE_JOB_UPS1 + i, pStep) != 0) {
+				pStep->setProp("Port", (void*)(__int64)(i + 1));
+				pStep->setWriteSignalDev(0x023 + i);
+				if (addStep(STEP_ID_FETCHED_OUT_JOB_REPORT1 + i, pStep) != 0) {
 					delete pStep;
 				}
 			}
 		}
+
+		{
+			// Stored Job Report #1~15
+			char szBuffer[256];
+			for (int i = 0; i < 8; i++) {
+				CEqReadStep* pStep = new CEqReadStep(0x5b23 + 18 * i, 18 * 2,
+					[&](void* pFrom, int code, const char* pszData, size_t size) -> int {
+						if (code == ROK && pszData != nullptr && size > 0) {
+							int port = (int)(__int64)((CEqReadStep*)pFrom)->getProp("Port");
+							if (port > 0) {
+								decodeStoredJobReport((CStep*)pFrom, port, pszData, size);
+							}
+						}
+						return -1;
+					});
+				sprintf_s(szBuffer, "%s%d", STEP_EQ_STORED_JOBn, i + 1);
+				pStep->setName(szBuffer);
+				pStep->setProp("Port", (void*)(__int64)(i + 1));
+				pStep->setWriteSignalDev(0x014 + i);
+				if (addStep(STEP_ID_STORE_JOB_REPORT1 + i, pStep) != 0) {
+					delete pStep;
+				}
+			}
+		}
+
 
 		{
 			// Dispatching Mode Change Command
@@ -712,28 +785,26 @@
 
 	int CEFEM::onReceivedJob(int port, CJobDataS* pJobDataS)
 	{
-		m_pPort[0]->onReceivedJob(port, pJobDataS);
-		m_pPort[1]->onReceivedJob(port, pJobDataS);
-		m_pPort[2]->onReceivedJob(port, pJobDataS);
-		m_pPort[3]->onReceivedJob(port, pJobDataS);
-		m_pArmTray[0]->onReceivedJob(port, pJobDataS);
-		m_pArmTray[1]->onReceivedJob(port, pJobDataS);
-		m_pAligner->onReceivedJob(port, pJobDataS);
-		m_pFliper->onReceivedJob(port, pJobDataS);
+		// 转发到子单元设备
+		CEquipment* pEqs[] = { m_pPort[0], m_pPort[1], m_pPort[2], m_pPort[3], m_pArmTray[0], m_pArmTray[1],
+			m_pAligner, m_pFliper };
+		if (1 <= port && port <= 8) {
+			pEqs[port - 1]->onReceivedJob(port, pJobDataS);
+		}
+
 
 		return 0;
 	}
 
 	int CEFEM::onSentOutJob(int port, CJobDataS* pJobDataS)
 	{
-		m_pPort[0]->onSentOutJob(port, pJobDataS);
-		m_pPort[1]->onSentOutJob(port, pJobDataS);
-		m_pPort[2]->onSentOutJob(port, pJobDataS);
-		m_pPort[3]->onSentOutJob(port, pJobDataS);
-		m_pArmTray[0]->onSentOutJob(port, pJobDataS);
-		m_pArmTray[1]->onSentOutJob(port, pJobDataS);
-		m_pAligner->onSentOutJob(port, pJobDataS);
-		m_pFliper->onSentOutJob(port, pJobDataS);
+		// 转发到子单元设备
+		CEquipment* pEqs[] = { m_pPort[0], m_pPort[1], m_pPort[2], m_pPort[3], m_pArmTray[0], m_pArmTray[1],
+			m_pAligner, m_pFliper };
+		if (1 <= port && port <= 8) {
+			pEqs[port - 1]->onSentOutJob(port, pJobDataS);
+		}
+
 
 		return 0;
 	}
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index 1cbcb03..165199a 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -1322,8 +1322,6 @@
 	int CEquipment::onReceivedJob(int port, CJobDataS* pJobDataS)
 	{
 		LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str());
-
-		addJobDataS(pJobDataS);
 		return 0;
 	}
 
@@ -1340,7 +1338,7 @@
 		pStep->addAttributeVector(attrubutes);
 
 
-		onReceivedJob(port, &jobDataS);
+		onSentOutJob(port, &jobDataS);
 
 		return nRet;
 	}
@@ -1349,13 +1347,16 @@
 	{
 		LOGI("<CEquipment-%s>onSentOutJob.", m_strName.c_str());
 
-		int count = removeJobDataS(pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
-		if (count == 1) {
-			LOGI("<CEquipment-%s>onSentOutJob,删除数据 %d 条", m_strName.c_str(), count);
+
+		// 可以在此更新JobDataS数据了
+		CGlass* pGlass = getGlass(pJobDataS->getGlass1Id().c_str());
+		if (pGlass == nullptr) {
+			LOGE("<CEquipment-%s>onSentOutJob,没有找到对应的Glass(CassetteSequenceNo:%d, JobSequenceNo:%d, ID=%s),请检查数据,注意风险。",
+				m_strName.c_str(), pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo(),
+				pJobDataS->getGlass1Id().c_str());
+			return -1;
 		}
-		else {
-			LOGE("<CEquipment-%s>onSentOutJob,删除数据 %d 条,注意排查风险", m_strName.c_str(), count);
-		}
+		pGlass->updateJobDataS(pJobDataS);
 
 		return 0;
 	}
@@ -1577,10 +1578,20 @@
 		LOGI("<CEquipment-%s>onPreStoredJob:port:%d|GlassId:%s",
 			m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
 
-		CJobDataS* pJobDataS = getJobDataS(pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
-		if (pJobDataS == nullptr) {
-			LOGE("<CFliper-%s>onPreFetchedOutJob,找不到对应的JobDataS(CassetteSequenceNo:%d, JobSequenceNo:%d), 注意排查风险!", m_strName.c_str(),
+		// 当前要存片,之前肯定有拔片,因此片子在Arm那里
+		CGlass* pGlass = ((CArm*)m_pArm)->getGlassFromSlot(1);
+		if (pGlass == nullptr) {
+			LOGE("<CFliper-%s>onPreStoredJob,缓存中没有找到对应的Glass(CassetteSequenceNo:%d, JobSequenceNo:%d),请检查数据,注意风险。", m_strName.c_str(),
 				pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
+			return FALSE;
+		}
+
+		CJobDataS* pJobDataS = pGlass->getJobDataS();
+		ASSERT(pJobDataS);
+		if (!compareJobData(pJobDataB, pJobDataS)) {
+			LOGE("<CFliper-%s>onPreFetchedOutJob,JobData数据不匹配(JobDataB(%d, %d),JobDataS(%d, %d)), 注意排查风险!", m_strName.c_str(),
+				pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo(),
+				pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
 			return FALSE;
 		}
 
@@ -1616,7 +1627,6 @@
 		short putSlot = 0;
 		BOOL bCheck = onPreStoredJob(port, pJobDataB, putSlot);
 		if (bCheck) {
-			addJobDataB(pJobDataB);
 			return storedJob(pJobDataB, putSlot);
 		}
 
@@ -1656,96 +1666,6 @@
 	int CEquipment::getIndexerOperationModeBaseValue()
 	{
 		return 0;
-	}
-
-	int CEquipment::addJobDataB(CJobDataB* pJobDataB)
-	{
-		// 添加之前先删除旧的,以免数据重复
-		Lock();
-		int count = removeJobDataB(pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
-		if (count > 0) {
-			LOGE("<CEquipment-%s>addJobDataB,删除重复数据 %d 条,注意排查风险", m_strName.c_str(), count);
-		}
-
-		m_listJobDataB.push_back(std::move(*pJobDataB));
-		Unlock();
-
-		return (int)m_listJobDataB.size();
-	}
-
-	int CEquipment::removeJobDataB(int nCassetteSequenceNo, int nJobSequenceNo)
-	{
-		int count = 0;
-		for (auto it = m_listJobDataB.begin(); it != m_listJobDataB.end(); ) {
-			if ((*it).getCassetteSequenceNo() == nCassetteSequenceNo
-				&& (*it).getJobSequenceNo() == nJobSequenceNo) {
-				it = m_listJobDataB.erase(it);
-				count++;
-			}
-			else {
-				++it;
-			}
-		}
-
-		return count;
-	}
-
-	CJobDataB* CEquipment::getJobDataB(int nCassetteSequenceNo, int nJobSequenceNo)
-	{
-		for (auto& item : m_listJobDataB) {
-			if (item.getCassetteSequenceNo() == nCassetteSequenceNo
-				&& item.getJobSequenceNo() == nJobSequenceNo) {
-				return &item;
-			}
-		}
-
-		return nullptr;
-	}
-
-	int CEquipment::addJobDataS(CJobDataS* pJobDataS)
-	{
-		// 添加之前先删除旧的,以免数据重复
-		Lock();
-		int count = removeJobDataS(pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
-		if (count > 0) {
-			LOGE("<CEquipment-%s>addJobDataS,删除重复数据 %d 条,注意排查风险", m_strName.c_str(), count);
-		}
-
-		m_listJobDataS.push_back(std::move(*pJobDataS));
-		Unlock();
-
-		return (int)m_listJobDataB.size();
-	}
-
-	int CEquipment::removeJobDataS(int nCassetteSequenceNo, int nJobSequenceNo)
-	{
-		int count = 0;
-		Lock();
-		for (auto it = m_listJobDataS.begin(); it != m_listJobDataS.end(); ) {
-			if ((*it).getCassetteSequenceNo() == nCassetteSequenceNo
-				&& (*it).getJobSequenceNo() == nJobSequenceNo) {
-				it = m_listJobDataS.erase(it);
-				count++;
-			}
-			else {
-				++it;
-			}
-		}
-		Unlock();
-
-		return count;
-	}
-
-	CJobDataS* CEquipment::getJobDataS(int nCassetteSequenceNo, int nJobSequenceNo)
-	{
-		for (auto& item : m_listJobDataS) {
-			if (item.getCassetteSequenceNo() == nCassetteSequenceNo
-				&& item.getJobSequenceNo() == nJobSequenceNo) {
-				return &item;
-			}
-		}
-
-		return nullptr;
 	}
 
 	BOOL CEquipment::compareJobData(CJobDataB* pJobDataB, CJobDataS* pJobDataS)
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index 25a40c9..3752e2f 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -224,12 +224,6 @@
 		int decodePanelDataReport(CStep* pStep, const char* pszData, size_t size);
 		int decodeFacDataReport(CStep* pStep, const char* pszData, size_t size);
 		int decodePanelDataRequest(CStep* pStep, const char* pszData, size_t size);
-		int addJobDataB(CJobDataB* pJobDataB);
-		int removeJobDataB(int nCassetteSequenceNo, int nJobSequenceNo);
-		CJobDataB* getJobDataB(int nCassetteSequenceNo, int nJobSequenceNo);
-		int addJobDataS(CJobDataS* pJobDataS);
-		int removeJobDataS(int nCassetteSequenceNo, int nJobSequenceNo);
-		CJobDataS* getJobDataS(int nCassetteSequenceNo, int nJobSequenceNo);
 		BOOL compareJobData(CJobDataB* pJobDataB, CJobDataS* pJobDataS);
 		void setProcessState(PROCESS_STATE state);
 
@@ -267,8 +261,6 @@
 
 	private:
 		CEquipment* m_pArm;
-		std::list<CJobDataS> m_listJobDataS;
-		std::list<CJobDataB> m_listJobDataB;
 	};
 }
 
diff --git a/SourceCode/Bond/Servo/CGlass.cpp b/SourceCode/Bond/Servo/CGlass.cpp
index a9e88eb..a88255a 100644
--- a/SourceCode/Bond/Servo/CGlass.cpp
+++ b/SourceCode/Bond/Servo/CGlass.cpp
@@ -142,6 +142,11 @@
 		m_jobDataS.copy(pJobDataS);
 	}
 
+	void CGlass::updateJobDataS(CJobDataS* pJobDataS)
+	{
+		m_jobDataS.update(pJobDataS);
+	}
+
 	CJobDataS* CGlass::getJobDataS()
 	{
 		return &m_jobDataS;
diff --git a/SourceCode/Bond/Servo/CGlass.h b/SourceCode/Bond/Servo/CGlass.h
index 86115ef..f5e1945 100644
--- a/SourceCode/Bond/Servo/CGlass.h
+++ b/SourceCode/Bond/Servo/CGlass.h
@@ -29,6 +29,7 @@
 		void addPath(unsigned int nEqId, unsigned int nUnit);
 		void serialize(CArchive& ar);
 		void setJobDataS(CJobDataS* pJobDataS);
+		void updateJobDataS(CJobDataS* pJobDataS);
 		CJobDataS* getJobDataS();
 		BOOL setBuddy(CGlass* pGlass);
 		BOOL forceSetBuddy(CGlass* pGlass);
diff --git a/SourceCode/Bond/Servo/CJobDataS.cpp b/SourceCode/Bond/Servo/CJobDataS.cpp
index 18f1b0e..0ac6e18 100644
--- a/SourceCode/Bond/Servo/CJobDataS.cpp
+++ b/SourceCode/Bond/Servo/CJobDataS.cpp
@@ -88,6 +88,42 @@
 		m_pOwner = pScr->m_pOwner;
 	}
 
+	void CJobDataS::update(CJobDataS* pScr)
+	{
+		// m_nCassetteSequenceNo = pScr->m_nCassetteSequenceNo;
+		// m_nJobSequenceNo = pScr->m_nJobSequenceNo;
+		m_strLotId = pScr->m_strLotId;
+		m_strProductId = pScr->m_strProductId;
+		m_strOperationId = pScr->m_strOperationId;
+		// m_strGlass1Id = pScr->m_strGlass1Id;
+		m_strGlass2Id = pScr->m_strGlass2Id;
+		m_nJobType = pScr->m_nJobType;
+		m_nMaterialsType = pScr->m_nMaterialsType;
+		m_nProductType = pScr->m_nProductType;
+		m_nDummyType = pScr->m_nDummyType;
+		m_nSkipFlag = pScr->m_nSkipFlag;
+		m_nProcessFlag = pScr->m_nProcessFlag;
+		m_nProcessResonCode = pScr->m_nProcessResonCode;
+		m_nLastGlassFlag = pScr->m_nLastGlassFlag;
+		m_nFirstGlassFlag = pScr->m_nFirstGlassFlag;
+		m_nQTime[0] = pScr->m_nQTime[0];
+		m_nQTime[1] = pScr->m_nQTime[1];
+		m_nQTime[2] = pScr->m_nQTime[2];
+		m_nQTimeOverFlag = pScr->m_nQTimeOverFlag;
+		m_nMasterRecipe = pScr->m_nMasterRecipe;
+		m_strProductRecipeId = pScr->m_strProductRecipeId;
+		m_strPCode = pScr->m_strPCode;
+		m_strUseType = pScr->m_strUseType;
+		m_strPanelMeasure = pScr->m_strPanelMeasure;
+		m_nMode = pScr->m_nMode;
+		m_nSlotUnitSelectFlag = pScr->m_nSlotUnitSelectFlag;
+		m_nSourcePortNo = pScr->m_nSourcePortNo;
+		m_nSourceSlotNo = pScr->m_nSourceSlotNo;
+		m_nTargetPortNo = pScr->m_nTargetPortNo;
+		m_nTargetSlotNo = pScr->m_nTargetSlotNo;
+		m_pOwner = pScr->m_pOwner;
+	}
+
 	void* CJobDataS::getOwner()
 	{
 		return m_pOwner;
diff --git a/SourceCode/Bond/Servo/CJobDataS.h b/SourceCode/Bond/Servo/CJobDataS.h
index 87b1cde..e0a8cb8 100644
--- a/SourceCode/Bond/Servo/CJobDataS.h
+++ b/SourceCode/Bond/Servo/CJobDataS.h
@@ -15,6 +15,7 @@
 		void* getOwner();
 		void setOwner(void* pOwner);
 		void copy(CJobDataS* pScr);
+		void update(CJobDataS* pScr);
 		int getCassetteSequenceNo();
 		void setCassetteSequenceNo(int no);
 		int getJobSequenceNo();

--
Gitblit v1.9.3