From 49c116b0a9d6ad26dae0d5ec915ea6f7fe5684f4 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期六, 13 九月 2025 11:34:40 +0800
Subject: [PATCH] Merge branch 'liuyang'

---
 SourceCode/Bond/SGMeasurement/resource.h                              |    2 
 SourceCode/Bond/SGMeasurement/PLCSignalListener.h                     |    2 
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h                      |   10 +
 SourceCode/Bond/SGMeasurement/framework.h                             |    2 
 SourceCode/Bond/SGMeasurement/pch.h                                   |    2 
 SourceCode/Bond/SGMeasurement/Logger.cpp                              |    2 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp   |    2 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp |    2 
 SourceCode/Bond/SGMeasurement/pch.cpp                                 |    2 
 SourceCode/Bond/SGMeasurement/targetver.h                             |    2 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h   |    2 
 SourceCode/Bond/SGMeasurement/SGMeasurement.cpp                       |   86 +++++++++++++++-
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj                   |    2 
 SourceCode/Bond/SGMeasurement/ProductResultStorage.h                  |   18 +++
 SourceCode/Bond/SGMeasurement/SGMeasurement.h                         |    7 +
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters           |    6 +
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp                    |    6 +
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h     |    2 
 SourceCode/Bond/SGMeasurement/Logger.h                                |    2 
 SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp                   |   25 +++-
 SourceCode/Bond/SGMeasurement/ProductResultStorage.cpp                |   70 ++++++++++++++
 21 files changed, 220 insertions(+), 34 deletions(-)

diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
index ee59ea8..3d4c965 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
@@ -1,4 +1,4 @@
-#include "pch.h"
+锘�#include "pch.h"
 #include "CCLinkIEControl.h"
 
 CCCLinkIEControl::CCCLinkIEControl() : CPerformanceMelsec(BoardType::CC_LINK_IE_CONTROL) {}
diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
index 5782c45..1baef51 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
@@ -1,4 +1,4 @@
-#ifndef CCLINKIECONTROL_H
+锘�#ifndef CCLINKIECONTROL_H
 #define CCLINKIECONTROL_H
 
 #include "PerformanceMelsec.h"
diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
index 24b6104..e677b00 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
@@ -1,4 +1,4 @@
-// PerformanceMelsec.cpp: implementation of the CPerformanceMelsec class.
+锘�// PerformanceMelsec.cpp: implementation of the CPerformanceMelsec class.
 //
 //////////////////////////////////////////////////////////////////////
 #include "pch.h"
diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
index f171550..836f4da 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
@@ -1,4 +1,4 @@
-#ifndef PERFORMANCE_MELSEC_H
+锘�#ifndef PERFORMANCE_MELSEC_H
 #define PERFORMANCE_MELSEC_H
 
 #include "Mdfunc.h"
diff --git a/SourceCode/Bond/SGMeasurement/Logger.cpp b/SourceCode/Bond/SGMeasurement/Logger.cpp
index 34a0dd1..ecc94fd 100644
--- a/SourceCode/Bond/SGMeasurement/Logger.cpp
+++ b/SourceCode/Bond/SGMeasurement/Logger.cpp
@@ -1,4 +1,4 @@
-#include "pch.h"
+锘�#include "pch.h"
 #include "Logger.h"
 
 CLogger& CLogger::Instance()
diff --git a/SourceCode/Bond/SGMeasurement/Logger.h b/SourceCode/Bond/SGMeasurement/Logger.h
index 1649714..2b9f84d 100644
--- a/SourceCode/Bond/SGMeasurement/Logger.h
+++ b/SourceCode/Bond/SGMeasurement/Logger.h
@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 #include <afx.h>
 
 class CLogger
diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp b/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
index 4176b59..ab32e61 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
+++ b/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
@@ -1,4 +1,4 @@
-#include "pch.h"
+锘�#include "pch.h"
 #include "PLCSignalListener.h"
 
 // === 鏃ュ織鎵撳嵃绫诲瀷 ===
@@ -247,13 +247,10 @@
 				// 涓婂崌娌胯Е鍙�
 				switch (i) {
 				case 0:
+					// Start 鍛戒护
 					if (m_cbStart) {
 						m_cbStart();
 						WriteOutValues(OutValuesArray{ 0.0, 0.0, 0.0, 0.0 });
-						if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
-							m_vecAckSent[i] = true;
-							m_vecAckCounter[i] = 0;
-						}
 
 						std::string strProductID;
 						if (ReadProductID(strProductID)) {
@@ -262,21 +259,31 @@
 							LOG_MSG(msg, LOG_TYPE_SUCCESS);
 						}
 					}
+
+					// 鍙戦�佸簲绛斾俊鍙�
+					if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
+						m_vecAckSent[i] = true;
+						m_vecAckCounter[i] = 0;
+					}
 					break;
 
 				case 1:
+					// Stop 鍛戒护
 					if (m_cbStop) {
 						m_cbStop();
-						if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
-							m_vecAckSent[i] = true;
-							m_vecAckCounter[i] = 0;
-						}
 					}
 
+					// Analyze 鍛戒护
 					if (m_cbAnalyze) {
 						auto results = m_cbAnalyze();
 						WriteOutValues(results);
 					}
+
+					// 鍙戦�佸簲绛斾俊鍙�
+					if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) {
+						m_vecAckSent[i] = true;
+						m_vecAckCounter[i] = 0;
+					}
 					break;
 				}
 			}
diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
index 0a4030d..aa40df7 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
+++ b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 
 #include "CCLinkIEControl.h"
 
diff --git a/SourceCode/Bond/SGMeasurement/ProductResultStorage.cpp b/SourceCode/Bond/SGMeasurement/ProductResultStorage.cpp
new file mode 100644
index 0000000..51503e2
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/ProductResultStorage.cpp
@@ -0,0 +1,70 @@
+锘�#include "pch.h"
+#include "ProductResultStorage.h"
+
+CProductResultStorage::CProductResultStorage()
+{
+	TCHAR szPath[MAX_PATH] = { 0 };
+	GetModuleFileName(NULL, szPath, MAX_PATH);
+	CString strExePath(szPath);
+	int pos = strExePath.ReverseFind(_T('\\'));
+	if (pos != -1) {
+		m_strBaseResultDir = strExePath.Left(pos) + _T("\\Data");
+	}
+	else {
+		m_strBaseResultDir = _T(".\\Data");
+	}
+}
+
+void CProductResultStorage::SaveAnalyzeResult(const CString& strProductID, const std::array<double, 4>& result)
+{
+	CString strFilePath = MakeResultCsvPath(_T("MeasurementResults"));
+	CString strHeader = _T("Timestamp,ProductID,OUT1,OUT2,OUT3,OUT4\r\n");
+
+	// 鏃堕棿鎴�
+	CTime now = CTime::GetCurrentTime();
+	CString strTimestamp;
+	strTimestamp.Format(_T("%02d:%02d:%02d"), now.GetHour(), now.GetMinute(), now.GetSecond());
+
+	// 缁撴灉琛�
+	CString strBody;
+	strBody.Format(_T("%s,%s,%.3f,%.3f,%.3f,%.3f\r\n"), strTimestamp, strProductID, result[0], result[1], result[2], result[3]);
+	AppendCsvWithHeader(strFilePath, strHeader, strBody);
+}
+
+CString CProductResultStorage::MakeResultCsvPath(const CString& strFileName)
+{
+    SYSTEMTIME st;
+    GetLocalTime(&st);
+
+    CString strDate;
+    strDate.Format(_T("%04d%02d%02d"), st.wYear, st.wMonth, st.wDay);
+
+    if (GetFileAttributes(m_strBaseResultDir) == INVALID_FILE_ATTRIBUTES) {
+        CreateDirectory(m_strBaseResultDir, NULL);
+    }
+
+    CString strFilePath;
+    strFilePath.Format(_T("%s\\%s_%s.csv"), m_strBaseResultDir, strFileName, strDate);
+
+    return strFilePath;
+}
+
+BOOL CProductResultStorage::AppendCsvWithHeader(const CString& strFilePath, const CString& strHeader, const CString& strBody)
+{
+    if (strBody.IsEmpty()) {
+        return FALSE;
+    }
+
+    CFile f;
+    CFileException ex;
+    if (!f.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate | CFile::shareDenyWrite | CFile::shareDenyRead, &ex)) {
+        return FALSE;
+    }
+
+    if (f.SeekToEnd() == 0L) {
+        f.Write(strHeader, strHeader.GetLength() * sizeof(TCHAR));
+    }
+    f.Write(strBody, strBody.GetLength() * sizeof(TCHAR));
+    f.Close();
+    return TRUE;
+}
diff --git a/SourceCode/Bond/SGMeasurement/ProductResultStorage.h b/SourceCode/Bond/SGMeasurement/ProductResultStorage.h
new file mode 100644
index 0000000..6165555
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/ProductResultStorage.h
@@ -0,0 +1,18 @@
+锘�#pragma once
+#include <array>
+
+class CProductResultStorage
+{
+public:
+	CProductResultStorage();
+    ~CProductResultStorage() = default;
+
+    void SaveAnalyzeResult(const CString& strProductID, const std::array<double, 4>& result);
+
+private:
+    CString MakeResultCsvPath(const CString& strFileName);
+    BOOL AppendCsvWithHeader(const CString& strFilePath, const CString& strHeader, const CString& strBody);
+
+    CString m_strBaseResultDir;
+};
+
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
index 475924d..eeeead9 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
@@ -1,4 +1,4 @@
-
+锘�
 // SGMeasurement.cpp: 瀹氫箟搴旂敤绋嬪簭鐨勭被琛屼负銆�
 //
 
@@ -7,10 +7,61 @@
 #include "SGMeasurement.h"
 #include "SGMeasurementDlg.h"
 
+#include <DbgHelp.h>
+#pragma comment(lib, "DbgHelp.lib")
+
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #endif
 
+LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* pExceptionInfo)
+{
+	// 鑾峰彇褰撳墠绋嬪簭鐩綍
+	TCHAR szAppPath[MAX_PATH] = { 0 };
+	::GetModuleFileName(NULL, szAppPath, MAX_PATH);
+	PathRemoveFileSpec(szAppPath);
+
+	// 鏋勯�� Temp 鏂囦欢澶硅矾寰�
+	CString strTempPath;
+	strTempPath.Format(_T("%s\\Temp"), szAppPath);
+	CreateDirectory(strTempPath, NULL);
+
+	// 鐢熸垚甯︽椂闂存埑鐨� Dump 鏂囦欢鍚�
+	SYSTEMTIME st;
+	GetLocalTime(&st);
+
+	CString strDumpFile;
+	strDumpFile.Format(
+		_T("%s\\SG_%04d%02d%02d_%02d%02d%02d.dmp"),
+		strTempPath,
+		st.wYear, st.wMonth, st.wDay,
+		st.wHour, st.wMinute, st.wSecond
+	);
+
+	// 鎵撳紑 dump 鏂囦欢
+	HANDLE hFile = CreateFile(strDumpFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+	if (hFile != INVALID_HANDLE_VALUE) {
+		MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
+		dumpInfo.ExceptionPointers = pExceptionInfo;
+		dumpInfo.ThreadId = GetCurrentThreadId();
+		dumpInfo.ClientPointers = TRUE;
+
+		// 鍐欏畬鏁村唴瀛� dump
+		BOOL success = MiniDumpWriteDump(
+			GetCurrentProcess(),
+			GetCurrentProcessId(),
+			hFile,
+			MiniDumpWithFullMemory,
+			&dumpInfo,
+			NULL,
+			NULL
+		);
+
+		CloseHandle(hFile);
+	}
+
+	return EXCEPTION_EXECUTE_HANDLER;
+}
 
 // CSGMeasurementApp
 
@@ -51,6 +102,18 @@
 
 	CWinApp::InitInstance();
 
+	// 鍞竴瀹炰緥杩愯妫�娴�
+	m_hMutex = ::CreateMutex(NULL, FALSE, _T("MutexEdgeInspector_App"));
+	if (m_hMutex != NULL) {
+		if (::GetLastError() == ERROR_ALREADY_EXISTS) {
+			AfxMessageBox(_T("The Program is already running. Exit this Program."), MB_OK | MB_ICONERROR);
+			return FALSE;
+		}
+	}
+
+	// 璁剧疆鏈鐞嗗紓甯歌繃婊ゅ櫒锛屾崟鑾峰穿婧冨苟鐢熸垚 Dump 鏂囦欢
+	SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
+
 	// 鍒濆鍖� MFC RichEdit 鎺т欢
 	AfxInitRichEdit2();
 
@@ -75,23 +138,19 @@
 	CSGMeasurementDlg dlg;
 	m_pMainWnd = &dlg;
 	INT_PTR nResponse = dlg.DoModal();
-	if (nResponse == IDOK)
-	{
+	if (nResponse == IDOK) {
 		// TODO:鈥滅‘瀹氣�濇潵鍏抽棴瀵硅瘽妗嗙殑浠g爜
 	}
-	else if (nResponse == IDCANCEL)
-	{
+	else if (nResponse == IDCANCEL) {
 		// TODO:鈥滃彇娑堚�濇潵鍏抽棴瀵硅瘽妗嗙殑浠g爜 
 	}
-	else if (nResponse == -1)
-	{
+	else if (nResponse == -1) {
 		TRACE(traceAppMsg, 0, "璀﹀憡: 瀵硅瘽妗嗗垱寤哄け璐ワ紝搴旂敤绋嬪簭灏嗘剰澶栫粓姝€�俓n");
 		TRACE(traceAppMsg, 0, "璀﹀憡: 濡傛灉鎮ㄥ湪瀵硅瘽妗嗕笂浣跨敤 MFC 鎺т欢锛屽垯鏃犳硶 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS銆俓n");
 	}
 
 	// 鍒犻櫎涓婇潰鍒涘缓鐨� shell 绠$悊鍣ㄣ��
-	if (pShellManager != nullptr)
-	{
+	if (pShellManager != nullptr) {
 		delete pShellManager;
 	}
 
@@ -101,4 +160,13 @@
 
 	// 鐢变簬瀵硅瘽妗嗗凡鍏抽棴锛屾墍浠ュ皢杩斿洖 FALSE 浠ヤ究閫�鍑哄簲鐢ㄧ▼搴忥紝鑰屼笉鏄惎鍔ㄥ簲鐢ㄧ▼搴忕殑娑堟伅娉点��
 	return FALSE;
+}
+
+int CSGMeasurementApp::ExitInstance()
+{
+	if (m_hMutex) {
+		CloseHandle(m_hMutex);
+		m_hMutex = nullptr;
+	}
+	return CWinApp::ExitInstance();
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.h b/SourceCode/Bond/SGMeasurement/SGMeasurement.h
index 6515a3d..a9d2b9e 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.h
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.h
@@ -1,4 +1,4 @@
-
+锘�
 // SGMeasurement.h: PROJECT_NAME 搴旂敤绋嬪簭鐨勪富澶存枃浠�
 //
 
@@ -23,10 +23,13 @@
 // 閲嶅啓
 public:
 	virtual BOOL InitInstance();
+	virtual int ExitInstance();
 
 // 瀹炵幇
-
 	DECLARE_MESSAGE_MAP()
+
+private:
+	HANDLE m_hMutex;
 };
 
 extern CSGMeasurementApp theApp;
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
index 1bab676..33c1c14 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
@@ -209,6 +209,7 @@
     <ClInclude Include="Logger.h" />
     <ClInclude Include="pch.h" />
     <ClInclude Include="PLCSignalListener.h" />
+    <ClInclude Include="ProductResultStorage.h" />
     <ClInclude Include="Resource.h" />
     <ClInclude Include="SGMeasurement.h" />
     <ClInclude Include="SGMeasurementDlg.h" />
@@ -225,6 +226,7 @@
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
     </ClCompile>
     <ClCompile Include="PLCSignalListener.cpp" />
+    <ClCompile Include="ProductResultStorage.cpp" />
     <ClCompile Include="SGMeasurement.cpp" />
     <ClCompile Include="SGMeasurementDlg.cpp" />
   </ItemGroup>
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters
index 163f190..df340e5 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters
@@ -48,6 +48,9 @@
     <ClInclude Include="PLCSignalListener.h">
       <Filter>澶存枃浠�</Filter>
     </ClInclude>
+    <ClInclude Include="ProductResultStorage.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="SGMeasurement.cpp">
@@ -71,6 +74,9 @@
     <ClCompile Include="PLCSignalListener.cpp">
       <Filter>婧愭枃浠�</Filter>
     </ClCompile>
+    <ClCompile Include="ProductResultStorage.cpp">
+      <Filter>婧愭枃浠�</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="SGMeasurement.rc">
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
index a2afe06..8e45bb2 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -1,4 +1,4 @@
-
+锘�
 // SGMeasurementDlg.cpp: 瀹炵幇鏂囦欢
 //
 
@@ -932,6 +932,10 @@
 			result[i] = AnalyzeStoredData(i + 1); // OUT1 ~ OUT4
 		}
 
+		std::string strProductID;
+		m_plcListener.ReadProductID(strProductID);
+		m_resultStorage.SaveAnalyzeResult(CString(strProductID.c_str()), result);
+
 		CString strLog;
 		strLog.Format(_T("鍒嗘瀽缁撴灉锛歄UT1: %.3f, OUT2: %.3f, OUT3: %.3f, OUT4: %.3f"), result[0], result[1], result[2], result[3]);
 		return result;
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
index ab23343..a1d8aae 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -1,10 +1,11 @@
-
+锘�
 // SGMeasurementDlg.h: 澶存枃浠�
 //
 
 #pragma once
 
 #include "PLCSignalListener.h"
+#include "ProductResultStorage.h"
 
 #include <map>
 #include <vector>
@@ -340,4 +341,11 @@
 	 * @brief PLC 淇″彿鐩戝惉鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊 PLC 淇″彿浜嬩欢
 	 */
 	CPLCSignalListener m_plcListener;
+
+	// === 浜у搧缁撴灉瀛樺偍 ===
+
+	/**
+	 * @brief 浜у搧缁撴灉瀛樺偍瀹炰緥锛岀敤浜庝繚瀛樺拰绠$悊娴嬮噺缁撴灉
+	 */
+	CProductResultStorage m_resultStorage;
 };
diff --git a/SourceCode/Bond/SGMeasurement/framework.h b/SourceCode/Bond/SGMeasurement/framework.h
index d6f08b6..5672fb5 100644
--- a/SourceCode/Bond/SGMeasurement/framework.h
+++ b/SourceCode/Bond/SGMeasurement/framework.h
@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 
 #ifndef VC_EXTRALEAN
 #define VC_EXTRALEAN            // 浠� Windows 澶翠腑鎺掗櫎鏋佸皯浣跨敤鐨勮祫鏂�
diff --git a/SourceCode/Bond/SGMeasurement/pch.cpp b/SourceCode/Bond/SGMeasurement/pch.cpp
index 10b8eaa..b6fb8f4 100644
--- a/SourceCode/Bond/SGMeasurement/pch.cpp
+++ b/SourceCode/Bond/SGMeasurement/pch.cpp
@@ -1,4 +1,4 @@
-// pch.cpp: 涓庨缂栬瘧鏍囧ご瀵瑰簲鐨勬簮鏂囦欢
+锘�// pch.cpp: 涓庨缂栬瘧鏍囧ご瀵瑰簲鐨勬簮鏂囦欢
 
 #include "pch.h"
 
diff --git a/SourceCode/Bond/SGMeasurement/pch.h b/SourceCode/Bond/SGMeasurement/pch.h
index fe3bd2d..9660927 100644
--- a/SourceCode/Bond/SGMeasurement/pch.h
+++ b/SourceCode/Bond/SGMeasurement/pch.h
@@ -1,4 +1,4 @@
-// pch.h: 杩欐槸棰勭紪璇戞爣澶存枃浠躲��
+锘�// pch.h: 杩欐槸棰勭紪璇戞爣澶存枃浠躲��
 // 涓嬫柟鍒楀嚭鐨勬枃浠朵粎缂栬瘧涓�娆★紝鎻愰珮浜嗗皢鏉ョ敓鎴愮殑鐢熸垚鎬ц兘銆�
 // 杩欒繕灏嗗奖鍝� IntelliSense 鎬ц兘锛屽寘鎷唬鐮佸畬鎴愬拰璁稿浠g爜娴忚鍔熻兘銆�
 // 浣嗘槸锛屽鏋滄澶勫垪鍑虹殑鏂囦欢涓殑浠讳綍涓�涓湪鐢熸垚涔嬮棿鏈夋洿鏂帮紝瀹冧滑鍏ㄩ儴閮藉皢琚噸鏂扮紪璇戙��
diff --git a/SourceCode/Bond/SGMeasurement/resource.h b/SourceCode/Bond/SGMeasurement/resource.h
index e083afe..9286258 100644
--- a/SourceCode/Bond/SGMeasurement/resource.h
+++ b/SourceCode/Bond/SGMeasurement/resource.h
@@ -1,4 +1,4 @@
-//{{NO_DEPENDENCIES}}
+锘�//{{NO_DEPENDENCIES}}
 // Microsoft Visual C++ 鐢熸垚鐨勫寘鍚枃浠躲��
 // 渚� SGMeasurement.rc 浣跨敤
 //
diff --git a/SourceCode/Bond/SGMeasurement/targetver.h b/SourceCode/Bond/SGMeasurement/targetver.h
index 51be421..79934a3 100644
--- a/SourceCode/Bond/SGMeasurement/targetver.h
+++ b/SourceCode/Bond/SGMeasurement/targetver.h
@@ -1,4 +1,4 @@
-#pragma once
+锘�#pragma once
 
 // 鍖呮嫭 SDKDDKVer.h 灏嗗畾涔夊彲鐢ㄧ殑鏈�楂樼増鏈殑 Windows 骞冲彴銆�
 

--
Gitblit v1.9.3