From 9fbd7479ce17f76f72cc0e5a675336261ec76472 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 12 五月 2025 15:39:53 +0800
Subject: [PATCH] 1.使用CEqReadStep替换CEqJobEventStep, 实现ReceivedJob 2.实现SentOutJob

---
 SourceCode/Bond/Servo/CPageGraph2.cpp     |    2 
 SourceCode/Bond/Servo/CEqJobEventStep.cpp |   93 -------------
 SourceCode/Bond/Servo/CStep.h             |    1 
 SourceCode/Bond/Servo/CJobDataS.h         |    2 
 SourceCode/Bond/Servo/CEquipment.cpp      |   64 ++++++++-
 SourceCode/Bond/Servo/CEFEM.cpp           |   20 +-
 SourceCode/Bond/Servo/CJobDataS.cpp       |  114 +++++++++++++++-
 SourceCode/Bond/Servo/CEFEM.h             |    4 
 SourceCode/Bond/Servo/CEquipment.h        |   10 +
 SourceCode/Bond/Servo/CBonder.cpp         |   50 +++++++
 SourceCode/Bond/Servo/CStep.cpp           |    9 +
 SourceCode/Bond/Servo/Common.h            |   30 ++++
 12 files changed, 275 insertions(+), 124 deletions(-)

diff --git a/SourceCode/Bond/Servo/CBonder.cpp b/SourceCode/Bond/Servo/CBonder.cpp
index fb29c2e..9d18867 100644
--- a/SourceCode/Bond/Servo/CBonder.cpp
+++ b/SourceCode/Bond/Servo/CBonder.cpp
@@ -235,6 +235,55 @@
 			}
 		}
 
+		// 使用CEqReadStep替换CEqJobEventStep
+		{
+			// Received Job Report Upstream #1~9
+			char szBuffer[256];
+			for (int i = 0; i < 9; i++) {
+				CEqReadStep* pStep = new CEqReadStep((m_nIndex == 0 ? 0x8c90 : 0xcc90) + 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((m_nIndex == 0 ? 0x300 : 0x600) + 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 < 9; i++) {
+				CEqReadStep* pStep = new CEqReadStep((m_nIndex == 0 ? 0x8000 : 0xc000) + 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_SENT_OUT_JOB_DOWNSn, i + 1);
+				pStep->setName(szBuffer);
+				pStep->setProp("Port", (void*)(__int64)(i + 1));
+				pStep->setWriteSignalDev((m_nIndex == 0 ? 0x30a : 0x60a) + i);
+				if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS1 + i, pStep) != 0) {
+					delete pStep;
+				}
+			}
+		}
+
+		/*
 		{
 			CEqJobEventStep* pStep = new CEqJobEventStep();
 			pStep->setName(STEP_EQ_RECEIVED_JOB_UPS1);
@@ -271,6 +320,7 @@
 				delete pStep;
 			}
 		}
+		*/
 
 		{
 			// Fetched Out Job Report #1~15
diff --git a/SourceCode/Bond/Servo/CEFEM.cpp b/SourceCode/Bond/Servo/CEFEM.cpp
index 32e9233..6b28e45 100644
--- a/SourceCode/Bond/Servo/CEFEM.cpp
+++ b/SourceCode/Bond/Servo/CEFEM.cpp
@@ -426,37 +426,37 @@
 		}
 	}
 
-	int CEFEM::onFetchedOut(int port, const char* pszGlassId)
+	int CEFEM::onFetchedOutJob(int port, const char* pszGlassId)
 	{
 		if (port == 1) {
-			return m_pPort[0]->fetchedOut(pszGlassId);
+			return m_pPort[0]->fetchedOutJob(pszGlassId);
 		}
 		if (port == 2) {
-			return m_pPort[1]->fetchedOut(pszGlassId);
+			return m_pPort[1]->fetchedOutJob(pszGlassId);
 		}
 		if (port == 3) {
-			return m_pPort[2]->fetchedOut(pszGlassId);
+			return m_pPort[2]->fetchedOutJob(pszGlassId);
 		}
 		if (port == 4) {
-			return m_pPort[3]->fetchedOut(pszGlassId);
+			return m_pPort[3]->fetchedOutJob(pszGlassId);
 		}
 		if (port == 5) {
-			return m_pArmTray[0]->fetchedOut(pszGlassId);
+			return m_pArmTray[0]->fetchedOutJob(pszGlassId);
 		}
 		if (port == 6) {
-			return m_pArmTray[1]->fetchedOut(pszGlassId);
+			return m_pArmTray[1]->fetchedOutJob(pszGlassId);
 		}
 		if (port == 7) {
-			return m_pAligner->fetchedOut(pszGlassId);
+			return m_pAligner->fetchedOutJob(pszGlassId);
 		}
 		if (port == 8) {
-			return m_pFliper->fetchedOut(pszGlassId);
+			return m_pFliper->fetchedOutJob(pszGlassId);
 		}
 
 		return -1;
 	}
 
-	int CEFEM::onStore(int port, const char* pszGlassId)
+	int CEFEM::onStoreJob(int port, const char* pszGlassId)
 	{
 		if (port == 1) {
 			return m_pPort[0]->storedJob(pszGlassId);
diff --git a/SourceCode/Bond/Servo/CEFEM.h b/SourceCode/Bond/Servo/CEFEM.h
index 39b89d0..5bc4c0c 100644
--- a/SourceCode/Bond/Servo/CEFEM.h
+++ b/SourceCode/Bond/Servo/CEFEM.h
@@ -27,8 +27,8 @@
         virtual int recvIntent(CPin* pPin, CIntent* pIntent);
         virtual BOOL glassWillArrive(CGlass* pGlass);
         virtual void onReceiveLBData(const char* pszData, size_t size);
-        virtual int onFetchedOut(int port, const char* pszGlassId);
-        virtual int onStore(int port, const char* pszGlassId);
+        virtual int onFetchedOutJob(int port, const char* pszGlassId);
+        virtual int onStoreJob(int port, const char* pszGlassId);
 
     public:
         void setPort(unsigned int index, CLoadPort* pPort);
diff --git a/SourceCode/Bond/Servo/CEqJobEventStep.cpp b/SourceCode/Bond/Servo/CEqJobEventStep.cpp
index 2bdc84a..7a084fe 100644
--- a/SourceCode/Bond/Servo/CEqJobEventStep.cpp
+++ b/SourceCode/Bond/Servo/CEqJobEventStep.cpp
@@ -21,102 +21,11 @@
 
 	void CEqJobEventStep::getAttributeVector(CAttributeVector& attrubutes)
 	{
-		CReadStep::getAttributeVector(attrubutes);
-
 		unsigned int weight = 31;
 		std::string strTemp;
 		attrubutes.addAttribute(new CAttribute("Dev",
 			("W" + CToolUnits::toHexString(m_nJobDataADev, strTemp)).c_str(), "", weight++));
-	
-		attrubutes.addAttribute(new CAttribute("CassetteSequenceNo",
-			std::to_string(m_jobDataS.getCassetteSequenceNo()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("JobSequenceNo",
-			std::to_string(m_jobDataS.getJobSequenceNo()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("LotId",
-			m_jobDataS.getLotId().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("ProductId",
-			m_jobDataS.getProductId().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("OperationId",
-			m_jobDataS.getOperationId().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("Glass1Id",
-			m_jobDataS.getGlass1Id().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("Glass2Id",
-			m_jobDataS.getGlass2Id().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("JobType",
-			std::to_string(m_jobDataS.getJobType()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("MaterialsType",
-			std::to_string(m_jobDataS.getMaterialsType()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("ProductType",
-			std::to_string(m_jobDataS.getProductType()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("DummyType",
-			std::to_string(m_jobDataS.getDummyType()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("SkipFlag",
-			std::to_string(m_jobDataS.getSkipFlag()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("ProcessFlag",
-			std::to_string(m_jobDataS.getProcessFlag()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("ProcessResonCode",
-			std::to_string(m_jobDataS.getProcessResonCode()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("LastGlassFlag",
-			std::to_string(m_jobDataS.getLastGlassFlag()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("FirstGlassFlag",
-			std::to_string(m_jobDataS.getFirstGlassFlag()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("QTime1",
-			std::to_string(m_jobDataS.getQTime(0)).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("QTime2",
-			std::to_string(m_jobDataS.getQTime(1)).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("QTime3",
-			std::to_string(m_jobDataS.getQTime(2)).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("QTimeOverFlag",
-			std::to_string(m_jobDataS.getQTimeOverFlag()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("MasterRecipe",
-			std::to_string(m_jobDataS.getMasterRecipe()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("ProductRecipeId",
-			m_jobDataS.getProductRecipeId().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("PCode",
-			m_jobDataS.getPCode().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("UseType",
-			m_jobDataS.getUseType().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("PanelMeasure",
-			m_jobDataS.getPanelMeasure().c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("SlotUnitSelectFlag",
-			std::to_string(m_jobDataS.getSlotUnitSelectFlag()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("SourcePortNo",
-			std::to_string(m_jobDataS.getSourcePortNo()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("SourceSlotNo",
-			std::to_string(m_jobDataS.getSourceSlotNo()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("TargetPortNo",
-			std::to_string(m_jobDataS.getTargetPortNo()).c_str(), "", weight++));
-
-		attrubutes.addAttribute(new CAttribute("TargetSlotNo",
-			std::to_string(m_jobDataS.getTargetSlotNo()).c_str(), "", weight++));
+		m_jobDataS.getAttributeVector(attrubutes, weight);
 	}
 
 	int CEqJobEventStep::onReadData()
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index 0bf4132..3b15620 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -822,7 +822,7 @@
 		return pGlass;
 	}
 
-	int CEquipment::fetchedOut(const char* pszGlassId)
+	int CEquipment::fetchedOutJob(const char* pszGlassId)
 	{
 		if (m_pArm == nullptr) {
 			return -1;
@@ -1061,6 +1061,56 @@
 		return m_recipesManager.decodeRecipeParameterReport(pszData, size);
 	}
 
+	int CEquipment::decodeReceivedJobReport(CStep* pStep, int port, const char* pszData, size_t size)
+	{
+		CJobDataS jobDataS;
+		int nRet = jobDataS.unserialize(&pszData[0], (int)size);
+		if (nRet < 0) return nRet;
+
+		// 缓存Attribute,用于调试时显示信息
+		unsigned int weight = 201;
+		CAttributeVector attrubutes;
+		jobDataS.getAttributeVector(attrubutes, weight);
+		pStep->addAttributeVector(attrubutes);
+
+
+		onReceivedJob(port, &jobDataS);
+
+		return nRet;
+	}
+
+	int CEquipment::onReceivedJob(int port, CJobDataS* pJobDataS)
+	{
+		LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str());
+		// return fetchedOutJob(pszGlassId);
+		return 0;
+	}
+
+	int CEquipment::decodeSentOutJobReport(CStep* pStep, int port, const char* pszData, size_t size)
+	{
+		CJobDataS jobDataS;
+		int nRet = jobDataS.unserialize(&pszData[0], (int)size);
+		if (nRet < 0) return nRet;
+
+		// 缓存Attribute,用于调试时显示信息
+		unsigned int weight = 201;
+		CAttributeVector attrubutes;
+		jobDataS.getAttributeVector(attrubutes, weight);
+		pStep->addAttributeVector(attrubutes);
+
+
+		onReceivedJob(port, &jobDataS);
+
+		return nRet;
+	}
+
+	int CEquipment::onSentOutJob(int port, CJobDataS* pJobDataS)
+	{
+		LOGI("<CEquipment-%s>onSentOutJob.", m_strName.c_str());
+		// return fetchedOutJob(pszGlassId);
+		return 0;
+	}
+
 	int CEquipment::decodeFetchedOutJobReport(CStep* pStep, int port, const char* pszData, size_t size)
 	{
 		int index = 0;
@@ -1098,16 +1148,16 @@
 			jobDataB.getGlassId().c_str(), "", weight++));
 
 
-		onFetchedOut(port, jobDataB.getGlassId().c_str());
+		onFetchedOutJob(port, jobDataB.getGlassId().c_str());
 
 		return index;
 	}
 
-	int CEquipment::onFetchedOut(int port, const char* pszGlassId)
+	int CEquipment::onFetchedOutJob(int port, const char* pszGlassId)
 	{
-		LOGI("<CEquipment-%s>onFetchedOut:port:%d|GlassId:%s", 
+		LOGI("<CEquipment-%s>onFetchedOutJob:port:%d|GlassId:%s", 
 			m_strName.c_str(), port, pszGlassId);
-		return fetchedOut(pszGlassId);
+		return fetchedOutJob(pszGlassId);
 	}
 
 	int CEquipment::decodeStoredJobReport(CStep* pStep, int port, const char* pszData, size_t size)
@@ -1147,12 +1197,12 @@
 			jobDataB.getGlassId().c_str(), "", weight++));
 
 
-		onStore(port, jobDataB.getGlassId().c_str());
+		onStoreJob(port, jobDataB.getGlassId().c_str());
 
 		return index;
 	}
 
-	int CEquipment::onStore(int port, const char* pszGlassId)
+	int CEquipment::onStoreJob(int port, const char* pszGlassId)
 	{
 		LOGI("<CEquipment-%s>onStore:port:%d|GlassId:%s",
 			m_strName.c_str(), port, pszGlassId);
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index 22a6a52..24eb6ff 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -116,8 +116,10 @@
 		virtual BOOL glassWillArrive(CGlass* pGlass);
 		virtual int outputGlass(int port);
 		virtual int glassArrived(CGlass* pGlass);
-		virtual int onFetchedOut(int port, const char* pszGlassId);
-		virtual int onStore(int port, const char* pszGlassId);
+		virtual int onReceivedJob(int port, CJobDataS* pJobDataS);
+		virtual int onSentOutJob(int port, CJobDataS* pJobDataS);
+		virtual int onFetchedOutJob(int port, const char* pszGlassId);
+		virtual int onStoreJob(int port, const char* pszGlassId);
 		void getGlassList(std::list<CGlass*>& list);
 		CGlass* getFrontGlass();
 		BOOL removeClass(CGlass* pGlass);
@@ -148,7 +150,7 @@
 		int recipeParameterRequest(short masterRecipeId, short localRecipeId, short unitNo);
 
 	public:
-		int fetchedOut(const char* pszGlassId);
+		int fetchedOutJob(const char* pszGlassId);
 		int storedJob(const char* pszGlassId);
 		BOOL isGlassListEmpty();
 
@@ -171,6 +173,8 @@
 		void addGlassToList(CGlass* pGlass);
 		short decodeRecipeListReport(const char* pszData, size_t size);
 		short decodeRecipeParameterReport(const char* pszData, size_t size);
+		int decodeReceivedJobReport(CStep* pStep, int port, const char* pszData, size_t size);
+		int decodeSentOutJobReport(CStep* pStep, int port, const char* pszData, size_t size);
 		int decodeFetchedOutJobReport(CStep* pStep, int port, const char* pszData, size_t size);
 		int decodeStoredJobReport(CStep* pStep, int port, const char* pszData, size_t size);
 
diff --git a/SourceCode/Bond/Servo/CJobDataS.cpp b/SourceCode/Bond/Servo/CJobDataS.cpp
index 0b2b4f7..54d0689 100644
--- a/SourceCode/Bond/Servo/CJobDataS.cpp
+++ b/SourceCode/Bond/Servo/CJobDataS.cpp
@@ -340,23 +340,23 @@
 		memcpy(&pszBuffer[index], &m_nJobSequenceNo, sizeof(short));
 		index += sizeof(short);
 
-		int strLen = min(40, m_strLotId.size());
+		int strLen = min(40, (int)m_strLotId.size());
 		memcpy(&pszBuffer[index], m_strLotId.c_str(), strLen);
 		index += 40;
 
-		strLen = min(20, m_strProductId.size());
+		strLen = min(20, (int)m_strProductId.size());
 		memcpy(&pszBuffer[index], m_strProductId.c_str(), strLen);
 		index += 20;
 
-		strLen = min(20, m_strOperationId.size());
+		strLen = min(20, (int)m_strOperationId.size());
 		memcpy(&pszBuffer[index], m_strOperationId.c_str(), strLen);
 		index += 20;
 
-		strLen = min(20, m_strGlass1Id.size());
+		strLen = min(20, (int)m_strGlass1Id.size());
 		memcpy(&pszBuffer[index], m_strGlass1Id.c_str(), strLen);
 		index += 20;
 
-		strLen = min(20, m_strGlass2Id.size());
+		strLen = min(20, (int)m_strGlass2Id.size());
 		memcpy(&pszBuffer[index], m_strGlass2Id.c_str(), strLen);
 		index += 20;
 
@@ -405,19 +405,19 @@
 		memcpy(&pszBuffer[index], &m_nMasterRecipe, sizeof(short));
 		index += sizeof(short);
 
-		strLen = min(10, m_strProductRecipeId.size());
+		strLen = min(10, (int)m_strProductRecipeId.size());
 		memcpy(&pszBuffer[index], m_strProductRecipeId.c_str(), strLen);
 		index += 10;
 
-		strLen = min(10, m_strPCode.size());
+		strLen = min(10, (int)m_strPCode.size());
 		memcpy(&pszBuffer[index], m_strPCode.c_str(), strLen);
 		index += 10;
 
-		strLen = min(10, m_strUseType.size());
+		strLen = min(10, (int)m_strUseType.size());
 		memcpy(&pszBuffer[index], m_strUseType.c_str(), strLen);
 		index += 10;
 
-		strLen = min(80, m_strPanelMeasure.size());
+		strLen = min(80, (int)m_strPanelMeasure.size());
 		memcpy(&pszBuffer[index], m_strPanelMeasure.c_str(), strLen);
 		index += 80;
 
@@ -543,4 +543,100 @@
 
 		return 256 * 2;
 	}
+
+	void CJobDataS::getAttributeVector(CAttributeVector& attrubutes, int beginWeight)
+	{
+		unsigned int weight = beginWeight;
+		std::string strTemp;
+
+		attrubutes.addAttribute(new CAttribute("CassetteSequenceNo",
+			std::to_string(getCassetteSequenceNo()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("JobSequenceNo",
+			std::to_string(getJobSequenceNo()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("LotId",
+			getLotId().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("ProductId",
+			getProductId().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("OperationId",
+			getOperationId().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("Glass1Id",
+			getGlass1Id().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("Glass2Id",
+			getGlass2Id().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("JobType",
+			std::to_string(getJobType()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("MaterialsType",
+			std::to_string(getMaterialsType()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("ProductType",
+			std::to_string(getProductType()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("DummyType",
+			std::to_string(getDummyType()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("SkipFlag",
+			std::to_string(getSkipFlag()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("ProcessFlag",
+			std::to_string(getProcessFlag()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("ProcessResonCode",
+			std::to_string(getProcessResonCode()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("LastGlassFlag",
+			std::to_string(getLastGlassFlag()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("FirstGlassFlag",
+			std::to_string(getFirstGlassFlag()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("QTime1",
+			std::to_string(getQTime(0)).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("QTime2",
+			std::to_string(getQTime(1)).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("QTime3",
+			std::to_string(getQTime(2)).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("QTimeOverFlag",
+			std::to_string(getQTimeOverFlag()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("MasterRecipe",
+			std::to_string(getMasterRecipe()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("ProductRecipeId",
+			getProductRecipeId().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("PCode",
+			getPCode().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("UseType",
+			getUseType().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("PanelMeasure",
+			getPanelMeasure().c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("SlotUnitSelectFlag",
+			std::to_string(getSlotUnitSelectFlag()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("SourcePortNo",
+			std::to_string(getSourcePortNo()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("SourceSlotNo",
+			std::to_string(getSourceSlotNo()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("TargetPortNo",
+			std::to_string(getTargetPortNo()).c_str(), "", weight++));
+
+		attrubutes.addAttribute(new CAttribute("TargetSlotNo",
+			std::to_string(getTargetSlotNo()).c_str(), "", weight++));
+	}
 }
diff --git a/SourceCode/Bond/Servo/CJobDataS.h b/SourceCode/Bond/Servo/CJobDataS.h
index 62087b4..4cf456a 100644
--- a/SourceCode/Bond/Servo/CJobDataS.h
+++ b/SourceCode/Bond/Servo/CJobDataS.h
@@ -1,4 +1,5 @@
 #pragma once
+#include "CAttributeVector.h"
 
 
 namespace SERVO {
@@ -69,6 +70,7 @@
 		void setTargetSlotNo(int no);
 		int serialize(char* pszBuffer, int nBufferSize);
 		int unserialize(const char* pszBuffer, int nBufferSize);
+		void getAttributeVector(CAttributeVector& attrubutes, int beginWeight);
 
 
 	private:
diff --git a/SourceCode/Bond/Servo/CPageGraph2.cpp b/SourceCode/Bond/Servo/CPageGraph2.cpp
index 6ef9a57..cc44782 100644
--- a/SourceCode/Bond/Servo/CPageGraph2.cpp
+++ b/SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -193,7 +193,7 @@
 			if (pEquipment->getID() == EQ_ID_LOADPORT1) {
 				pEquipment->outputGlass(1);
 			}
-			pEquipment->fetchedOut("P20250320A1A2");
+			pEquipment->fetchedOutJob("P20250320A1A2");
 		}
 		else if (nCmd == ID_EQSGRAPHITEM_TEST2) {
 			SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData;
diff --git a/SourceCode/Bond/Servo/CStep.cpp b/SourceCode/Bond/Servo/CStep.cpp
index 0597e6e..d1907c7 100644
--- a/SourceCode/Bond/Servo/CStep.cpp
+++ b/SourceCode/Bond/Servo/CStep.cpp
@@ -91,6 +91,15 @@
 		m_attributeVector.addAttribute(pAttribute, TRUE);
 	}
 
+	void CStep::addAttributeVector(CAttributeVector& attributeVector)
+	{
+		// 添加attribute时,要前删除存在的同名的attribute
+		unsigned int size = attributeVector.size();
+		for (unsigned int i = 0; i < size; i++) {
+			m_attributeVector.addAttribute(attributeVector.getAttribute(i), TRUE);
+		}
+	}
+
 	void CStep::convertString(const char* pszBuffer, int size, std::string& strOut)
 	{
 		strOut.clear();
diff --git a/SourceCode/Bond/Servo/CStep.h b/SourceCode/Bond/Servo/CStep.h
index fee9d57..20520f3 100644
--- a/SourceCode/Bond/Servo/CStep.h
+++ b/SourceCode/Bond/Servo/CStep.h
@@ -30,6 +30,7 @@
 		void setProp(const char* pszKey, void* pValue);
 		void* getProp(const char* pszKey);
 		void addAttribute(CAttribute* pAttribute);
+		void addAttributeVector(CAttributeVector& attributeVector);
 
 	protected:
 		inline void Lock() { EnterCriticalSection(&m_criticalSection); }
diff --git a/SourceCode/Bond/Servo/Common.h b/SourceCode/Bond/Servo/Common.h
index 5cf76f2..b4b4a75 100644
--- a/SourceCode/Bond/Servo/Common.h
+++ b/SourceCode/Bond/Servo/Common.h
@@ -137,10 +137,26 @@
 #define STEP_EQ_P3_CASSETTE_CTRL_CMD	_T("EQPort3CassetteCtrlCmd")
 #define STEP_EQ_P4_CASSETTE_CTRL_CMD	_T("EQPort4CassetteCtrlCmd")
 #define STEP_EQ_CIM_MESSAGE_CONFIRM		_T("EQCimMessageConfirm")
+#define STEP_EQ_RECEIVED_JOB_UPSn		_T("EQJEReceivedJobUps")
 #define STEP_EQ_RECEIVED_JOB_UPS1		_T("EQJEReceivedJobUps1")
 #define STEP_EQ_RECEIVED_JOB_UPS2		_T("EQJEReceivedJobUps2")
+#define STEP_EQ_RECEIVED_JOB_UPS3		_T("EQJEReceivedJobUps3")
+#define STEP_EQ_RECEIVED_JOB_UPS4		_T("EQJEReceivedJobUps4")
+#define STEP_EQ_RECEIVED_JOB_UPS5		_T("EQJEReceivedJobUps5")
+#define STEP_EQ_RECEIVED_JOB_UPS6		_T("EQJEReceivedJobUps6")
+#define STEP_EQ_RECEIVED_JOB_UPS7		_T("EQJEReceivedJobUps7")
+#define STEP_EQ_RECEIVED_JOB_UPS8		_T("EQJEReceivedJobUps8")
+#define STEP_EQ_RECEIVED_JOB_UPS9		_T("EQJEReceivedJobUps9")
+#define STEP_EQ_SENT_OUT_JOB_DOWNSn		_T("EQJESentOutJobDowns")
 #define STEP_EQ_SENT_OUT_JOB_DOWNS1		_T("EQJESentOutJobDowns1")
 #define STEP_EQ_SENT_OUT_JOB_DOWNS2		_T("EQJESentOutJobDowns2")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS3		_T("EQJESentOutJobDowns3")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS4		_T("EQJESentOutJobDowns4")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS5		_T("EQJESentOutJobDowns5")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS6		_T("EQJESentOutJobDowns6")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS7		_T("EQJESentOutJobDowns7")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS8		_T("EQJESentOutJobDowns8")
+#define STEP_EQ_SENT_OUT_JOB_DOWNS9		_T("EQJESentOutJobDowns9")
 #define STEP_EQ_VCR1_EVENT_REPORT		_T("EQVcr1EventReport")
 #define STEP_EQ_RURRENT_RECIPE_CHANGE	_T("EQCurrentRecipeChange")
 #define STEP_EQ_MASTER_RECIPE_LIST_REQ	_T("EQMasterRecipeListReq")
@@ -216,8 +232,22 @@
 #define STEP_ID_RECIPE_PARAMETER_REPORT			0x56C
 #define STEP_ID_RECIVE_JOB_UPS1					0x580
 #define STEP_ID_RECIVE_JOB_UPS2					0x581
+#define STEP_ID_RECIVE_JOB_UPS3					0x582
+#define STEP_ID_RECIVE_JOB_UPS4					0x583
+#define STEP_ID_RECIVE_JOB_UPS5					0x584
+#define STEP_ID_RECIVE_JOB_UPS6					0x585
+#define STEP_ID_RECIVE_JOB_UPS7					0x586
+#define STEP_ID_RECIVE_JOB_UPS8					0x587
+#define STEP_ID_RECIVE_JOB_UPS9					0x588
 #define STEP_ID_SENT_OUT_JOB_DOWNS1				0x590
 #define STEP_ID_SENT_OUT_JOB_DOWNS2				0x591
+#define STEP_ID_SENT_OUT_JOB_DOWNS3				0x592
+#define STEP_ID_SENT_OUT_JOB_DOWNS4				0x593
+#define STEP_ID_SENT_OUT_JOB_DOWNS5				0x594
+#define STEP_ID_SENT_OUT_JOB_DOWNS6				0x595
+#define STEP_ID_SENT_OUT_JOB_DOWNS7				0x596
+#define STEP_ID_SENT_OUT_JOB_DOWNS8				0x597
+#define STEP_ID_SENT_OUT_JOB_DOWNS9				0x598
 #define STEP_ID_STORE_JOB_REPORT1				0x5A0
 #define STEP_ID_STORE_JOB_REPORT2				0x5A1
 #define STEP_ID_STORE_JOB_REPORT3				0x5A2

--
Gitblit v1.9.3