From def291509b5d8c3da5229aea41182c95eb7ba5b5 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期六, 13 九月 2025 11:37:58 +0800
Subject: [PATCH] 1. SG精度检添加产品ID写入PLC功能 2. SG精度检产品ID显示乱码问题 3. 更新bond报警解析文件

---
 SourceCode/Bond/SGMeasurement/PLCSignalListener.h        |   11 +++++
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h         |    4 +-
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user |    2 
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp       |   18 ++++----
 SourceCode/Bond/x64/Debug/AlarmList.csv                  |    4 -
 SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp      |   56 +++++++++++++++++++++++++--
 SourceCode/Bond/SGMeasurement/SGMeasurement.cpp          |    2 
 7 files changed, 76 insertions(+), 21 deletions(-)

diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp b/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
index ab32e61..93660d0 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
+++ b/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
@@ -255,7 +255,7 @@
 						std::string strProductID;
 						if (ReadProductID(strProductID)) {
 							CString msg;
-							msg.Format(_T("璇诲彇鍒颁骇鍝両D锛�%s"), strProductID);
+							msg.Format(_T("璇诲彇鍒颁骇鍝両D锛�%s"), CString(strProductID.c_str()));
 							LOG_MSG(msg, LOG_TYPE_SUCCESS);
 						}
 					}
@@ -309,15 +309,22 @@
 	}
 
 	for (int i = 0; i < PLC_RESULT_ADDR_COUNT; ++i) {
-		// 鏀惧ぇ1000鍊嶅苟鍥涜垗浜斿叆锛岃浆涓篜LC鏁存暟
-		int32_t  nScaled = static_cast<int32_t>(std::round(values[i] * 1000.0));
-		DWordContainer vec = { static_cast<uint32_t>(nScaled) };
+		double dVal = values[i];
+		int32_t nScaled = 0;
+
+		if (dVal == DBL_MAX || dVal == DBL_MIN || std::isnan(dVal)) {
+			nScaled = static_cast<int32_t>(dVal);
+		}
+		else {
+			nScaled = static_cast<int32_t>(std::round(dVal * 1000.0));
+		}
 
 		short nTargetAddr = PLC_RESULT_ADDR_START + i * 2;
+		DWordContainer vec = { static_cast<uint32_t>(nScaled) };
 		int ret = m_pPlc->WriteDWordDataEx(m_station, PLC_WORD_DEVICE_TYPE, nTargetAddr, vec);
 		if (ret != 0) {
 			CString msg;
-			msg.Format(_T("鍐欏叆OUT%d鍒板湴鍧�%d澶辫触锛屽��=%.2f"), i + 1, nTargetAddr, values[i]);
+			msg.Format(_T("鍐欏叆OUT%d鍒板湴鍧�%d澶辫触锛屽��=%.2f"), i + 1, nTargetAddr, dVal);
 			LOG_MSG(msg, LOG_TYPE_ERROR);
 			return false;
 		}
@@ -360,4 +367,43 @@
 	}
 
 	return true;
+}
+
+bool CPLCSignalListener::WriteProductID(const std::string& strProductID)
+{
+	if (!m_pPlc || !m_bConnected) {
+		LOG_MSG(_T("PLC鏈繛鎺ユ垨鏈垵濮嬪寲锛屾棤娉曞啓鍏ヤ骇鍝両D銆�"), LOG_TYPE_ERROR);
+		return false;
+	}
+
+
+	WordContainer vec;
+	vec.reserve(PLC_PRODUCT_ID_WORDS);
+	for (size_t i = 0; i < strProductID.size();) {
+		unsigned char c1 = static_cast<unsigned char>(strProductID[i]);
+		unsigned char c2 = 0;
+
+		if (i + 1 < strProductID.size()) {
+			c2 = static_cast<unsigned char>(strProductID[i + 1]);
+		}
+
+		uint16_t w = static_cast<uint16_t>(c2 << 8 | c1);
+		vec.push_back(w);
+
+		i += 2;
+	}
+
+	while (vec.size() < PLC_PRODUCT_ID_WORDS) {
+		vec.push_back(0);
+	}
+
+	int ret = m_pPlc->WriteWordDataEx(m_station, PLC_WORD_DEVICE_TYPE, PLC_PRODUCT_ID_ADDR, vec);
+	if (ret != 0) {
+		CString msg;
+		msg.Format(_T("鍐欏叆浜у搧ID澶辫触锛岄敊璇爜=%d"), ret);
+		LOG_MSG(msg, LOG_TYPE_ERROR);
+		return false;
+	}
+
+	return true;
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
index aa40df7..73ce823 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
+++ b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
@@ -87,6 +87,17 @@
 	 */
 	bool ReadProductID(std::string& strProductID);
 
+	/**
+	 * @brief 灏嗕骇鍝� ID锛堝瓧绗︿覆褰㈠紡锛夊啓鍏� PLC 鍐呴儴銆�
+	 *
+	 * @param strProductID  杈撳叆鍙傛暟锛岃鍐欏叆鐨勪骇鍝� ID銆�
+	 *                      瀛楃涓蹭細鎸夊瓧鑺傚榻愶紝姣忎袱涓瓧鑺傜粍鎴愪竴涓� Word锛�
+	 *                      鍐欏叆 PLC 鐨勬寚瀹氬瘎瀛樺櫒鍖哄煙锛屼笉瓒虫椂鑷姩琛ラ浂銆�
+	 * @return true         鍐欏叆鎴愬姛銆�
+	 * @return false        鍐欏叆澶辫触銆�
+	 */
+	bool WriteProductID(const std::string& strProductID);
+
 private:
 	/**
 	 * @brief 杈撳嚭鏃ュ織淇℃伅锛堝皝瑁呮棩蹇楀洖璋冿級銆�
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
index eeeead9..fe11f5b 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
@@ -103,7 +103,7 @@
 	CWinApp::InitInstance();
 
 	// 鍞竴瀹炰緥杩愯妫�娴�
-	m_hMutex = ::CreateMutex(NULL, FALSE, _T("MutexEdgeInspector_App"));
+	m_hMutex = ::CreateMutex(NULL, FALSE, _T("MutexSGMeasurementApp"));
 	if (m_hMutex != NULL) {
 		if (::GetLastError() == ERROR_ALREADY_EXISTS) {
 			AfxMessageBox(_T("The Program is already running. Exit this Program."), MB_OK | MB_ICONERROR);
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
index 0cecbcc..110a872 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
@@ -4,7 +4,7 @@
     <RESOURCE_FILE>SGMeasurement.rc</RESOURCE_FILE>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
+    <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <RemoteDebuggerCommand>\\DESKTOP-IODBVIQ\SGMeasurement\$(ProjectName).exe</RemoteDebuggerCommand>
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
index 8e45bb2..ecdface 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -715,7 +715,7 @@
 	return false;
 }
 
-float CSGMeasurementDlg::AnalyzeStoredData(int nOutNo)
+double CSGMeasurementDlg::AnalyzeStoredData(int nOutNo)
 {
 	MEASURE_FUNC_START();
 
@@ -724,27 +724,27 @@
 	if (m_nUseTrigger) {
 		UpdateControlStatus(m_bConnected, m_bSaving);
 		AfxMessageBox(_T("褰撳墠鏄‖瑙﹀彂妯″紡锛岃妫�鏌ヨЕ鍙戝櫒鐘舵�併��"), MB_ICONINFORMATION);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	if (!m_bConnected) {
 		AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	if (m_bSaving) {
 		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍姝e湪杩涜涓紝璇峰厛鍋滄瀛樺偍銆�"), LOG_COLOR_WARNING);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	if (nOutNo < 1 || nOutNo > 4) {
 		AppendLogLineRichStyled(_T("杈撳嚭绔彛缂栧彿鏃犳晥锛屽繀椤诲湪 1 鍒� 4 涔嬮棿銆�"), LOG_COLOR_ERROR);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	if (m_nSavePointCount < 0) {
 		AppendLogLineRichStyled(_T("鏁版嵁鐐规暟蹇呴』澶т簬 0銆�"), LOG_COLOR_ERROR);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	std::vector<float> vecBuffer(m_nSavePointCount, 0.0f);
@@ -755,7 +755,7 @@
 		CString strError;
 		strError.Format(_T("璇诲彇 OUT%d 鏁版嵁澶辫触锛岄敊璇爜锛�%#X"), nOutNo, nRet);
 		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	vecBuffer.resize(nReceived);
@@ -764,7 +764,7 @@
 	std::vector<float> vecGlass1, vecGlass2;
 	if (!SplitGlassSegments(nOutNo, vecBuffer, vecGlass1, vecGlass2, m_fJumpThreshold, m_nJumpWindow, m_nValleyMargin, m_nMinGlass1Count)) {
 		AppendLogLineRichStyled(_T("鏈兘璇嗗埆鍑轰袱鐗囩幓鐠冪殑鏁版嵁銆�"), LOG_COLOR_WARNING);
-		return 0xFF;
+		return DBL_MAX;
 	}
 
 	std::vector<float> vecGlass1Filtered, vecGlass2Filtered;
@@ -924,7 +924,7 @@
 	m_plcListener.SetAnalyzeCallback([this]() {
 		if (!m_bConnected) {
 			AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
-			return std::array<double, 4>{ 0xFF, 0xFF, 0xFF, 0xFF };
+			return std::array<double, 4>{ DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX };
 		}
 
 		std::array<double, 4> result;
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
index a1d8aae..8b42bd2 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -234,9 +234,9 @@
 	 * @brief 鍒嗘瀽鎸囧畾绔彛鐨勫瓨鍌ㄦ暟鎹紝骞舵彁鍙栦袱娈电幓鐠冩暟鎹笌绋冲畾鍖猴紝璁$畻鍋忕Щ銆�
 	 *
 	 * @param nOutNo     杈撳嚭绔彛缂栧彿锛�1~4锛�
-	 * @return float     鎴愬姛杩斿洖璁$畻鍑虹殑鍋忕Щ閲忥紝澶辫触杩斿洖 -1.0f
+	 * @return double     鎴愬姛杩斿洖璁$畻鍑虹殑鍋忕Щ閲忥紝澶辫触杩斿洖 -1.0f
 	 */
-	float AnalyzeStoredData(int nOutNo);
+	double AnalyzeStoredData(int nOutNo);
 
 	// === 绯荤粺鐘舵�佷笌杩愯鏁版嵁 ===
 
diff --git a/SourceCode/Bond/x64/Debug/AlarmList.csv b/SourceCode/Bond/x64/Debug/AlarmList.csv
index 08cd213..cc7e2af 100644
--- a/SourceCode/Bond/x64/Debug/AlarmList.csv
+++ b/SourceCode/Bond/x64/Debug/AlarmList.csv
@@ -1,3 +1 @@
-锘縉o,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description
-1,EFEM(ROBOT)-EFEM,,0,2,100,Fatal communication error in the ACLS receive loop. Please reboot MCC., Fatal communication error in the ACLS receive loop. Please reboot MCC.
-2,Load Port 1-EFEM,,1,1,101,"Must check substrate location due to the failure of ACLS operation <%s> ; To protect glass, a dummy glass has been created"," Must check substrate location due to the failure of ACLS operation <%s> ; To protect glass, a dummy glass has been created"
\ No newline at end of file
+No,UNIT ID,UNIT NO,Alarm Level,Alarm Code,AlarmID,Alarm Text,Description
1,EFEM,100,0,0,1000,机器人CCLink链接异常,"请检查接线,断电重启"
2,EFEM,101,0,0,1001,相机CCLink链接异常,"请检查接线,断电重启"
3,EFEM,102,0,0,1002,静电测试CCLink链接异常,"请检查接线,断电重启"
4,EFEM,103,0,0,1003,,
5,EFEM,104,0,0,1004,,
6,EFEM,105,0,0,1005,,
7,EFEM,106,0,0,1006,,
8,EFEM,107,0,0,1007,,
9,EFEM,108,0,0,1008,,
10,EFEM,109,0,0,1009,,
11,EFEM,110,0,0,1010,总进气气压异常,检测进气
12,EFEM,111,0,0,1011,总真空气压异常,检测真空
13,EFEM,112,0,0,1012,LP真空异常,检测真空
14,EFEM,113,0,0,1013,离子风棒压空异常,检测进气
15,EFEM,114,0,0,1014,机器人真空异常,检测真空
16,EFEM,115,0,0,1015,急停被按下,请检查急停按钮
17,EFEM,116,0,0,1016,,
18,EFEM,117,0,0,1017,,
19,EFEM,118,0,0,1018,,
20,EFEM,119,0,0,1019,,
21,EFEM,120,0,0,1020,安全门打开,检查安全门
22,EFEM,121,0,0,1021,正面左门打开中,检查安全门
23,EFEM,122,0,0,1022,正面右门打开中,检查安全门
24,EFEM,123,0,0,1023,侧面左门打开中,检查安全门
25,EFEM,124,0,0,1024,侧面右门打开中,检查安全门
26,EFEM,125,0,0,1025,背面左门打开中,检查安全门
27,EFEM,126,0,0,1026,背面右门打开中,检查安全门
28,EFEM,127,0,0,1027,,
29,EFEM,128,0,0,1028,,
30,EFEM,129,0,0,1029,,
31,EFEM,130,0,0,1030,,
32,EFEM,131,0,0,1031,"Port1_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆
33,EFEM,132,0,0,1032,"Port1_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆
34,EFEM,133,0,0,1033,"Port1_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆
35,EFEM,134,0,0,1034,,
36,EFEM,135,0,0,1035,,
37,EFEM,136,0,0,1036,,
38,EFEM,137,0,0,1037,,
39,EFEM,138,0,0,1038,,
40,EFEM,139,0,0,1039,,
41,EFEM,140,1,0,1040,"Port1_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆
42,EFEM,141,1,0,1041,"Port1_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停
43,EFEM,142,1,0,1042,"Port1_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态"
44,EFEM,143,1,0,1043,"Port1_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆
45,EFEM,144,0,0,1044,,
46,EFEM,145,0,0,1045,,
47,EFEM,146,0,0,1046,,
48,EFEM,147,0,0,1047,,
49,EFEM,148,0,0,1048,,
50,EFEM,149,0,0,1049,,
51,EFEM,150,0,0,1050,"Port2_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆
52,EFEM,151,0,0,1051,"Port2_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆
53,EFEM,152,0,0,1052,"Port2_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆
54,EFEM,153,0,0,1053,,
55,EFEM,154,0,0,1054,,
56,EFEM,155,0,0,1055,,
57,EFEM,156,0,0,1056,,
58,EFEM,157,0,0,1057,,
59,EFEM,158,0,0,1058,,
60,EFEM,159,0,0,1059,,
61,EFEM,160,0,0,1060,"Port2_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆
62,EFEM,161,0,0,1061,"Port2_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停
63,EFEM,162,0,0,1062,"Port2_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态"
64,EFEM,163,0,0,1063,"Port2_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆
65,EFEM,164,0,0,1064,,
66,EFEM,165,0,0,1065,,
67,EFEM,166,0,0,1066,,
68,EFEM,167,0,0,1067,,
69,EFEM,168,0,0,1068,,
70,EFEM,169,0,0,1069,,
71,EFEM,170,1,0,1070,,
72,EFEM,171,1,0,1071,"Port3_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆
73,EFEM,172,1,0,1072,"Port3_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停
74,EFEM,173,1,0,1073,"Port3_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态"
75,EFEM,174,1,0,1074,"Port3_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆
76,EFEM,175,1,0,1075,,
77,EFEM,176,1,0,1076,,
78,EFEM,177,1,0,1077,,
79,EFEM,178,1,0,1078,,
80,EFEM,179,1,0,1079,,
81,EFEM,180,1,0,1080,"Port3_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆
82,EFEM,181,1,0,1081,"Port3_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆
83,EFEM,182,1,0,1082,"Port3_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆
84,EFEM,183,1,0,1083,,
85,EFEM,184,1,0,1084,,
86,EFEM,185,1,0,1085,,
87,EFEM,186,1,0,1086,,
88,EFEM,187,1,0,1087,,
89,EFEM,188,1,0,1088,,
90,EFEM,189,1,0,1089,,
91,EFEM,190,1,0,1090,,
92,EFEM,191,1,0,1091,"Port4_E84流程停止,OHT_VALID信号异常",请检查OHT信号或者E84线缆
93,EFEM,192,1,0,1092,"Port4_E84流程停止,光栅被遮挡或者急停被拍",请检查光栅信号急停
94,EFEM,193,1,0,1093,"Port4_E84流程停止,OHT_取或放FOUP超时","OHT_BUSY后未在规定时间内取走FOUP,请检查OHT或者核对LP状态"
95,EFEM,194,1,0,1094,"Port4_E84流程停止,OHT_BUSY_OFF或者TR_REQ_OFF信号超时",请检查OHT信号或者E84线缆
96,EFEM,195,1,0,1095,,
97,EFEM,196,1,0,1096,,
98,EFEM,197,1,0,1097,,
99,EFEM,198,1,0,1098,,
100,EFEM,199,1,0,1099,,
101,EFEM,200,1,0,1100,"Port4_E84流程异常,OHT_TR_REQ_ON信号超时",请检查OHT或者E84线缆
102,EFEM,201,1,0,1101,"Port4_E84流程异常,OHT_BUSY_ON信号超时",请检查OHT或者E84线缆
103,EFEM,202,1,0,1102,"Port4_E84流程异常,OHT_COMPT_OFF信号超时",请检查OHT信号或者E84线缆
104,EFEM,203,1,0,1103,,
105,EFEM,204,1,0,1104,,
106,EFEM,205,1,0,1105,,
107,EFEM,206,1,0,1106,,
108,EFEM,207,1,0,1107,,
109,EFEM,208,1,0,1108,,
110,EFEM,209,1,0,1109,,
111,EFEM,210,0,0,1110,回原点失败/超时,请检查设备状态以及轴位置是否有干涉,重新执行回原操作
112,EFEM,211,0,0,1111,Flip工位,真空打开时在荷异常,请检查玻璃位置
113,EFEM,212,1,0,1112,,
114,EFEM,213,1,0,1113,,
115,EFEM,214,1,0,1114,,
116,EFEM,215,1,0,1115,,
117,EFEM,216,1,0,1116,,
118,EFEM,217,1,0,1117,,
119,EFEM,218,1,0,1118,,
120,EFEM,219,1,0,1119,,
121,EFEM,220,1,0,1120,任务取消失败,当前取消任务条件不满足
122,EFEM,221,1,0,1121,任务重试失败,当前重试任务条件不满足
\ No newline at end of file

--
Gitblit v1.9.3