From cacf29e9e6a5c080688e25e87850ddfb5148f0f2 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期一, 15 十二月 2025 12:25:38 +0800
Subject: [PATCH] 1.通过从mes下发的job,提取map,设置到loadport里;

---
 SourceCode/Bond/Servo/CLoadPort.h   |    7 ++-
 SourceCode/Bond/Servo/CMaster.cpp   |   20 +++++++++-
 SourceCode/Bond/Servo/CLoadPort.cpp |   76 ++++++++++++++++++++------------------
 3 files changed, 62 insertions(+), 41 deletions(-)

diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index ebd1690..73549bf 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1,4 +1,4 @@
-#include "stdafx.h"
+锘�#include "stdafx.h"
 #include "CLoadPort.h"
 #include "CGlassPool.h"
 #include "Servo.h"
@@ -17,6 +17,7 @@
 		m_bAutoChangeEnable = FALSE;
 		m_nNextCassetteSequenceNo = 0;
 		m_isCompareMapsBeforeProceeding = FALSE;
+		m_downloadCassetteMap = 0;
 	}
 
 	CLoadPort::~CLoadPort()
@@ -40,16 +41,16 @@
 		CEquipment::term();
 	}
 
-	// 必须要实现的虚函数,在此初始化Pin列表
+	// 蹇呴』瑕佸疄鐜扮殑铏氬嚱鏁帮紝鍦ㄦ鍒濆鍖朠in鍒楄〃
 	void CLoadPort::initPins()
 	{
-		// 加入Pin初始化代码
+		// 鍔犲叆Pin鍒濆鍖栦唬鐮�
 		LOGD("<CLoadPort>initPins");
 		addPin(SERVO::PinType::INPUT, _T("In"));
 		addPin(SERVO::PinType::OUTPUT, _T("Out"));
 	}
 
-	// 必须要实现的虚函数,在此初始化Slot信息
+	// 蹇呴』瑕佸疄鐜扮殑铏氬嚱鏁帮紝鍦ㄦ鍒濆鍖朣lot淇℃伅
 	void CLoadPort::initSlots()
 	{
 		for (int i = 0; i < SLOT_MAX; i++) {
@@ -351,7 +352,7 @@
 		CEquipment::onTimer(nTimerid);
 
 
-		// 从配置读出的enable,初始化时写给efem
+		// 浠庨厤缃鍑虹殑enable锛屽垵濮嬪寲鏃跺啓缁檈fem
 		static int i_enable[4] = { 0 };
 		if ((++i_enable[m_nIndex]) == 20 + m_nIndex) {
 			eablePort(m_bEnable, [&](int code) -> int {
@@ -362,7 +363,7 @@
 
 
 
-		// 模拟测试
+		// 妯℃嫙娴嬭瘯
 		/*
 		if (m_nIndex == 0) {
 			static int ii = 0;
@@ -934,7 +935,7 @@
 		m_portStatusReport.copyEx(portStatusReport);
 
 
-		// 当port状态为InUse, 比较map
+		// 褰損ort鐘舵�佷负InUse, 姣旇緝map
 		if (m_portStatusReport.getPortStatus() == PORT_INUSE) {
 			if (m_isCompareMapsBeforeProceeding) {
 				short scanMap = getScanCassetteMap();
@@ -946,14 +947,14 @@
 				else {
 					this->sendCassetteCtrlCmd(CCC_PROCESS_CANCEL, nullptr, 0, 0, 0, nullptr, nullptr);
 
-					// 抛出到应用层做提示
+					// 鎶涘嚭鍒板簲鐢ㄥ眰鍋氭彁绀�
 					if (m_listener.onMapMismatch != nullptr) {
 						m_listener.onMapMismatch(this, scanMap, downloadMap);
 					}
 				}
 			}
 			else {
-				// 抛出到应用层做选择要加工的片子
+				// 鎶涘嚭鍒板簲鐢ㄥ眰鍋氶�夋嫨瑕佸姞宸ョ殑鐗囧瓙
 				generateGlassList(getScanCassetteMap());
 			}
 		}
@@ -963,7 +964,7 @@
 		}
 
 
-		// 缓存Attribute,用于调试时显示信息
+		// 缂撳瓨Attribute锛岀敤浜庤皟璇曟椂鏄剧ず淇℃伅
 		unsigned int weight = 201;
 		CAttributeVector& attrubutes = pStep->attributeVector();
 		m_portStatusReport.getAttributeVector(attrubutes, weight);
@@ -988,17 +989,17 @@
 			return -1;
 		}
 
-		LOGI("<CLoadPort-%d>准备设置Port type<%d>", m_nIndex, (int)type);
+		LOGI("<CLoadPort-%d>鍑嗗璁剧疆Port type<%d>", m_nIndex, (int)type);
 		short value = (short)type;
 		pStep->writeDataEx((const char*)&value, sizeof(short), [&, onWritedBlock](int code) -> int {
 			// test
 			code = WOK;
 			if (code == WOK) {
 				m_portType = type;
-				LOGI("<CLoadPort-%d>设置Port type成功.", m_nIndex);
+				LOGI("<CLoadPort-%d>璁剧疆Port type鎴愬姛.", m_nIndex);
 			}
 			else {
-				LOGE("<CLoadPort-%d>设置Port type失败,code:%d", m_nIndex, code);
+				LOGE("<CLoadPort-%d>璁剧疆Port type澶辫触锛宑ode:%d", m_nIndex, code);
 			}
 			if (onWritedBlock != nullptr) {
 				return onWritedBlock(code);
@@ -1018,17 +1019,17 @@
 			return -1;
 		}
 
-		LOGI("<CLoadPort-%d>准备%s Port", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+		LOGI("<CLoadPort-%d>鍑嗗%s Port", m_nIndex, bEnable ? _T("鍚敤") : _T("绂佺敤"));
 		short value = bEnable ? 1 : 2;
 		pStep->writeDataEx((const char*)&value, sizeof(short), [&, onWritedBlock](int code) -> int {
 			// test
 			code = WOK;
 			if (code == WOK) {
 				m_bEnable = bEnable;
-				LOGI("<CLoadPort-%d>%s Port成功.", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+				LOGI("<CLoadPort-%d>%s Port鎴愬姛.", m_nIndex, bEnable ? _T("鍚敤") : _T("绂佺敤"));
 			}
 			else {
-				LOGE("<CLoadPort-%d>%s  Port失败,code:%d", m_nIndex, bEnable ? _T("启用") : _T("禁用"), code);
+				LOGE("<CLoadPort-%d>%s  Port澶辫触锛宑ode:%d", m_nIndex, bEnable ? _T("鍚敤") : _T("绂佺敤"), code);
 			}
 			if (onWritedBlock != nullptr) {
 				return onWritedBlock(code);
@@ -1047,17 +1048,17 @@
 			return -1;
 		}
 
-		LOGI("<CLoadPort-%d>准备设置Port mode<%d>", m_nIndex, (int)mode);
+		LOGI("<CLoadPort-%d>鍑嗗璁剧疆Port mode<%d>", m_nIndex, (int)mode);
 		short value = (short)mode;
 		pStep->writeDataEx((const char*)&value, sizeof(short), [&, onWritedBlock](int code) -> int {
 			// test
 			code = WOK;
 			if (code == WOK) {
 				m_portMode = mode;
-				LOGI("<CLoadPort-%d>设置Port mode成功.", m_nIndex);
+				LOGI("<CLoadPort-%d>璁剧疆Port mode鎴愬姛.", m_nIndex);
 			}
 			else {
-				LOGE("<CLoadPort-%d>设置Port mode失败,code:%d", m_nIndex, code);
+				LOGE("<CLoadPort-%d>璁剧疆Port mode澶辫触锛宑ode:%d", m_nIndex, code);
 			}
 			if (onWritedBlock != nullptr) {
 				return onWritedBlock(code);
@@ -1077,16 +1078,16 @@
 			return -1;
 		}
 
-		LOGI("<CLoadPort-%d>准备设置Cassette Type<%d>", m_nIndex, (int)type);
+		LOGI("<CLoadPort-%d>鍑嗗璁剧疆Cassette Type<%d>", m_nIndex, (int)type);
 		short value = (short)type;
 		pStep->writeDataEx((const char*)&value, sizeof(short), [&, onWritedBlock](int code) -> int {
 			// test
 			code = WOK;
 			if (code == WOK) {
-				LOGI("<CLoadPort-%d>设置Cassette Type成功.", m_nIndex);
+				LOGI("<CLoadPort-%d>璁剧疆Cassette Type鎴愬姛.", m_nIndex);
 			}
 			else {
-				LOGE("<CLoadPort-%d>设置Cassette Type失败,code:%d", m_nIndex, code);
+				LOGE("<CLoadPort-%d>璁剧疆Cassette Type澶辫触锛宑ode:%d", m_nIndex, code);
 			}
 			if (onWritedBlock != nullptr) {
 				return onWritedBlock(code);
@@ -1105,17 +1106,17 @@
 			return -1;
 		}
 
-		LOGI("<CLoadPort-%d>准备设置Transfer mode<%d>", m_nIndex, (int)mode);
+		LOGI("<CLoadPort-%d>鍑嗗璁剧疆Transfer mode<%d>", m_nIndex, (int)mode);
 		short value = (short)mode;
 		pStep->writeDataEx((const char*)&value, sizeof(short), [&, onWritedBlock](int code) -> int {
 			// test
 			code = WOK;
 			if (code == WOK) {
 				m_transferMode = mode;
-				LOGI("<CLoadPort-%d>设置Transfer mode成功.", m_nIndex + 1);
+				LOGI("<CLoadPort-%d>璁剧疆Transfer mode鎴愬姛.", m_nIndex + 1);
 			}
 			else {
-				LOGE("<CLoadPort-%d>设置Transfer mode失败,code:%d", m_nIndex + 1, code);
+				LOGE("<CLoadPort-%d>璁剧疆Transfer mode澶辫触锛宑ode:%d", m_nIndex + 1, code);
 			}
 			if (onWritedBlock != nullptr) {
 				return onWritedBlock(code);
@@ -1134,17 +1135,17 @@
 			return -1;
 		}
 
-		LOGI("<CLoadPort-%d>准备%s Auto Change", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+		LOGI("<CLoadPort-%d>鍑嗗%s Auto Change", m_nIndex, bEnable ? _T("鍚敤") : _T("绂佺敤"));
 		short value = bEnable ? 1 : 2;
 		pStep->writeDataEx((const char*)&value, sizeof(short), [&, onWritedBlock](int code) -> int {
 			// test
 			code = WOK;
 			if (code == WOK) {
 				m_bAutoChangeEnable = bEnable;
-				LOGI("<CLoadPort-%d>%s Auto Change成功.", m_nIndex, bEnable ? _T("启用") : _T("禁用"));
+				LOGI("<CLoadPort-%d>%s Auto Change鎴愬姛.", m_nIndex, bEnable ? _T("鍚敤") : _T("绂佺敤"));
 			}
 			else {
-				LOGE("<CLoadPort-%d>%s  Auto Change失败,code:%d", m_nIndex, bEnable ? _T("启用") : _T("禁用"), code);
+				LOGE("<CLoadPort-%d>%s  Auto Change澶辫触锛宑ode:%d", m_nIndex, bEnable ? _T("鍚敤") : _T("绂佺敤"), code);
 			}
 			if (onWritedBlock != nullptr) {
 				return onWritedBlock(code);
@@ -1192,17 +1193,20 @@
 
 	short CLoadPort::getDownloadCassetteMap()
 	{
-		// 暂时未实现此功能
-		short map = 0;
-		return map;
+		return m_downloadCassetteMap;
+	}
+
+	void CLoadPort::setDownloadCassetteMap(short map)
+	{
+		m_downloadCassetteMap = map;
 	}
 
 	/*
-	 * 生成测试用的玻璃列表
+	 * 鐢熸垚娴嬭瘯鐢ㄧ殑鐜荤拑鍒楄〃
 	 */
 	int CLoadPort::testGenerateGlassList(MaterialsType type)
 	{
-		// 如果非空就不生成了
+		// 濡傛灉闈炵┖灏变笉鐢熸垚浜�
 		Lock();
 		if (hasGlass()) {
 			Unlock();
@@ -1236,11 +1240,11 @@
 	}
 
 	/*
-	 * 根据efem扫描到的map,生成玻璃列表
+	 * 鏍规嵁efem鎵弿鍒扮殑map锛岀敓鎴愮幓鐠冨垪琛�
 	 */
 	int CLoadPort::generateGlassList(short map)
 	{
-		// 先释放较早前的数据
+		// 鍏堥噴鏀捐緝鏃╁墠鐨勬暟鎹�
 		Lock();
 		for (int i = 0; i < SLOT_MAX; i++) {
 			m_slot[i].setContext(nullptr);
@@ -1248,7 +1252,7 @@
 		Unlock();
 
 
-		// 根据map生成新的
+		// 鏍规嵁map鐢熸垚鏂扮殑
 		char szBuffer[64];
 		for (int i = 0; i < SLOT_MAX; i++) {
 			if (!m_slot[i].isEnable()) continue;
diff --git a/SourceCode/Bond/Servo/CLoadPort.h b/SourceCode/Bond/Servo/CLoadPort.h
index 523ab69..1169f7e 100644
--- a/SourceCode/Bond/Servo/CLoadPort.h
+++ b/SourceCode/Bond/Servo/CLoadPort.h
@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 #include "CEquipment.h"
 #include "ServoCommo.h"
 
@@ -39,6 +39,7 @@
 		void localAutoChangeEnable(BOOL bEnable);
 		short getScanCassetteMap();
 		short getDownloadCassetteMap();
+		void setDownloadCassetteMap(short map);
 
 	public:
 		short getNextCassetteSequenceNo();
@@ -100,8 +101,8 @@
 		CPortStatusReport m_portStatusReport;
 		int m_nNextCassetteSequenceNo;
 
-		// 在开始工艺前是否先需要先比较map
+		// 鍦ㄥ紑濮嬪伐鑹哄墠鏄惁鍏堥渶瑕佸厛姣旇緝map
 		BOOL m_isCompareMapsBeforeProceeding;
+		short m_downloadCassetteMap;
 	};
 }
-
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index cf85b05..348c561 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -2601,15 +2601,31 @@
 		}
 		m_processJobs = temp;
 
+		// 閲嶇疆鍚勭鍙� DownloadMap锛圚ost/鏈湴鍕鹃�夌殑鏈熸湜鍔犲伐妲戒綅锛�
+		for (int i = 0; i < 4; i++) {
+			auto* pPort = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1 + i);
+			if (pPort != nullptr) {
+				pPort->setDownloadCassetteMap(0);
+			}
+		}
+
 
 		// 鏇存柊context
-		std::vector<uint8_t> newSlots;
-		std::vector<void*> newContexts;
 		for (auto pj : m_processJobs) {
 			for (auto& c : pj->carriers()) {
 				auto pPort = getPortWithCarrierId(c.carrierId);
 				if (pPort == nullptr) continue;
 
+				short downloadMap = 0;
+				for (auto s : c.slots) {
+					if (s >= 1 && s <= 8) {
+						downloadMap |= (short)(1 << (s - 1));
+					}
+				}
+				pPort->setDownloadCassetteMap((short)(pPort->getDownloadCassetteMap() | downloadMap));
+
+				std::vector<uint8_t> newSlots;
+				std::vector<void*> newContexts;
 				for (auto s : c.slots) {
 					auto pGlass = pPort->getGlassFromSlot(s);
 					if (pGlass == nullptr) continue;

--
Gitblit v1.9.3