From 63686244746925d43248ceaf8d9e31f50df68a72 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 01 九月 2025 17:21:43 +0800
Subject: [PATCH] Merge branch 'clh'

---
 Document/CEID.xlsx                                     |    0 
 SourceCode/Bond/Servo/HsmsPassive.h                    |    7 
 SourceCode/Bond/Servo/Servo.vcxproj.user               |    2 
 SourceCode/Bond/Servo/HsmsPassive.cpp                  |   34 +++
 SourceCode/Bond/Servo/CMaster.h                        |    9 +
 SourceCode/Bond/Servo/Model.cpp                        |   40 ++++
 SourceCode/Bond/Servo/CLoadPort.cpp                    |   10 
 SourceCode/Bond/Servo/ServoDlg.cpp                     |    2 
 SourceCode/Bond/x64/Debug/VariableList.txt             |   64 ++++---
 SourceCode/Bond/Servo/PortConfigurationDlg.cpp         |   52 +++++
 SourceCode/Bond/Servo/CEquipmentPage2.cpp              |   12 +
 SourceCode/Bond/x64/Debug/CollectionEventList.txt      |   10 +
 SourceCode/Bond/Servo/CEquipment.cpp                   |   20 ++
 SourceCode/Bond/Servo/CEFEM.cpp                        |    4 
 SourceCode/Bond/Servo/CMaster.cpp                      |  227 +++++++++++++++++++------
 SourceCode/Bond/Servo/CEquipment.h                     |    4 
 SourceCode/Bond/Servo/ServoCommo.h                     |    1 
 SourceCode/Bond/x64/Debug/ReportList.txt               |    9 +
 SourceCode/Bond/Servo/CBonder.h                        |    4 
 Document/Panel Bonder八零联合 SecsTest CheckList_v3.0.xlsx |    0 
 SourceCode/Bond/Servo/CBonder.cpp                      |    4 
 21 files changed, 417 insertions(+), 98 deletions(-)

diff --git a/Document/CEID.xlsx b/Document/CEID.xlsx
new file mode 100644
index 0000000..8ed5a00
--- /dev/null
+++ b/Document/CEID.xlsx
Binary files differ
diff --git "a/Document/Panel Bonder\345\205\253\351\233\266\350\201\224\345\220\210 SecsTest CheckList_v3.0.xlsx" "b/Document/Panel Bonder\345\205\253\351\233\266\350\201\224\345\220\210 SecsTest CheckList_v3.0.xlsx"
index 59056de..4c7dee0 100644
--- "a/Document/Panel Bonder\345\205\253\351\233\266\350\201\224\345\220\210 SecsTest CheckList_v3.0.xlsx"
+++ "b/Document/Panel Bonder\345\205\253\351\233\266\350\201\224\345\220\210 SecsTest CheckList_v3.0.xlsx"
Binary files differ
diff --git a/SourceCode/Bond/Servo/CBonder.cpp b/SourceCode/Bond/Servo/CBonder.cpp
index 7ebd7be..ef46752 100644
--- a/SourceCode/Bond/Servo/CBonder.cpp
+++ b/SourceCode/Bond/Servo/CBonder.cpp
@@ -460,7 +460,7 @@
 		return m_nIndex;
 	}
 
-	BOOL CBonder::hasBondClass()
+	BOOL CBonder::hasBondGlass()
 	{
 		CGlass* pGlass = (CGlass*)m_slot[1].getContext();
 		if (pGlass == nullptr) return FALSE;
@@ -468,7 +468,7 @@
 		return pBuddy != nullptr;
 	}
 
-	BOOL CBonder::hasG2Class()
+	BOOL CBonder::hasG2Glass()
 	{
 		CGlass* pGlass = (CGlass*)m_slot[0].getContext();
 		return (pGlass != nullptr);
diff --git a/SourceCode/Bond/Servo/CBonder.h b/SourceCode/Bond/Servo/CBonder.h
index 4e8edcd..0746fa5 100644
--- a/SourceCode/Bond/Servo/CBonder.h
+++ b/SourceCode/Bond/Servo/CBonder.h
@@ -28,8 +28,8 @@
     public:
         void setIndex(unsigned int index);
         unsigned int getIndex();
-        BOOL hasBondClass();
-        BOOL hasG2Class();
+        BOOL hasBondGlass();
+        BOOL hasG2Glass();
 
     private:
         unsigned int m_nIndex;
diff --git a/SourceCode/Bond/Servo/CEFEM.cpp b/SourceCode/Bond/Servo/CEFEM.cpp
index dcb5684..39df4b4 100644
--- a/SourceCode/Bond/Servo/CEFEM.cpp
+++ b/SourceCode/Bond/Servo/CEFEM.cpp
@@ -892,7 +892,7 @@
 	{
 		LOGI("<CEFEM>Robot status:%d, ARM1:%s, ARM2:%s",
 			m_robotData.status,
-			m_robotData.armState[1] ? _T("ON") : _T("OFF"),
-			m_robotData.armState[2] ? _T("ON") : _T("OFF"));
+			m_robotData.armState[0] ? _T("ON") : _T("OFF"),
+			m_robotData.armState[1] ? _T("ON") : _T("OFF"));
 	}
 }
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index bfdec30..d7f5698 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -27,6 +27,7 @@
 		m_pArm = nullptr;
 		m_processState = PROCESS_STATE::Ready;
 		m_blockReadBit = { 0 };
+		m_nTestFlag = 0;
 		InitializeCriticalSection(&m_criticalSection);
 	}
 
@@ -1328,24 +1329,32 @@
 	CSlot* CEquipment::getProcessedSlot(MaterialsType putSlotType, BOOL bJobMode/* = FALSE*/)
 	{
 		for (int i = 0; i < SLOT_MAX; i++) {
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 001");
 			if (!m_slot[i].isEnable()) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 002");
 			if (m_slot[i].isLock()) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 003");
 			CGlass* pGlass = (CGlass*)m_slot[i].getContext();
 			if (!isSlotProcessed(i)) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 004");
 			if (pGlass == nullptr) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 005");
 			if (!pGlass->isScheduledForProcessing()) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 006");
 			if (bJobMode && pGlass->getProcessJob() == nullptr) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 007");
 			if(pGlass->getInspResult(m_nID, 0) == InspResult::Fail) continue;
 			int lsPath = m_slot[i].getLinkSignalPath();
 			if(!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE]
 				|| m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
 				|| !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK]
 				|| !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE] ) continue;
-
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 008");
 			MaterialsType glassType = pGlass->getType();
 			if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 009");
 			if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
-
+			if (m_nTestFlag == 1) LOGI("getProcessedSlot 00a");
 			return &m_slot[i];
 		}
 
@@ -1445,6 +1454,13 @@
 		return TRUE;
 	}
 
+	BOOL CEquipment::slotHasGlass(int slotIndex/* = 0*/)
+	{
+		ASSERT(slotIndex < 8);
+		CGlass* pGlass = (CGlass*)m_slot[slotIndex].getContext();
+		return (pGlass != nullptr);
+	}
+
 	int CEquipment::removeGlass(int slotNo)
 	{
 		CSlot* pSlot = nullptr;
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index 27a448e..e23aa10 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -202,6 +202,7 @@
 
 		// 是否有玻璃
 		BOOL hasGlass();
+		BOOL slotHasGlass(int slotIndex = 0);
 
 		// 指定槽位是否可以放置玻璃
 		BOOL canPlaceGlassInSlot(const short slotIndex);
@@ -290,6 +291,9 @@
 
 	private:
 		CEquipment* m_pArm;
+
+	public:
+		int m_nTestFlag;
 	};
 }
 
diff --git a/SourceCode/Bond/Servo/CEquipmentPage2.cpp b/SourceCode/Bond/Servo/CEquipmentPage2.cpp
index 14b46ac..984fa26 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage2.cpp
+++ b/SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -180,7 +180,17 @@
 
 			SERVO::CGlass* pGlass = (SERVO::CGlass*)pSlot->getContext();
 			if (pGlass != nullptr) {
-				m_listCtrl.SetItemText(index, 3, pGlass->getID().c_str());
+				CString strText;
+				if (pGlass->getType() == SERVO::MaterialsType::G1) {
+					strText.Format(_T("(G1)%s"), pGlass->getID().c_str());
+				}
+				else if (pGlass->getType() == SERVO::MaterialsType::G2) {
+					strText.Format(_T("(G2)%s"), pGlass->getID().c_str());
+				}
+				else {
+					strText.Format(_T("(%s"), pGlass->getID().c_str());
+				}
+				m_listCtrl.SetItemText(index, 3, strText);
 				SERVO::CGlass* pBuddy = pGlass->getBuddy();
 				if (pBuddy != nullptr) {
 					m_listCtrl.SetItemText(index, 4, pBuddy->getID().c_str());
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index 7cc6006..15a49fe 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -363,14 +363,15 @@
 
 
 		// 模拟测试
+		/*
 		if (m_nIndex == 0) {
 			static int ii = 0;
 			ii++;
 			if (ii == 50) {
 				char szBuffer[64] = {0};
-				CStep* pStep = getStepWithName(STEP_EQ_PORT1_INUSE);
+				CStep* pStep = getStepWithName(STEP_EQ_PORT1_BLOCKED);
 				CPortStatusReport portStatusReport;
-				portStatusReport.setPortStatus(PORT_INUSE);
+				portStatusReport.setPortStatus(PORT_BLOCKED);
 				portStatusReport.setJobExistenceSlot(0xf);
 				portStatusReport.setCassetteId("CID1001");
 				int nRet = portStatusReport.serialize(szBuffer, 64);
@@ -382,15 +383,16 @@
 			ii++;
 			if (ii == 55) {
 				char szBuffer[64] = { 0 };
-				CStep* pStep = getStepWithName(STEP_EQ_PORT2_INUSE);
+				CStep* pStep = getStepWithName(STEP_EQ_PORT2_BLOCKED);
 				CPortStatusReport portStatusReport;
-				portStatusReport.setPortStatus(PORT_INUSE);
+				portStatusReport.setPortStatus(PORT_BLOCKED);
 				portStatusReport.setJobExistenceSlot(0xff );
 				portStatusReport.setCassetteId("CID1004");
 				int nRet = portStatusReport.serialize(szBuffer, 64);
 				decodePortStatusReport(pStep, szBuffer, 64);
 			}
 		}
+		*/
 	}
 
 	void CLoadPort::serialize(CArchive& ar)
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index baf3806..f88f104 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -63,6 +63,7 @@
 		m_nContinuousTransferCount = 0;
 		m_nContinuousTransferStep = CTStep_Unknow;
 		m_pControlJob = nullptr;
+		m_nTestFlag = 0;
 		InitializeCriticalSection(&m_criticalSection);
 	}
 
@@ -505,13 +506,11 @@
 				}
 				
 				// 检查看是否都已经切换到START状态
-				/*
 				if (!bIomcOk[6]) {
 					unlock();
 					setState(MASTERSTATE::MSERROR);
 					continue;
 				}
-				*/
 
 				unlock();
 				if(m_bContinuousTransfer)
@@ -596,37 +595,62 @@
 				}
 
 
-				// 此处检测优先类型和次要类型(G1或G2)
-				// 如果其中一Bonder有单个玻璃,优先取它的配对类型,否则无所谓了
-				primaryType = MaterialsType::G1;
-				secondaryType = MaterialsType::G2;
-				if ((!pBonder1->canPlaceGlassInSlot(0) && !pBonder1->canPlaceGlassInSlot(1))
-					&& (!pBonder2->canPlaceGlassInSlot(0) && !pBonder2->canPlaceGlassInSlot(1))) {
-					// 如果G1和G2都满了,那就看Aligner, 如果Aligner有玻璃为G1, 则取G2
-					CGlass* pGlass = pAligner->getGlassFromSlot(1);
-					if (pGlass != nullptr && pGlass->getType() == MaterialsType::G1) {
-						primaryType = MaterialsType::G2;
-						secondaryType = MaterialsType::G1;
-					}
+				// Bonder1、Bonder2、Fliper、VacuumBake、Aligner,统计G2和G1的数量, 配对组数, 多出的类型
+				int nG2Count = 0, nG1Count = 0, nGlassGroup, nExtraType;
+				if (pBonder1->slotHasGlass(0)) {
+					nG2Count++;
 				}
-				else if ((pBonder1->canPlaceGlassInSlot(0) && !pBonder1->canPlaceGlassInSlot(1))
-					|| (pBonder2->canPlaceGlassInSlot(0) && !pBonder2->canPlaceGlassInSlot(1))) {
-					primaryType = MaterialsType::G2;
-					secondaryType = MaterialsType::G1;
+				if (pBonder1->slotHasGlass(1)) {
+					nG1Count++;
 				}
+
+				if (pBonder2->slotHasGlass(0)) {
+					nG2Count++;
+				}
+				if (pBonder2->slotHasGlass(1)) {
+					nG1Count++;
+				}
+
+				if (pFliper->slotHasGlass(0)) {
+					nG2Count++;
+				}
+
+				if (pVacuumBake->slotHasGlass(0)) {
+					nG1Count++;
+				}
+				if (pVacuumBake->slotHasGlass(1)) {
+					nG1Count++;
+				}
+
+				CGlass* pTempGlass = pAligner->getGlassFromSlot(0);
+				if (pTempGlass != nullptr) {
+					MaterialsType type = pTempGlass->getType();
+					if(type == MaterialsType::G1)
+						nG1Count++;
+					else if (type == MaterialsType::G2)
+						nG2Count++;
+				}
+				nGlassGroup = min(nG1Count, nG2Count);
+				
+				if (nG1Count == nG2Count) {
+					nExtraType = 0;
+				}
+				else if (nG1Count > nG2Count) {
+					nExtraType = 1;
+				}
+				else {
+					nExtraType = 2;
+				}
+				secondaryType = MaterialsType::G0;
 
 
 				// Measurement -> LoadPort
-				if (rmd.armState[0] || rmd.armState[1]) {
-					LOGI("Arm1 %s, Arm2 %s.", rmd.armState[0] ? _T("不可用") : _T("可用"),
-						rmd.armState[1] ? _T("不可用") : _T("可用"));
-				}
 				for (int s = 0; s < 4; s++) {
 					PortType pt = pLoadPorts[s]->getPortType();
 					if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
 						&& (pt == PortType::Unloading || pt == PortType::Both)
 						&& pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
-						m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], primaryType, secondaryType);
+						m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
 						if (m_pActiveRobotTask != nullptr) {
 							goto PORT_PUT;
 						}
@@ -673,25 +697,30 @@
 
 
 				// Fliper(G2) -> Bonder
-				auto pSrcSlot = pVacuumBake->getProcessedSlot(primaryType);
-				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
+				//m_nTestFlag = 1;
+				//pVacuumBake->m_nTestFlag = 1;
+				auto pSrcSlot = pVacuumBake->getProcessedSlot(MaterialsType::G1);
+				//LOGI("<Master>pSrcSlot = %x", pSrcSlot,);
+				if (pSrcSlot != nullptr && !rmd.armState[1]
+					&& pBonder1->canPlaceGlassInSlot(0)) {
+					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, MaterialsType::G2, MaterialsType::G0, 2);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
-				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
+				if (pSrcSlot != nullptr && !rmd.armState[1] 
+					&& pBonder2->canPlaceGlassInSlot(0)) {
+					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, MaterialsType::G2, MaterialsType::G0, 2);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
-
-
+				//m_nTestFlag = 0
+					;
 				// VacuumBake(G1) -> Bonder
-				if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
+				if (!rmd.armState[0] && pBonder1->slotHasGlass(0) && !pBonder1->slotHasGlass(1)) {
+					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, MaterialsType::G1, MaterialsType::G0);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
-				if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
-					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
+				if (!rmd.armState[0] && pBonder2->slotHasGlass(0) && !pBonder2->slotHasGlass(1)) {
+					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, MaterialsType::G1, MaterialsType::G0);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
@@ -699,13 +728,16 @@
 				// Aligner -> Fliper(G2)
 				// Aligner -> VacuumBake(G1)
 				if (!rmd.armState[1]) {
-					m_pActiveRobotTask = createTransferTask(pAligner, pFliper, primaryType, secondaryType);
+					m_pActiveRobotTask = createTransferTask(pAligner, pFliper, MaterialsType::G2, secondaryType);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
 				if (!rmd.armState[0]) {
-					m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, primaryType, secondaryType);
+					// m_nTestFlag = 1;
+					if (m_nTestFlag == 1) LOGI("createTransferTask 004df %d, %d", MaterialsType::G1, secondaryType);
+					m_pActiveRobotTask = createTransferTask(pAligner, pVacuumBake, MaterialsType::G1, secondaryType);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
+					m_nTestFlag = 0;
 				}
 
 
@@ -717,6 +749,17 @@
 
 
 				// LoadPort -> Aligner
+				if (nGlassGroup >= 2) {
+					unlock();
+					continue;
+				}
+
+				if(nExtraType == 0)
+					primaryType = MaterialsType::G2;
+				else {
+					primaryType = MaterialsType::G1;
+				}
+
 				for (int s = 0; s < 4; s++) {
 					PortType pt = pLoadPorts[s]->getPortType();
 					if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
@@ -761,6 +804,10 @@
 				if (m_pControlJob->state() == CJState::Queued) {
 					LOGI("<Master>ControlJob已经启动");
 					m_pControlJob->start();
+
+					if (m_listener.onCjStart != nullptr) {
+						m_listener.onCjStart(this, m_pControlJob);
+					}
 				}
 				if (m_pControlJob->state() == CJState::Paused) {
 					LOGI("<Master>ControlJob已经恢复运行");
@@ -889,23 +936,23 @@
 
 				// Fliper(G2) -> Bonder
 				auto pSrcSlot = pVacuumBake->getProcessedSlot(primaryType);
-				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondClass()) {
+				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder1->hasBondGlass()) {
 					m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
-				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondClass()) {
+				if (pSrcSlot != nullptr && !rmd.armState[1] && !pBonder2->hasBondGlass()) {
 					m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
 
 				// VacuumBake(G1) -> Bonder
-				if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
+				if (!rmd.armState[0] && !pBonder1->hasBondGlass()) {
 					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
 
-				if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
+				if (!rmd.armState[0] && !pBonder2->hasBondGlass()) {
 					m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
 					CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
 				}
@@ -950,6 +997,11 @@
 							else {
 								LOGE("<Master>Glass(%s)从等待列队到工艺列队转移失败.",
 									pGlass->getID().c_str());
+							}
+
+							// 这里上报Panel Start事件
+							if (m_listener.onPanelStart != nullptr) {
+								m_listener.onPanelStart(this, pGlass);
 							}
 
 							goto BATCH_PORT_GET;
@@ -1090,7 +1142,7 @@
 				
 				// Bonder1 -> Bonder2
 				if ((m_nContinuousTransferStep == CTStep_Unknow || m_nContinuousTransferStep == CTStep_Fliper_Bonder1)
-					&& !rmd.armState[0] && !pBonder2->hasBondClass()) {
+					&& !rmd.armState[0] && !pBonder2->hasBondGlass()) {
 					m_pActiveRobotTask = createTransferTask_continuous_transfer(pBonder1,
 						1, pBonder2, 1);
 					if (m_pActiveRobotTask != nullptr) {
@@ -1102,7 +1154,7 @@
 
 				// Fliper(G2) -> Bonder1
 				if ((m_nContinuousTransferStep == CTStep_Unknow || m_nContinuousTransferStep == CTStep_Aligner_Fliper)
-					&&!rmd.armState[0] && !pBonder1->hasBondClass()) {
+					&&!rmd.armState[0] && !pBonder1->hasBondGlass()) {
 					m_pActiveRobotTask = createTransferTask_continuous_transfer(pFliper,
 						0, pBonder1, 1);
 					if (m_pActiveRobotTask != nullptr) {
@@ -1310,7 +1362,7 @@
 					if (pGlass == nullptr) {
 						bOk = TRUE;
 						slot = m_pActiveRobotTask->getTarSlot();
-						LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
+						LOGI("<CMaster>onPreStoredJob, 已校验数据一致性.");
 					}
 				}
 
@@ -1321,7 +1373,7 @@
 					if (pGlass == nullptr && m_pActiveRobotTask->getSrcSlot() == port) {
 						bOk = TRUE;
 						slot = m_pActiveRobotTask->getSrcSlot();
-						LOGI("<CMaster>onPreFethedOutJob, 已校验数据一致性.");
+						LOGI("<CMaster>onPreStoredJob, 已校验数据一致性.");
 					}
 				}
 			}
@@ -1384,6 +1436,7 @@
 					if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
 						CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
 						pGlass->complete();
+						this->saveState();
 						bool bMoved = glassFromInPorcessToComplete(pGlass);
 						if (bMoved) {
 							LOGI("<Master>Glass(%s)从工艺列队到完成列队转移成功.",
@@ -1393,14 +1446,29 @@
 							LOGE("<Master>Glass(%s)从工艺列队到完成列队转移失败.",
 								pGlass->getID().c_str());
 						}
+						if (m_listener.onPanelEnd != nullptr) {
+							m_listener.onPanelEnd(this, pGlass);
+						}
 
 						// 检查PJ是否已经完成
 						CProcessJob* pJob = getGlassProcessJob((CGlass*)m_pActiveRobotTask->getContext());
 						if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+							this->saveState();
 							LOGE("<Master>ProcessJob(%s)完成.",
 								pJob->id().c_str());
 							if (m_listener.onPjEnd != nullptr) {
 								m_listener.onPjEnd(this, pJob);
+							}
+
+							// 检查CJ是否已经完成
+							ASSERT(m_pControlJob);
+							if (checkAndUpdateCjComplete(m_pControlJob)) {
+								this->saveState();
+								LOGE("<Master>ControlJob(%s)完成.",
+									m_pControlJob->id().c_str());
+								if (m_listener.onCjEnd != nullptr) {
+									m_listener.onCjEnd(this, pJob);
+								}
 							}
 						}
 					}
@@ -1711,7 +1779,6 @@
 
 
 		// 模拟测试
-		/*
 		static int aaa = 0;
 		aaa++;
 		if (aaa % 30 == 0) {
@@ -1719,6 +1786,12 @@
 				CGlass* pGlass = m_queueGlasses.front();
 				pGlass->start();
 				glassFromQueueToInPorcess(pGlass);
+				this->saveState();
+
+				// 这里上报Panel Start事件
+				if (m_listener.onPanelStart != nullptr) {
+					m_listener.onPanelStart(this, pGlass);
+				}
 			}
 		}
 
@@ -1727,19 +1800,37 @@
 				CGlass* pGlass = m_inProcesGlasses.front();
 				pGlass->complete();
 				glassFromInPorcessToComplete(pGlass);
+				this->saveState();
 
+				// 这里上报Panel End事件
+				if (m_listener.onPanelEnd != nullptr) {
+					m_listener.onPanelEnd(this, pGlass);
+				}
 
 				CProcessJob* pJob = getGlassProcessJob(pGlass);
 				if (pJob != nullptr && checkAndUpdatePjComplete(pJob)) {
+					processJobFromInPorcessToComplete(pJob);
+					this->saveState();
 					LOGE("<Master>ProcessJob(%s)完成.",
 						pJob->id().c_str());
 					if (m_listener.onPjEnd != nullptr) {
 						m_listener.onPjEnd(this, pJob);
 					}
+
+					// 检查CJ是否已经完成
+					ASSERT(m_pControlJob);
+					if (checkAndUpdateCjComplete(m_pControlJob)) {
+						this->saveState();
+						LOGE("<Master>ControlJob(%s)完成.",
+							m_pControlJob->id().c_str());
+						if (m_listener.onCjEnd != nullptr) {
+							m_listener.onCjEnd(this, pJob);
+						}
+					}
 				}
 			}
 		}
-		*/
+		
 	}
 
 	void CMaster::connectEquipments()
@@ -1909,16 +2000,17 @@
 		if (!pSrcEq->IsEnabled()) { 
 			return nullptr;
 		}
-
 		CRobotTask* pTask = nullptr;
 		CSlot* pSrcSlot, * pTarSlot;
+		pSrcEq->m_nTestFlag = m_nTestFlag;
 		pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
 		pSrcSlot = pSrcEq->getProcessedSlot(primaryType, bJobMode);
-		if (pSrcSlot == nullptr || nullptr == pTarSlot) {
+		if (m_nTestFlag == 1) LOGI("createTransferTask 003 %x, %x", pTarSlot, pSrcSlot);
+		if (pSrcSlot == nullptr || nullptr == pTarSlot && secondaryType != SERVO::MaterialsType::G0) {
 			pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
 			pSrcSlot = pSrcEq->getProcessedSlot(secondaryType, bJobMode);
 		}
-
+		if (m_nTestFlag == 1) LOGI("createTransferTask 004 %x, %x", pTarSlot, pSrcSlot);
 
 		if (pSrcSlot != nullptr && nullptr != pTarSlot) {
 			pTask = new CRobotTask();
@@ -2438,8 +2530,8 @@
 		for (const auto pj : pjs) {
 			if (pj->state() == PJState::Queued) {
 				pj->start();
+				return pj;
 			}
-			return pj;
 		}
 
 
@@ -2513,6 +2605,17 @@
 		return false;
 	}
 
+	bool CMaster::processJobFromInPorcessToComplete(CProcessJob* pProcessJob)
+	{
+		auto it = std::find(m_inProcesJobs.begin(), m_inProcesJobs.end(), pProcessJob);
+		if (it != m_inProcesJobs.end()) {
+			m_completeProcessJobs.push_back(*it);
+			m_inProcesJobs.erase(it);
+			return true;
+		}
+		return false;
+	}
+
 	bool CMaster::checkAndUpdatePjComplete(CProcessJob* pJob)
 	{
 		ASSERT(pJob);
@@ -2521,10 +2624,26 @@
 
 		for (auto c : pJob->carriers()) {
 			for (auto g : c.contexts) {
-				CGlass* pGlass = (CGlass*)g;
-				if (pGlass->state() != GlsState::Aborted
-					&& pGlass->state() != GlsState::Completed
-					&& pGlass->state() != GlsState::Failed) return false;
+				auto state = ((CGlass*)g)->state();
+				if (state != GlsState::Aborted && state != GlsState::Completed
+					&& state != GlsState::Failed) return false;
+			}
+		}
+
+		return pJob->complete();
+	}
+
+	bool CMaster::checkAndUpdateCjComplete(CControlJob* pJob)
+	{
+		ASSERT(pJob);
+		auto state = pJob->state();
+		if (state != CJState::Executing && state != CJState::Paused) return false;
+
+		for (auto pj : pJob->getPjs()) {
+			auto state = pj->state();
+			if (state != PJState::Aborted && state != PJState::Completed
+				&& state != PJState::Failed) {
+				return false;
 			}
 		}
 
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 631ff24..2d4d697 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -65,8 +65,12 @@
         ONROBOTTASKEVENT        onRobotTaskEvent;
         ONLOADPORTSTATUSCHANGED	onLoadPortStatusChanged;
         ONCTROUNDEND            onCTRoundEnd;
+        ONPJSTART               onCjStart;
+        ONPJSTART               onCjEnd;
         ONPJSTART               onPjStart;
         ONPJSTART               onPjEnd;
+        ONPJSTART               onPanelStart;
+        ONPJSTART               onPanelEnd;
     } MasterListener;
 
     class CMaster : public IResourceView
@@ -167,7 +171,9 @@
         bool addGlassToQueue(CGlass* pGlass);
         bool glassFromQueueToInPorcess(CGlass* pGlass);
         bool glassFromInPorcessToComplete(CGlass* pGlass);
+        bool processJobFromInPorcessToComplete(CProcessJob* pProcessJob);
         bool checkAndUpdatePjComplete(CProcessJob* pJob);
+        bool checkAndUpdateCjComplete(CControlJob* pJob);
         CProcessJob* getGlassProcessJob(CGlass* pGlass);
 
 
@@ -217,6 +223,7 @@
 
         // 新增已经开始处理的ProcessJob列表
         std::vector<CProcessJob*> m_inProcesJobs;
+        std::vector<CProcessJob*> m_completeProcessJobs;
         std::vector<CGlass*> m_queueGlasses;
         std::vector<CGlass*> m_inProcesGlasses;
         std::vector<CGlass*> m_completeGlasses;
@@ -227,6 +234,8 @@
         SERVO::CControlJob* m_pControlJob;
         std::vector<SERVO::CProcessJob*> m_processJobs;
         std::string m_strStatePath;
+
+        int m_nTestFlag;
     };
 }
 
diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index e96e8a8..1b122ec 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -1874,6 +1874,21 @@
 	return requestEventReportSend("CarrierID_Readed");
 }
 
+int CHsmsPassive::requestEventReportSend_Port_Unload_Ready()
+{
+	return requestEventReportSend("Port_Unload_Ready");
+}
+
+int CHsmsPassive::requestEventReportSend_Port_Load_Ready()
+{
+	return requestEventReportSend("Port_Load_Ready");
+}
+
+int CHsmsPassive::requestEventReportSend_Port_Blocked()
+{
+	return requestEventReportSend("Port_Blocked");
+}
+
 int CHsmsPassive::requestEventReportSend_PJ_Queued()
 {
 	return requestEventReportSend("PJ_Queued");
@@ -1889,6 +1904,25 @@
 	return requestEventReportSend("PJ_End");
 }
 
+int CHsmsPassive::requestEventReportSend_CJ_Start()
+{
+	return requestEventReportSend("CJ_Start");
+}
+
+int CHsmsPassive::requestEventReportSend_CJ_End()
+{
+	return requestEventReportSend("CJ_End");
+}
+
+int CHsmsPassive::requestEventReportSend_Panel_Start()
+{
+	return requestEventReportSend("Panel_Start");
+}
+
+int CHsmsPassive::requestEventReportSend_Panel_End()
+{
+	return requestEventReportSend("Panel_End");
+}
 
 
 
diff --git a/SourceCode/Bond/Servo/HsmsPassive.h b/SourceCode/Bond/Servo/HsmsPassive.h
index f423b9e..1863abd 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.h
+++ b/SourceCode/Bond/Servo/HsmsPassive.h
@@ -191,9 +191,16 @@
 	int requestEventReportSend(unsigned int CEID);
 	int requestEventReportSend(const char* pszEventName);
 	int requestEventReportSend_CarrierID_Readed();
+	int requestEventReportSend_Port_Unload_Ready();
+	int requestEventReportSend_Port_Load_Ready();
+	int requestEventReportSend_Port_Blocked();
 	int requestEventReportSend_PJ_Queued();
 	int requestEventReportSend_PJ_Start();
 	int requestEventReportSend_PJ_End();
+	int requestEventReportSend_CJ_Start();
+	int requestEventReportSend_CJ_End();
+	int requestEventReportSend_Panel_Start();
+	int requestEventReportSend_Panel_End();
 
 private:
 	void replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName);
diff --git a/SourceCode/Bond/Servo/Model.cpp b/SourceCode/Bond/Servo/Model.cpp
index b71d072..d7fa9d9 100644
--- a/SourceCode/Bond/Servo/Model.cpp
+++ b/SourceCode/Bond/Servo/Model.cpp
@@ -382,10 +382,42 @@
 			}
 			m_hsmsPassive.requestEventReportSend_CarrierID_Readed();
 		}
+		else if (status == PORT_BLOCKED) {
+			SERVO::CLoadPort* pLoadPort = dynamic_cast<SERVO::CLoadPort*>(pEquipment);
+			if (pLoadPort != nullptr) {
+				m_hsmsPassive.setVariableValue("BlockedPortId", pLoadPort->getID());
+			}
+			m_hsmsPassive.requestEventReportSend_Port_Blocked();
+		}
+		else if (status == PORT_LOAD_READY) {
+			SERVO::CLoadPort* pLoadPort = dynamic_cast<SERVO::CLoadPort*>(pEquipment);
+			if (pLoadPort != nullptr) {
+				m_hsmsPassive.setVariableValue("LoadReadyPortId", pLoadPort->getID());
+			}
+			m_hsmsPassive.requestEventReportSend_Port_Load_Ready();
+		}
+		else if (status == PORT_UNLOAD_READY) {
+			SERVO::CLoadPort* pLoadPort = dynamic_cast<SERVO::CLoadPort*>(pEquipment);
+			if (pLoadPort != nullptr) {
+				m_hsmsPassive.setVariableValue("UnloadReadyPortId", pLoadPort->getID());
+			}
+			m_hsmsPassive.requestEventReportSend_Port_Unload_Ready();
+		}
 		notifyPtr(RX_CODE_LOADPORT_STATUS_CHANGED, pEquipment);
 	};
 	masterListener.onCTRoundEnd = [&](void* pMaster, int round) {
 		m_configuration.setContinuousTransferCount(round);
+	};
+	masterListener.onCjStart = [&](void* pMaster, void* pj) {
+		m_hsmsPassive.setVariableValue("CJStartID", ((SERVO::CControlJob*)pj)->id().c_str());
+		m_hsmsPassive.requestEventReportSend_CJ_Start();
+	};
+	masterListener.onCjEnd = [&](void* pMaster, void* pj) {
+		m_hsmsPassive.setVariableValue("CJEndID", ((SERVO::CControlJob*)pj)->id().c_str());
+		m_hsmsPassive.requestEventReportSend_CJ_End();
+
+		// 结批,保存ControlJob
+		// 
 	};
 	masterListener.onPjStart = [&](void* pMaster, void* pj) {
 		m_hsmsPassive.setVariableValue("PJStartID", ((SERVO::CProcessJob*)pj)->id().c_str());
@@ -395,6 +427,14 @@
 		m_hsmsPassive.setVariableValue("PJEndID", ((SERVO::CProcessJob*)pj)->id().c_str());
 		m_hsmsPassive.requestEventReportSend_PJ_End();
 	};
+	masterListener.onPanelStart = [&](void* pMaster, void* pj) {
+		m_hsmsPassive.setVariableValue("PanelStartID", ((SERVO::CGlass*)pj)->getID().c_str());
+		m_hsmsPassive.requestEventReportSend_Panel_Start();
+	};
+	masterListener.onPanelEnd = [&](void* pMaster, void* pj) {
+		m_hsmsPassive.setVariableValue("PanelEndID", ((SERVO::CGlass*)pj)->getID().c_str());
+		m_hsmsPassive.requestEventReportSend_Panel_End();
+	};
 	m_master.setListener(masterListener);
 	m_master.setContinuousTransferCount(m_configuration.getContinuousTransferCount());
 
diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 8b0f98f..a8969fe 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -317,6 +317,7 @@
 	}
 
     // 鑾峰彇 Grid 琛ㄦ牸涓� Slot 鐘舵�侊紙绗�1~8琛岋級
+    /*
     for (int i = 1; i <= SLOT_MAX; ++i) {
         SERVO::CGlass* pGlass = (SERVO::CGlass*)m_wndGrid.GetItemData(i, 0);
         if (pGlass != nullptr) {
@@ -324,6 +325,7 @@
             ASSERT(pCheck);
             pGlass->setScheduledForProcessing(pCheck->GetCheck());
             pGlass->setType(static_cast<SERVO::MaterialsType>(config.nMaterialType));
+            LOGI("i: %d, nMaterialType:%d", i, config.nMaterialType);
 
             SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
             pJobDataS->setLotId(config.strLotID.c_str());
@@ -359,6 +361,56 @@
             }
         }
     }
+    */
+
+
+    // 鎵撳嬀涓烘洿鏂扮被鍨嬶紝鏆傛椂娴嬭瘯浣跨敤锛屽師鎵撹壊涓烘槸鍚﹀姞宸�
+    for (int i = 1; i <= SLOT_MAX; ++i) {
+        SERVO::CGlass* pGlass = (SERVO::CGlass*)m_wndGrid.GetItemData(i, 0);
+        if (pGlass != nullptr) {
+            CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
+            ASSERT(pCheck);
+            pGlass->setScheduledForProcessing(TRUE);
+            if (pCheck->GetCheck()) {
+                pGlass->setType(static_cast<SERVO::MaterialsType>(config.nMaterialType));
+                LOGI("i: %d, nMaterialType:%d", i, config.nMaterialType);
+
+                SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
+                pJobDataS->setLotId(config.strLotID.c_str());
+                pJobDataS->setProductId(config.strProductID.c_str());
+                pJobDataS->setOperationId(config.strOperationID.c_str());
+                pJobDataS->setMaterialsType(config.nMaterialType);
+
+                RecipeInfo stRecipeInfo = RecipeManager::getInstance().getRecipeByPPID(config.strRecipe);
+                std::vector<DeviceRecipe> vecRecipeInfo = stRecipeInfo.vecDeviceList;
+
+                for (const auto& info : vecRecipeInfo) {
+                    const std::string& name = info.strDeviceName;
+                    short nRecipeID = (short)info.nRecipeID;
+
+                    if (name == EQ_NAME_EFEM) {
+                        pJobDataS->setDeviceRecipeId(0, nRecipeID);
+                    }
+                    else if (name == EQ_NAME_BONDER1) {
+                        pJobDataS->setDeviceRecipeId(1, nRecipeID);
+                    }
+                    else if (name == EQ_NAME_BONDER2) {
+                        pJobDataS->setDeviceRecipeId(2, nRecipeID);
+                    }
+                    else if (name == EQ_NAME_BAKE_COOLING) {
+                        pJobDataS->setDeviceRecipeId(3, nRecipeID);
+                    }
+                    else if (name == EQ_NAME_VACUUMBAKE) {
+                        pJobDataS->setDeviceRecipeId(4, nRecipeID);
+                    }
+                    else if (name == EQ_NAME_MEASUREMENT) {
+                        pJobDataS->setDeviceRecipeId(5, nRecipeID);
+                    }
+                }
+            }
+        }
+    }
+
 
     GetDlgItem(IDC_BUTTON_PROCESS_START)->EnableWindow(TRUE);
     GetDlgItem(IDC_BUTTON_PROCESS_CANCEL)->EnableWindow(TRUE);
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.user b/SourceCode/Bond/Servo/Servo.vcxproj.user
index 0c03257..82c7903 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.user
+++ b/SourceCode/Bond/Servo/Servo.vcxproj.user
@@ -7,6 +7,6 @@
     <RemoteDebuggerCommand>\\DESKTOP-IODBVIQ\Servo\Debug\Servo.exe</RemoteDebuggerCommand>
     <RemoteDebuggerWorkingDirectory>\\DESKTOP-IODBVIQ\Servo\Debug\</RemoteDebuggerWorkingDirectory>
     <RemoteDebuggerServerName>DESKTOP-IODBVIQ</RemoteDebuggerServerName>
-    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
+    <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor>
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/ServoCommo.h b/SourceCode/Bond/Servo/ServoCommo.h
index dea7370..8c4c7ea 100644
--- a/SourceCode/Bond/Servo/ServoCommo.h
+++ b/SourceCode/Bond/Servo/ServoCommo.h
@@ -73,6 +73,7 @@
 	};
 
 	enum class MaterialsType {
+		G0 = 0,
 		G1 = 1,
 		G2 = 2,
 		G1G2 = 3
diff --git a/SourceCode/Bond/Servo/ServoDlg.cpp b/SourceCode/Bond/Servo/ServoDlg.cpp
index 5d2e6d5..c1a4238 100644
--- a/SourceCode/Bond/Servo/ServoDlg.cpp
+++ b/SourceCode/Bond/Servo/ServoDlg.cpp
@@ -242,7 +242,7 @@
 						pEq2 = theApp.m_model.getMaster().getEquipment(pTask->getTarPosition());
 						if (pEq1 != nullptr && pEq2 != nullptr) {
 							CString strText;
-							if (theApp.m_model.getMaster().getContinuousTransferCount() > 0) {
+							if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) {
 								strText.Format(_T("[%d]%s --> %s"),
 									theApp.m_model.getMaster().getContinuousTransferCount(),
 									pEq1->getName().c_str(), pEq2->getName().c_str());
diff --git a/SourceCode/Bond/x64/Debug/CollectionEventList.txt b/SourceCode/Bond/x64/Debug/CollectionEventList.txt
index 7d2dd32..f955838 100644
--- a/SourceCode/Bond/x64/Debug/CollectionEventList.txt
+++ b/SourceCode/Bond/x64/Debug/CollectionEventList.txt
@@ -40,4 +40,12 @@
 50000,CarrierID_Readed,,(50000)
 50001,PJ_Queued,,(50001)
 50002,PJ_Start,,(50002)
-50002,PJ_End,,(50003)
+50003,PJ_End,,(50003)
+50004,Panel_Start,,(50004)
+50005,Panel_End,,(50005)
+50006,CJ_Start,,(50006)
+50007,CJ_End,,(50007)
+50008,Port_Unload_Ready,,(50008)
+50009,Port_Load_Ready,,(50009)
+50010,Port_Blocked,,(50010)
+
diff --git a/SourceCode/Bond/x64/Debug/ReportList.txt b/SourceCode/Bond/x64/Debug/ReportList.txt
index 5e9be61..ceadc9c 100644
--- a/SourceCode/Bond/x64/Debug/ReportList.txt
+++ b/SourceCode/Bond/x64/Debug/ReportList.txt
@@ -18,4 +18,13 @@
 50000,(5000)
 50001,(5003)
 50002,(5004)
+50003,(5005)
+50004,(5006)
+50005,(5007)
+50006,(5008)
+50007,(5009)
+50008,(5010)
+50009,(5011)
+50010,(5012)
+
 
diff --git a/SourceCode/Bond/x64/Debug/VariableList.txt b/SourceCode/Bond/x64/Debug/VariableList.txt
index 84f4e7a..659b40e 100644
--- a/SourceCode/Bond/x64/Debug/VariableList.txt
+++ b/SourceCode/Bond/x64/Debug/VariableList.txt
@@ -8,34 +8,42 @@
 701,PreviousProcessState,U1,
 800,EFEMPPExecName,A20,
 801,EQPPExecName,A20,
-2000,RbRAxisTorque,I2,机器人R轴扭矩
-2001,RbLAxisTorque,l2,机器人L轴扭矩
-2002,RbZAxisTorque,l2,机器人Z轴扭矩
-2003,RbTHAxisTorque,l2,机器人TH轴扭矩
-2004,RbXAxisTorque,l2,机器人X轴扭矩
-2005,AxisX111,l2,X111相机前移栽电机扭矩
-2006,AxisX112,l2,X112相机后移栽电机扭矩
-2007,AxisU113,l2,U113产品旋转电机扭矩
-2008,AxisX114,l2,X114产品左整列电机扭矩
-2009,AxisY121,l2,Y121产品右整列电机扭矩
-2010,AxisY122,l2,Y122产品前整列电机扭矩
-2011,AxisY123,l2,Y123产品后阵列电机扭矩
-2012,MainAir,U2,总进气压力值
-2013,MainVacuum,l2,总真空压力值
-2014,RbMainVacuum,l2,机器人真空值
-2015,LPMainVacuum,l2,LP真空值#D265
-2016,LPMainAir,U2,LP压空值
-2017,ALVacuum,l2,Aligner真空值
-2018,FFU1RPM,U2,FFU1转速
-2019,FFU2RPM,U2,FFU2转速
-2020,FFU3RPM,U2,FFU3转速
-2021,FFU4RPM,U2,FFU4转速
-2022,ESDValue,I2,静电检测值
-2023,OCREnable,U2,"OCR使能:O:开启 1:屏蔽"
-2024,CCDEnable,U2,"CCD使能:O:开启 1:屏蔽"
-2025,FFUParameter,U2,FFU设定值
-5000,CarrierID,A20,卡匣ID
+2000,RbRAxisTorque,I2,鏈哄櫒浜篟杞存壄鐭�
+2001,RbLAxisTorque,l2,鏈哄櫒浜篖杞存壄鐭�
+2002,RbZAxisTorque,l2,鏈哄櫒浜篫杞存壄鐭�
+2003,RbTHAxisTorque,l2,鏈哄櫒浜篢H杞存壄鐭�
+2004,RbXAxisTorque,l2,鏈哄櫒浜篨杞存壄鐭�
+2005,AxisX111,l2,X111鐩告満鍓嶇Щ鏍界數鏈烘壄鐭�
+2006,AxisX112,l2,X112鐩告満鍚庣Щ鏍界數鏈烘壄鐭�
+2007,AxisU113,l2,U113浜у搧鏃嬭浆鐢垫満鎵煩
+2008,AxisX114,l2,X114浜у搧宸︽暣鍒楃數鏈烘壄鐭�
+2009,AxisY121,l2,Y121浜у搧鍙虫暣鍒楃數鏈烘壄鐭�
+2010,AxisY122,l2,Y122浜у搧鍓嶆暣鍒楃數鏈烘壄鐭�
+2011,AxisY123,l2,Y123浜у搧鍚庨樀鍒楃數鏈烘壄鐭�
+2012,MainAir,U2,鎬昏繘姘斿帇鍔涘��
+2013,MainVacuum,l2,鎬荤湡绌哄帇鍔涘��
+2014,RbMainVacuum,l2,鏈哄櫒浜虹湡绌哄��
+2015,LPMainVacuum,l2,LP鐪熺┖鍊�#D265
+2016,LPMainAir,U2,LP鍘嬬┖鍊�
+2017,ALVacuum,l2,Aligner鐪熺┖鍊�
+2018,FFU1RPM,U2,FFU1杞��
+2019,FFU2RPM,U2,FFU2杞��
+2020,FFU3RPM,U2,FFU3杞��
+2021,FFU4RPM,U2,FFU4杞��
+2022,ESDValue,I2,闈欑數妫�娴嬪��
+2023,OCREnable,U2,"OCR浣胯兘锛歄:寮�鍚� 1锛氬睆钄�"
+2024,CCDEnable,U2,"CCD浣胯兘锛歄:寮�鍚� 1锛氬睆钄�"
+2025,FFUParameter,U2,FFU璁惧畾鍊�
+5000,CarrierID,A20,鍗″專ID
 5001,CJobSpace,U1,CJ Space
 5002,PJobSpace,U1,PJ Space
 5003,PJQueued,L,PJ Queued
-5004,PJStartID,A20,PJStartID
\ No newline at end of file
+5004,PJStartID,A20,PJStartID
+5005,PJEndID,A20,PJEndID
+5006,PanelStartID,A20,PanelStartID
+5007,PanelEndID,A20,PanelEndID
+5008,CJStartID,A20,CJStartID
+5009,CJEndID,A20,CJEndID
+5010,UnloadReadyPortId,U2,"Port ID"
+5011,LoadReadyPortId,U2,"Port ID"
+5012,BlockedPortId,U2,"Port ID"
\ No newline at end of file

--
Gitblit v1.9.3