From cb9456e93002220b7247fadac088c7bddf6908d3 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期日, 01 二月 2026 21:03:23 +0800
Subject: [PATCH] 1.LoadPort1装G1,LoadPort2装G2, LoadPort3装G1, LoadPort4装G4, 加工完成回到G1的原位。按此增加生产模式的调度和连接图;

---
 SourceCode/Bond/Servo/Configuration.h   |    1 
 SourceCode/Bond/x64/Debug/EqsGraph.ini  |   58 +++++-----
 SourceCode/Bond/Servo/CAligner.cpp      |    2 
 SourceCode/Bond/Servo/CMaster.cpp       |  165 ++++++++++++++++++++++++++++-----
 SourceCode/Bond/Servo/Configuration.cpp |    6 +
 SourceCode/Bond/Servo/CMaster.h         |   10 ++
 SourceCode/Bond/Servo/Model.cpp         |    4 
 7 files changed, 192 insertions(+), 54 deletions(-)

diff --git a/SourceCode/Bond/Servo/CAligner.cpp b/SourceCode/Bond/Servo/CAligner.cpp
index e15bfe0..ebbfd1a 100644
--- a/SourceCode/Bond/Servo/CAligner.cpp
+++ b/SourceCode/Bond/Servo/CAligner.cpp
@@ -35,6 +35,8 @@
 		LOGD("<CAligner>initPins");
 		addPin(SERVO::PinType::INPUT, _T("In1"));
 		addPin(SERVO::PinType::INPUT, _T("In2"));
+		addPin(SERVO::PinType::INPUT, _T("In3"));
+		addPin(SERVO::PinType::INPUT, _T("In4"));
 		addPin(SERVO::PinType::OUTPUT, _T("Out1"));
 		addPin(SERVO::PinType::OUTPUT, _T("Out2"));
 	}
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index d9fb326..707f808 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -63,6 +63,7 @@
 		m_ullRunTime = 0;
 		m_state = MASTERSTATE::READY;
 		m_curveMode = CurveMode::Production;
+		m_schedulingMode = SchedulingMode::Production;
 		m_pActiveRobotTask = nullptr;
 		m_nLastError = ER_CODE_NOERROR;
 		m_isCompareMapsBeforeProceeding = FALSE;
@@ -310,6 +311,17 @@
 	CurveMode CMaster::getCurveMode() const
 	{
 		return m_curveMode;
+	}
+
+	void CMaster::setSchedulingMode(SchedulingMode mode)
+	{
+		m_schedulingMode = mode;
+		LOGI("<Master>SchedulingMode=%s", mode == SchedulingMode::Production ? "Production" : "Tuning");
+	}
+
+	SchedulingMode CMaster::getSchedulingMode() const
+	{
+		return m_schedulingMode;
 	}
 
 	int CMaster::term()
@@ -746,14 +758,22 @@
 
 
 				// Measurement -> LoadPort
-				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], MaterialsType::G1, secondaryType);
-						if (m_pActiveRobotTask != nullptr) {
-							goto PORT_PUT;
+				if (m_schedulingMode == SchedulingMode::Production) {
+					if (!rmd.armState[0]) {
+						m_pActiveRobotTask = createTransferTask_returnOrigin(pMeasurement, pLoadPorts);
+						CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
+					}
+				}
+				else {
+					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], MaterialsType::G1, secondaryType);
+							if (m_pActiveRobotTask != nullptr) {
+								goto PORT_PUT;
+							}
 						}
 					}
 				}
@@ -1008,19 +1028,27 @@
 				// 缁勬暟闂ㄩ檺锛氣墺2 缁勬椂涓嶅啀浠� LP 涓婄墖锛岄伩鍏嶅爢绉紙涓庡崟鐗囦竴鑷达級
 				bool blockLoadFromLP = (nGlassGroup >= 2);
 
-				// 7) Measurement -> LoadPort锛堝浐瀹氾細G1 浼樺厛鍥� LP锛�
+				// 7) Measurement -> LoadPort
 				if (rmd.armState[0] || rmd.armState[1]) {
 					LOGD("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], MaterialsType::G1, secondaryType);
-						if (m_pActiveRobotTask != nullptr) { goto BATCH_PORT_PUT; }
+				if (m_schedulingMode == SchedulingMode::Production) {
+					if (!rmd.armState[0]) {
+						m_pActiveRobotTask = createTransferTask_returnOrigin(pMeasurement, pLoadPorts);
+						CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
+					}
+				}
+				else {
+					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], MaterialsType::G1, secondaryType);
+							if (m_pActiveRobotTask != nullptr) { goto BATCH_PORT_PUT; }
+						}
 					}
 				}
 
@@ -2449,11 +2477,19 @@
 
 		nRet = pLoadPort1->getPin("Out")->connectPin(pAligner->getPin("In1"));
 		if (nRet < 0) {
-			LOGE("杩炴帴LoadPort1-Fliper澶辫触");
+			LOGE("杩炴帴LoadPort1-Aligner澶辫触");
 		}
 		nRet = pLoadPort2->getPin("Out")->connectPin(pAligner->getPin("In2"));
 		if (nRet < 0) {
-			LOGE("杩炴帴LoadPort1-Fliper澶辫触");
+			LOGE("杩炴帴LoadPort2-Aligner澶辫触");
+		}
+		nRet = pLoadPort3->getPin("Out")->connectPin(pAligner->getPin("In3"));
+		if (nRet < 0) {
+			LOGE("杩炴帴LoadPort3-Aligner澶辫触");
+		}
+		nRet = pLoadPort4->getPin("Out")->connectPin(pAligner->getPin("In4"));
+		if (nRet < 0) {
+			LOGE("杩炴帴LoadPort4-Aligner澶辫触");
 		}
 
 		nRet = pAligner->getPin("Out1")->connectPin(pFliper->getPin("In"));
@@ -2498,14 +2534,29 @@
 			LOGE("杩炴帴BakeCooling-LoadPort3澶辫触");
 		}
 
-		nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort3->getPin("In"));
-		if (nRet < 0) {
-			LOGE("杩炴帴BakeCooling-LoadPort3澶辫触");
-		}
+		if (m_schedulingMode == SchedulingMode::Production) {
+			// 鐢熶骇妯″紡锛氭祴閲忚緭鍑哄洖鍒� G1 鍘熶綅锛堥粯璁� Port1 / Port3锛�
+			nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort1->getPin("In"));
+			if (nRet < 0) {
+				LOGE("杩炴帴Measurement-LoadPort1澶辫触");
+			}
 
-		nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort4->getPin("In"));
-		if (nRet < 0) {
-			LOGE("杩炴帴BakeCooling-LoadPort4澶辫触");
+			nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort3->getPin("In"));
+			if (nRet < 0) {
+				LOGE("杩炴帴Measurement-LoadPort3澶辫触");
+			}
+		}
+		else {
+			// 璋冩満妯″紡锛氱淮鎸佸師杩炴帴锛圤ut1->Port3, Out2->Port4锛�
+			nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort3->getPin("In"));
+			if (nRet < 0) {
+				LOGE("杩炴帴Measurement-LoadPort3澶辫触");
+			}
+
+			nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort4->getPin("In"));
+			if (nRet < 0) {
+				LOGE("杩炴帴Measurement-LoadPort4澶辫触");
+			}
 		}
 	}
 
@@ -2735,6 +2786,57 @@
 		return pTask;
 	}
 
+	CRobotTask* CMaster::createTransferTask_returnOrigin(CEquipment* pEqSrc, CLoadPort** pPorts)
+	{
+		if (!pEqSrc->IsEnabled()) {
+			return nullptr;
+		}
+
+		CSlot* pSrcSlot = pEqSrc->getProcessedSlot(MaterialsType::G1, m_bJobMode);
+		if (pSrcSlot == nullptr) {
+			return nullptr;
+		}
+
+		CGlass* pGlass = (CGlass*)pSrcSlot->getContext();
+		if (pGlass == nullptr) {
+			return nullptr;
+		}
+
+		int port = 0, slot = 0;
+		pGlass->getOrginPort(port, slot);
+		if (port < 0 || port >= 4 || slot < 0 || slot >= SLOT_MAX) {
+			return nullptr;
+		}
+
+		CLoadPort* pPort = pPorts[port];
+		if (pPort == nullptr || !pPort->isEnable()) {
+			return nullptr;
+		}
+		PortType pt = pPort->getPortType();
+		if (!(pt == PortType::Unloading || pt == PortType::Both)) {
+			return nullptr;
+		}
+		if (pPort->getPortStatus() != PORT_INUSE) {
+			return nullptr;
+		}
+
+		CSlot* pTarSlot = pPort->getSlot(slot);
+		if (pTarSlot == nullptr) {
+			return nullptr;
+		}
+		if (!pTarSlot->isEnable() || pTarSlot->isLock() || pTarSlot->getContext() != nullptr) {
+			return nullptr;
+		}
+
+		CRobotTask* pTask = new CRobotTask();
+		pTask->setContext(pSrcSlot->getContext());
+		pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
+		taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
+			pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+
+		return pTask;
+	}
+
 	CRobotTask* CMaster::createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
 		CEquipment* pTarEq, int nTarSlot, int armNo/* = 1*/)
 	{
@@ -2844,6 +2946,19 @@
 		pPort->localSetCessetteType(type);
 	}
 
+	void CMaster::applySchedulingModePortMapping()
+	{
+		// 鐢熶骇妯″紡锛氬浐瀹� Port1/Port3 涓� G1锛孭ort2/Port4 涓� G2锛圙4 鏈畾涔夛紝鎸� G2 澶勭悊锛�
+		if (m_schedulingMode != SchedulingMode::Production) {
+			return;
+		}
+
+		setPortCassetteType(0, SERVO::CassetteType::G1);
+		setPortCassetteType(1, SERVO::CassetteType::G2);
+		setPortCassetteType(2, SERVO::CassetteType::G1);
+		setPortCassetteType(3, SERVO::CassetteType::G2);
+	}
+
 	void CMaster::setPortEnable(unsigned int index, BOOL bEnable)
 	{
 		ASSERT(index < 4);
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 20d4c3d..856dde3 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -59,6 +59,11 @@
         EmptyChamber
     };
 
+    enum class SchedulingMode {
+        Production = 0, // 鐢熶骇妯″紡锛堟寜瀹㈡埛鎸囧畾Port鏄犲皠锛�
+        Tuning = 1      // 璋冩満妯″紡锛堝師鏈夎皟搴﹂�昏緫锛�
+    };
+
     typedef std::function<void(void* pMaster, MASTERSTATE state)> ONMASTERSTATECHANGED;
     typedef std::function<void(void* pMaster, CEquipment* pEiuipment, BOOL bAlive)> ONEQALIVE;
     typedef std::function<void(CStep* pStep, int code, void* pData)> ONEQSTEPEVENT;
@@ -124,6 +129,9 @@
         MASTERSTATE getState();
         void setCurveMode(CurveMode mode);
         CurveMode getCurveMode() const;
+        void setSchedulingMode(SchedulingMode mode);
+        SchedulingMode getSchedulingMode() const;
+        void applySchedulingModePortMapping();
         unsigned DispatchProc();
         unsigned ReadBitsProc();
         void onTimer(UINT nTimerid);
@@ -194,6 +202,7 @@
         CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq);
         CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq);
         CRobotTask* createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts);
+        CRobotTask* createTransferTask_returnOrigin(CEquipment* pEqSrc, CLoadPort** pPorts);
         CRobotTask* createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
             CEquipment* pTarEq, int nTarSlot, int armNo = 1);
 
@@ -278,6 +287,7 @@
         // 鍦ㄥ紑濮嬪伐鑹哄墠鏄惁闇�瑕佸厛姣旇緝 map
         BOOL m_isCompareMapsBeforeProceeding;
         BOOL m_bJobMode;
+        SchedulingMode m_schedulingMode;
 
         // 鍗冧紶鍦堟暟璁℃暟
         int m_nContinuousTransferCount;
diff --git a/SourceCode/Bond/Servo/Configuration.cpp b/SourceCode/Bond/Servo/Configuration.cpp
index a2434b1..285cfa3 100644
--- a/SourceCode/Bond/Servo/Configuration.cpp
+++ b/SourceCode/Bond/Servo/Configuration.cpp
@@ -175,6 +175,12 @@
 	return GetPrivateProfileInt(_T("Master"), _T("JobMode"), 0, m_strFilepath);
 }
 
+int CConfiguration::getSchedulingMode()
+{
+	// 0: Production, 1: Tuning (default to Production)
+	return GetPrivateProfileInt(_T("Master"), _T("SchedulingMode"), 0, m_strFilepath);
+}
+
 void CConfiguration::setContinuousTransferCount(int round)
 {
 	WritePrivateProfileString(_T("Master"), _T("CTRound"),
diff --git a/SourceCode/Bond/Servo/Configuration.h b/SourceCode/Bond/Servo/Configuration.h
index 9c6aaf7..323a227 100644
--- a/SourceCode/Bond/Servo/Configuration.h
+++ b/SourceCode/Bond/Servo/Configuration.h
@@ -29,6 +29,7 @@
 	BOOL setPortEnable(unsigned int index, BOOL bEnable);
 	BOOL isCompareMapsBeforeProceeding();
 	BOOL isJobMode();
+	int getSchedulingMode();
 	void setContinuousTransferCount(int round);
 	int getContinuousTransferCount();
 	int getPortCassetteSnSeed(int port);
diff --git a/SourceCode/Bond/Servo/Model.cpp b/SourceCode/Bond/Servo/Model.cpp
index 358a582..ce8ee46 100644
--- a/SourceCode/Bond/Servo/Model.cpp
+++ b/SourceCode/Bond/Servo/Model.cpp
@@ -272,6 +272,9 @@
 		int seed = m_configuration.getPortCassetteSnSeed(i + 1);
 		m_master.setPortCassetteSnSeed(i + 1, seed);
 	}
+
+	// 鎸夎皟搴︽ā寮忚鍐欑敓浜х鍙i厤缃�
+	m_master.applySchedulingModePortMapping();
 }
 
 void CModel::setPortType(unsigned int index, SERVO::PortType type)
@@ -1129,6 +1132,7 @@
 	m_master.setCacheFilepath((LPTSTR)(LPCTSTR)strMasterDataFile);
 	m_master.setCompareMapsBeforeProceeding(m_configuration.isCompareMapsBeforeProceeding());
 	m_master.setJobMode(m_configuration.isJobMode());
+	m_master.setSchedulingMode((SERVO::SchedulingMode)m_configuration.getSchedulingMode());
 
 	// 鍔犳埅Job
 	strMasterDataFile.Format(_T("%s\\MasterState.dat"), (LPTSTR)(LPCTSTR)m_strWorkDir);
diff --git a/SourceCode/Bond/x64/Debug/EqsGraph.ini b/SourceCode/Bond/x64/Debug/EqsGraph.ini
index 8a58491..4dada3b 100644
--- a/SourceCode/Bond/x64/Debug/EqsGraph.ini
+++ b/SourceCode/Bond/x64/Debug/EqsGraph.ini
@@ -1,51 +1,51 @@
 [LoadPort 1]
-Left=23
-Top=87
+Left=44
+Top=64
 [LoadPort 2]
-Left=23
-Top=437
+Left=30
+Top=317
 [LoadPort 3]
-Left=1253
-Top=297
+Left=70
+Top=615
 [LoadPort 4]
-Left=1253
-Top=457
+Left=57
+Top=466
 [EFEM(ROBOT)]
-Left=294
-Top=63
+Left=381
+Top=42
 [Bonder 1]
-Left=659
-Top=297
+Left=762
+Top=317
 [Bonder 2]
-Left=659
-Top=437
+Left=781
+Top=504
 [Fliper]
 Left=279
 Top=297
 [Aligner]
-Left=210
+Left=320
 Top=317
 [VacuumBake]
 Left=279
 Top=437
 [BakeCooling]
-Left=853
-Top=363
+Left=994
+Top=317
 [ARM]
-Left=628
-Top=63
+Left=722
+Top=42
 [Arm Tray1]
-Left=467
-Top=63
+Left=554
+Top=42
 [Arm Tray2]
-Left=467
-Top=167
+Left=554
+Top=141
 [Fliper(G2)]
-Left=413
-Top=285
+Left=529
+Top=317
 [VacuumBake(G1)]
-Left=413
-Top=437
+Left=529
+Top=466
 [Measurement]
-Left=1041
-Top=363
+Left=1207
+Top=317

--
Gitblit v1.9.3