From c62dbec7328a8b44e6ec61758e7b8463f2e502dd Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期五, 12 九月 2025 11:58:15 +0800
Subject: [PATCH] Merge branch 'liuyang'

---
 SourceCode/Bond/SGMeasurement/resource.h                              |    2 
 SourceCode/Bond/SGMeasurement/PLCSignalListener.h                     |  275 ++-
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h                      |    2 
 SourceCode/Bond/Servo/AlarmManager.cpp                                |  138 +
 SourceCode/Bond/SGMeasurement/framework.h                             |    2 
 SourceCode/Bond/SGMeasurement/pch.h                                   |    2 
 SourceCode/Bond/SGMeasurement/Logger.cpp                              |   82 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp   |  136 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp | 2380 +++++++++++++++++-----------------
 SourceCode/Bond/SGMeasurement/pch.cpp                                 |    2 
 SourceCode/Bond/SGMeasurement/targetver.h                             |    2 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h   |  412 ++--
 SourceCode/Bond/SGMeasurement/SGMeasurement.cpp                       |    2 
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj                   |    2 
 SourceCode/Bond/Servo/PageAlarm.cpp                                   |    6 
 SourceCode/Bond/SGMeasurement/SGMeasurement.h                         |    2 
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user              |    2 
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp                    |   46 
 SourceCode/Bond/Servo/AlarmManager.h                                  |   48 
 SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h     |   94 
 SourceCode/Bond/SGMeasurement/Logger.h                                |   28 
 SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp                   |  421 +++--
 22 files changed, 2,073 insertions(+), 2,013 deletions(-)

diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
index 42b6f63..ee59ea8 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.cpp
@@ -6,99 +6,99 @@
 CCCLinkIEControl::~CCCLinkIEControl() = default;
 
 int CCCLinkIEControl::SetBoardModeEx(CCLinkIEControlMode mode) {
-    return SetBoardMode(static_cast<short>(mode));
+	return SetBoardMode(static_cast<short>(mode));
 }
 
 CCLinkIEControlMode CCCLinkIEControl::GetBoardModeEx() {
-    short nMode = 0;
-    const int nResult = GetBoardMode(nMode);
-    if (nResult != 0) {
-        return CCLinkIEControlMode::UNKNOWN;
-    }
+	short nMode = 0;
+	const int nResult = GetBoardMode(nMode);
+	if (nResult != 0) {
+		return CCLinkIEControlMode::UNKNOWN;
+	}
 
-    return ConvertToCCLinkIEControlMode(nMode);
+	return ConvertToCCLinkIEControlMode(nMode);
 }
 
 int CCCLinkIEControl::GetBoardStatusEx(BoardStatus& status) {
-    const int nResult = GetBoardStatus(status);
-    if (nResult != 0) {
-        return nResult;
-    }
+	const int nResult = GetBoardStatus(status);
+	if (nResult != 0) {
+		return nResult;
+	}
 
-    return ValidateBoardStatus(status);
+	return ValidateBoardStatus(status);
 }
 
 int CCCLinkIEControl::ReadLedStatus(LedStatus& outLedStatus) {
-    std::vector<short> vecLedBuffer;
-    const int nRet = ReadBoardLed(vecLedBuffer);
-    if (nRet != 0) {
-        return nRet;
-    }
+	std::vector<short> vecLedBuffer;
+	const int nRet = ReadBoardLed(vecLedBuffer);
+	if (nRet != 0) {
+		return nRet;
+	}
 
-    if (vecLedBuffer.empty()) {
-        UpdateLastError(ERROR_CODE_INVALID_DATA);
-        return ERROR_CODE_INVALID_DATA;
-    }
+	if (vecLedBuffer.empty()) {
+		UpdateLastError(ERROR_CODE_INVALID_DATA);
+		return ERROR_CODE_INVALID_DATA;
+	}
 
-    // 解析各位状态
-    const short nBuffer = vecLedBuffer[0];
-    outLedStatus.bExtPw = (nBuffer & (1 << 15)) != 0;
-    outLedStatus.bRd = (nBuffer & (1 << 6)) != 0;
-    outLedStatus.bDLnk = (nBuffer & (1 << 5)) != 0;
-    outLedStatus.bPrm = (nBuffer & (1 << 4)) != 0;
-    outLedStatus.bErr = (nBuffer & (1 << 3)) != 0;
-    outLedStatus.bSd = (nBuffer & (1 << 2)) != 0;
-    outLedStatus.bMode = (nBuffer & (1 << 1)) != 0;
-    outLedStatus.bRun = (nBuffer & (1 << 0)) != 0;
+	// 瑙f瀽鍚勪綅鐘舵��
+	const short nBuffer = vecLedBuffer[0];
+	outLedStatus.bExtPw = (nBuffer & (1 << 15)) != 0;
+	outLedStatus.bRd = (nBuffer & (1 << 6)) != 0;
+	outLedStatus.bDLnk = (nBuffer & (1 << 5)) != 0;
+	outLedStatus.bPrm = (nBuffer & (1 << 4)) != 0;
+	outLedStatus.bErr = (nBuffer & (1 << 3)) != 0;
+	outLedStatus.bSd = (nBuffer & (1 << 2)) != 0;
+	outLedStatus.bMode = (nBuffer & (1 << 1)) != 0;
+	outLedStatus.bRun = (nBuffer & (1 << 0)) != 0;
 
-    return 0;
+	return 0;
 }
 
 CCLinkIEControlMode CCCLinkIEControl::ConvertToCCLinkIEControlMode(const short nMode) {
-    switch (static_cast<CCLinkIEControlMode>(nMode)) {
-        case CCLinkIEControlMode::ONLINE: return CCLinkIEControlMode::ONLINE;                           // 在线
-        case CCLinkIEControlMode::OFFLINE: return CCLinkIEControlMode::OFFLINE;                         // 离线
-        case CCLinkIEControlMode::INTER_STATION_TEST: return CCLinkIEControlMode::INTER_STATION_TEST;   // 站间测试
-        case CCLinkIEControlMode::LINE_TEST: return CCLinkIEControlMode::LINE_TEST;                     // 线路测试
-        case CCLinkIEControlMode::LOOPBACK_TEST: return CCLinkIEControlMode::LOOPBACK_TEST;             // 自回送测试
-        case CCLinkIEControlMode::HW_TEST: return CCLinkIEControlMode::HW_TEST;                         // H/W测试
-        case CCLinkIEControlMode::BUS_IF_TEST: return CCLinkIEControlMode::BUS_IF_TEST;                 // 总线I/F测试
-        default: return CCLinkIEControlMode::UNKNOWN;
-    }
+	switch (static_cast<CCLinkIEControlMode>(nMode)) {
+		case CCLinkIEControlMode::ONLINE: return CCLinkIEControlMode::ONLINE;                           // 鍦ㄧ嚎
+		case CCLinkIEControlMode::OFFLINE: return CCLinkIEControlMode::OFFLINE;                         // 绂荤嚎
+		case CCLinkIEControlMode::INTER_STATION_TEST: return CCLinkIEControlMode::INTER_STATION_TEST;   // 绔欓棿娴嬭瘯
+		case CCLinkIEControlMode::LINE_TEST: return CCLinkIEControlMode::LINE_TEST;                     // 绾胯矾娴嬭瘯
+		case CCLinkIEControlMode::LOOPBACK_TEST: return CCLinkIEControlMode::LOOPBACK_TEST;             // 鑷洖閫佹祴璇�
+		case CCLinkIEControlMode::HW_TEST: return CCLinkIEControlMode::HW_TEST;                         // H/W娴嬭瘯
+		case CCLinkIEControlMode::BUS_IF_TEST: return CCLinkIEControlMode::BUS_IF_TEST;                 // 鎬荤嚎I/F娴嬭瘯
+		default: return CCLinkIEControlMode::UNKNOWN;
+	}
 }
 
 int CCCLinkIEControl::ValidateBoardStatus(const BoardStatus& status) {
-    if (status.nStationValue < 1 || status.nStationValue > 120) {
-        return ERROR_CODE_STATION_OUT_OF_RANGE; // 站号超出范围
-    }
-    if (status.nGroupValue < 0 || status.nGroupValue > 32) {
-        return ERROR_CODE_GROUP_OUT_OF_RANGE;   // 组超出范围
-    }
-    if (status.nNetworkValue < 1 || status.nNetworkValue > 239) {
-        return ERROR_CODE_NETWORK_OUT_OF_RANGE; // 网络号超出范围
-    }
-    return 0; // 校验通过
+	if (status.nStationValue < 1 || status.nStationValue > 120) {
+		return ERROR_CODE_STATION_OUT_OF_RANGE; // 绔欏彿瓒呭嚭鑼冨洿
+	}
+	if (status.nGroupValue < 0 || status.nGroupValue > 32) {
+		return ERROR_CODE_GROUP_OUT_OF_RANGE;   // 缁勮秴鍑鸿寖鍥�
+	}
+	if (status.nNetworkValue < 1 || status.nNetworkValue > 239) {
+		return ERROR_CODE_NETWORK_OUT_OF_RANGE; // 缃戠粶鍙疯秴鍑鸿寖鍥�
+	}
+	return 0; // 鏍¢獙閫氳繃
 }
 
 int CCCLinkIEControl::ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData)
 {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStationAndSize(station, static_cast<short>(size));
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStationAndSize(station, static_cast<short>(size));
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 确保线程安全的最小锁定范围
-    {
-        std::lock_guard<std::mutex> lock(m_mtx);
-        const short nDevType = CalculateDeviceType(station, enDevType);
-        nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, devNo, &size, pData);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		std::lock_guard<std::mutex> lock(m_mtx);
+		const short nDevType = CalculateDeviceType(station, enDevType);
+		nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, devNo, &size, pData);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+	}
 
-    return nRet;
+	return nRet;
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
index 703780b..5782c45 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/CCLinkIEControl.h
@@ -4,66 +4,66 @@
 #include "PerformanceMelsec.h"
 
 enum class CCLinkIEControlMode : short {
-    UNKNOWN = 0x0194,               // 未知
-    ONLINE = 0x0000,                // 在线
-    OFFLINE = 0x0002,               // 离线
-    INTER_STATION_TEST = 0x0005,    // 站间测试
-    LINE_TEST = 0x0006,             // 线路测试
-    LOOPBACK_TEST = 0x0007,         // 自回送测试
-    HW_TEST = 0x0009,               // H/W测试
-    BUS_IF_TEST = 0x000E            // 总线I/F测试
+	UNKNOWN = 0x0194,               // 鏈煡
+	ONLINE = 0x0000,                // 鍦ㄧ嚎
+	OFFLINE = 0x0002,               // 绂荤嚎
+	INTER_STATION_TEST = 0x0005,    // 绔欓棿娴嬭瘯
+	LINE_TEST = 0x0006,             // 绾胯矾娴嬭瘯
+	LOOPBACK_TEST = 0x0007,         // 鑷洖閫佹祴璇�
+	HW_TEST = 0x0009,               // H/W娴嬭瘯
+	BUS_IF_TEST = 0x000E            // 鎬荤嚎I/F娴嬭瘯
 };
 
 class CCCLinkIEControl final : public CPerformanceMelsec {
 public:
-    CCCLinkIEControl();
-    ~CCCLinkIEControl() override;
+	CCCLinkIEControl();
+	~CCCLinkIEControl() override;
 
-    struct LedStatus {
-        bool bExtPw; // 外部电源状态 (b15)
-        bool bRd;    // 数据接收状态 (b6)
-        bool bDLnk;  // 数据链接状态 (b5)
-        bool bPrm;   // 管理功能状态 (b4)
-        bool bErr;   // 错误状态 (b3)
-        bool bSd;    // 数据发送状态 (b2)
-        bool bMode;  // 动作模式 (b1)
-        bool bRun;   // 运行状态 (b0)
+	struct LedStatus {
+		bool bExtPw; // 澶栭儴鐢垫簮鐘舵�� (b15)
+		bool bRd;    // 鏁版嵁鎺ユ敹鐘舵�� (b6)
+		bool bDLnk;  // 鏁版嵁閾炬帴鐘舵�� (b5)
+		bool bPrm;   // 绠$悊鍔熻兘鐘舵�� (b4)
+		bool bErr;   // 閿欒鐘舵�� (b3)
+		bool bSd;    // 鏁版嵁鍙戦�佺姸鎬� (b2)
+		bool bMode;  // 鍔ㄤ綔妯″紡 (b1)
+		bool bRun;   // 杩愯鐘舵�� (b0)
 
-        // 转换为字符串,用于调试
-        std::string ToString() const {
-            std::ostringstream oss;
-            oss << "CC-Link IE Control Network LED Status: {"
-                << "\n  Ext Power: " << (bExtPw ? "ON" : "OFF")
-                << "\n  Receive Data: " << (bRd ? "Receiving" : "Not Receiving")
-                << "\n  Data Link: " << (bDLnk ? "Linked" : "Not Linked")
-                << "\n  Management: " << (bPrm ? "Managing" : "Not Managing")
-                << "\n  Error: " << (bErr ? "Error Detected" : "No Error")
-                << "\n  Send Data: " << (bSd ? "Sending" : "Not Sending")
-                << "\n  Mode: " << (bMode ? "Executing" : "Not Executing")
-                << "\n  Run: " << (bRun ? "Running" : "Stopped")
-                << "\n}";
-            return oss.str();
-        }
-    };
+		// 杞崲涓哄瓧绗︿覆锛岀敤浜庤皟璇�
+		std::string ToString() const {
+			std::ostringstream oss;
+			oss << "CC-Link IE Control Network LED Status: {"
+				<< "\n  Ext Power: " << (bExtPw ? "ON" : "OFF")
+				<< "\n  Receive Data: " << (bRd ? "Receiving" : "Not Receiving")
+				<< "\n  Data Link: " << (bDLnk ? "Linked" : "Not Linked")
+				<< "\n  Management: " << (bPrm ? "Managing" : "Not Managing")
+				<< "\n  Error: " << (bErr ? "Error Detected" : "No Error")
+				<< "\n  Send Data: " << (bSd ? "Sending" : "Not Sending")
+				<< "\n  Mode: " << (bMode ? "Executing" : "Not Executing")
+				<< "\n  Run: " << (bRun ? "Running" : "Stopped")
+				<< "\n}";
+			return oss.str();
+		}
+	};
 
-    // 读取目标站点CPU类型
-    // short ReadCPUCodeEx(const StationIdentifier& station, short& nCPUCode);
+	// 璇诲彇鐩爣绔欑偣CPU绫诲瀷
+	// short ReadCPUCodeEx(const StationIdentifier& station, short& nCPUCode);
 
-    // 板模式获取/设置
-    int SetBoardModeEx(CCLinkIEControlMode mode);
-    CCLinkIEControlMode GetBoardModeEx();
+	// 鏉挎ā寮忚幏鍙�/璁剧疆
+	int SetBoardModeEx(CCLinkIEControlMode mode);
+	CCLinkIEControlMode GetBoardModeEx();
 
-    // 获取板状态
-    int GetBoardStatusEx(BoardStatus& status);
+	// 鑾峰彇鏉跨姸鎬�
+	int GetBoardStatusEx(BoardStatus& status);
 
-    // 读取LED状态
-    int ReadLedStatus(LedStatus& outLedStatus);
+	// 璇诲彇LED鐘舵��
+	int ReadLedStatus(LedStatus& outLedStatus);
 
-    int ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData);
+	int ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData);
 
 private:
-    static CCLinkIEControlMode ConvertToCCLinkIEControlMode(short nMode);
-    static int ValidateBoardStatus(const BoardStatus& status);
+	static CCLinkIEControlMode ConvertToCCLinkIEControlMode(short nMode);
+	static int ValidateBoardStatus(const BoardStatus& status);
 };
 
 
diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
index b8e6a84..24b6104 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.cpp
@@ -23,1572 +23,1572 @@
 #define LOG_DEBUG(msg)
 #endif
 
-// 初始化静态成员变量
+// 鍒濆鍖栭潤鎬佹垚鍛樺彉閲�
 std::unordered_map<int, std::string> CPerformanceMelsec::m_mapError = {
-    // 板块SDK错误码
-    {0, "No error, communication successful."},
-    {1, "Driver not started. The driver is not running."},
-    {2, "Timeout error (board response error). Request not completed within timeout."},
-    {66, "Already OPEN error. The specified channel is OPEN."},
-    {68, "Path error. The specified path is invalid."},
-    {69, "Unsupported function execution error."},
-    {70, "Station number error. The specified station number is invalid."},
-    {71, "No received data error (during RECV function)."},
-    {77, "Memory allocation error / insufficient memory resources."},
-    {85, "SEND/RECV channel number error."},
-    {100, "Board H/W resource busy."},
-    {101, "Routing exception."},
-    {102, "Board driver I/F error: Failed to send request data to the board driver."},
-    {103, "Board driver I/F error: Failed to receive response data from the board driver."},
-    {130, "Initial software component No. Error."},
-    {131, "Capacity error."},
-    {133, "Parameter error."},
-    {16385, "Specified target station number does not exist."},
-    {16386, "Received a request that the target station cannot process."},
-    {16418, "Failed to create the event history file."},
-    {16420, "Failed to access the event history file."},
-    {16421, "Another board driver is using the event history file."},
-    {16432, "The specified soft component type does not exist."},
-    {16433, "Soft component specification error: Out of range or invalid start I/O or block number."},
-    {16512, "Request data exception: Invalid data or unsupported module."},
-    {16685, "File association error: Failed to create the event history file."},
-    {16837, "File association error: Event history file does not exist."},
-    {18944, "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number."},
-    {-1, "Invalid path. The specified function is not supported for this path."},
-    {-2, "Start component No. error. The specified component is out of range."},
-    {-3, "Capacity error. The capacity exceeds the component range."},
-    {-6, "Component type error. The specified type during write is invalid."},
-    {-8, "Channel No. error. The channel specified is invalid."},
-    {-12, "Target path error. The specified path points to an invalid target."},
-    {-13, "Write protection area error. The specified range is protected."},
-    {-16, "Target path conflict. The path conflicts with write protection settings."},
-    {-17, "Device not found or target not responding."},
-    {-18, "Invalid target. The device does not support the operation."},
-    {-19, "Invalid path operation. An unsupported path operation was executed."},
-    {-31, "DLL library call failed or path not initialized."},
-    {-32, "Resource timeout error. Communication timed out or exceeded resource limits."},
-    {-33, "Communication timeout error. The target is not responding or timed out."},
-    {-34, "Unsupported communication target error. The specified network No. or station No. points to an unsupported model."},
-    {-35, "Registry access error."},
-    {-36, "Registry access error."},
-    {-37, "Communication initialization error. The settings for initializing the communication path are invalid."},
-    {-42, "Key information error. Authentication failed."},
-    {-43, "Marking event error. TC waiting event write was executed on the CPU."},
-    {-61, "Marking event error. TC waiting event write was executed on the CPU."},
-    {-62, "Event waiting timeout. The specified external event waiting timed out."},
-    {-63, "Timeout value is out of range."},
-    {-64, "Timeout value is out of range."},
-    {-65, "Event waiting timeout. The specified external event waiting timed out."},
-    {-66, "Timeout-induced resource shortage."},
-    {-67, "Irrelevant file access execution error."},
-    {-69, "Operation executed, but the module does not support the function."},
-    {-70, "The target event processing module returned a rejection."},
-    {-71, "The remote station did not return data correctly."},
-    {-72, "Pointer error. The specified pointer value is invalid."},
-    {-73, "Specified address error."},
-    {-2174, "Buffer data queue exception occurred. Read/write exception to device."},
-    {-7656, "Buffer data queue exception. Read/write exception to the device."},
-    {-7672, "Buffer data queue exception. Read/write exception to the device."},
-    {-11683, "Buffer data transfer error."},
-    {-11717, "Network No. error."},
-    {-11746, "Station No. error."},
-    {-12128, "Buffer data send/response error."},
-    {-18560, "Module mode setting error."},
-    {-18572, "Communication method error."},
-    {-25056, "Processor error."},
-    {-26334, "Duplicate program call or illegal CPU operation."},
-    {-26336, "Routing request error to a station without routing function support."},
-    {-27902, "Event register timeout error."},
-    {-28079, "Communication No. read error."},
-    {-28080, "Communication No. incorrect error."},
-    {-28136, "Unsupported function in fast mode error."},
-    {-28139, "Link disconnection error."},
-    {-28140, "Incorrect mode setting error."},
-    {-28141, "System reboot error."},
-    {-28142, "Mode error."},
-    {-28143, "Hardware self-diagnosis error."},
-    {-28144, "Hardware self-diagnosis error."},
-    {-28150, "Data reception interruption at remote station error."},
-    {-28151, "Data reception interruption at remote station error."},
-    {-28153, "Data reception interruption at remote station error."},
-    {-28154, "Abnormal data reception error."},
-    {-28158, "Driver WDT error."},
-    {-28160, "Hardware resource error."},
-    {-28622, "Dedicated instruction channel in-use error."},
-    {-28634, "Hardware self-diagnosis error."},
-    {-28636, "Hardware self-diagnosis error."},
+	// 鏉垮潡SDK閿欒鐮�
+	{0, "No error, communication successful."},
+	{1, "Driver not started. The driver is not running."},
+	{2, "Timeout error (board response error). Request not completed within timeout."},
+	{66, "Already OPEN error. The specified channel is OPEN."},
+	{68, "Path error. The specified path is invalid."},
+	{69, "Unsupported function execution error."},
+	{70, "Station number error. The specified station number is invalid."},
+	{71, "No received data error (during RECV function)."},
+	{77, "Memory allocation error / insufficient memory resources."},
+	{85, "SEND/RECV channel number error."},
+	{100, "Board H/W resource busy."},
+	{101, "Routing exception."},
+	{102, "Board driver I/F error: Failed to send request data to the board driver."},
+	{103, "Board driver I/F error: Failed to receive response data from the board driver."},
+	{130, "Initial software component No. Error."},
+	{131, "Capacity error."},
+	{133, "Parameter error."},
+	{16385, "Specified target station number does not exist."},
+	{16386, "Received a request that the target station cannot process."},
+	{16418, "Failed to create the event history file."},
+	{16420, "Failed to access the event history file."},
+	{16421, "Another board driver is using the event history file."},
+	{16432, "The specified soft component type does not exist."},
+	{16433, "Soft component specification error: Out of range or invalid start I/O or block number."},
+	{16512, "Request data exception: Invalid data or unsupported module."},
+	{16685, "File association error: Failed to create the event history file."},
+	{16837, "File association error: Event history file does not exist."},
+	{18944, "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number."},
+	{-1, "Invalid path. The specified function is not supported for this path."},
+	{-2, "Start component No. error. The specified component is out of range."},
+	{-3, "Capacity error. The capacity exceeds the component range."},
+	{-6, "Component type error. The specified type during write is invalid."},
+	{-8, "Channel No. error. The channel specified is invalid."},
+	{-12, "Target path error. The specified path points to an invalid target."},
+	{-13, "Write protection area error. The specified range is protected."},
+	{-16, "Target path conflict. The path conflicts with write protection settings."},
+	{-17, "Device not found or target not responding."},
+	{-18, "Invalid target. The device does not support the operation."},
+	{-19, "Invalid path operation. An unsupported path operation was executed."},
+	{-31, "DLL library call failed or path not initialized."},
+	{-32, "Resource timeout error. Communication timed out or exceeded resource limits."},
+	{-33, "Communication timeout error. The target is not responding or timed out."},
+	{-34, "Unsupported communication target error. The specified network No. or station No. points to an unsupported model."},
+	{-35, "Registry access error."},
+	{-36, "Registry access error."},
+	{-37, "Communication initialization error. The settings for initializing the communication path are invalid."},
+	{-42, "Key information error. Authentication failed."},
+	{-43, "Marking event error. TC waiting event write was executed on the CPU."},
+	{-61, "Marking event error. TC waiting event write was executed on the CPU."},
+	{-62, "Event waiting timeout. The specified external event waiting timed out."},
+	{-63, "Timeout value is out of range."},
+	{-64, "Timeout value is out of range."},
+	{-65, "Event waiting timeout. The specified external event waiting timed out."},
+	{-66, "Timeout-induced resource shortage."},
+	{-67, "Irrelevant file access execution error."},
+	{-69, "Operation executed, but the module does not support the function."},
+	{-70, "The target event processing module returned a rejection."},
+	{-71, "The remote station did not return data correctly."},
+	{-72, "Pointer error. The specified pointer value is invalid."},
+	{-73, "Specified address error."},
+	{-2174, "Buffer data queue exception occurred. Read/write exception to device."},
+	{-7656, "Buffer data queue exception. Read/write exception to the device."},
+	{-7672, "Buffer data queue exception. Read/write exception to the device."},
+	{-11683, "Buffer data transfer error."},
+	{-11717, "Network No. error."},
+	{-11746, "Station No. error."},
+	{-12128, "Buffer data send/response error."},
+	{-18560, "Module mode setting error."},
+	{-18572, "Communication method error."},
+	{-25056, "Processor error."},
+	{-26334, "Duplicate program call or illegal CPU operation."},
+	{-26336, "Routing request error to a station without routing function support."},
+	{-27902, "Event register timeout error."},
+	{-28079, "Communication No. read error."},
+	{-28080, "Communication No. incorrect error."},
+	{-28136, "Unsupported function in fast mode error."},
+	{-28139, "Link disconnection error."},
+	{-28140, "Incorrect mode setting error."},
+	{-28141, "System reboot error."},
+	{-28142, "Mode error."},
+	{-28143, "Hardware self-diagnosis error."},
+	{-28144, "Hardware self-diagnosis error."},
+	{-28150, "Data reception interruption at remote station error."},
+	{-28151, "Data reception interruption at remote station error."},
+	{-28153, "Data reception interruption at remote station error."},
+	{-28154, "Abnormal data reception error."},
+	{-28158, "Driver WDT error."},
+	{-28160, "Hardware resource error."},
+	{-28622, "Dedicated instruction channel in-use error."},
+	{-28634, "Hardware self-diagnosis error."},
+	{-28636, "Hardware self-diagnosis error."},
 
-    // 自定义错误码
-    {ERROR_CODE_UNKNOWN, "Error: Unknown error code."},
-    {ERROR_CODE_NOT_CONNECTED, "Error: Not connected to the device."},
-    {ERROR_CODE_INVALID_PARAM, "Error: Invalid parameter."},
-    {ERROR_CODE_INVALID_DATA, "Error: Invalid data provided."},
-    {ERROR_CODE_STATION_OUT_OF_RANGE, "Error: Station number is out of range."},
-    {ERROR_CODE_GROUP_OUT_OF_RANGE, "Error: Group number is out of range."},
-    {ERROR_CODE_NETWORK_OUT_OF_RANGE, "Error: Network number is out of range."}
+	// 鑷畾涔夐敊璇爜
+	{ERROR_CODE_UNKNOWN, "Error: Unknown error code."},
+	{ERROR_CODE_NOT_CONNECTED, "Error: Not connected to the device."},
+	{ERROR_CODE_INVALID_PARAM, "Error: Invalid parameter."},
+	{ERROR_CODE_INVALID_DATA, "Error: Invalid data provided."},
+	{ERROR_CODE_STATION_OUT_OF_RANGE, "Error: Station number is out of range."},
+	{ERROR_CODE_GROUP_OUT_OF_RANGE, "Error: Group number is out of range."},
+	{ERROR_CODE_NETWORK_OUT_OF_RANGE, "Error: Network number is out of range."}
 };
 
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
 CPerformanceMelsec::CPerformanceMelsec(const BoardType enBoardType) {
-    m_nPath = 0;
-    m_enBoardType = enBoardType;
-    m_bConnected.store(false);
+	m_nPath = 0;
+	m_enBoardType = enBoardType;
+	m_bConnected.store(false);
 }
 
-// 析构函数
+// 鏋愭瀯鍑芥暟
 CPerformanceMelsec::~CPerformanceMelsec() {
-    Disconnect();
+	Disconnect();
 }
 
-// 获取最近的错误信息
+// 鑾峰彇鏈�杩戠殑閿欒淇℃伅
 std::string CPerformanceMelsec::GetLastError() const {
-    return m_strLastError;
+	return m_strLastError;
 }
 
-// 保存错误信息
+// 淇濆瓨閿欒淇℃伅
 bool CPerformanceMelsec::SaveErrorInfoToFile(const std::string& filename) {
-    // 打开文件
-    std::ofstream file(filename);
-    if (!file.is_open()) {
-        std::cerr << "Failed to open file for saving: " << filename << std::endl;
-        return false;
-    }
+	// 鎵撳紑鏂囦欢
+	std::ofstream file(filename);
+	if (!file.is_open()) {
+		std::cerr << "Failed to open file for saving: " << filename << std::endl;
+		return false;
+	}
 
-    // 遍历静态成员变量 m_mapError 并将每个错误信息写入文件
-    for (const auto& entry : m_mapError) {
-        const int nCode = entry.first;
-        const std::string& strMessage = entry.second;
-        file << nCode << "|" << strMessage << "\n";
-    }
-    file.close();
+	// 閬嶅巻闈欐�佹垚鍛樺彉閲� m_mapError 骞跺皢姣忎釜閿欒淇℃伅鍐欏叆鏂囦欢
+	for (const auto& entry : m_mapError) {
+		const int nCode = entry.first;
+		const std::string& strMessage = entry.second;
+		file << nCode << "|" << strMessage << "\n";
+	}
+	file.close();
 
-    return true;
+	return true;
 }
 
-// 加载错误信息
+// 鍔犺浇閿欒淇℃伅
 bool CPerformanceMelsec::LoadErrorInfoFromFile(const std::string& filename) {
-    std::ifstream inFile(filename);
-    if (!inFile.is_open()) {
-        std::cerr << "Failed to open file for loading: " << filename << std::endl;
-        return false;
-    }
+	std::ifstream inFile(filename);
+	if (!inFile.is_open()) {
+		std::cerr << "Failed to open file for loading: " << filename << std::endl;
+		return false;
+	}
 
-    m_mapError.clear();
-    std::string line;
-    while (std::getline(inFile, line)) {
-        std::istringstream iss(line);
-        int nCode = 0;
-        std::string strToken;
-        std::string strMessage;
+	m_mapError.clear();
+	std::string line;
+	while (std::getline(inFile, line)) {
+		std::istringstream iss(line);
+		int nCode = 0;
+		std::string strToken;
+		std::string strMessage;
 
-        // 使用分隔符 "|" 解析每一行
-        if (std::getline(iss, strToken, '|')) {
-            nCode = std::stoi(strToken);
-        }
+		// 浣跨敤鍒嗛殧绗� "|" 瑙f瀽姣忎竴琛�
+		if (std::getline(iss, strToken, '|')) {
+			nCode = std::stoi(strToken);
+		}
 
-        if (std::getline(iss, strToken)) {
-            strMessage = strToken;
-        }
+		if (std::getline(iss, strToken)) {
+			strMessage = strToken;
+		}
 
-        if (!strMessage.empty()) {
-            m_mapError[nCode] = strMessage;
-        }
-    }
+		if (!strMessage.empty()) {
+			m_mapError[nCode] = strMessage;
+		}
+	}
 
-    return true;
+	return true;
 }
 
-// 连接到PLC
+// 杩炴帴鍒癙LC
 int CPerformanceMelsec::Connect(const short nChannel, const short nMode) {
-    std::lock_guard<std::mutex> lock(m_mtx);
+	std::lock_guard<std::mutex> lock(m_mtx);
 
-    if (m_bConnected.load()) {
-        return 0;
-    }
+	if (m_bConnected.load()) {
+		return 0;
+	}
 
-    const BoardType enBoardType = FindBoardTypeByChannel(nChannel);
-    if (enBoardType == BoardType::UNKNOWN || enBoardType != m_enBoardType) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	const BoardType enBoardType = FindBoardTypeByChannel(nChannel);
+	if (enBoardType == BoardType::UNKNOWN || enBoardType != m_enBoardType) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    // 连接PLC,显式类型转换以匹配 mdOpen 的签名
-    const short nRet = mdOpen(nChannel, nMode, &m_nPath);
-    if (nRet == 0) {
-        m_bConnected.store(true);
-        m_enBoardType = enBoardType;
-    }
-    else {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	// 杩炴帴PLC锛屾樉寮忕被鍨嬭浆鎹互鍖归厤 mdOpen 鐨勭鍚�
+	const short nRet = mdOpen(nChannel, nMode, &m_nPath);
+	if (nRet == 0) {
+		m_bConnected.store(true);
+		m_enBoardType = enBoardType;
+	}
+	else {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 断开连接
+// 鏂紑杩炴帴
 int CPerformanceMelsec::Disconnect() {
-    std::lock_guard<std::mutex> lock(m_mtx);
+	std::lock_guard<std::mutex> lock(m_mtx);
 
-    short nRet = 0;
-    if (m_bConnected.load()) {
-        nRet = mdClose(m_nPath);
-        m_bConnected.store(false);
-        m_nPath = 0;
-    }
+	short nRet = 0;
+	if (m_bConnected.load()) {
+		nRet = mdClose(m_nPath);
+		m_bConnected.store(false);
+		m_nPath = 0;
+	}
 
-    UpdateLastError(nRet);
-    LOG_DEBUG("Close connect.");
+	UpdateLastError(nRet);
+	LOG_DEBUG("Close connect.");
 
-    return nRet;
+	return nRet;
 }
 
-// 可编程控制器软元件信息表的初始化
+// 鍙紪绋嬫帶鍒跺櫒杞厓浠朵俊鎭〃鐨勫垵濮嬪寲
 int CPerformanceMelsec::InitializeController() {
-    std::lock_guard<std::mutex> lock(m_mtx);
+	std::lock_guard<std::mutex> lock(m_mtx);
 
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    const short nRet = mdInit(m_nPath);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	const short nRet = mdInit(m_nPath);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 获取版本信息
+// 鑾峰彇鐗堟湰淇℃伅
 int CPerformanceMelsec::GetBoardVersion(BoardVersion& version) {
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    // 获取版本信息
-    short buf[32] = { 0 };
-    const short nRet = mdBdVerRead(m_nPath, buf);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-        return nRet;
-    }
+	// 鑾峰彇鐗堟湰淇℃伅
+	short buf[32] = { 0 };
+	const short nRet = mdBdVerRead(m_nPath, buf);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+		return nRet;
+	}
 
-    // 填充版本信息到结构体
-    version.fixedValue[0] = static_cast<char>(buf[0] & 0xFF);
-    version.fixedValue[1] = static_cast<char>((buf[0] >> 8) & 0xFF);
+	// 濉厖鐗堟湰淇℃伅鍒扮粨鏋勪綋
+	version.fixedValue[0] = static_cast<char>(buf[0] & 0xFF);
+	version.fixedValue[1] = static_cast<char>((buf[0] >> 8) & 0xFF);
 
-    version.checksum[0] = static_cast<char>(buf[1] & 0xFF);
-    version.checksum[1] = static_cast<char>((buf[1] >> 8) & 0xFF);
+	version.checksum[0] = static_cast<char>(buf[1] & 0xFF);
+	version.checksum[1] = static_cast<char>((buf[1] >> 8) & 0xFF);
 
-    version.swVersion[0] = static_cast<char>(buf[2] & 0xFF);
-    version.swVersion[1] = static_cast<char>((buf[2] >> 8) & 0xFF);
+	version.swVersion[0] = static_cast<char>(buf[2] & 0xFF);
+	version.swVersion[1] = static_cast<char>((buf[2] >> 8) & 0xFF);
 
-    std::memcpy(version.date, &buf[3], 6);
+	std::memcpy(version.date, &buf[3], 6);
 
-    version.reserved = static_cast<uint32_t>(buf[6]) | (static_cast<uint32_t>(buf[7]) << 16);
+	version.reserved = static_cast<uint32_t>(buf[6]) | (static_cast<uint32_t>(buf[7]) << 16);
 
-    std::memcpy(version.swModel, &buf[8], 16);
-    std::memcpy(version.hwModel, &buf[16], 16);
+	std::memcpy(version.swModel, &buf[8], 16);
+	std::memcpy(version.hwModel, &buf[16], 16);
 
-    version.twoPortMemory[0] = static_cast<char>(buf[18] & 0xFF);
-    version.twoPortMemory[1] = static_cast<char>((buf[18] >> 8) & 0xFF);
+	version.twoPortMemory[0] = static_cast<char>(buf[18] & 0xFF);
+	version.twoPortMemory[1] = static_cast<char>((buf[18] >> 8) & 0xFF);
 
-    version.twoPortAttribute[0] = static_cast<char>(buf[19] & 0xFF);
-    version.twoPortAttribute[1] = static_cast<char>((buf[19] >> 8) & 0xFF);
+	version.twoPortAttribute[0] = static_cast<char>(buf[19] & 0xFF);
+	version.twoPortAttribute[1] = static_cast<char>((buf[19] >> 8) & 0xFF);
 
-    version.availableBias[0] = static_cast<char>(buf[20] & 0xFF);
-    version.availableBias[1] = static_cast<char>((buf[20] >> 8) & 0xFF);
+	version.availableBias[0] = static_cast<char>(buf[20] & 0xFF);
+	version.availableBias[1] = static_cast<char>((buf[20] >> 8) & 0xFF);
 
-    std::memcpy(version.moduleType, &buf[21], 10);
+	std::memcpy(version.moduleType, &buf[21], 10);
 
-    return nRet;
+	return nRet;
 }
 
-// 读取目标站点CPU类型
+// 璇诲彇鐩爣绔欑偣CPU绫诲瀷
 int CPerformanceMelsec::ReadCPUCode(const StationIdentifier& station, short& nCPUCode) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 确保线程安全的最小锁定范围
-    {
-        nCPUCode = 0;
-        std::lock_guard<std::mutex> lock(m_mtx);
-        nRet = mdTypeRead(m_nPath, CombineStation(station), &nCPUCode);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		nCPUCode = 0;
+		std::lock_guard<std::mutex> lock(m_mtx);
+		nRet = mdTypeRead(m_nPath, CombineStation(station), &nCPUCode);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 板模式设置
+// 鏉挎ā寮忚缃�
 int CPerformanceMelsec::SetBoardMode(const short nMode) {
-    // 检查是否已经连接
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	// 妫�鏌ユ槸鍚﹀凡缁忚繛鎺�
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    // 确保线程安全的最小锁定范围
-    short nRet = 0;
-    {
-        std::lock_guard<std::mutex> lock(m_mtx);
-        nRet = mdBdModSet(m_nPath, nMode);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	short nRet = 0;
+	{
+		std::lock_guard<std::mutex> lock(m_mtx);
+		nRet = mdBdModSet(m_nPath, nMode);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 获取板模式
+// 鑾峰彇鏉挎ā寮�
 int CPerformanceMelsec::GetBoardMode(short& nMode) {
-    // 检查是否已经连接
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	// 妫�鏌ユ槸鍚﹀凡缁忚繛鎺�
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    short nRet = 0;
-    {
-        nMode = 0;
-        std::lock_guard<std::mutex> lock(m_mtx);
-        nRet = mdBdModRead(m_nPath, &nMode);
-    }
+	short nRet = 0;
+	{
+		nMode = 0;
+		std::lock_guard<std::mutex> lock(m_mtx);
+		nRet = mdBdModRead(m_nPath, &nMode);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_DEBUG("Raw Mode: " << nMode);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_DEBUG("Raw Mode: " << nMode);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return 0;
+	return 0;
 }
 
-// 板复位
+// 鏉垮浣�
 int CPerformanceMelsec::BoardReset() {
-    std::lock_guard<std::mutex> lock(m_mtx);
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	std::lock_guard<std::mutex> lock(m_mtx);
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    const short nRet = mdBdRst(m_nPath);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	const short nRet = mdBdRst(m_nPath);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 板LED读取
+// 鏉縇ED璇诲彇
 int CPerformanceMelsec::ReadBoardLed(std::vector<short>& vecLedBuffer) {
-    std::lock_guard<std::mutex> lock(m_mtx);
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	std::lock_guard<std::mutex> lock(m_mtx);
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    // 清空 LED 缓冲区
-    vecLedBuffer.clear();
-    vecLedBuffer.resize(16, 0);
+	// 娓呯┖ LED 缂撳啿鍖�
+	vecLedBuffer.clear();
+	vecLedBuffer.resize(16, 0);
 
-    // 调用 SDK 函数读取 LED 数据
-    const short nRet = mdBdLedRead(m_nPath, vecLedBuffer.data());
-    if (nRet != 0) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        LOG_ERROR("Error reading board LED, ErrorCode: " << nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	// 璋冪敤 SDK 鍑芥暟璇诲彇 LED 鏁版嵁
+	const short nRet = mdBdLedRead(m_nPath, vecLedBuffer.data());
+	if (nRet != 0) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		LOG_ERROR("Error reading board LED, ErrorCode: " << nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 获取板状态
+// 鑾峰彇鏉跨姸鎬�
 int CPerformanceMelsec::GetBoardStatus(BoardStatus& status) {
-    std::lock_guard<std::mutex> lock(m_mtx);
-    if (!m_bConnected) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	std::lock_guard<std::mutex> lock(m_mtx);
+	if (!m_bConnected) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    short buf[6] = { 0 };
-    const short nRet = mdBdSwRead(m_nPath, buf);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	short buf[6] = { 0 };
+	const short nRet = mdBdSwRead(m_nPath, buf);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    // 将 buf 映射到结构体
-    status = BoardStatus::fromBuffer(buf);
-    return 0;
+	// 灏� buf 鏄犲皠鍒扮粨鏋勪綋
+	status = BoardStatus::fromBuffer(buf);
+	return 0;
 }
 
-// 通用读数据
+// 閫氱敤璇绘暟鎹�
 int CPerformanceMelsec::ReadData(const StationIdentifier& station, const long nDevType, const long nDevNo, long nSize, std::vector<short>& vecData) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStationAndSize(station, static_cast<short>(nSize));
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStationAndSize(station, static_cast<short>(nSize));
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 初始化读取缓冲区
-    vecData.clear();
-    vecData.resize(nSize, 0);
+	// 鍒濆鍖栬鍙栫紦鍐插尯
+	vecData.clear();
+	vecData.resize(nSize, 0);
 
-    // 确保线程安全的最小锁定范围
-    {
-        std::lock_guard<std::mutex> lock(m_mtx);
-        short* pData = vecData.data();
-        nSize *= sizeof(short);
-        nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, (long)(unsigned short)nDevNo, &nSize, pData);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		std::lock_guard<std::mutex> lock(m_mtx);
+		short* pData = vecData.data();
+		nSize *= sizeof(short);
+		nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, (long)(unsigned short)nDevNo, &nSize, pData);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    if (nRet != 0) {
-        vecData.clear(); // 如果读取失败,清空缓冲区
-    }
+	if (nRet != 0) {
+		vecData.clear(); // 濡傛灉璇诲彇澶辫触锛屾竻绌虹紦鍐插尯
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 读取位数据
+// 璇诲彇浣嶆暟鎹�
 int CPerformanceMelsec::ReadBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nBitCount, BitContainer& vecData) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStationAndSize(station, nBitCount);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStationAndSize(station, nBitCount);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    if (nDevNo % 8 != 0) {
-        nRet = -2;
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	if (nDevNo % 8 != 0) {
+		nRet = -2;
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    const auto nSize = static_cast<short>((static_cast<int>(nBitCount) + 15) / 16);  // 计算需要读取的字数量(向上取整)
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	const auto nSize = static_cast<short>((static_cast<int>(nBitCount) + 15) / 16);  // 璁$畻闇�瑕佽鍙栫殑瀛楁暟閲忥紙鍚戜笂鍙栨暣锛�
 
-    std::vector<short> vecTempBuffer(nSize, 0);
-    nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer);
+	std::vector<short> vecTempBuffer(nSize, 0);
+	nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer);
 
-    if (nRet == 0) {
-        vecData.clear();
+	if (nRet == 0) {
+		vecData.clear();
 
-        // 将字数据解析为位数据
-        for (short nIdx = 0; nIdx < nSize; ++nIdx) {
-            const short nCurrentValue = vecTempBuffer[nIdx];
-            // 遍历当前 short 中的每一位
-            for (int bitIdx = 0; bitIdx < 16; ++bitIdx) {
-                bool bBit = (nCurrentValue & (1 << bitIdx)) != 0;
-                vecData.push_back(bBit);
-                if (vecData.size() >= nBitCount) {
-                    return nRet;  // 如果已经读取完所需的位数,提前退出
-                }
-            }
-        }
-    }
+		// 灏嗗瓧鏁版嵁瑙f瀽涓轰綅鏁版嵁
+		for (short nIdx = 0; nIdx < nSize; ++nIdx) {
+			const short nCurrentValue = vecTempBuffer[nIdx];
+			// 閬嶅巻褰撳墠 short 涓殑姣忎竴浣�
+			for (int bitIdx = 0; bitIdx < 16; ++bitIdx) {
+				bool bBit = (nCurrentValue & (1 << bitIdx)) != 0;
+				vecData.push_back(bBit);
+				if (vecData.size() >= nBitCount) {
+					return nRet;  // 濡傛灉宸茬粡璇诲彇瀹屾墍闇�鐨勪綅鏁帮紝鎻愬墠閫�鍑�
+				}
+			}
+		}
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 读取字数据
+// 璇诲彇瀛楁暟鎹�
 int CPerformanceMelsec::ReadWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nWordCount, WordContainer& vecData) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStationAndSize(station, nWordCount);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStationAndSize(station, nWordCount);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    std::vector<short> vecTempBuffer(nWordCount, 0);
-    nRet = ReadData(station, nDevType, nDevNo, nWordCount, vecTempBuffer);
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	std::vector<short> vecTempBuffer(nWordCount, 0);
+	nRet = ReadData(station, nDevType, nDevNo, nWordCount, vecTempBuffer);
 
-    if (nRet == 0) {
-        vecData.clear();
-        vecData.assign(vecTempBuffer.begin(), vecTempBuffer.end());
-    }
+	if (nRet == 0) {
+		vecData.clear();
+		vecData.assign(vecTempBuffer.begin(), vecTempBuffer.end());
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 读取双字数据
+// 璇诲彇鍙屽瓧鏁版嵁
 int CPerformanceMelsec::ReadDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nDWordCount, DWordContainer& vecData) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStationAndSize(station, nDWordCount);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStationAndSize(station, nDWordCount);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const auto nSize = static_cast<short>(nDWordCount * 2); // 每个双字占两个字(每个双字占 4 字节)
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    std::vector<short> vecTempBuffer(nSize, 0);
-    nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer);
+	const auto nSize = static_cast<short>(nDWordCount * 2); // 姣忎釜鍙屽瓧鍗犱袱涓瓧锛堟瘡涓弻瀛楀崰 4 瀛楄妭锛�
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	std::vector<short> vecTempBuffer(nSize, 0);
+	nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer);
 
-    if (nRet == 0) {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        ConvertShortToUint32(vecTempBuffer, vecData);
-    }
+	if (nRet == 0) {
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		ConvertShortToUint32(vecTempBuffer, vecData);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 通用写数据
+// 閫氱敤鍐欐暟鎹�
 int CPerformanceMelsec::WriteData(const StationIdentifier& station, const long nDevType, const long nDevNo, long nSize, short* pData) {
-    // 验证站点参数
-    int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟
+	int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 数据有效性
-    if (nSize < 0 || pData == nullptr) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	// 鏁版嵁鏈夋晥鎬�
+	if (nSize < 0 || pData == nullptr) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    // 确保线程安全的最小锁定范围
-    {
-        std::lock_guard<std::mutex> lock(m_mtx);
-        nSize *= sizeof(short);
-        nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, pData);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		std::lock_guard<std::mutex> lock(m_mtx);
+		nSize *= sizeof(short);
+		nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, pData);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 写位数据
+// 鍐欎綅鏁版嵁
 int CPerformanceMelsec::WriteBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const BitContainer& vecData) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    if (nDevNo % 8 != 0) {
-        nRet = -2;
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	if (nDevNo % 8 != 0) {
+		nRet = -2;
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    const auto nSize = static_cast<short>((static_cast<int>(vecData.size()) + 15) / 16);  // 计算需要写入的字数量(向上取整)
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	const auto nSize = static_cast<short>((static_cast<int>(vecData.size()) + 15) / 16);  // 璁$畻闇�瑕佸啓鍏ョ殑瀛楁暟閲忥紙鍚戜笂鍙栨暣锛�
 
-    // 准备临时缓冲区来存储转换后的 16 位数据
-    std::vector<short> vecTempBuffer(nSize, 0);
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        // 将位数据按字打包到临时缓冲区
-        for (int i = 0; i < vecData.size(); ++i) {
-            if (vecData[i]) {
-                // 使用 & 0xFFFF 保证不会超过 16 位,防止溢出
-                vecTempBuffer[i / 16] |= static_cast<short>((1 << (i % 16)) & 0xFFFF);
-            }
-        }
-    }
+	// 鍑嗗涓存椂缂撳啿鍖烘潵瀛樺偍杞崲鍚庣殑 16 浣嶆暟鎹�
+	std::vector<short> vecTempBuffer(nSize, 0);
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		// 灏嗕綅鏁版嵁鎸夊瓧鎵撳寘鍒颁复鏃剁紦鍐插尯
+		for (int i = 0; i < vecData.size(); ++i) {
+			if (vecData[i]) {
+				// 浣跨敤 & 0xFFFF 淇濊瘉涓嶄細瓒呰繃 16 浣嶏紝闃叉婧㈠嚭
+				vecTempBuffer[i / 16] |= static_cast<short>((1 << (i % 16)) & 0xFFFF);
+			}
+		}
+	}
 
-    return WriteData(station, nDevType, nDevNo, nSize, vecTempBuffer.data());
+	return WriteData(station, nDevType, nDevNo, nSize, vecTempBuffer.data());
 }
 
-// 写字数据
+// 鍐欏瓧鏁版嵁
 int CPerformanceMelsec::WriteWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const WordContainer& vecData) {
-    // 验证站点参数和数据有效性
-    const int nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	const int nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 计算需要写入的字节数(每个字占 2 字节)
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    const auto nSize = static_cast<short>(vecData.size());
-    const auto pData = const_cast<short*>(reinterpret_cast<const short*>(vecData.data()));
+	// 璁$畻闇�瑕佸啓鍏ョ殑瀛楄妭鏁帮紙姣忎釜瀛楀崰 2 瀛楄妭锛�
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	const auto nSize = static_cast<short>(vecData.size());
+	const auto pData = const_cast<short*>(reinterpret_cast<const short*>(vecData.data()));
 
-    return WriteData(station, nDevType, nDevNo, nSize, pData);
+	return WriteData(station, nDevType, nDevNo, nSize, pData);
 }
 
-// 写双字数据
+// 鍐欏弻瀛楁暟鎹�
 int CPerformanceMelsec::WriteDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const DWordContainer& vecData) {
-    // 验证站点参数和数据有效性
-    const int nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	const int nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 计算需要写入的字节数(每个双字占 4 字节)
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    const auto nSize = static_cast<short>(vecData.size() * sizeof(short));
-    std::vector<short> vecBuffer(nSize, 0);
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        ConvertUint32ToShort(vecData, vecBuffer);
-    }
+	// 璁$畻闇�瑕佸啓鍏ョ殑瀛楄妭鏁帮紙姣忎釜鍙屽瓧鍗� 4 瀛楄妭锛�
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	const auto nSize = static_cast<short>(vecData.size() * sizeof(short));
+	std::vector<short> vecBuffer(nSize, 0);
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		ConvertUint32ToShort(vecData, vecBuffer);
+	}
 
-    return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data());
+	return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data());
 }
 
-// 扩展读数据
+// 鎵╁睍璇绘暟鎹�
 long CPerformanceMelsec::ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData) {
-    // 验证站点参数和读取大小是否有效
-    long nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜岃鍙栧ぇ灏忔槸鍚︽湁鏁�
+	long nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    if (nSize < 0) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	if (nSize < 0) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    nSize = nSize % 2 != 0 ? nSize + 1 : nSize;
-    std::vector<short> vecBuffer(nSize / 2, 0);
+	nSize = nSize % 2 != 0 ? nSize + 1 : nSize;
+	std::vector<short> vecBuffer(nSize / 2, 0);
 
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data());
-    }
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data());
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
-    else {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        vecData.resize(nSize);
-        ConvertShortToChar(vecBuffer, vecData);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
+	else {
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		vecData.resize(nSize);
+		ConvertShortToChar(vecBuffer, vecData);
+	}
 
-    return 0;
+	return 0;
 }
 
-// 扩展读取位数据
+// 鎵╁睍璇诲彇浣嶆暟鎹�
 long CPerformanceMelsec::ReadBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nBitCount, BitContainer& vecData) {
-    long nRet = ValidateStationAndSize(station, static_cast<short>(nBitCount));
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	long nRet = ValidateStationAndSize(station, static_cast<short>(nBitCount));
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
+	const short nDevType = CalculateDeviceType(station, enDevType);
 
-    // === 自动对齐到起始字 ===
-    long nWordAlignedStartBit = nDevNo / 16 * 16;
-    long nBitOffset = nDevNo - nWordAlignedStartBit;
-    long nTotalBits = nBitOffset + nBitCount;
-    long nWordCount = (nTotalBits + 15) / 16;
-    long nByteSize = nWordCount * sizeof(short);
+	// === 鑷姩瀵归綈鍒拌捣濮嬪瓧 ===
+	long nWordAlignedStartBit = nDevNo / 16 * 16;
+	long nBitOffset = nDevNo - nWordAlignedStartBit;
+	long nTotalBits = nBitOffset + nBitCount;
+	long nWordCount = (nTotalBits + 15) / 16;
+	long nByteSize = nWordCount * sizeof(short);
 
-    std::vector<char> vecRaw;
-    nRet = ReadDataEx(station, nDevType, nWordAlignedStartBit, nByteSize, vecRaw);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	std::vector<char> vecRaw;
+	nRet = ReadDataEx(station, nDevType, nWordAlignedStartBit, nByteSize, vecRaw);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    vecData.clear();
-    for (long i = 0; i < nWordCount; ++i) {
-        short word = static_cast<unsigned char>(vecRaw[i * 2]) |
-            (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8);
+	vecData.clear();
+	for (long i = 0; i < nWordCount; ++i) {
+		short word = static_cast<unsigned char>(vecRaw[i * 2]) |
+			(static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8);
 
-        for (int j = 0; j < 16; ++j) {
-            long bitIndex = i * 16 + j;
-            if (bitIndex >= nBitOffset && vecData.size() < static_cast<size_t>(nBitCount)) {
-                vecData.push_back((word & (1 << j)) != 0);
-            }
-        }
-    }
+		for (int j = 0; j < 16; ++j) {
+			long bitIndex = i * 16 + j;
+			if (bitIndex >= nBitOffset && vecData.size() < static_cast<size_t>(nBitCount)) {
+				vecData.push_back((word & (1 << j)) != 0);
+			}
+		}
+	}
 
-    return 0;
+	return 0;
 }
 
-// 扩展读取字数据
+// 鎵╁睍璇诲彇瀛楁暟鎹�
 long CPerformanceMelsec::ReadWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nWordCount, WordContainer& vecData) {
-    long nRet = ValidateStationAndSize(station, static_cast<short>(nWordCount));
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	long nRet = ValidateStationAndSize(station, static_cast<short>(nWordCount));
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    const long nByteSize = nWordCount * sizeof(short);
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	const long nByteSize = nWordCount * sizeof(short);
 
-    std::vector<char> vecRaw;
-    nRet = ReadDataEx(station, nDevType, nDevNo, nByteSize, vecRaw);
-    if (nRet != 0) {
-        return nRet;
-    }
+	std::vector<char> vecRaw;
+	nRet = ReadDataEx(station, nDevType, nDevNo, nByteSize, vecRaw);
+	if (nRet != 0) {
+		return nRet;
+	}
 
-    vecData.clear();
-    for (long i = 0; i < nWordCount; ++i) {
-        short value = static_cast<unsigned char>(vecRaw[i * 2]) |
-            (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8);
-        vecData.push_back(value);
-    }
+	vecData.clear();
+	for (long i = 0; i < nWordCount; ++i) {
+		short value = static_cast<unsigned char>(vecRaw[i * 2]) |
+			(static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8);
+		vecData.push_back(value);
+	}
 
-    return 0;
+	return 0;
 }
 
-// 扩展读取双字数据
+// 鎵╁睍璇诲彇鍙屽瓧鏁版嵁
 long CPerformanceMelsec::ReadDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nDWordCount, DWordContainer& vecData) {
-    long nRet = ValidateStationAndSize(station, static_cast<short>(nDWordCount));
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	long nRet = ValidateStationAndSize(station, static_cast<short>(nDWordCount));
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    const long nByteSize = nDWordCount * sizeof(uint32_t);
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	const long nByteSize = nDWordCount * sizeof(uint32_t);
 
-    std::vector<char> vecRaw;
-    nRet = ReadDataEx(station, nDevType, nDevNo, nByteSize, vecRaw);
-    if (nRet != 0) {
-        return nRet;
-    }
+	std::vector<char> vecRaw;
+	nRet = ReadDataEx(station, nDevType, nDevNo, nByteSize, vecRaw);
+	if (nRet != 0) {
+		return nRet;
+	}
 
-    vecData.clear();
-    for (long i = 0; i < nDWordCount; ++i) {
-        uint32_t val = static_cast<unsigned char>(vecRaw[i * 4 + 0]) |
-            (static_cast<unsigned char>(vecRaw[i * 4 + 1]) << 8) |
-            (static_cast<unsigned char>(vecRaw[i * 4 + 2]) << 16) |
-            (static_cast<unsigned char>(vecRaw[i * 4 + 3]) << 24);
-        vecData.push_back(val);
-    }
+	vecData.clear();
+	for (long i = 0; i < nDWordCount; ++i) {
+		uint32_t val = static_cast<unsigned char>(vecRaw[i * 4 + 0]) |
+			(static_cast<unsigned char>(vecRaw[i * 4 + 1]) << 8) |
+			(static_cast<unsigned char>(vecRaw[i * 4 + 2]) << 16) |
+			(static_cast<unsigned char>(vecRaw[i * 4 + 3]) << 24);
+		vecData.push_back(val);
+	}
 
-    return 0;
+	return 0;
 }
 
-// 扩展写数据
+// 鎵╁睍鍐欐暟鎹�
 long CPerformanceMelsec::WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector<char>& vecData) {
-    // 验证站点参数和数据有效性
-    long nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	long nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 将 vecData 转换为 short 类型的缓冲区
-    long nSize = static_cast<long>(vecData.size());
-    nSize = nSize % 2 != 0 ? nSize + 1 : nSize;
-    std::vector<short> vecBuffer(nSize / 2, 0);
+	// 灏� vecData 杞崲涓� short 绫诲瀷鐨勭紦鍐插尯
+	long nSize = static_cast<long>(vecData.size());
+	nSize = nSize % 2 != 0 ? nSize + 1 : nSize;
+	std::vector<short> vecBuffer(nSize / 2, 0);
 
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        ConvertCharToShort(vecData, vecBuffer);
-        nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data());
-    }
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		ConvertCharToShort(vecData, vecBuffer);
+		nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data());
+	}
 
-    // 错误处理和日志记录
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	// 閿欒澶勭悊鍜屾棩蹇楄褰�
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 扩展写位数据
+// 鎵╁睍鍐欎綅鏁版嵁
 long CPerformanceMelsec::WriteBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const BitContainer& vecData) {
-    long nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	long nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
+	const short nDevType = CalculateDeviceType(station, enDevType);
 
-    // === 1. 自动对齐起始地址 ===
-    long nWordAlignedStartBit = nDevNo / 16 * 16;
-    long nBitOffset = nDevNo - nWordAlignedStartBit;
-    long nTotalBits = nBitOffset + static_cast<long>(vecData.size());
-    size_t nWordCount = (nTotalBits + 15) / 16;
+	// === 1. 鑷姩瀵归綈璧峰鍦板潃 ===
+	long nWordAlignedStartBit = nDevNo / 16 * 16;
+	long nBitOffset = nDevNo - nWordAlignedStartBit;
+	long nTotalBits = nBitOffset + static_cast<long>(vecData.size());
+	size_t nWordCount = (nTotalBits + 15) / 16;
 
-    // === 2. 先读取原始值以支持非对齐覆盖 ===
-    std::vector<char> vecRaw;
-    nRet = ReadDataEx(station, nDevType, nWordAlignedStartBit, static_cast<long>(nWordCount * sizeof(short)), vecRaw);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// === 2. 鍏堣鍙栧師濮嬪�间互鏀寔闈炲榻愯鐩� ===
+	std::vector<char> vecRaw;
+	nRet = ReadDataEx(station, nDevType, nWordAlignedStartBit, static_cast<long>(nWordCount * sizeof(short)), vecRaw);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // === 3. 合并新数据 ===
-    std::vector<short> vecWordBuffer(nWordCount, 0);
-    for (size_t i = 0; i < nWordCount; ++i) {
-        vecWordBuffer[i] = static_cast<unsigned char>(vecRaw[i * 2]) | (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8);
-    }
+	// === 3. 鍚堝苟鏂版暟鎹� ===
+	std::vector<short> vecWordBuffer(nWordCount, 0);
+	for (size_t i = 0; i < nWordCount; ++i) {
+		vecWordBuffer[i] = static_cast<unsigned char>(vecRaw[i * 2]) | (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8);
+	}
 
-    for (size_t i = 0; i < vecData.size(); ++i) {
-        size_t bitIndex = nBitOffset + i;
-        size_t wordIdx = bitIndex / 16;
-        size_t bitPos = bitIndex % 16;
-        if (vecData[i]) {
-            vecWordBuffer[wordIdx] |= (1 << bitPos);
-        }
-        else {
-            vecWordBuffer[wordIdx] &= ~(1 << bitPos);
-        }
-    }
+	for (size_t i = 0; i < vecData.size(); ++i) {
+		size_t bitIndex = nBitOffset + i;
+		size_t wordIdx = bitIndex / 16;
+		size_t bitPos = bitIndex % 16;
+		if (vecData[i]) {
+			vecWordBuffer[wordIdx] |= (1 << bitPos);
+		}
+		else {
+			vecWordBuffer[wordIdx] &= ~(1 << bitPos);
+		}
+	}
 
-    // === 4. 转为字节流写入 ===
-    std::vector<char> vecByteBuffer(nWordCount * 2);
-    for (size_t i = 0; i < nWordCount; ++i) {
-        vecByteBuffer[i * 2] = static_cast<char>(vecWordBuffer[i] & 0xFF);
-        vecByteBuffer[i * 2 + 1] = static_cast<char>((vecWordBuffer[i] >> 8) & 0xFF);
-    }
+	// === 4. 杞负瀛楄妭娴佸啓鍏� ===
+	std::vector<char> vecByteBuffer(nWordCount * 2);
+	for (size_t i = 0; i < nWordCount; ++i) {
+		vecByteBuffer[i * 2] = static_cast<char>(vecWordBuffer[i] & 0xFF);
+		vecByteBuffer[i * 2 + 1] = static_cast<char>((vecWordBuffer[i] >> 8) & 0xFF);
+	}
 
-    return WriteDataEx(station, nDevType, nWordAlignedStartBit, vecByteBuffer);
+	return WriteDataEx(station, nDevType, nWordAlignedStartBit, vecByteBuffer);
 }
 
-// 扩展写字数据
+// 鎵╁睍鍐欏瓧鏁版嵁
 long CPerformanceMelsec::WriteWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const WordContainer& vecData) {
-    long nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	long nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    std::vector<char> vecByteBuffer;
-    vecByteBuffer.resize(vecData.size() * sizeof(short));
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	std::vector<char> vecByteBuffer;
+	vecByteBuffer.resize(vecData.size() * sizeof(short));
 
-    for (size_t i = 0; i < vecData.size(); ++i) {
-        vecByteBuffer[i * 2] = static_cast<char>(vecData[i] & 0xFF);
-        vecByteBuffer[i * 2 + 1] = static_cast<char>((vecData[i] >> 8) & 0xFF);
-    }
+	for (size_t i = 0; i < vecData.size(); ++i) {
+		vecByteBuffer[i * 2] = static_cast<char>(vecData[i] & 0xFF);
+		vecByteBuffer[i * 2 + 1] = static_cast<char>((vecData[i] >> 8) & 0xFF);
+	}
 
-    return WriteDataEx(station, nDevType, nDevNo, vecByteBuffer);
+	return WriteDataEx(station, nDevType, nDevNo, vecByteBuffer);
 }
 
-// 扩展写双字数据
+// 鎵╁睍鍐欏弻瀛楁暟鎹�
 long CPerformanceMelsec::WriteDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const DWordContainer& vecData) {
-    long nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	long nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    const short nDevType = CalculateDeviceType(station, enDevType);
-    std::vector<char> vecByteBuffer;
-    vecByteBuffer.resize(vecData.size() * sizeof(uint32_t));
+	const short nDevType = CalculateDeviceType(station, enDevType);
+	std::vector<char> vecByteBuffer;
+	vecByteBuffer.resize(vecData.size() * sizeof(uint32_t));
 
-    for (size_t i = 0; i < vecData.size(); ++i) {
-        vecByteBuffer[i * 4] = static_cast<char>(vecData[i] & 0xFF);
-        vecByteBuffer[i * 4 + 1] = static_cast<char>((vecData[i] >> 8) & 0xFF);
-        vecByteBuffer[i * 4 + 2] = static_cast<char>((vecData[i] >> 16) & 0xFF);
-        vecByteBuffer[i * 4 + 3] = static_cast<char>((vecData[i] >> 24) & 0xFF);
-    }
+	for (size_t i = 0; i < vecData.size(); ++i) {
+		vecByteBuffer[i * 4] = static_cast<char>(vecData[i] & 0xFF);
+		vecByteBuffer[i * 4 + 1] = static_cast<char>((vecData[i] >> 8) & 0xFF);
+		vecByteBuffer[i * 4 + 2] = static_cast<char>((vecData[i] >> 16) & 0xFF);
+		vecByteBuffer[i * 4 + 3] = static_cast<char>((vecData[i] >> 24) & 0xFF);
+	}
 
-    return WriteDataEx(station, nDevType, nDevNo, vecByteBuffer);
+	return WriteDataEx(station, nDevType, nDevNo, vecByteBuffer);
 }
 
-// 扩展软元件随机读取
+// 鎵╁睍杞厓浠堕殢鏈鸿鍙�
 long CPerformanceMelsec::ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData) {
-    if (vecSoftElements.empty()) {
-        UpdateLastError(ERROR_INVALID_PARAMETER);
-        LOG_ERROR("Invalid parameters: soft elements are empty.");
-        return ERROR_INVALID_PARAMETER;
-    }
+	if (vecSoftElements.empty()) {
+		UpdateLastError(ERROR_INVALID_PARAMETER);
+		LOG_ERROR("Invalid parameters: soft elements are empty.");
+		return ERROR_INVALID_PARAMETER;
+	}
 
-    // 准备 dev 数据
-    std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // 每个软元件需要 3 个 short,外加一个计数器
-    devBuffer[0] = static_cast<short>(vecSoftElements.size());                 // 第一个元素是软元件数量
-    for (size_t i = 0; i < vecSoftElements.size(); ++i) {
-        const SoftElement& element = vecSoftElements[i];
-        devBuffer[i * 3 + 1] = element.nType;                        // 软元件类型
-        devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // 起始软元件编号
-        devBuffer[i * 3 + 3] = element.nElementCount;                // 点数
-    }
+	// 鍑嗗 dev 鏁版嵁
+	std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // 姣忎釜杞厓浠堕渶瑕� 3 涓� short锛屽鍔犱竴涓鏁板櫒
+	devBuffer[0] = static_cast<short>(vecSoftElements.size());                 // 绗竴涓厓绱犳槸杞厓浠舵暟閲�
+	for (size_t i = 0; i < vecSoftElements.size(); ++i) {
+		const SoftElement& element = vecSoftElements[i];
+		devBuffer[i * 3 + 1] = element.nType;                        // 杞厓浠剁被鍨�
+		devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // 璧峰杞厓浠剁紪鍙�
+		devBuffer[i * 3 + 3] = element.nElementCount;                // 鐐规暟
+	}
 
-    // 计算读取数据所需缓冲区大小
-    long nBufferSize = 0;
-    for (const auto& element : vecSoftElements) {
-        nBufferSize += element.nElementCount * 2; // 每个点占用 2 个字节
-    }
+	// 璁$畻璇诲彇鏁版嵁鎵�闇�缂撳啿鍖哄ぇ灏�
+	long nBufferSize = 0;
+	for (const auto& element : vecSoftElements) {
+		nBufferSize += element.nElementCount * 2; // 姣忎釜鐐瑰崰鐢� 2 涓瓧鑺�
+	}
 
-    // 锁保护及调用 mdRandREx
-    long nRet = 0;
-    std::vector<short> vecBuffer(nBufferSize / 2, 0);
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 确保线程安全
-        nRet = mdRandREx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), nBufferSize);
-    }
+	// 閿佷繚鎶ゅ強璋冪敤 mdRandREx
+	long nRet = 0;
+	std::vector<short> vecBuffer(nBufferSize / 2, 0);
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 纭繚绾跨▼瀹夊叏
+		nRet = mdRandREx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), nBufferSize);
+	}
 
-    // 错误处理和日志记录
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-        return nRet;
-    }
+	// 閿欒澶勭悊鍜屾棩蹇楄褰�
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+		return nRet;
+	}
 
-    // 将读取到的 short 数据转换为 char 数据
-    vecData.resize(nBufferSize);
-    for (size_t i = 0; i < vecBuffer.size(); ++i) {
-        vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF);            // 低字节
-        vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // 高字节
-    }
+	// 灏嗚鍙栧埌鐨� short 鏁版嵁杞崲涓� char 鏁版嵁
+	vecData.resize(nBufferSize);
+	for (size_t i = 0; i < vecBuffer.size(); ++i) {
+		vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF);            // 浣庡瓧鑺�
+		vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // 楂樺瓧鑺�
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 扩展软元件随机写入(支持多个软元件)
+// 鎵╁睍杞厓浠堕殢鏈哄啓鍏ワ紙鏀寔澶氫釜杞厓浠讹級
 long CPerformanceMelsec::WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData) {
-    if (vecSoftElements.empty() || vecData.empty()) {
-        UpdateLastError(ERROR_INVALID_PARAMETER);
-        LOG_ERROR("Invalid parameters: soft elements or data is empty.");
-        return ERROR_INVALID_PARAMETER;
-    }
+	if (vecSoftElements.empty() || vecData.empty()) {
+		UpdateLastError(ERROR_INVALID_PARAMETER);
+		LOG_ERROR("Invalid parameters: soft elements or data is empty.");
+		return ERROR_INVALID_PARAMETER;
+	}
 
-    // 准备 dev 数据
-    std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // 每个软元件需要 3 个 long,外加一个计数器
-    devBuffer[0] = static_cast<long>(vecSoftElements.size());                 // 第一个元素是软元件数量
-    for (size_t i = 0; i < vecSoftElements.size(); ++i) {
-        const SoftElement& element = vecSoftElements[i];
-        devBuffer[i * 3 + 1] = static_cast<long>(element.nType);    // 软元件类型
-        devBuffer[i * 3 + 2] = element.nStartNo;                    // 起始软元件编号(已经是 long 类型,无需转换)
-        devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // 点数
-    }
+	// 鍑嗗 dev 鏁版嵁
+	std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // 姣忎釜杞厓浠堕渶瑕� 3 涓� long锛屽鍔犱竴涓鏁板櫒
+	devBuffer[0] = static_cast<long>(vecSoftElements.size());                 // 绗竴涓厓绱犳槸杞厓浠舵暟閲�
+	for (size_t i = 0; i < vecSoftElements.size(); ++i) {
+		const SoftElement& element = vecSoftElements[i];
+		devBuffer[i * 3 + 1] = static_cast<long>(element.nType);    // 杞厓浠剁被鍨�
+		devBuffer[i * 3 + 2] = element.nStartNo;                    // 璧峰杞厓浠剁紪鍙凤紙宸茬粡鏄� long 绫诲瀷锛屾棤闇�杞崲锛�
+		devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // 鐐规暟
+	}
 
-    // 锁保护及调用 mdRandWEx
-    long nRet = 0;
-    std::vector<short> vecBuffer(vecData.size() / 2, 0);
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 确保线程安全
-        ConvertCharToShort(vecData, vecBuffer);
-        nRet = mdRandWEx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), static_cast<long>(vecBuffer.size()));
-    }
+	// 閿佷繚鎶ゅ強璋冪敤 mdRandWEx
+	long nRet = 0;
+	std::vector<short> vecBuffer(vecData.size() / 2, 0);
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 纭繚绾跨▼瀹夊叏
+		ConvertCharToShort(vecData, vecBuffer);
+		nRet = mdRandWEx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), static_cast<long>(vecBuffer.size()));
+	}
 
-    // 错误处理和日志记录
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	// 閿欒澶勭悊鍜屾棩蹇楄褰�
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 远程设备站/远程站的缓冲存储器读取
+// 杩滅▼璁惧绔�/杩滅▼绔欑殑缂撳啿瀛樺偍鍣ㄨ鍙�
 long CPerformanceMelsec::ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    if (nSize < 0) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	if (nSize < 0) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    long nActualSize = (nSize + 1) / 2;
-    std::vector<short> vecBuffer(nActualSize, 0);
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        nRet = mdRemBufReadEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nActualSize, vecBuffer.data());
-    }
+	long nActualSize = (nSize + 1) / 2;
+	std::vector<short> vecBuffer(nActualSize, 0);
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		nRet = mdRemBufReadEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nActualSize, vecBuffer.data());
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet); // 更新错误码
-        LOG_ERROR(m_strLastError);
-    }
-    else {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        ConvertShortToChar(vecBuffer, vecData);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet); // 鏇存柊閿欒鐮�
+		LOG_ERROR(m_strLastError);
+	}
+	else {
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		ConvertShortToChar(vecBuffer, vecData);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 远程设备站/远程站的缓冲存储器写入
+// 杩滅▼璁惧绔�/杩滅▼绔欑殑缂撳啿瀛樺偍鍣ㄥ啓鍏�
 long CPerformanceMelsec::WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData) {
-    // 验证站点参数和数据有效性
-    long nRet = ValidateStationAndData(station, vecData);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	long nRet = ValidateStationAndData(station, vecData);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 将 vecData 转换为 short 类型的缓冲区
-    long nSize = static_cast<long>(vecData.size());
-    std::vector<short> vecBuffer((nSize + 1) / 2, 0);
+	// 灏� vecData 杞崲涓� short 绫诲瀷鐨勭紦鍐插尯
+	long nSize = static_cast<long>(vecData.size());
+	std::vector<short> vecBuffer((nSize + 1) / 2, 0);
 
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        ConvertCharToShort(vecData, vecBuffer);
-        nRet = mdRemBufWriteEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nSize, vecBuffer.data());
-    }
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		ConvertCharToShort(vecData, vecBuffer);
+		nRet = mdRemBufWriteEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nSize, vecBuffer.data());
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 远程站的缓冲存储器读取 对象站IP地址指定
+// 杩滅▼绔欑殑缂撳啿瀛樺偍鍣ㄨ鍙� 瀵硅薄绔橧P鍦板潃鎸囧畾
 long CPerformanceMelsec::ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData) {
-    uint32_t nAddress = 0;
-    if (nSize < 0 || !ConvertIpStringToUint32(strIP, nAddress)) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	uint32_t nAddress = 0;
+	if (nSize < 0 || !ConvertIpStringToUint32(strIP, nAddress)) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    // 将缓冲区大小调整为 nSize
-    vecData.resize(nSize, 0);
-    std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 转换为 short 类型
+	// 灏嗙紦鍐插尯澶у皬璋冩暣涓� nSize
+	vecData.resize(nSize, 0);
+	std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 杞崲涓� short 绫诲瀷
 
-    // 调用底层 SDK
-    long nRet = 0;
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        nRet = mdRemBufReadIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data());
-    }
+	// 璋冪敤搴曞眰 SDK
+	long nRet = 0;
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		nRet = mdRemBufReadIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data());
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
-    else {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护
-        ConvertShortToChar(vecBuffer, vecData);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
+	else {
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+		ConvertShortToChar(vecBuffer, vecData);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 远程站的缓冲存储器写入 对象站IP地址指定
+// 杩滅▼绔欑殑缂撳啿瀛樺偍鍣ㄥ啓鍏� 瀵硅薄绔橧P鍦板潃鎸囧畾
 long CPerformanceMelsec::WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData) {
-    uint32_t nAddress = 0;
-    if (vecData.empty() || !ConvertIpStringToUint32(strIP, nAddress)) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	uint32_t nAddress = 0;
+	if (vecData.empty() || !ConvertIpStringToUint32(strIP, nAddress)) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    // 转换 vecData 为 short 类型的缓冲区
-    long nSize = static_cast<long>(vecData.size());
-    std::vector<short> vecBuffer((nSize + 1) / 2, 0);
+	// 杞崲 vecData 涓� short 绫诲瀷鐨勭紦鍐插尯
+	long nSize = static_cast<long>(vecData.size());
+	std::vector<short> vecBuffer((nSize + 1) / 2, 0);
 
-    long nRet = 0;
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全
-        ConvertCharToShort(vecData, vecBuffer);
-        nRet = mdRemBufWriteIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data());
-    }
+	long nRet = 0;
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏
+		ConvertCharToShort(vecData, vecBuffer);
+		nRet = mdRemBufWriteIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data());
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 设置(ON)对象站的指定位软元件
+// 璁剧疆(ON)瀵硅薄绔欑殑鎸囧畾浣嶈蒋鍏冧欢
 int CPerformanceMelsec::SetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo) {
-    // 验证站点参数
-    int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟
+	int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 确保线程安全的最小锁定范围
-    {
-        std::lock_guard<std::mutex> lock(m_mtx); // 线程安全
-        const short nDevType = CalculateDeviceType(station, enDevType);
-        nRet = mdDevSet(m_nPath, CombineStation(station), nDevType, nDevNo);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏
+		const short nDevType = CalculateDeviceType(station, enDevType);
+		nRet = mdDevSet(m_nPath, CombineStation(station), nDevType, nDevNo);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 复位(OFF)对象站的指定位软元件
+// 澶嶄綅(OFF)瀵硅薄绔欑殑鎸囧畾浣嶈蒋鍏冧欢
 int CPerformanceMelsec::ResetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short enDevNo) {
-    // 验证站点参数
-    int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟
+	int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 确保线程安全的最小锁定范围
-    {
-        std::lock_guard<std::mutex> lock(m_mtx);
-        const short nDevType = CalculateDeviceType(station, enDevType);
-        nRet = mdDevRst(m_nPath, CombineStation(station), nDevType, enDevNo);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		std::lock_guard<std::mutex> lock(m_mtx);
+		const short nDevType = CalculateDeviceType(station, enDevType);
+		nRet = mdDevRst(m_nPath, CombineStation(station), nDevType, enDevNo);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 扩展位软元件设置
+// 鎵╁睍浣嶈蒋鍏冧欢璁剧疆
 long CPerformanceMelsec::SetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo) {
-    std::lock_guard<std::mutex> lock(m_mtx);
+	std::lock_guard<std::mutex> lock(m_mtx);
 
-    // 检查参数有效性
-    long nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 妫�鏌ュ弬鏁版湁鏁堟��
+	long nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    long nDevType = static_cast<long>(enDevType);
-    nRet = mdDevSetEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	long nDevType = static_cast<long>(enDevType);
+	nRet = mdDevSetEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 扩展位软元件复位
+// 鎵╁睍浣嶈蒋鍏冧欢澶嶄綅
 long CPerformanceMelsec::ResetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo) {
-    std::lock_guard<std::mutex> lock(m_mtx);
+	std::lock_guard<std::mutex> lock(m_mtx);
 
-    // 检查参数有效性
-    long nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 妫�鏌ュ弬鏁版湁鏁堟��
+	long nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    long nDevType = static_cast<long>(enDevType);
-    nRet = mdDevRstEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	long nDevType = static_cast<long>(enDevType);
+	nRet = mdDevRstEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 执行对象站的CPU
+// 鎵ц瀵硅薄绔欑殑CPU
 int CPerformanceMelsec::ControlCPU(const StationIdentifier& station, ControlCode enControlCode) {
-    // 验证站点参数和数据有效性
-    int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        return nRet;
-    }
+	// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
+	int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		return nRet;
+	}
 
-    // 验证控制码是否合法
-    const auto nControlCode = static_cast<short>(enControlCode);
-    if (nControlCode < 0 || nControlCode > 2) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM); // 参数错误
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	// 楠岃瘉鎺у埗鐮佹槸鍚﹀悎娉�
+	const auto nControlCode = static_cast<short>(enControlCode);
+	if (nControlCode < 0 || nControlCode > 2) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM); // 鍙傛暟閿欒
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    // 确保线程安全的最小锁定范围
-    {
-        std::lock_guard<std::mutex> lock(m_mtx);
-        nRet = mdControl(m_nPath, CombineStation(station), nControlCode);
-    }
+	// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
+	{
+		std::lock_guard<std::mutex> lock(m_mtx);
+		nRet = mdControl(m_nPath, CombineStation(station), nControlCode);
+	}
 
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-// 事件等待
+// 浜嬩欢绛夊緟
 int CPerformanceMelsec::WaitForBoardEvent(std::vector<short> vecEventNumbers, const int nTimeoutMs, EventDetails& details) {
-    std::lock_guard<std::mutex> lock(m_mtx);
+	std::lock_guard<std::mutex> lock(m_mtx);
 
-    if (!m_bConnected.load()) {
-        UpdateLastError(ERROR_CODE_NOT_CONNECTED);
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	if (!m_bConnected.load()) {
+		UpdateLastError(ERROR_CODE_NOT_CONNECTED);
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    if (vecEventNumbers.empty() || vecEventNumbers.size() > 64) {
-        UpdateLastError(ERROR_CODE_INVALID_PARAM);
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	if (vecEventNumbers.empty() || vecEventNumbers.size() > 64) {
+		UpdateLastError(ERROR_CODE_INVALID_PARAM);
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    // 第 0 个元素存储数量,最大支持 64 个事件
-    std::array<short, 65> eventno = { 0 };
-    eventno[0] = static_cast<short>(vecEventNumbers.size());
-    std::copy(vecEventNumbers.begin(), vecEventNumbers.end(), eventno.begin() + 1);
+	// 绗� 0 涓厓绱犲瓨鍌ㄦ暟閲忥紝鏈�澶ф敮鎸� 64 涓簨浠�
+	std::array<short, 65> eventno = { 0 };
+	eventno[0] = static_cast<short>(vecEventNumbers.size());
+	std::copy(vecEventNumbers.begin(), vecEventNumbers.end(), eventno.begin() + 1);
 
-    // 初始化输出参数
-    details.nEventNo = 0;
-    details.details.fill(0);
+	// 鍒濆鍖栬緭鍑哄弬鏁�
+	details.nEventNo = 0;
+	details.details.fill(0);
 
-    const int nRet = mdWaitBdEvent(m_nPath, eventno.data(), nTimeoutMs, &details.nEventNo, details.details.data());
-    if (nRet != 0) {
-        UpdateLastError(nRet);
-        LOG_ERROR(m_strLastError);
-    }
+	const int nRet = mdWaitBdEvent(m_nPath, eventno.data(), nTimeoutMs, &details.nEventNo, details.details.data());
+	if (nRet != 0) {
+		UpdateLastError(nRet);
+		LOG_ERROR(m_strLastError);
+	}
 
-    return nRet;
+	return nRet;
 }
 
-//============================================辅助函数=======================================================
-// 更新最近的错误信息
+//============================================杈呭姪鍑芥暟=======================================================
+// 鏇存柊鏈�杩戠殑閿欒淇℃伅
 void CPerformanceMelsec::UpdateLastError(const int nCode) {
-    if (nCode == 0) {
-        return;
-    }
+	if (nCode == 0) {
+		return;
+	}
 
-    // 检查错误码是否存在于映射表中
-    const auto it = m_mapError.find(nCode);
-    if (it != m_mapError.end()) {
-        // 如果找到,直接返回对应语言的错误信息
-        m_strLastError = it->second;
-    }
-    else {
-        // 如果未找到,处理特殊范围
-        m_strLastError = "Unknown error.";
-        if (nCode == -28611 || nCode == -28612) {
-            // 系统出错
-            m_strLastError = "System error.";
-        }
+	// 妫�鏌ラ敊璇爜鏄惁瀛樺湪浜庢槧灏勮〃涓�
+	const auto it = m_mapError.find(nCode);
+	if (it != m_mapError.end()) {
+		// 濡傛灉鎵惧埌锛岀洿鎺ヨ繑鍥炲搴旇瑷�鐨勯敊璇俊鎭�
+		m_strLastError = it->second;
+	}
+	else {
+		// 濡傛灉鏈壘鍒帮紝澶勭悊鐗规畩鑼冨洿
+		m_strLastError = "Unknown error.";
+		if (nCode == -28611 || nCode == -28612) {
+			// 绯荤粺鍑洪敊
+			m_strLastError = "System error.";
+		}
 
-        if (nCode >= -20480 && nCode <= -16384) {
-            // CC-Link 系统检测出的错误
-            m_strLastError = "Error detected in the CC-Link system.";
-        }
+		if (nCode >= -20480 && nCode <= -16384) {
+			// CC-Link 绯荤粺妫�娴嬪嚭鐨勯敊璇�
+			m_strLastError = "Error detected in the CC-Link system.";
+		}
 
-        if (nCode >= -12288 && nCode <= -8193) {
-            // CC-Link IE TSN 系统检测出的错误
-            m_strLastError = "Error detected in the CC-Link IE TSN system.";
-        }
+		if (nCode >= -12288 && nCode <= -8193) {
+			// CC-Link IE TSN 绯荤粺妫�娴嬪嚭鐨勯敊璇�
+			m_strLastError = "Error detected in the CC-Link IE TSN system.";
+		}
 
-        if (nCode >= -8192 && nCode <= -4097) {
-            // CC-Link IE 控制网络系统检测出的错误
-            m_strLastError = "Error detected in the CC-Link IE control network system.";
-        }
+		if (nCode >= -8192 && nCode <= -4097) {
+			// CC-Link IE 鎺у埗缃戠粶绯荤粺妫�娴嬪嚭鐨勯敊璇�
+			m_strLastError = "Error detected in the CC-Link IE control network system.";
+		}
 
-        if (nCode >= -4096 && nCode <= -257) {
-            // MELSECNET/10 或 MELSECNET/网络系统错误范围
-            m_strLastError = "Errors detected in MELSECNET/10 or MELSECNET/network system.";
-        }
+		if (nCode >= -4096 && nCode <= -257) {
+			// MELSECNET/10 鎴� MELSECNET/缃戠粶绯荤粺閿欒鑼冨洿
+			m_strLastError = "Errors detected in MELSECNET/10 or MELSECNET/network system.";
+		}
 
-        if (nCode >= 4096 && nCode <= 16383) {
-            // MELSEC 数据链接库范围
-            m_strLastError = "Internal error detected by MELSEC Data Link Library.";
-        }
+		if (nCode >= 4096 && nCode <= 16383) {
+			// MELSEC 鏁版嵁閾炬帴搴撹寖鍥�
+			m_strLastError = "Internal error detected by MELSEC Data Link Library.";
+		}
 
-        if (nCode == 18944 || nCode == 18945) {
-            // 链接关联出错
-            m_strLastError = "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number.";
-        }
+		if (nCode == 18944 || nCode == 18945) {
+			// 閾炬帴鍏宠仈鍑洪敊
+			m_strLastError = "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number.";
+		}
 
-        if (nCode >= 16384 && nCode <= 20479) {
-            // PLC CPU 检测范围
-            m_strLastError = "Errors detected by the programmable controller CPU in the target station.";
-        }
+		if (nCode >= 16384 && nCode <= 20479) {
+			// PLC CPU 妫�娴嬭寖鍥�
+			m_strLastError = "Errors detected by the programmable controller CPU in the target station.";
+		}
 
-        if (nCode >= 28416 && nCode <= 28671) {
-            // 冗余功能模块范围
-            m_strLastError = "Error detected in the redundancy module of the target station.";
-        }
-    }
+		if (nCode >= 28416 && nCode <= 28671) {
+			// 鍐椾綑鍔熻兘妯″潡鑼冨洿
+			m_strLastError = "Error detected in the redundancy module of the target station.";
+		}
+	}
 }
 
-// 检查连接状态和站点参数有效性
+// 妫�鏌ヨ繛鎺ョ姸鎬佸拰绔欑偣鍙傛暟鏈夋晥鎬�
 int CPerformanceMelsec::ValidateStation(const StationIdentifier& station) const {
-    // 检查是否已连接
-    if (!m_bConnected.load()) {
-        return ERROR_CODE_NOT_CONNECTED;
-    }
+	// 妫�鏌ユ槸鍚﹀凡杩炴帴
+	if (!m_bConnected.load()) {
+		return ERROR_CODE_NOT_CONNECTED;
+	}
 
-    // 检查网络号和站点号范围
-    if (station.nNetNo < 0 || station.nNetNo > 239 || station.nStNo < 0 || station.nStNo > 255) {
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	// 妫�鏌ョ綉缁滃彿鍜岀珯鐐瑰彿鑼冨洿
+	if (station.nNetNo < 0 || station.nNetNo > 239 || station.nStNo < 0 || station.nStNo > 255) {
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    return 0; // 参数有效
+	return 0; // 鍙傛暟鏈夋晥
 }
 
-// 验证站点参数和数据有效性
+// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
 int CPerformanceMelsec::ValidateStationAndSize(const StationIdentifier& station, const short nCount) const {
-    // 验证站点参数
-    const int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        return nRet; // 如果站点验证失败,返回对应错误码
-    }
+	// 楠岃瘉绔欑偣鍙傛暟
+	const int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		return nRet; // 濡傛灉绔欑偣楠岃瘉澶辫触锛岃繑鍥炲搴旈敊璇爜
+	}
 
-    if (nCount <= 0) {
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	if (nCount <= 0) {
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    return 0; // 验证通过
+	return 0; // 楠岃瘉閫氳繃
 }
 
-// IP字符串转uint32_t
+// IP瀛楃涓茶浆uint32_t
 bool CPerformanceMelsec::ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP) {
-    nIP = 0;
-    std::stringstream ss(strIP);
-    std::string strSegment;
-    int nShift = 24;
+	nIP = 0;
+	std::stringstream ss(strIP);
+	std::string strSegment;
+	int nShift = 24;
 
-    while (std::getline(ss, strSegment, '.')) {
-        const auto nByte = static_cast<uint32_t>(std::stoi(strSegment));
-        if (nByte > 255) {
-            return false;
-        }
-        nIP |= (nByte << nShift);
-        nShift -= 8;
-    }
+	while (std::getline(ss, strSegment, '.')) {
+		const auto nByte = static_cast<uint32_t>(std::stoi(strSegment));
+		if (nByte > 255) {
+			return false;
+		}
+		nIP |= (nByte << nShift);
+		nShift -= 8;
+	}
 
-    return true;
+	return true;
 }
 
-//============================================静态辅助函数====================================================
-// 延时,并且转发窗口消息
+//============================================闈欐�佽緟鍔╁嚱鏁�====================================================
+// 寤舵椂锛屽苟涓旇浆鍙戠獥鍙f秷鎭�
 void CPerformanceMelsec::Delay(const unsigned int nDelayMs) {
-    MSG message;
-    // 如果延迟时间为 0,仅处理一次消息队列
-    if (nDelayMs == 0) {
-        // 非阻塞的检查消息队列
-        if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) {
-            TranslateMessage(&message);  // 将消息转化为有效的窗口消息
-            DispatchMessage(&message);   // 派发消息给相应的窗口过程
-        }
-        return;
-    }
+	MSG message;
+	// 濡傛灉寤惰繜鏃堕棿涓� 0锛屼粎澶勭悊涓�娆℃秷鎭槦鍒�
+	if (nDelayMs == 0) {
+		// 闈為樆濉炵殑妫�鏌ユ秷鎭槦鍒�
+		if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) {
+			TranslateMessage(&message);  // 灏嗘秷鎭浆鍖栦负鏈夋晥鐨勭獥鍙f秷鎭�
+			DispatchMessage(&message);   // 娲惧彂娑堟伅缁欑浉搴旂殑绐楀彛杩囩▼
+		}
+		return;
+	}
 
-    DWORD finish;
-    const DWORD start = GetTickCount();  // 获取当前的时间戳(从系统启动以来的毫秒数)
-    do {
-        if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) {
-            TranslateMessage(&message);  // 转换消息
-            DispatchMessage(&message);   // 处理消息
-        }
-        Sleep(1);   // 暂停 1 毫秒,防止过度占用 CPU
-        finish = GetTickCount(); // 获取当前的时间戳
-    } while ((finish - start) < nDelayMs);  // 循环直到经过的时间大于指定的延迟时间
+	DWORD finish;
+	const DWORD start = GetTickCount();  // 鑾峰彇褰撳墠鐨勬椂闂存埑锛堜粠绯荤粺鍚姩浠ユ潵鐨勬绉掓暟锛�
+	do {
+		if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) {
+			TranslateMessage(&message);  // 杞崲娑堟伅
+			DispatchMessage(&message);   // 澶勭悊娑堟伅
+		}
+		Sleep(1);   // 鏆傚仠 1 姣锛岄槻姝㈣繃搴﹀崰鐢� CPU
+		finish = GetTickCount(); // 鑾峰彇褰撳墠鐨勬椂闂存埑
+	} while ((finish - start) < nDelayMs);  // 寰幆鐩村埌缁忚繃鐨勬椂闂村ぇ浜庢寚瀹氱殑寤惰繜鏃堕棿
 }
 
 BoardType CPerformanceMelsec::FindBoardTypeByChannel(const int nChannel) {
-    if (nChannel >= MELSECNET_CHANNEL(1) && nChannel <= MELSECNET_CHANNEL(4)) {
-        return BoardType::MELSECNET_H;
-    }
-    else if (nChannel >= CC_LINK_CHANNEL(1) && nChannel <= CC_LINK_CHANNEL(4)) {
-        return BoardType::CC_LINK_VER_2;
-    }
-    else if (nChannel >= CC_LINK_IE_CONTROL_CHANNEL(1) && nChannel <= CC_LINK_IE_CONTROL_CHANNEL(4)) {
-        return BoardType::CC_LINK_IE_CONTROL;
-    }
-    else if (nChannel >= CC_LINK_IE_FIELD_CHANNEL(1) && nChannel <= CC_LINK_IE_FIELD_CHANNEL(4)) {
-        return BoardType::CC_LINK_IE_FIELD;
-    }
-    else if (nChannel >= CC_LINK_IE_TSN_CHANNEL(1) && nChannel <= CC_LINK_IE_TSN_CHANNEL(4)) {
-        return BoardType::CC_LINK_IE_TSN;
-    }
-    return BoardType::UNKNOWN;
+	if (nChannel >= MELSECNET_CHANNEL(1) && nChannel <= MELSECNET_CHANNEL(4)) {
+		return BoardType::MELSECNET_H;
+	}
+	else if (nChannel >= CC_LINK_CHANNEL(1) && nChannel <= CC_LINK_CHANNEL(4)) {
+		return BoardType::CC_LINK_VER_2;
+	}
+	else if (nChannel >= CC_LINK_IE_CONTROL_CHANNEL(1) && nChannel <= CC_LINK_IE_CONTROL_CHANNEL(4)) {
+		return BoardType::CC_LINK_IE_CONTROL;
+	}
+	else if (nChannel >= CC_LINK_IE_FIELD_CHANNEL(1) && nChannel <= CC_LINK_IE_FIELD_CHANNEL(4)) {
+		return BoardType::CC_LINK_IE_FIELD;
+	}
+	else if (nChannel >= CC_LINK_IE_TSN_CHANNEL(1) && nChannel <= CC_LINK_IE_TSN_CHANNEL(4)) {
+		return BoardType::CC_LINK_IE_TSN;
+	}
+	return BoardType::UNKNOWN;
 }
 
-// 合并网络号和站点号
+// 鍚堝苟缃戠粶鍙峰拰绔欑偣鍙�
 short CPerformanceMelsec::CombineStation(const StationIdentifier& station) {
-    return static_cast<short>(station.nStNo | ((station.nNetNo << 8) & 0xFF00));
+	return static_cast<short>(station.nStNo | ((station.nNetNo << 8) & 0xFF00));
 }
 
-// 计算软元件类型
+// 璁$畻杞厓浠剁被鍨�
 short CPerformanceMelsec::CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType) {
-    int nDevType = static_cast<int>(enDevType);
+	int nDevType = static_cast<int>(enDevType);
 
-    // 根据软元件类型的特定规则进行计算
-    if (enDevType == DeviceType::LX || enDevType == DeviceType::LY ||
-        enDevType == DeviceType::LB || enDevType == DeviceType::LW ||
-        enDevType == DeviceType::LSB || enDevType == DeviceType::LSW) {
-        // 网络号加偏移
-        nDevType += station.nNetNo;
-    }
-    else if (enDevType == DeviceType::ER) {
-        // 文件寄存器的块号加偏移
-        nDevType += 0;
-    }
-    else if (enDevType == DeviceType::SPG) {
-        // 起始 I/O No. ÷ 16 的值
-        nDevType += 0 / 16;
-    }
+	// 鏍规嵁杞厓浠剁被鍨嬬殑鐗瑰畾瑙勫垯杩涜璁$畻
+	if (enDevType == DeviceType::LX || enDevType == DeviceType::LY ||
+		enDevType == DeviceType::LB || enDevType == DeviceType::LW ||
+		enDevType == DeviceType::LSB || enDevType == DeviceType::LSW) {
+		// 缃戠粶鍙峰姞鍋忕Щ
+		nDevType += station.nNetNo;
+	}
+	else if (enDevType == DeviceType::ER) {
+		// 鏂囦欢瀵勫瓨鍣ㄧ殑鍧楀彿鍔犲亸绉�
+		nDevType += 0;
+	}
+	else if (enDevType == DeviceType::SPG) {
+		// 璧峰 I/O No. 梅 16 鐨勫��
+		nDevType += 0 / 16;
+	}
 
-    return static_cast<short>(nDevType);
+	return static_cast<short>(nDevType);
 }
 
-// std::vector<char>转换为std::vector<short>
+// std::vector<char>杞崲涓簊td::vector<short>
 void CPerformanceMelsec::ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort) {
-    vecShort.resize((vecChar.size() + 1) / 2, 0); // 调整 short 容器大小
-    for (size_t i = 0; i < vecChar.size(); i++) {
-        if (i % 2 == 0) {
-            vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]);       // 低字节
-        }
-        else {
-            vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // 高字节
-        }
-    }
+	vecShort.resize((vecChar.size() + 1) / 2, 0); // 璋冩暣 short 瀹瑰櫒澶у皬
+	for (size_t i = 0; i < vecChar.size(); i++) {
+		if (i % 2 == 0) {
+			vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]);       // 浣庡瓧鑺�
+		}
+		else {
+			vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // 楂樺瓧鑺�
+		}
+	}
 }
 
-// std::vector<short>转换为std::vector<char>
+// std::vector<short>杞崲涓簊td::vector<char>
 void CPerformanceMelsec::ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar) {
-    vecChar.resize(vecShort.size() * 2); // 调整 char 容器大小
-    for (size_t i = 0; i < vecShort.size(); i++) {
-        vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF);             // 低字节
-        vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF);  // 高字节
-    }
+	vecChar.resize(vecShort.size() * 2); // 璋冩暣 char 瀹瑰櫒澶у皬
+	for (size_t i = 0; i < vecShort.size(); i++) {
+		vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF);             // 浣庡瓧鑺�
+		vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF);  // 楂樺瓧鑺�
+	}
 }
 
-// std::vector<uint8_t>转换为std::vector<short>
+// std::vector<uint8_t>杞崲涓簊td::vector<short>
 void CPerformanceMelsec::ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort) {
-    vecShort.resize((vecUint8.size() + 1) / 2, 0); // 调整 short 容器大小
-    for (size_t i = 0; i < vecUint8.size(); i++) {
-        if (i % 2 == 0) {
-            vecShort[i / 2] = static_cast<short>(vecUint8[i]);          // 低字节
-        }
-        else {
-            vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8);    // 高字节
-        }
-    }
+	vecShort.resize((vecUint8.size() + 1) / 2, 0); // 璋冩暣 short 瀹瑰櫒澶у皬
+	for (size_t i = 0; i < vecUint8.size(); i++) {
+		if (i % 2 == 0) {
+			vecShort[i / 2] = static_cast<short>(vecUint8[i]);          // 浣庡瓧鑺�
+		}
+		else {
+			vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8);    // 楂樺瓧鑺�
+		}
+	}
 }
 
-// std::vector<short>转换为std::vector<uint8_t>
+// std::vector<short>杞崲涓簊td::vector<uint8_t>
 void CPerformanceMelsec::ConvertShortToUint8(const std::vector<short>& vecShort, std::vector<uint8_t>& vecUint8) {
-    vecUint8.resize(vecShort.size() * 2); // 调整 uint8_t 容器大小
-    for (size_t i = 0; i < vecShort.size(); i++) {
-        vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF);             // 低字节
-        vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF);  // 高字节
-    }
+	vecUint8.resize(vecShort.size() * 2); // 璋冩暣 uint8_t 瀹瑰櫒澶у皬
+	for (size_t i = 0; i < vecShort.size(); i++) {
+		vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF);             // 浣庡瓧鑺�
+		vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF);  // 楂樺瓧鑺�
+	}
 }
 
-// std::vector<uint32_t>转换为std::vector<short>
+// std::vector<uint32_t>杞崲涓簊td::vector<short>
 void CPerformanceMelsec::ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort) {
-    vecShort.resize(vecUint32.size() * 2); // 每个 uint32_t 转换为两个 short
-    for (size_t i = 0; i < vecUint32.size(); i++) {
-        vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF);             // 低16位
-        vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // 高16位
-    }
+	vecShort.resize(vecUint32.size() * 2); // 姣忎釜 uint32_t 杞崲涓轰袱涓� short
+	for (size_t i = 0; i < vecUint32.size(); i++) {
+		vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF);             // 浣�16浣�
+		vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // 楂�16浣�
+	}
 }
 
-// std::vector<short>转换为std::vector<uint32_t>
+// std::vector<short>杞崲涓簊td::vector<uint32_t>
 void CPerformanceMelsec::ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32) {
-    vecUint32.resize((vecShort.size() + 1) / 2, 0); // 每两个 short 合并为一个 uint32_t
-    for (size_t i = 0; i < vecUint32.size(); i++) {
-        vecUint32[i] = (static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2 + 1])) << 16) | // 高16位
-            static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2]));              // 低16位
-    }
+	vecUint32.resize((vecShort.size() + 1) / 2, 0); // 姣忎袱涓� short 鍚堝苟涓轰竴涓� uint32_t
+	for (size_t i = 0; i < vecUint32.size(); i++) {
+		vecUint32[i] = (static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2 + 1])) << 16) | // 楂�16浣�
+			static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2]));              // 浣�16浣�
+	}
 }
 
-//============================================模板辅助函数====================================================
-// 验证站点参数和数据有效性
+//============================================妯℃澘杈呭姪鍑芥暟====================================================
+// 楠岃瘉绔欑偣鍙傛暟鍜屾暟鎹湁鏁堟��
 template <typename T>
 int CPerformanceMelsec::ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData) {
-    // 验证站点参数
-    const int nRet = ValidateStation(station);
-    if (nRet != 0) {
-        return nRet; // 如果站点验证失败,返回对应错误码
-    }
+	// 楠岃瘉绔欑偣鍙傛暟
+	const int nRet = ValidateStation(station);
+	if (nRet != 0) {
+		return nRet; // 濡傛灉绔欑偣楠岃瘉澶辫触锛岃繑鍥炲搴旈敊璇爜
+	}
 
-    // 验证数据是否为空
-    if (vecData.empty()) {
-        return ERROR_CODE_INVALID_PARAM;
-    }
+	// 楠岃瘉鏁版嵁鏄惁涓虹┖
+	if (vecData.empty()) {
+		return ERROR_CODE_INVALID_PARAM;
+	}
 
-    return 0; // 验证通过
+	return 0; // 楠岃瘉閫氳繃
 }
 
-// 由低转高容器的模板(整型)
+// 鐢变綆杞珮瀹瑰櫒鐨勬ā鏉匡紙鏁村瀷锛�
 template <typename T, typename U>
 void CPerformanceMelsec::ConvertLowToHigh(const std::vector<T>& vecLow, std::vector<U>& vecHigh) {
-    static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types");
+	static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types");
 
-    // 自动计算 nGroupSize
-    constexpr size_t nGroupSize = sizeof(U) / sizeof(T);
+	// 鑷姩璁$畻 nGroupSize
+	constexpr size_t nGroupSize = sizeof(U) / sizeof(T);
 
-    // 如果 T 和 U 的大小相等,直接转换
-    if (sizeof(T) == sizeof(U)) {
-        vecHigh.assign(vecLow.begin(), vecLow.end());
-        return;
-    }
+	// 濡傛灉 T 鍜� U 鐨勫ぇ灏忕浉绛夛紝鐩存帴杞崲
+	if (sizeof(T) == sizeof(U)) {
+		vecHigh.assign(vecLow.begin(), vecLow.end());
+		return;
+	}
 
-    // 如果 U 的大小是 T 的倍数,正常组合
-    static_assert(sizeof(U) > sizeof(T), "Size of U must be greater than or equal to size of T");
+	// 濡傛灉 U 鐨勫ぇ灏忔槸 T 鐨勫�嶆暟锛屾甯哥粍鍚�
+	static_assert(sizeof(U) > sizeof(T), "Size of U must be greater than or equal to size of T");
 
-    // 计算完整组的数量
-    size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // 向上取整
-    vecHigh.resize(nHighSize, 0);
+	// 璁$畻瀹屾暣缁勭殑鏁伴噺
+	size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // 鍚戜笂鍙栨暣
+	vecHigh.resize(nHighSize, 0);
 
-    // 合并低位数据到高位数据
-    for (size_t i = 0; i < vecLow.size(); i++) {
-        vecHigh[i / nGroupSize] |= (static_cast<U>(vecLow[i]) << ((i % nGroupSize) * CHAR_BIT * sizeof(T)));
-    }
+	// 鍚堝苟浣庝綅鏁版嵁鍒伴珮浣嶆暟鎹�
+	for (size_t i = 0; i < vecLow.size(); i++) {
+		vecHigh[i / nGroupSize] |= (static_cast<U>(vecLow[i]) << ((i % nGroupSize) * CHAR_BIT * sizeof(T)));
+	}
 
-    return vecHigh;
+	return vecHigh;
 }
 
-// 由高转低容器的模板(整型)
+// 鐢遍珮杞綆瀹瑰櫒鐨勬ā鏉匡紙鏁村瀷锛�
 template <typename T, typename U>
 void CPerformanceMelsec::ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow) {
-    static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types");
+	static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types");
 
-    // 自动计算 nGroupSize
-    constexpr size_t nGroupSize = sizeof(T) / sizeof(U);
+	// 鑷姩璁$畻 nGroupSize
+	constexpr size_t nGroupSize = sizeof(T) / sizeof(U);
 
-    // 如果 T 和 U 的大小相等,直接转换
-    if (sizeof(T) == sizeof(U)) {
-        vecLow.assign(vecHigh.begin(), vecHigh.end());
-        return;
-    }
+	// 濡傛灉 T 鍜� U 鐨勫ぇ灏忕浉绛夛紝鐩存帴杞崲
+	if (sizeof(T) == sizeof(U)) {
+		vecLow.assign(vecHigh.begin(), vecHigh.end());
+		return;
+	}
 
-    // 如果 T 的大小是 U 的倍数,正常分解
-    static_assert(sizeof(T) > sizeof(U), "Size of T must be greater than or equal to size of U");
+	// 濡傛灉 T 鐨勫ぇ灏忔槸 U 鐨勫�嶆暟锛屾甯稿垎瑙�
+	static_assert(sizeof(T) > sizeof(U), "Size of T must be greater than or equal to size of U");
 
-    size_t nLowSize = vecHigh.size() * nGroupSize; // 低容器的大小
-    vecLow.resize(nLowSize, 0);
+	size_t nLowSize = vecHigh.size() * nGroupSize; // 浣庡鍣ㄧ殑澶у皬
+	vecLow.resize(nLowSize, 0);
 
-    // 分解高位数据到低位数据
-    for (size_t i = 0; i < vecHigh.size(); i++) {
-        for (size_t j = 0; j < nGroupSize; j++) {
-            vecLow[i * nGroupSize + j] = static_cast<U>((vecHigh[i] >> (j * CHAR_BIT * sizeof(U))) & ((1ULL << (CHAR_BIT * sizeof(U))) - 1));
-        }
-    }
+	// 鍒嗚В楂樹綅鏁版嵁鍒颁綆浣嶆暟鎹�
+	for (size_t i = 0; i < vecHigh.size(); i++) {
+		for (size_t j = 0; j < nGroupSize; j++) {
+			vecLow[i * nGroupSize + j] = static_cast<U>((vecHigh[i] >> (j * CHAR_BIT * sizeof(U))) & ((1ULL << (CHAR_BIT * sizeof(U))) - 1));
+		}
+	}
 
-    return vecLow;
+	return vecLow;
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
index d7586f6..f171550 100644
--- a/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
+++ b/SourceCode/Bond/SGMeasurement/CCLinkPerformance/PerformanceMelsec.h
@@ -12,151 +12,151 @@
 #include <sstream>
 #include <unordered_map>
 
-// 连接参数
-#define PLC_MAX_RETRY 3        // 最大重试次数:在与PLC通信时,如果发生通信错误,将最多重试3次
-#define PLC_TIMEOUT 500        // 超时时间(毫秒):每次通信操作的超时等待时间为500毫秒
+// 杩炴帴鍙傛暟
+#define PLC_MAX_RETRY 3        // 鏈�澶ч噸璇曟鏁帮細鍦ㄤ笌PLC閫氫俊鏃讹紝濡傛灉鍙戠敓閫氫俊閿欒锛屽皢鏈�澶氶噸璇�3娆�
+#define PLC_TIMEOUT 500        // 瓒呮椂鏃堕棿锛堟绉掞級锛氭瘡娆¢�氫俊鎿嶄綔鐨勮秴鏃剁瓑寰呮椂闂翠负500姣
 
 /*
- * 网络通道:指定通信所使用的网络通道号,通常在多通道通信中设置
- * 51 到 54 是 MELSECNET/H 的 1-4 通道
- * 81 到 84 是 CC-Link 的 1-4 通道
- * 151 到 154 是 CC-Link IE 控制器网络的 1-4 通道
- * 181 到 184 是 CC-Link IE 现场网络的 1-4 通道
- * 281 到 284 是 CC-Link IE TSN 网络的 1-4 通道
+ * 缃戠粶閫氶亾锛氭寚瀹氶�氫俊鎵�浣跨敤鐨勭綉缁滈�氶亾鍙凤紝閫氬父鍦ㄥ閫氶亾閫氫俊涓缃�
+ * 51 鍒� 54 鏄� MELSECNET/H 鐨� 1-4 閫氶亾
+ * 81 鍒� 84 鏄� CC-Link 鐨� 1-4 閫氶亾
+ * 151 鍒� 154 鏄� CC-Link IE 鎺у埗鍣ㄧ綉缁滅殑 1-4 閫氶亾
+ * 181 鍒� 184 鏄� CC-Link IE 鐜板満缃戠粶鐨� 1-4 閫氶亾
+ * 281 鍒� 284 鏄� CC-Link IE TSN 缃戠粶鐨� 1-4 閫氶亾
  **/
-#define MELSECNET_CHANNEL(x) (50 + (x))           // x 范围:1~4
-#define CC_LINK_CHANNEL(x) (80 + (x))			  // x 范围:1~4
-#define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x 范围:1~4
-#define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x))   // x 范围:1~4
-#define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x))     // x 范围:1~4
+#define MELSECNET_CHANNEL(x) (50 + (x))           // x 鑼冨洿锛�1~4
+#define CC_LINK_CHANNEL(x) (80 + (x))			  // x 鑼冨洿锛�1~4
+#define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x 鑼冨洿锛�1~4
+#define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x))   // x 鑼冨洿锛�1~4
+#define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x))     // x 鑼冨洿锛�1~4
 
- // 自定义错误码
-#define ERROR_CODE_UNKNOWN				0x00010000 // 未知
-#define ERROR_CODE_NOT_CONNECTED		0x00020000 // 未连接
-#define ERROR_CODE_INVALID_PARAM		0x00030000 // 参数无效
-#define ERROR_CODE_INVALID_DATA			0x00040000 // 数据无效
-#define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // 站号超出范围
-#define ERROR_CODE_GROUP_OUT_OF_RANGE   0x00060000 // 组号超出范围
-#define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // 网络号超出范围
+ // 鑷畾涔夐敊璇爜
+#define ERROR_CODE_UNKNOWN				0x00010000 // 鏈煡
+#define ERROR_CODE_NOT_CONNECTED		0x00020000 // 鏈繛鎺�
+#define ERROR_CODE_INVALID_PARAM		0x00030000 // 鍙傛暟鏃犳晥
+#define ERROR_CODE_INVALID_DATA			0x00040000 // 鏁版嵁鏃犳晥
+#define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // 绔欏彿瓒呭嚭鑼冨洿
+#define ERROR_CODE_GROUP_OUT_OF_RANGE   0x00060000 // 缁勫彿瓒呭嚭鑼冨洿
+#define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // 缃戠粶鍙疯秴鍑鸿寖鍥�
 
-// 板块类型
+// 鏉垮潡绫诲瀷
 enum class BoardType {
-	UNKNOWN = -1,										// 未知类型
+	UNKNOWN = -1,										// 鏈煡绫诲瀷
 	MELSECNET_H = MELSECNET_CHANNEL(1),					// MELSECNET/H
 	CC_LINK_VER_2 = CC_LINK_CHANNEL(1),					// CC-Link Ver. 2
-	CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1),	// CC-Link IE 控制网络
-	CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1),     // CC-Link IE 现场网络
+	CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1),	// CC-Link IE 鎺у埗缃戠粶
+	CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1),     // CC-Link IE 鐜板満缃戠粶
 	CC_LINK_IE_TSN = CC_LINK_IE_TSN_CHANNEL(1)          // CC-Link IE TSN
 };
 
-// 软元件类型枚举
+// 杞厓浠剁被鍨嬫灇涓�
 enum class DeviceType {
 	/*
-	 * ER、LX、LY、LB、LW、LSB、LSW和SPG软元件都是范围型
-	 * ER:DevER0~256
-	 * LX:DevLX1~255,DevLX(x)	(DevX*1000+(x))
-	 * LY:DevLY1~255,DevLY(x)	(DevY*1000+(x))
-	 * LB:DevLB1~255,DevLB(x)	(DevB*1000+(x))
-	 * LW:DevLW1~255,DevLW(x)	(DevW*1000+(x))
-	 * LSB:DevLSB1~255,DevLSB(x) (DevQSB*1000+(x))
-	 * LSW:DevLSW1~255,DevLSW(x) (DevQSW*1000+(x))
-	 * SPG:DevSPG0~255,DevSPG(x) (29*1000+(x))
-	 * 扩展文件寄存器代码指定(10进制数)的后3位数及软元件名指定的数值中,应指定块No.(0~256)
-	 * 链接直接软元件代码指定(10进制数)的后3位数及软元件名指定的数值中,应指定网络No.(1~255)
-	 * 智能功能模块软元件代码指定(10进制数)的后3位数及软元件名指定的数值中,应指定(起始I/ONo.÷16)的值
-	 * 扩展文件寄存器和链接直接软元件在随机读取(mdRandR、mdRandREx)函数中,即使指定实际不存在的软元件也有可能正常结束
-	 * MAIL和MAILMC在SEND功能及RECV功能中,与软元件访问一样,指定各功能对应的软元件类型,进行数据的发送(mdSend、mdSendEx)或数据的读取(mdReceive、mdReceiveEx)
+	 * ER銆丩X銆丩Y銆丩B銆丩W銆丩SB銆丩SW鍜孲PG杞厓浠堕兘鏄寖鍥村瀷
+	 * ER锛欴evER0锝�256
+	 * LX锛欴evLX1锝�255锛孌evLX(x)	(DevX*1000+(x))
+	 * LY锛欴evLY1锝�255锛孌evLY(x)	(DevY*1000+(x))
+	 * LB锛欴evLB1锝�255锛孌evLB(x)	(DevB*1000+(x))
+	 * LW锛欴evLW1锝�255锛孌evLW(x)	(DevW*1000+(x))
+	 * LSB锛欴evLSB1锝�255锛孌evLSB(x) (DevQSB*1000+(x))
+	 * LSW锛欴evLSW1锝�255锛孌evLSW(x) (DevQSW*1000+(x))
+	 * SPG锛欴evSPG0锝�255锛孌evSPG(x) (29*1000+(x))
+	 * 鎵╁睍鏂囦欢瀵勫瓨鍣ㄤ唬鐮佹寚瀹�(10杩涘埗鏁�)鐨勫悗3浣嶆暟鍙婅蒋鍏冧欢鍚嶆寚瀹氱殑鏁板�间腑锛屽簲鎸囧畾鍧桸o.(0锝�256)
+	 * 閾炬帴鐩存帴杞厓浠朵唬鐮佹寚瀹�(10杩涘埗鏁�)鐨勫悗3浣嶆暟鍙婅蒋鍏冧欢鍚嶆寚瀹氱殑鏁板�间腑锛屽簲鎸囧畾缃戠粶No.(1锝�255)
+	 * 鏅鸿兘鍔熻兘妯″潡杞厓浠朵唬鐮佹寚瀹�(10杩涘埗鏁�)鐨勫悗3浣嶆暟鍙婅蒋鍏冧欢鍚嶆寚瀹氱殑鏁板�间腑锛屽簲鎸囧畾(璧峰I/ONo.梅16)鐨勫��
+	 * 鎵╁睍鏂囦欢瀵勫瓨鍣ㄥ拰閾炬帴鐩存帴杞厓浠跺湪闅忔満璇诲彇(mdRandR銆乵dRandREx)鍑芥暟涓紝鍗充娇鎸囧畾瀹為檯涓嶅瓨鍦ㄧ殑杞厓浠朵篃鏈夊彲鑳芥甯哥粨鏉�
+	 * MAIL鍜孧AILMC鍦⊿END鍔熻兘鍙奟ECV鍔熻兘涓紝涓庤蒋鍏冧欢璁块棶涓�鏍凤紝鎸囧畾鍚勫姛鑳藉搴旂殑杞厓浠剁被鍨嬶紝杩涜鏁版嵁鐨勫彂閫�(mdSend銆乵dSendEx)鎴栨暟鎹殑璇诲彇(mdReceive銆乵dReceiveEx)
 	 **/
 
-	X = 0x0001,      // 输入 (位)
-	Y = 0x0002,      // 输出 (位)
-	L = 0x0003,      // 锁存继电器 (位)
-	M = 0x0004,      // 内部继电器 (位)
-	SM = 0x0005,     // 特殊继电器 (位)
-	F = 0x0006,      // 报警器 (位)
-	TT = 0x0007,     // 定时器 (触点) (位)
-	TC = 0x0008,     // 计数器 (线圈) (位)
-	CT = 0x0009,     // 计数器 (触点) (位)
-	CC = 0x000A,     // 计数器 (线圈) (字)
-	TN = 0x000B,     // 定时器 (当前值) (字)
-	CN = 0x000C,     // 计数器 (当前值) (字)
-	D = 0x000D,      // 数据寄存器 (字)
-	SD = 0x000E,     // 特殊寄存器 (字)
-	TM = 0x000F,     // 定时器 (设置值主) (字)
-	TS = 0x0010,     // 定时器 (设置值主1) (字)
-	TS2 = 0x3E82,    // 定时器 (设置值主2) (字)
-	TS3 = 0x3E83,    // 定时器 (设置值主3) (字)
-	CM = 0x0011,     // 计数器 (设置值主) (字)
-	CS = 0x0012,     // 计数器 (设置值主1) (字)
-	CS2 = 0x4652,    // 计数器 (设置值主2) (字)
-	CS3 = 0x4653,    // 计数器 (设置值主3) (字)
-	A = 0x0013,      // 累加器 (字)
-	Z = 0x0014,      // 变址寄存器 (字)
-	V = 0x0015,      // 变址寄存器 (字)
-	R = 0x0016,      // 文件寄存器 (块切换方式) (字)
-	ER = 0x55F0,     // 扩展文件寄存器 (块切换方式) (0x55F0~0x56F0) (字) (在随机读取(mdRandR、mdRandREx)函数中,即使指定实际不存在的软元件也有可能正常结束。(读取数据不正确。))
-	ZR = 0x00DC,     // 文件寄存器 (连号访问方式) (字)
-	B = 0x0017,      // 链接继电器 (位)
-	W = 0x0018,      // 链接寄存器 (字)
-	QSB = 0x0019,    // 链接特殊继电器 (位)
-	STT = 0x001A,    // 累计定时器 (触点) (位)
-	STC = 0x001B,    // 累计定时器 (线圈) (位)
-	QSW = 0x001C,    // 链接特殊寄存器 (字)
-	QV = 0x001E,     // 变址继电器 (位)
-	MRB = 0x0021,	 // 随机访问缓冲 (字)
-	STN = 0x0023,    // 累计定时器 (当前值) (字)
-	LZ = 0x0026,     // 超长变址寄存器 (双字)
-	RD = 0x0027,     // 刷新数据寄存器 (字)
-	LTT = 0x0029,    // 超长定时器 (触点) (位)
-	LTC = 0x002A,    // 超长定时器 (线圈) (位)
-	LTN = 0x002B,    // 超长定时器 (当前值) (双字)
-	LCT = 0x002C,    // 超长计数器 (触点) (位)
-	LCC = 0x002D,    // 超长计数器 (线圈) (位)
-	LCN = 0x002E,    // 超长计数器 (当前值) (双字)
-	LSTT = 0x002F,   // 超长累计定时器 (触点) (位)
-	LSTC = 0x0030,   // 超长累计定时器 (线圈) (位)
-	LSTN = 0x0031,   // 超长累计定时器 (当前值) (双字)
-	SPB = 0x0032,	 // 缓冲存储器 (字)
-	MAIL = 0x0065,   // 特殊软元件类型:邮件类型 (10进制 101)
-	MAILMC = 0x0066, // 特殊软元件类型:无确认邮件 (10进制 102)
-	LX = 0x03E8,     // 链接直接软元件 (链接输入) (0x03E9~0x04E7) (位)
-	LY = 0x07D0,     // 链接直接软元件 (链接输出) (0x07D1~0x08CF) (位)
-	LB = 0x59D8,     // 链接直接软元件 (链接继电器) (0x59D9~0x5AD7) (位)
-	LW = 0x5DC0,     // 链接直接软元件 (链接寄存器) (0x5DC1~0x5EBF) (字)
-	LSB = 0x61A8,    // 链接直接软元件 (链接特殊继电器) (0x61A9~0x62A7) (位)
-	LSW = 0x6D60,    // 链接直接软元件 (链接特殊寄存器) (0x6D61~0x6E5F) (字)
-	SPG = 0x7147,    // 智能功能模块软元件 (0x7148~0x7247) (字)
+	X = 0x0001,      // 杈撳叆 (浣�)
+	Y = 0x0002,      // 杈撳嚭 (浣�)
+	L = 0x0003,      // 閿佸瓨缁х數鍣� (浣�)
+	M = 0x0004,      // 鍐呴儴缁х數鍣� (浣�)
+	SM = 0x0005,     // 鐗规畩缁х數鍣� (浣�)
+	F = 0x0006,      // 鎶ヨ鍣� (浣�)
+	TT = 0x0007,     // 瀹氭椂鍣� (瑙︾偣) (浣�)
+	TC = 0x0008,     // 璁℃暟鍣� (绾垮湀) (浣�)
+	CT = 0x0009,     // 璁℃暟鍣� (瑙︾偣) (浣�)
+	CC = 0x000A,     // 璁℃暟鍣� (绾垮湀) (瀛�)
+	TN = 0x000B,     // 瀹氭椂鍣� (褰撳墠鍊�) (瀛�)
+	CN = 0x000C,     // 璁℃暟鍣� (褰撳墠鍊�) (瀛�)
+	D = 0x000D,      // 鏁版嵁瀵勫瓨鍣� (瀛�)
+	SD = 0x000E,     // 鐗规畩瀵勫瓨鍣� (瀛�)
+	TM = 0x000F,     // 瀹氭椂鍣� (璁剧疆鍊间富) (瀛�)
+	TS = 0x0010,     // 瀹氭椂鍣� (璁剧疆鍊间富1) (瀛�)
+	TS2 = 0x3E82,    // 瀹氭椂鍣� (璁剧疆鍊间富2) (瀛�)
+	TS3 = 0x3E83,    // 瀹氭椂鍣� (璁剧疆鍊间富3) (瀛�)
+	CM = 0x0011,     // 璁℃暟鍣� (璁剧疆鍊间富) (瀛�)
+	CS = 0x0012,     // 璁℃暟鍣� (璁剧疆鍊间富1) (瀛�)
+	CS2 = 0x4652,    // 璁℃暟鍣� (璁剧疆鍊间富2) (瀛�)
+	CS3 = 0x4653,    // 璁℃暟鍣� (璁剧疆鍊间富3) (瀛�)
+	A = 0x0013,      // 绱姞鍣� (瀛�)
+	Z = 0x0014,      // 鍙樺潃瀵勫瓨鍣� (瀛�)
+	V = 0x0015,      // 鍙樺潃瀵勫瓨鍣� (瀛�)
+	R = 0x0016,      // 鏂囦欢瀵勫瓨鍣� (鍧楀垏鎹㈡柟寮�) (瀛�)
+	ER = 0x55F0,     // 鎵╁睍鏂囦欢瀵勫瓨鍣� (鍧楀垏鎹㈡柟寮�) (0x55F0锝�0x56F0) (瀛�) (鍦ㄩ殢鏈鸿鍙�(mdRandR銆乵dRandREx)鍑芥暟涓紝鍗充娇鎸囧畾瀹為檯涓嶅瓨鍦ㄧ殑杞厓浠朵篃鏈夊彲鑳芥甯哥粨鏉熴��(璇诲彇鏁版嵁涓嶆纭��))
+	ZR = 0x00DC,     // 鏂囦欢瀵勫瓨鍣� (杩炲彿璁块棶鏂瑰紡) (瀛�)
+	B = 0x0017,      // 閾炬帴缁х數鍣� (浣�)
+	W = 0x0018,      // 閾炬帴瀵勫瓨鍣� (瀛�)
+	QSB = 0x0019,    // 閾炬帴鐗规畩缁х數鍣� (浣�)
+	STT = 0x001A,    // 绱瀹氭椂鍣� (瑙︾偣) (浣�)
+	STC = 0x001B,    // 绱瀹氭椂鍣� (绾垮湀) (浣�)
+	QSW = 0x001C,    // 閾炬帴鐗规畩瀵勫瓨鍣� (瀛�)
+	QV = 0x001E,     // 鍙樺潃缁х數鍣� (浣�)
+	MRB = 0x0021,	 // 闅忔満璁块棶缂撳啿 (瀛�)
+	STN = 0x0023,    // 绱瀹氭椂鍣� (褰撳墠鍊�) (瀛�)
+	LZ = 0x0026,     // 瓒呴暱鍙樺潃瀵勫瓨鍣� (鍙屽瓧)
+	RD = 0x0027,     // 鍒锋柊鏁版嵁瀵勫瓨鍣� (瀛�)
+	LTT = 0x0029,    // 瓒呴暱瀹氭椂鍣� (瑙︾偣) (浣�)
+	LTC = 0x002A,    // 瓒呴暱瀹氭椂鍣� (绾垮湀) (浣�)
+	LTN = 0x002B,    // 瓒呴暱瀹氭椂鍣� (褰撳墠鍊�) (鍙屽瓧)
+	LCT = 0x002C,    // 瓒呴暱璁℃暟鍣� (瑙︾偣) (浣�)
+	LCC = 0x002D,    // 瓒呴暱璁℃暟鍣� (绾垮湀) (浣�)
+	LCN = 0x002E,    // 瓒呴暱璁℃暟鍣� (褰撳墠鍊�) (鍙屽瓧)
+	LSTT = 0x002F,   // 瓒呴暱绱瀹氭椂鍣� (瑙︾偣) (浣�)
+	LSTC = 0x0030,   // 瓒呴暱绱瀹氭椂鍣� (绾垮湀) (浣�)
+	LSTN = 0x0031,   // 瓒呴暱绱瀹氭椂鍣� (褰撳墠鍊�) (鍙屽瓧)
+	SPB = 0x0032,	 // 缂撳啿瀛樺偍鍣� (瀛�)
+	MAIL = 0x0065,   // 鐗规畩杞厓浠剁被鍨嬶細閭欢绫诲瀷 (10杩涘埗 101)
+	MAILMC = 0x0066, // 鐗规畩杞厓浠剁被鍨嬶細鏃犵‘璁ら偖浠� (10杩涘埗 102)
+	LX = 0x03E8,     // 閾炬帴鐩存帴杞厓浠� (閾炬帴杈撳叆) (0x03E9锝�0x04E7) (浣�)
+	LY = 0x07D0,     // 閾炬帴鐩存帴杞厓浠� (閾炬帴杈撳嚭) (0x07D1锝�0x08CF) (浣�)
+	LB = 0x59D8,     // 閾炬帴鐩存帴杞厓浠� (閾炬帴缁х數鍣�) (0x59D9锝�0x5AD7) (浣�)
+	LW = 0x5DC0,     // 閾炬帴鐩存帴杞厓浠� (閾炬帴瀵勫瓨鍣�) (0x5DC1锝�0x5EBF) (瀛�)
+	LSB = 0x61A8,    // 閾炬帴鐩存帴杞厓浠� (閾炬帴鐗规畩缁х數鍣�) (0x61A9锝�0x62A7) (浣�)
+	LSW = 0x6D60,    // 閾炬帴鐩存帴杞厓浠� (閾炬帴鐗规畩瀵勫瓨鍣�) (0x6D61锝�0x6E5F) (瀛�)
+	SPG = 0x7147,    // 鏅鸿兘鍔熻兘妯″潡杞厓浠� (0x7148锝�0x7247) (瀛�)
 };
 
-// 数据类型
+// 鏁版嵁绫诲瀷
 enum class DataType {
-	BIT = 1,   // 位 (1位)
-	WORD = 2,  // 字 (16位)
-	DWORD = 4  // 双字 (32位)
+	BIT = 1,   // 浣� (1浣�)
+	WORD = 2,  // 瀛� (16浣�)
+	DWORD = 4  // 鍙屽瓧 (32浣�)
 };
 
-// 控制代码
+// 鎺у埗浠g爜
 enum class ControlCode {
-	RUN = 0,   // 远程 RUN
-	STOP = 1,  // 远程 STOP
-	PAUSE = 2  // 远程 PAUSE
+	RUN = 0,   // 杩滅▼ RUN
+	STOP = 1,  // 杩滅▼ STOP
+	PAUSE = 2  // 杩滅▼ PAUSE
 };
 
-// 版本信息
+// 鐗堟湰淇℃伅
 struct BoardVersion {
-	char fixedValue[2];       // 固定值
-	char checksum[2];         // 校验和
-	char swVersion[2];        // 软件版本
-	char date[6];             // 日期 (格式 YYMMDD)
-	uint32_t reserved;        // 保留区域 (4 字节)
-	char swModel[16];         // 软件型号
-	char hwModel[16];         // 硬件型号
-	char twoPortMemory[2];    // 两端口存储器占用容量
-	char twoPortAttribute[2]; // 两端口属性
-	char availableBias[2];    // 可使用偏置
-	char moduleType[10];      // 机型类型
+	char fixedValue[2];       // 鍥哄畾鍊�
+	char checksum[2];         // 鏍¢獙鍜�
+	char swVersion[2];        // 杞欢鐗堟湰
+	char date[6];             // 鏃ユ湡 (鏍煎紡 YYMMDD)
+	uint32_t reserved;        // 淇濈暀鍖哄煙 (4 瀛楄妭)
+	char swModel[16];         // 杞欢鍨嬪彿
+	char hwModel[16];         // 纭欢鍨嬪彿
+	char twoPortMemory[2];    // 涓ょ鍙e瓨鍌ㄥ櫒鍗犵敤瀹归噺
+	char twoPortAttribute[2]; // 涓ょ鍙e睘鎬�
+	char availableBias[2];    // 鍙娇鐢ㄥ亸缃�
+	char moduleType[10];      // 鏈哄瀷绫诲瀷
 
-	// 输出结构体内容为字符串 (便于调试)
+	// 杈撳嚭缁撴瀯浣撳唴瀹逛负瀛楃涓� (渚夸簬璋冭瘯)
 	std::string toString() const {
 		std::ostringstream oss;
 		oss << "Fixed Value: " << fixedValue[0] << fixedValue[1] << "\n"
@@ -174,18 +174,18 @@
 	}
 };
 
-// 站点标识符,默认使用本站
+// 绔欑偣鏍囪瘑绗︼紝榛樿浣跨敤鏈珯
 struct StationIdentifier {
 	/*
 	 * [Network No.]
-	 * 0 表示本站
-	 * 1~239 表示普通网络号
+	 * 0 琛ㄧず鏈珯
+	 * 1~239 琛ㄧず鏅�氱綉缁滃彿
 	 **/
 
 	 /*
 	  * [Station No.]
-	  * MELSECNET/H:1~64 表示其他站点,255 表示本站
-	  * CC-Link 系列网络的范围类似,区别在于站号的取值范围
+	  * MELSECNET/H锛�1~64 琛ㄧず鍏朵粬绔欑偣锛�255 琛ㄧず鏈珯
+	  * CC-Link 绯诲垪缃戠粶鐨勮寖鍥寸被浼硷紝鍖哄埆鍦ㄤ簬绔欏彿鐨勫彇鍊艰寖鍥�
 	  * MELSECNET/H             : 1~64(Other stations),255(Own station)
 	  * CC-Link                 : 0~63(Other stations),255(Own station)
 	  * CC-Link IE Controller   : 1~120(Other stations),255(Own station)
@@ -194,15 +194,15 @@
 	  **/
 
 	  /*
-	   * 高 8 位(网络号): 指定设备所属的网络
-	   * 低 8 位(站点号): 指定设备在网络中的编号
-	   * 用一个参数传递设备的网络号和站点号时: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00);
+	   * 楂� 8 浣嶏紙缃戠粶鍙凤級锛� 鎸囧畾璁惧鎵�灞炵殑缃戠粶
+	   * 浣� 8 浣嶏紙绔欑偣鍙凤級锛� 鎸囧畾璁惧鍦ㄧ綉缁滀腑鐨勭紪鍙�
+	   * 鐢ㄤ竴涓弬鏁颁紶閫掕澶囩殑缃戠粶鍙峰拰绔欑偣鍙锋椂: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00);
 	   **/
 
-	short nNetNo = 0;    // 网络编号:PLC所连接的网络编号,0表示默认网络
-	short nStNo = 255;   // 站点编号:指定与PLC连接的站点编号,255通常表示广播或所有站点
+	short nNetNo = 0;    // 缃戠粶缂栧彿锛歅LC鎵�杩炴帴鐨勭綉缁滅紪鍙凤紝0琛ㄧず榛樿缃戠粶
+	short nStNo = 255;   // 绔欑偣缂栧彿锛氭寚瀹氫笌PLC杩炴帴鐨勭珯鐐圭紪鍙凤紝255閫氬父琛ㄧず骞挎挱鎴栨墍鏈夌珯鐐�
 
-	// 自定义构造函数,覆盖默认值
+	// 鑷畾涔夋瀯閫犲嚱鏁帮紝瑕嗙洊榛樿鍊�
 	explicit StationIdentifier(const short net, const short st) : nNetNo(net), nStNo(st) {}
 
 	StationIdentifier() 
@@ -211,24 +211,24 @@
 		nStNo = 255;
 	}
 
-	// 将“网络号”和“站点号”组合成一个最终编码
+	// 灏嗏�滅綉缁滃彿鈥濆拰鈥滅珯鐐瑰彿鈥濈粍鍚堟垚涓�涓渶缁堢紪鐮�
 	short StationIdentifier::toNetworkStationCode() const {
 		return static_cast<short>(nStNo | ((nNetNo << 8) & 0xFF00));
 	}
 
-	// 重载 < 运算符(用于排序或比较,通常用于 map 或 set 中作为 key)
+	// 閲嶈浇 < 杩愮畻绗︼紙鐢ㄤ簬鎺掑簭鎴栨瘮杈冿紝閫氬父鐢ㄤ簬 map 鎴� set 涓綔涓� key锛�
 	bool operator<(const StationIdentifier& other) const {
 		return std::tie(nNetNo, nStNo) <
 			std::tie(other.nNetNo, other.nStNo);
 	}
 
-	// 重载 == 运算符(用于相等比较)
+	// 閲嶈浇 == 杩愮畻绗︼紙鐢ㄤ簬鐩哥瓑姣旇緝锛�
 	bool operator==(const StationIdentifier& other) const {
 		return std::tie(nNetNo, nStNo) ==
 			std::tie(other.nNetNo, other.nStNo);
 	}
 
-	// 重载 = 运算符(用于赋值)
+	// 閲嶈浇 = 杩愮畻绗︼紙鐢ㄤ簬璧嬪�硷級
 	StationIdentifier& operator=(const StationIdentifier& other) {
 		if (this != &other) {
 			nNetNo = other.nNetNo;
@@ -238,16 +238,16 @@
 	}
 };
 
-// 板状态
+// 鏉跨姸鎬�
 struct BoardStatus {
-	short nStationValue = 0;    // 站号的设备值 (buf[0])
-	short nGroupValue = 0;      // 组 No. 的设备值 (buf[1])
-	short nNetworkValue = 0;    // 网络 No. 的设备值 (buf[2])
-	short nReserved1 = 0;       // 保留字段 (buf[3])
-	short nReserved2 = 0;       // 保留字段 (buf[4])
-	short nReserved3 = 0;       // 保留字段 (buf[5])
+	short nStationValue = 0;    // 绔欏彿鐨勮澶囧�� (buf[0])
+	short nGroupValue = 0;      // 缁� No. 鐨勮澶囧�� (buf[1])
+	short nNetworkValue = 0;    // 缃戠粶 No. 鐨勮澶囧�� (buf[2])
+	short nReserved1 = 0;       // 淇濈暀瀛楁 (buf[3])
+	short nReserved2 = 0;       // 淇濈暀瀛楁 (buf[4])
+	short nReserved3 = 0;       // 淇濈暀瀛楁 (buf[5])
 
-	// 将数组映射到结构体
+	// 灏嗘暟缁勬槧灏勫埌缁撴瀯浣�
 	static BoardStatus fromBuffer(const short buf[6]) {
 		return {
 			buf[0],
@@ -259,7 +259,7 @@
 		};
 	}
 
-	// 将结构体内容映射到数组
+	// 灏嗙粨鏋勪綋鍐呭鏄犲皠鍒版暟缁�
 	void toBuffer(short buf[6]) const {
 		buf[0] = nStationValue;
 		buf[1] = nGroupValue;
@@ -269,7 +269,7 @@
 		buf[5] = nReserved3;
 	}
 
-	// 调试输出
+	// 璋冭瘯杈撳嚭
 	std::string toString() const {
 		std::ostringstream oss;
 		oss << "Station Value: " << nStationValue << "\n"
@@ -282,12 +282,12 @@
 	}
 };
 
-// 事件详情
+// 浜嬩欢璇︽儏
 struct EventDetails {
-	short nEventNo;  					// 发生的事件号
-	std::array<short, 4> details; 		// 存储事件详情信息
+	short nEventNo;  					// 鍙戠敓鐨勪簨浠跺彿
+	std::array<short, 4> details; 		// 瀛樺偍浜嬩欢璇︽儏淇℃伅
 
-	// 解析事件详情,返回格式化字符串
+	// 瑙f瀽浜嬩欢璇︽儏锛岃繑鍥炴牸寮忓寲瀛楃涓�
 	std::string toString() const {
 		std::ostringstream oss;
 		oss << "Details[0]: " << details[0] << ", "
@@ -298,33 +298,33 @@
 	}
 };
 
-// SoftElement 结构体定义
+// SoftElement 缁撴瀯浣撳畾涔�
 struct SoftElement {
-	short nType;         // 软元件类型
-	short nElementCount; // 点数
-	long nStartNo;       // 起始软元件编号
+	short nType;         // 杞厓浠剁被鍨�
+	short nElementCount; // 鐐规暟
+	long nStartNo;       // 璧峰杞厓浠剁紪鍙�
 };
 
-// 错误信息
+// 閿欒淇℃伅
 struct ErrorInfo {
-	int nErrorCode = 0;              // 错误码
-	std::string strErrorMessageCn;   // 中文描述
-	std::string strErrorMessageEn;   // 英文描述
+	int nErrorCode = 0;              // 閿欒鐮�
+	std::string strErrorMessageCn;   // 涓枃鎻忚堪
+	std::string strErrorMessageEn;   // 鑻辨枃鎻忚堪
 
-	// 将结构体序列化为字符串
+	// 灏嗙粨鏋勪綋搴忓垪鍖栦负瀛楃涓�
 	std::string toString() const {
 		std::ostringstream oss;
 		oss << nErrorCode << "|" << strErrorMessageCn << "|" << strErrorMessageEn;
 		return oss.str();
 	}
 
-	// 从字符串反序列化为结构体
+	// 浠庡瓧绗︿覆鍙嶅簭鍒楀寲涓虹粨鏋勪綋
 	static ErrorInfo fromString(const std::string& line) {
 		ErrorInfo info;
 		std::istringstream iss(line);
 		std::string token;
 
-		// 使用分隔符 "|" 解析字符串
+		// 浣跨敤鍒嗛殧绗� "|" 瑙f瀽瀛楃涓�
 		std::getline(iss, token, '|');
 		info.nErrorCode = std::stoi(token);
 
@@ -338,47 +338,47 @@
 	}
 };
 
-using BitContainer = std::vector<bool>;			// 每个元素存储 1  位
-using WordContainer = std::vector<uint16_t>;	// 每个元素存储 16 位
-using DWordContainer = std::vector<uint32_t>;	// 每个元素存储 32 位
+using BitContainer = std::vector<bool>;			// 姣忎釜鍏冪礌瀛樺偍 1  浣�
+using WordContainer = std::vector<uint16_t>;	// 姣忎釜鍏冪礌瀛樺偍 16 浣�
+using DWordContainer = std::vector<uint32_t>;	// 姣忎釜鍏冪礌瀛樺偍 32 浣�
 
-// CPerformanceMelsec 类声明
+// CPerformanceMelsec 绫诲0鏄�
 class CPerformanceMelsec {
 public:
-	// 获取最近的错误信息
+	// 鑾峰彇鏈�杩戠殑閿欒淇℃伅
 	std::string GetLastError() const;
 
-	// 错误信息加载与保存接口
-	static bool LoadErrorInfoFromFile(const std::string& filename);  // 从文件加载错误信息
-	static bool SaveErrorInfoToFile(const std::string& filename);    // 保存错误信息到文件
+	// 閿欒淇℃伅鍔犺浇涓庝繚瀛樻帴鍙�
+	static bool LoadErrorInfoFromFile(const std::string& filename);  // 浠庢枃浠跺姞杞介敊璇俊鎭�
+	static bool SaveErrorInfoToFile(const std::string& filename);    // 淇濆瓨閿欒淇℃伅鍒版枃浠�
 
-	// 连接/断开
+	// 杩炴帴/鏂紑
 	int Connect(short nChannel, short nMode = -1);
 	int Disconnect();
 
-	// 初始化可编程控制器软元件信息表
+	// 鍒濆鍖栧彲缂栫▼鎺у埗鍣ㄨ蒋鍏冧欢淇℃伅琛�
 	int InitializeController();
 
-	//	获取版本信息
+	//	鑾峰彇鐗堟湰淇℃伅
 	int GetBoardVersion(BoardVersion& version);
 
-	// 板复位
+	// 鏉垮浣�
 	int BoardReset();
 
-	// 板LED读取
+	// 鏉縇ED璇诲彇
 	int ReadBoardLed(std::vector<short>& vecLedBuffer);
 
-	// 读取目标站点CPU类型
+	// 璇诲彇鐩爣绔欑偣CPU绫诲瀷
 	int ReadCPUCode(const StationIdentifier& station, short& nCPUCode);
 
-	// 板模式获取/设置
+	// 鏉挎ā寮忚幏鍙�/璁剧疆
 	int SetBoardMode(short nMode);
 	int GetBoardMode(short& nMode);
 
-	// 获取板状态
+	// 鑾峰彇鏉跨姸鎬�
 	int GetBoardStatus(BoardStatus& status);
 
-	// 读写数据
+	// 璇诲啓鏁版嵁
 	int ReadData(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<short>& vecData);
 	int ReadBitData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nBitCount, BitContainer& vecData);
 	int ReadWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nWordCount, WordContainer& vecData);
@@ -388,7 +388,7 @@
 	int WriteWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const WordContainer& vecData);
 	int WriteDWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const DWordContainer& vecData);
 
-	// 扩展读写数据
+	// 鎵╁睍璇诲啓鏁版嵁
 	long ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData);
 	long ReadBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nBitCount, BitContainer& vecData);
 	long ReadWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nWordCount, WordContainer& vecData);
@@ -398,56 +398,56 @@
 	long WriteWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const WordContainer& vecData);
 	long WriteDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const DWordContainer& vecData);
 
-	// 扩展软元件随机读写(支持多个软元件)
+	// 鎵╁睍杞厓浠堕殢鏈鸿鍐欙紙鏀寔澶氫釜杞厓浠讹級
 	long ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData);
 	long WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData);
 
-	// 远程设备站/远程站的缓冲存储器读写
+	// 杩滅▼璁惧绔�/杩滅▼绔欑殑缂撳啿瀛樺偍鍣ㄨ鍐�
 	long ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData);
 	long WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData);
 	long ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData);
 	long WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData);
 
-	// 设置/复位对象站的指定位软元件
+	// 璁剧疆/澶嶄綅瀵硅薄绔欑殑鎸囧畾浣嶈蒋鍏冧欢
 	int SetBitDevice(const StationIdentifier& station, DeviceType enDevType, short nDevNo);
 	int ResetBitDevice(const StationIdentifier& station, DeviceType enDevType, short enDevNo);
 
-	// 扩展设置/复位对象站的指定位软元件
+	// 鎵╁睍璁剧疆/澶嶄綅瀵硅薄绔欑殑鎸囧畾浣嶈蒋鍏冧欢
 	long SetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo);
 	long ResetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo);
 
-	// 执行对象站的CPU
+	// 鎵ц瀵硅薄绔欑殑CPU
 	int ControlCPU(const StationIdentifier& station, ControlCode enControlCode);
 
-	// 事件等待,vecEventNumbers[0, 64],nTimeoutMs[-1, 2147483647]
-	// 同时发生了多个事件的情况下,首先检测出其中一个事件。 再次执行了本函数的情况下检测出其它事件。
+	// 浜嬩欢绛夊緟锛寁ecEventNumbers[0, 64]锛宯TimeoutMs[-1, 2147483647]
+	// 鍚屾椂鍙戠敓浜嗗涓簨浠剁殑鎯呭喌涓嬶紝棣栧厛妫�娴嬪嚭鍏朵腑涓�涓簨浠躲�� 鍐嶆鎵ц浜嗘湰鍑芥暟鐨勬儏鍐典笅妫�娴嬪嚭鍏跺畠浜嬩欢銆�
 	int WaitForBoardEvent(std::vector<short> vecEventNumbers, int nTimeoutMs, EventDetails& details);
 
 private:
-	// 锁定与解锁(多线程同步保护)
+	// 閿佸畾涓庤В閿侊紙澶氱嚎绋嬪悓姝ヤ繚鎶わ級
 	void Lock() { m_mtx.lock(); }
 	void Unlock() { m_mtx.unlock(); }
 
 protected:
-	// 构造函数/析构函数
+	// 鏋勯�犲嚱鏁�/鏋愭瀯鍑芥暟
 	explicit CPerformanceMelsec(BoardType enBoardType);
 	virtual ~CPerformanceMelsec();
 
-	// 辅助函数
-	void UpdateLastError(int nCode);						 		// 更新最近的错误信息
-	int ValidateStation(const StationIdentifier& station) const; 	// 检查连接状态和站点参数有效性
+	// 杈呭姪鍑芥暟
+	void UpdateLastError(int nCode);						 		// 鏇存柊鏈�杩戠殑閿欒淇℃伅
+	int ValidateStation(const StationIdentifier& station) const; 	// 妫�鏌ヨ繛鎺ョ姸鎬佸拰绔欑偣鍙傛暟鏈夋晥鎬�
 	int ValidateStationAndSize(const StationIdentifier& station, short nCount) const;
 
-	// 静态辅助函数
-	static void Delay(unsigned int nDelayMs);						// 延时,并且转发窗口消息
-	static BoardType FindBoardTypeByChannel(int nChannel);			// 查找板块类型
-	static short CombineStation(const StationIdentifier& station);  // 合并网络号和站点号
-	static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // 计算软元件类型
+	// 闈欐�佽緟鍔╁嚱鏁�
+	static void Delay(unsigned int nDelayMs);						// 寤舵椂锛屽苟涓旇浆鍙戠獥鍙f秷鎭�
+	static BoardType FindBoardTypeByChannel(int nChannel);			// 鏌ユ壘鏉垮潡绫诲瀷
+	static short CombineStation(const StationIdentifier& station);  // 鍚堝苟缃戠粶鍙峰拰绔欑偣鍙�
+	static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // 璁$畻杞厓浠剁被鍨�
 
-	// IP转换
+	// IP杞崲
 	static bool ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP);
 
-	// 容器转换
+	// 瀹瑰櫒杞崲
 	static void ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort);
 	static void ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar);
 	static void ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort);
@@ -455,7 +455,7 @@
 	static void ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort);
 	static void ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32);
 
-	// 模板辅助函数
+	// 妯℃澘杈呭姪鍑芥暟
 	template <typename T>
 	int ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData);
 
@@ -465,15 +465,15 @@
 	template <typename T, typename U>
 	void ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow);
 
-	// 成员变量
-	std::mutex m_mtx;                       // 互斥锁保护
-	BoardType m_enBoardType;				// 板块类型
-	long m_nPath;                           // 通信路径
-	std::atomic<bool> m_bConnected;         // 是否已连接
-	std::string m_strLastError;             // 最近一次错误信息
+	// 鎴愬憳鍙橀噺
+	std::mutex m_mtx;                       // 浜掓枼閿佷繚鎶�
+	BoardType m_enBoardType;				// 鏉垮潡绫诲瀷
+	long m_nPath;                           // 閫氫俊璺緞
+	std::atomic<bool> m_bConnected;         // 鏄惁宸茶繛鎺�
+	std::string m_strLastError;             // 鏈�杩戜竴娆¢敊璇俊鎭�
 
-	// 静态成员变量
-	static std::unordered_map<int, std::string> m_mapError; // 错误码映射表
+	// 闈欐�佹垚鍛樺彉閲�
+	static std::unordered_map<int, std::string> m_mapError; // 閿欒鐮佹槧灏勮〃
 };
 
 #endif // PERFORMANCE_MELSEC_H
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/Logger.cpp b/SourceCode/Bond/SGMeasurement/Logger.cpp
index 1908277..34a0dd1 100644
--- a/SourceCode/Bond/SGMeasurement/Logger.cpp
+++ b/SourceCode/Bond/SGMeasurement/Logger.cpp
@@ -3,8 +3,8 @@
 
 CLogger& CLogger::Instance()
 {
-    static CLogger instance;
-    return instance;
+	static CLogger instance;
+	return instance;
 }
 
 CLogger::CLogger()
@@ -14,66 +14,66 @@
 
 CLogger::~CLogger()
 {
-    CloseLogFile();
+	CloseLogFile();
 }
 
 void CLogger::OpenLogFile()
 {
-    CSingleLock lock(&m_csLogLock, TRUE);
+	CSingleLock lock(&m_csLogLock, TRUE);
 
-    CTime now = CTime::GetCurrentTime();
-    CString strLogDir = _T("Log");
+	CTime now = CTime::GetCurrentTime();
+	CString strLogDir = _T("Log");
 
-    if (!PathFileExists(strLogDir)) {
-        CreateDirectory(strLogDir, NULL);
-    }
+	if (!PathFileExists(strLogDir)) {
+		CreateDirectory(strLogDir, NULL);
+	}
 
-    CString strNewPath;
-    strNewPath.Format(_T("%s\\SG_%04d%02d%02d.log"), strLogDir, now.GetYear(), now.GetMonth(), now.GetDay());
+	CString strNewPath;
+	strNewPath.Format(_T("%s\\SG_%04d%02d%02d.log"), strLogDir, now.GetYear(), now.GetMonth(), now.GetDay());
 
-    if (m_strCurrentLogPath.CompareNoCase(strNewPath) != 0 || m_logFile.m_pStream == nullptr) {
-        if (m_logFile.m_pStream) {
-            m_logFile.Flush();
-            m_logFile.Close();
-        }
+	if (m_strCurrentLogPath.CompareNoCase(strNewPath) != 0 || m_logFile.m_pStream == nullptr) {
+		if (m_logFile.m_pStream) {
+			m_logFile.Flush();
+			m_logFile.Close();
+		}
 
-        if (m_logFile.Open(strNewPath,
-            CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary)) {
+		if (m_logFile.Open(strNewPath,
+			CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary)) {
 
-            if (m_logFile.GetLength() == 0) {
-                WCHAR bom = 0xFEFF;
-                m_logFile.Write(&bom, sizeof(WCHAR));
-            }
+			if (m_logFile.GetLength() == 0) {
+				WCHAR bom = 0xFEFF;
+				m_logFile.Write(&bom, sizeof(WCHAR));
+			}
 
-            m_logFile.SeekToEnd();
-            m_strCurrentLogPath = strNewPath;
-        }
-    }
+			m_logFile.SeekToEnd();
+			m_strCurrentLogPath = strNewPath;
+		}
+	}
 }
 
 void CLogger::WriteLine(CString str)
 {
-    CSingleLock lock(&m_csLogLock, TRUE);
+	CSingleLock lock(&m_csLogLock, TRUE);
 
-    OpenLogFile();
+	OpenLogFile();
 
-    if (m_logFile.m_pStream) {
-        CTime now = CTime::GetCurrentTime();
-        CString strTime;
-        strTime.Format(_T("[%02d:%02d:%02d]"), now.GetHour(), now.GetMinute(), now.GetSecond());
+	if (m_logFile.m_pStream) {
+		CTime now = CTime::GetCurrentTime();
+		CString strTime;
+		strTime.Format(_T("[%02d:%02d:%02d]"), now.GetHour(), now.GetMinute(), now.GetSecond());
 
-        CString strLine = strTime + str + _T("\r\n");
-        m_logFile.Write((LPCTSTR)strLine, strLine.GetLength() * sizeof(WCHAR));
-    }
+		CString strLine = strTime + str + _T("\r\n");
+		m_logFile.Write((LPCTSTR)strLine, strLine.GetLength() * sizeof(WCHAR));
+	}
 }
 
 void CLogger::CloseLogFile()
 {
-    CSingleLock lock(&m_csLogLock, TRUE);
+	CSingleLock lock(&m_csLogLock, TRUE);
 
-    if (m_logFile.m_pStream) {
-        m_logFile.Flush();
-        m_logFile.Close();
-        m_strCurrentLogPath.Empty();
-    }
+	if (m_logFile.m_pStream) {
+		m_logFile.Flush();
+		m_logFile.Close();
+		m_strCurrentLogPath.Empty();
+	}
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/Logger.h b/SourceCode/Bond/SGMeasurement/Logger.h
index aec95af..1649714 100644
--- a/SourceCode/Bond/SGMeasurement/Logger.h
+++ b/SourceCode/Bond/SGMeasurement/Logger.h
@@ -4,25 +4,25 @@
 class CLogger
 {
 public:
-    static CLogger& Instance();  // 获取单例
-    void WriteLine(CString str); // 写一行日志
-    void CloseLogFile();         // 关闭日志文件
+	static CLogger& Instance();  // 鑾峰彇鍗曚緥
+	void WriteLine(CString str); // 鍐欎竴琛屾棩蹇�
+	void CloseLogFile();         // 鍏抽棴鏃ュ織鏂囦欢
 
 private:
-    CLogger();
-    ~CLogger();
-    void OpenLogFile();          // 内部打开文件
+	CLogger();
+	~CLogger();
+	void OpenLogFile();          // 鍐呴儴鎵撳紑鏂囦欢
 
-    CCriticalSection m_csLogLock;
-    CString m_strCurrentLogPath;
-    CStdioFile m_logFile;
+	CCriticalSection m_csLogLock;
+	CString m_strCurrentLogPath;
+	CStdioFile m_logFile;
 };
 
 #define LOG_LINE(x) CLogger::Instance().WriteLine(x)
 
 #define LOG_LINEF(fmt, ...)                     \
-    do {                                        \
-        CString __log__;                        \
-        __log__.Format(fmt, __VA_ARGS__);       \
-        CLogger::Instance().WriteLine(__log__); \
-    } while (0)
\ No newline at end of file
+	do {                                        \
+		CString __log__;                        \
+		__log__.Format(fmt, __VA_ARGS__);       \
+		CLogger::Instance().WriteLine(__log__); \
+	} while (0)
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp b/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
index bef7669..4176b59 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
+++ b/SourceCode/Bond/SGMeasurement/PLCSignalListener.cpp
@@ -1,309 +1,356 @@
 #include "pch.h"
 #include "PLCSignalListener.h"
 
-// === 日志打印类型 ===
+// === 鏃ュ織鎵撳嵃绫诲瀷 ===
 #define LOG_TYPE_ERROR     -1
 #define LOG_TYPE_SUCCESS    0
 #define LOG_TYPE_WARNING    1
 #define LOG_TYPE_NORMAL     2
 
-// === 日志打印宏定义 ===
+// === 鏃ュ織鎵撳嵃瀹忓畾涔� ===
 #define LOG_MSG(msg, type) LogInfo(msg, type)
 
-// === PLC 心跳相关配置 ===
-#define PLC_HEARTBEAT_PC_TO_PLC_ADDR   0x107F   // PC -> PLC:PC 写入心跳
-#define PLC_HEARTBEAT_PLC_TO_PC_ADDR   0x6C40   // PLC -> PC:PC 读取 PLC 写入的心跳
-#define MAX_MISSED_HEARTBEAT           5        // 允许连续丢失心跳的最大次数,超过则判定 PLC 掉线
+// === PLC 蹇冭烦鐩稿叧閰嶇疆 ===
+#define PLC_HEARTBEAT_PC_TO_PLC_ADDR   0x107F   // PC -> PLC锛歅C 鍐欏叆蹇冭烦
+#define PLC_HEARTBEAT_PLC_TO_PC_ADDR   0x6C40   // PLC -> PC锛歅C 璇诲彇 PLC 鍐欏叆鐨勫績璺�
+#define MAX_MISSED_HEARTBEAT           5        // 鍏佽杩炵画涓㈠け蹇冭烦鐨勬渶澶ф鏁帮紝瓒呰繃鍒欏垽瀹� PLC 鎺夌嚎
 
-// === PLC 命令输入配置(PLC -> PC) ===
-#define PLC_CMD_BIT_START       0x6CD3  // PLC命令起始位(通常为B6CD3)
-#define PLC_CMD_BIT_COUNT       2       // 总共几个命令位(B6CD3=Start, B6CD4=Stop)
+// === PLC 鍛戒护杈撳叆閰嶇疆锛圥LC -> PC锛� ===
+#define PLC_CMD_BIT_START       0x6CD3          // PLC鍛戒护璧峰浣嶏紙閫氬父涓築6CD3锛�
+#define PLC_CMD_BIT_COUNT       2               // 鎬诲叡鍑犱釜鍛戒护浣嶏紙B6CD3=Start, B6CD4=Stop锛�
 
-// === PLC 应答输出配置(PC -> PLC) ===
-#define PLC_ACK_MAX_LIFE        25      // PLC响应信号最大保留周期数(每周期为 m_nIntervalMs 毫秒)
-#define PLC_ACK_BASE_BIT        0x1060  // PLC应答起始地址(B1060表示B6CD3的应答;B1061表示B6CD4的应答)
+// === PLC 搴旂瓟杈撳嚭閰嶇疆锛圥C -> PLC锛� ===
+#define PLC_ACK_MAX_LIFE        25              // PLC鍝嶅簲淇″彿鏈�澶т繚鐣欏懆鏈熸暟锛堟瘡鍛ㄦ湡涓� m_nIntervalMs 姣锛�
+#define PLC_ACK_BASE_BIT        0x1060          // PLC搴旂瓟璧峰鍦板潃锛圔1060琛ㄧずB6CD3鐨勫簲绛旓紱B1061琛ㄧずB6CD4鐨勫簲绛旓級
 
-// === PLC软元件类型宏(用于应答、数据写入)===
-#define PLC_BIT_DEVICE_TYPE     DeviceType::B   // 位操作设备类型(如M、B)
-#define PLC_WORD_DEVICE_TYPE    DeviceType::W   // 字操作设备类型(如D、W)
+// === PLC杞厓浠剁被鍨嬪畯锛堢敤浜庡簲绛斻�佹暟鎹啓鍏ワ級===
+#define PLC_BIT_DEVICE_TYPE     DeviceType::B   // 浣嶆搷浣滆澶囩被鍨嬶紙濡侻銆丅锛�
+#define PLC_WORD_DEVICE_TYPE    DeviceType::W   // 瀛楁搷浣滆澶囩被鍨嬶紙濡侱銆乄锛�
 
-// === PLC结果寄存器地址配置 ===
-#define PLC_RESULT_ADDR_START   0x37B0  // PLC结果寄存器起始地址(如W37B0)
-#define PLC_RESULT_ADDR_COUNT   4       // 结果寄存器数量(如W37B0, W37B2, W37B4, W37B6)
+// === PLC缁撴灉瀵勫瓨鍣ㄥ湴鍧�閰嶇疆 ===
+#define PLC_RESULT_ADDR_START   0x37B0          // PLC缁撴灉瀵勫瓨鍣ㄨ捣濮嬪湴鍧�锛堝W37B0锛�
+#define PLC_RESULT_ADDR_COUNT   4               // 缁撴灉瀵勫瓨鍣ㄦ暟閲忥紙濡俉37B0, W37B2, W37B4, W37B6锛�
+
+// === PLC 浜у搧ID閰嶇疆锛圥LC -> PC锛�===
+#define PLC_PRODUCT_ID_ADDR      0x1B160        // 浜у搧ID璧峰鍦板潃 (W1B160)
+#define PLC_PRODUCT_ID_WORDS     10             // 浜у搧ID闀垮害锛�10涓猈ord锛�
 
 #define IS_RISING_EDGE(prev, curr) (!(prev) && (curr))
 
 CPLCSignalListener::CPLCSignalListener() = default;
 
 CPLCSignalListener::~CPLCSignalListener() {
-    Stop();
+	Stop();
 }
 
 bool CPLCSignalListener::Initialize(StationIdentifier station, int nIntervalMs/* = 200*/)
 {
-    m_pPlc = std::make_unique<CCCLinkIEControl>();
-    if (!m_pPlc) {
-        LOG_MSG(_T("PLC控制器初始化失败,无法创建 CCCLinkIEControl 实例。"), LOG_TYPE_ERROR);
-        return false;
-    }
+	m_pPlc = std::make_unique<CCCLinkIEControl>();
+	if (!m_pPlc) {
+		LOG_MSG(_T("PLC鎺у埗鍣ㄥ垵濮嬪寲澶辫触锛屾棤娉曞垱寤� CCCLinkIEControl 瀹炰緥銆�"), LOG_TYPE_ERROR);
+		return false;
+	}
 
-    int ret = m_pPlc->Connect(CC_LINK_IE_CONTROL_CHANNEL(1));
-    if (ret != 0) {
-        m_bConnected = false;
+	int ret = m_pPlc->Connect(CC_LINK_IE_CONTROL_CHANNEL(1));
+	if (ret != 0) {
+		m_bConnected = false;
 
-        CString strError;
-        strError.Format(_T("PLC控制器连接失败,错误码:%d"), ret);
-        LOG_MSG(strError, LOG_TYPE_ERROR);
+		CString strError;
+		strError.Format(_T("PLC鎺у埗鍣ㄨ繛鎺ュけ璐ワ紝閿欒鐮侊細%d"), ret);
+		LOG_MSG(strError, LOG_TYPE_ERROR);
 
-        return false;
-    }
+		return false;
+	}
 
-    m_bConnected = true;
-    m_station = station;
-    m_nIntervalMs = nIntervalMs;
+	m_bConnected = true;
+	m_station = station;
+	m_nIntervalMs = nIntervalMs;
 
-    m_vecPrevBits.assign(PLC_CMD_BIT_COUNT, false);
+	m_vecPrevBits.assign(PLC_CMD_BIT_COUNT, false);
 
-    return true;
+	return true;
 }
 
 void CPLCSignalListener::SetStartCallback(Callback cb)
 {
-    m_cbStart = std::move(cb);
+	m_cbStart = std::move(cb);
 }
 
 void CPLCSignalListener::SetStopCallback(Callback cb)
 {
-    m_cbStop = std::move(cb);
+	m_cbStop = std::move(cb);
 }
 
 void CPLCSignalListener::SetAnalyzeCallback(AnalyzeCallback cb)
 {
-    m_cbAnalyze = std::move(cb);
+	m_cbAnalyze = std::move(cb);
 }
 
 void CPLCSignalListener::SetLogCallback(LogCallback cb)
 {
-    m_cbLog = std::move(cb);
+	m_cbLog = std::move(cb);
 }
 
 bool CPLCSignalListener::Start()
 {
-    if (m_bRunning || !m_pPlc) {
-        LOG_MSG(_T("PLC信号监听器已在运行或PLC控制器未初始化。"), LOG_TYPE_ERROR);
-        return false;
-    }
+	if (m_bRunning || !m_pPlc) {
+		LOG_MSG(_T("PLC淇″彿鐩戝惉鍣ㄥ凡鍦ㄨ繍琛屾垨PLC鎺у埗鍣ㄦ湭鍒濆鍖栥��"), LOG_TYPE_ERROR);
+		return false;
+	}
 
-    m_bRunning = true;
-    m_thread = std::thread(&CPLCSignalListener::ThreadProc, this);
+	m_bRunning = true;
+	m_thread = std::thread(&CPLCSignalListener::ThreadProc, this);
 
-    StartHeartbeatMonitor();
-    return true;
+	StartHeartbeatMonitor();
+	return true;
 }
 
 void CPLCSignalListener::Stop()
 {
-    m_bRunning = false;
-    if (m_thread.joinable()) {
-        m_thread.join();
-    }
+	m_bRunning = false;
+	if (m_thread.joinable()) {
+		m_thread.join();
+	}
 
-    StopHeartbeatMonitor();
+	StopHeartbeatMonitor();
 }
 
 void CPLCSignalListener::LogInfo(const CString& strText, int nType)
 {
-    if (m_cbLog) {
-        m_cbLog(strText, nType);
-    }
+	if (m_cbLog) {
+		m_cbLog(strText, nType);
+	}
 }
 
 bool CPLCSignalListener::SendHeartbeat()
 {
-    if (!m_pPlc || !m_bConnected) {
-        return false;
-    }
+	if (!m_pPlc || !m_bConnected) {
+		return false;
+	}
 
-    static bool bToggle = false;
-    bToggle = !bToggle;
+	static bool bToggle = false;
+	bToggle = !bToggle;
 
-    int ret = m_pPlc->WriteBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_HEARTBEAT_PC_TO_PLC_ADDR, BitContainer{ bToggle });
+	int ret = m_pPlc->WriteBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_HEARTBEAT_PC_TO_PLC_ADDR, BitContainer{ bToggle });
 
-    return (ret == 0);
+	return (ret == 0);
 }
 
 bool CPLCSignalListener::CheckHeartbeat()
 {
-    static bool bLastHeartbeat = false;
+	static bool bLastHeartbeat = false;
 
-    if (!m_pPlc || !m_bConnected) {
-        return false;
-    }
+	if (!m_pPlc || !m_bConnected) {
+		return false;
+	}
 
-    BitContainer vec;
-    int ret = m_pPlc->ReadBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_HEARTBEAT_PLC_TO_PC_ADDR, 1, vec);
-    if (ret != 0 || vec.empty()) {
-        return false;
-    }
+	BitContainer vec;
+	int ret = m_pPlc->ReadBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_HEARTBEAT_PLC_TO_PC_ADDR, 1, vec);
+	if (ret != 0 || vec.empty()) {
+		return false;
+	}
 
-    bool bCurrent = vec[0];
-    bool bChanged = (bCurrent != bLastHeartbeat);
-    bLastHeartbeat = bCurrent;
+	bool bCurrent = vec[0];
+	bool bChanged = (bCurrent != bLastHeartbeat);
+	bLastHeartbeat = bCurrent;
 
-    return bChanged;
+	return bChanged;
 }
 
 bool CPLCSignalListener::MonitorHeartbeat()
 {
-    if (CheckHeartbeat()) {
-        m_nMissedHeartbeatCount = 0;
+	if (CheckHeartbeat()) {
+		m_nMissedHeartbeatCount = 0;
 
-        if (m_bHeartbeatLost) {
-            m_bHeartbeatLost = false;
-            LOG_MSG(_T("PLC心跳恢复!"), LOG_TYPE_SUCCESS);
-        }
+		if (m_bHeartbeatLost) {
+			m_bHeartbeatLost = false;
+			LOG_MSG(_T("PLC蹇冭烦鎭㈠锛�"), LOG_TYPE_SUCCESS);
+		}
 
-        return true;
-    }
-    else {
-        m_nMissedHeartbeatCount++;
+		return true;
+	}
+	else {
+		m_nMissedHeartbeatCount++;
 
-        if (m_nMissedHeartbeatCount > MAX_MISSED_HEARTBEAT) {
-            if (!m_bHeartbeatLost) {
-                m_bHeartbeatLost = true;
+		if (m_nMissedHeartbeatCount > MAX_MISSED_HEARTBEAT) {
+			if (!m_bHeartbeatLost) {
+				m_bHeartbeatLost = true;
 				m_nMissedHeartbeatCount = 0;
-                LOG_MSG(_T("PLC心跳信号中断!"), LOG_TYPE_ERROR);
-            }
-            return false;
-        }
-    }
+				LOG_MSG(_T("PLC蹇冭烦淇″彿涓柇锛�"), LOG_TYPE_ERROR);
+			}
+			return false;
+		}
+	}
 
-    return true;
+	return true;
 }
 
 void CPLCSignalListener::StartHeartbeatMonitor()
 {
-    m_bHeartbeatRunning = true;
-    m_heartbeatThread = std::thread([this]() {
-        while (m_bHeartbeatRunning) {
-            SendHeartbeat();
-            MonitorHeartbeat();
-            std::this_thread::sleep_for(std::chrono::milliseconds(m_nIntervalMs * 5));
-        }
-    });
+	m_bHeartbeatRunning = true;
+	m_heartbeatThread = std::thread([this]() {
+		while (m_bHeartbeatRunning) {
+			SendHeartbeat();
+			MonitorHeartbeat();
+			std::this_thread::sleep_for(std::chrono::milliseconds(m_nIntervalMs * 5));
+		}
+	});
 }
 
 void CPLCSignalListener::StopHeartbeatMonitor()
 {
-    m_bHeartbeatRunning = false;
-    if (m_heartbeatThread.joinable()) {
-        m_heartbeatThread.join();
-    }
+	m_bHeartbeatRunning = false;
+	if (m_heartbeatThread.joinable()) {
+		m_heartbeatThread.join();
+	}
 }
 
 void CPLCSignalListener::PulseBitDevice(DeviceType eDevType, long nBitNo, int nDelayMs/* = 50*/)
 {
-    m_pPlc->SetBitDeviceEx(m_station, eDevType, nBitNo);
-    ::Sleep(nDelayMs);
-    m_pPlc->ResetBitDeviceEx(m_station, eDevType, nBitNo);
+	m_pPlc->SetBitDeviceEx(m_station, eDevType, nBitNo);
+	::Sleep(nDelayMs);
+	m_pPlc->ResetBitDeviceEx(m_station, eDevType, nBitNo);
 }
 
 void CPLCSignalListener::HandleAckLife(int i, bool bCurrTriggerBit)
 {
-    if (m_vecAckSent[i] && !bCurrTriggerBit) {
-        m_pPlc->ResetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, long(PLC_ACK_BASE_BIT + i));
-        m_vecAckSent[i] = false;
-    }
+	if (m_vecAckSent[i] && !bCurrTriggerBit) {
+		m_pPlc->ResetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, long(PLC_ACK_BASE_BIT + i));
+		m_vecAckSent[i] = false;
+	}
 
-    if (m_vecAckSent[i]) {
-        if (++m_vecAckCounter[i] > PLC_ACK_MAX_LIFE) {
-            m_pPlc->ResetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, long(PLC_ACK_BASE_BIT + i));
-            m_vecAckSent[i] = false;
-        }
-    }
+	if (m_vecAckSent[i]) {
+		if (++m_vecAckCounter[i] > PLC_ACK_MAX_LIFE) {
+			m_pPlc->ResetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, long(PLC_ACK_BASE_BIT + i));
+			m_vecAckSent[i] = false;
+		}
+	}
 }
 
 void CPLCSignalListener::ThreadProc()
 {
-    while (m_bRunning && m_bConnected) {
-        BitContainer vecBits;
-        int ret = m_pPlc->ReadBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_CMD_BIT_START, PLC_CMD_BIT_COUNT, vecBits);
-        if (ret != 0 && vecBits.size() != PLC_CMD_BIT_COUNT) {
-            ::Sleep(m_nIntervalMs);
+	while (m_bRunning && m_bConnected) {
+		BitContainer vecBits;
+		int ret = m_pPlc->ReadBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_CMD_BIT_START, PLC_CMD_BIT_COUNT, vecBits);
+		if (ret != 0 && vecBits.size() != PLC_CMD_BIT_COUNT) {
+			::Sleep(m_nIntervalMs);
 
-            CString strError;
-            strError.Format(_T("PLC读取位数据失败,错误码:%d"), ret);
-            LOG_MSG(strError, LOG_TYPE_ERROR);
+			CString strError;
+			strError.Format(_T("PLC璇诲彇浣嶆暟鎹け璐ワ紝閿欒鐮侊細%d"), ret);
+			LOG_MSG(strError, LOG_TYPE_ERROR);
 
-            continue;
-        }
+			continue;
+		}
 
-        for (int i = 0; i < PLC_CMD_BIT_COUNT; ++i) {
-            if (IS_RISING_EDGE(m_vecPrevBits[i], vecBits[i])) {
-                // 上升沿触发
-                switch (i) {
-                case 0:
-                    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;
-                        }
-                    }
-                    break;
+		for (int i = 0; i < PLC_CMD_BIT_COUNT; ++i) {
+			if (IS_RISING_EDGE(m_vecPrevBits[i], vecBits[i])) {
+				// 涓婂崌娌胯Е鍙�
+				switch (i) {
+				case 0:
+					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;
+						}
 
-                case 1:
-                    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;
-                        }
-                    }
+						std::string strProductID;
+						if (ReadProductID(strProductID)) {
+							CString msg;
+							msg.Format(_T("璇诲彇鍒颁骇鍝両D锛�%s"), strProductID);
+							LOG_MSG(msg, LOG_TYPE_SUCCESS);
+						}
+					}
+					break;
 
-                    if (m_cbAnalyze) {
-                        auto results = m_cbAnalyze();
-                        WriteOutValues(results);
-                    }
-                    break;
-                }
-            }
+				case 1:
+					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;
+						}
+					}
 
-            HandleAckLife(i, vecBits[i]);
-            m_vecPrevBits[i] = vecBits[i];
-        }
+					if (m_cbAnalyze) {
+						auto results = m_cbAnalyze();
+						WriteOutValues(results);
+					}
+					break;
+				}
+			}
 
-        ::Sleep(m_nIntervalMs);
-    }
+			HandleAckLife(i, vecBits[i]);
+			m_vecPrevBits[i] = vecBits[i];
+		}
+
+		::Sleep(m_nIntervalMs);
+	}
 }
 
 bool CPLCSignalListener::WriteOutValues(const OutValuesArray& values)
 {
-    if (!m_pPlc || !m_bConnected) {
-        LOG_MSG(_T("PLC未连接或未初始化,无法写入输出值。"), LOG_TYPE_ERROR);
-        return false;
-    }
+	if (!m_pPlc || !m_bConnected) {
+		LOG_MSG(_T("PLC鏈繛鎺ユ垨鏈垵濮嬪寲锛屾棤娉曞啓鍏ヨ緭鍑哄�笺��"), LOG_TYPE_ERROR);
+		return false;
+	}
 
-    if (PLC_RESULT_ADDR_COUNT != 4) {
-        LOG_MSG(_T("PLC结果寄存器数量配置错误,必须为4个。"), LOG_TYPE_ERROR);
-        return false;
-    }
+	if (PLC_RESULT_ADDR_COUNT != 4) {
+		LOG_MSG(_T("PLC缁撴灉瀵勫瓨鍣ㄦ暟閲忛厤缃敊璇紝蹇呴』涓�4涓��"), LOG_TYPE_ERROR);
+		return false;
+	}
 
-    for (int i = 0; i < PLC_RESULT_ADDR_COUNT; ++i) {
-        // 放大100倍并四舍五入,转为PLC整数
-        uint16_t nScaled = static_cast<uint16_t>(std::round(values[i] * 100.0));
-        WordContainer vec = { nScaled };
+	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) };
 
-        short nTargetAddr = PLC_RESULT_ADDR_START + i * 2;
-        int ret = m_pPlc->WriteWordDataEx(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]);
-            LOG_MSG(msg, LOG_TYPE_ERROR);
-            return false;
-        }
-    }
+		short nTargetAddr = PLC_RESULT_ADDR_START + i * 2;
+		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]);
+			LOG_MSG(msg, LOG_TYPE_ERROR);
+			return false;
+		}
+	}
 
-    return true;
+	return true;
+}
+
+bool CPLCSignalListener::ReadProductID(std::string& strProductID)
+{
+	if (!m_pPlc || !m_bConnected) {
+		LOG_MSG(_T("PLC鏈繛鎺ユ垨鏈垵濮嬪寲锛屾棤娉曡鍙栦骇鍝両D銆�"), LOG_TYPE_ERROR);
+		return false;
+	}
+
+	WordContainer vec;
+	int ret = m_pPlc->ReadWordDataEx(m_station, PLC_WORD_DEVICE_TYPE, PLC_PRODUCT_ID_ADDR, PLC_PRODUCT_ID_WORDS, vec);
+	if (ret != 0 || vec.size() != PLC_PRODUCT_ID_WORDS) {
+		CString msg;
+		msg.Format(_T("璇诲彇浜у搧ID澶辫触锛岄敊璇爜=%d"), ret);
+		LOG_MSG(msg, LOG_TYPE_ERROR);
+		return false;
+	}
+
+	strProductID.clear();
+	strProductID.reserve(PLC_PRODUCT_ID_WORDS * 2);
+	for (auto w : vec) {
+		char c1 = static_cast<char>(w & 0xFF);          // 浣庡瓧鑺�
+		char c2 = static_cast<char>((w >> 8) & 0xFF);   // 楂樺瓧鑺�
+
+		if (c1 == '\0') { 
+			break;
+		}
+		strProductID.push_back(c1);
+
+		if (c2 == '\0') { 
+			break;
+		}
+		strProductID.push_back(c2);
+	}
+
+	return true;
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
index fe8638b..0a4030d 100644
--- a/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
+++ b/SourceCode/Bond/SGMeasurement/PLCSignalListener.h
@@ -15,164 +15,173 @@
 class CPLCSignalListener
 {
 public:
-    CPLCSignalListener();
-    ~CPLCSignalListener();
+	CPLCSignalListener();
+	~CPLCSignalListener();
 
-    /**
-     * @brief 初始化 PLC 信号监听器。
-     *
-     * @param station      目标 PLC 的站号标识符。
-     * @param nIntervalMs  轮询周期(单位:毫秒),默认 200ms。
-     * @return true        初始化成功。
-     * @return false       初始化失败。
-     */
-    bool Initialize(StationIdentifier station, int nIntervalMs = 200);
+	/**
+	 * @brief 鍒濆鍖� PLC 淇″彿鐩戝惉鍣ㄣ��
+	 *
+	 * @param station      鐩爣 PLC 鐨勭珯鍙锋爣璇嗙銆�
+	 * @param nIntervalMs  杞鍛ㄦ湡锛堝崟浣嶏細姣锛夛紝榛樿 200ms銆�
+	 * @return true        鍒濆鍖栨垚鍔熴��
+	 * @return false       鍒濆鍖栧け璐ャ��
+	 */
+	bool Initialize(StationIdentifier station, int nIntervalMs = 200);
 
-    /**
-     * @brief 设置开始命令的回调函数(对应 PLC 的 Start 信号)。
-     *
-     * @param cb  用户自定义的开始回调函数。
-     */
-    void SetStartCallback(Callback cb);
+	/**
+	 * @brief 璁剧疆寮�濮嬪懡浠ょ殑鍥炶皟鍑芥暟锛堝搴� PLC 鐨� Start 淇″彿锛夈��
+	 *
+	 * @param cb  鐢ㄦ埛鑷畾涔夌殑寮�濮嬪洖璋冨嚱鏁般��
+	 */
+	void SetStartCallback(Callback cb);
 
-    /**
-     * @brief 设置停止命令的回调函数(对应 PLC 的 Stop 信号)。
-     *
-     * @param cb  用户自定义的停止回调函数。
-     */
-    void SetStopCallback(Callback cb);
+	/**
+	 * @brief 璁剧疆鍋滄鍛戒护鐨勫洖璋冨嚱鏁帮紙瀵瑰簲 PLC 鐨� Stop 淇″彿锛夈��
+	 *
+	 * @param cb  鐢ㄦ埛鑷畾涔夌殑鍋滄鍥炶皟鍑芥暟銆�
+	 */
+	void SetStopCallback(Callback cb);
 
-    /**
-     * @brief 设置分析计算回调函数,在接收到停止命令后调用。
-     *
-     * @param cb  返回计算结果数组(OUT1~OUT4)的函数。
-     */
-    void SetAnalyzeCallback(AnalyzeCallback cb);
+	/**
+	 * @brief 璁剧疆鍒嗘瀽璁$畻鍥炶皟鍑芥暟锛屽湪鎺ユ敹鍒板仠姝㈠懡浠ゅ悗璋冪敤銆�
+	 *
+	 * @param cb  杩斿洖璁$畻缁撴灉鏁扮粍锛圤UT1~OUT4锛夌殑鍑芥暟銆�
+	 */
+	void SetAnalyzeCallback(AnalyzeCallback cb);
 
-    /**
-     * @brief 设置日志输出回调函数。
-     *
-     * @param cb  用户提供的日志输出接口(包含日志内容和日志类型)。
-     */
-    void SetLogCallback(LogCallback cb);
+	/**
+	 * @brief 璁剧疆鏃ュ織杈撳嚭鍥炶皟鍑芥暟銆�
+	 *
+	 * @param cb  鐢ㄦ埛鎻愪緵鐨勬棩蹇楄緭鍑烘帴鍙o紙鍖呭惈鏃ュ織鍐呭鍜屾棩蹇楃被鍨嬶級銆�
+	 */
+	void SetLogCallback(LogCallback cb);
 
-    /**
-     * @brief 启动信号监听线程。
-     *
-     * @return true   启动成功。
-     * @return false  启动失败(可能已运行或未初始化)。
-     */
-    bool Start();
+	/**
+	 * @brief 鍚姩淇″彿鐩戝惉绾跨▼銆�
+	 *
+	 * @return true   鍚姩鎴愬姛銆�
+	 * @return false  鍚姩澶辫触锛堝彲鑳藉凡杩愯鎴栨湭鍒濆鍖栵級銆�
+	 */
+	bool Start();
 
-    /**
-     * @brief 停止信号监听线程。
-     */
-    void Stop();
+	/**
+	 * @brief 鍋滄淇″彿鐩戝惉绾跨▼銆�
+	 */
+	void Stop();
 
-    /**
-     * @brief 向 PLC 写入分析结果值(通常为 OUT1 ~ OUT4)。
-     *
-     * @param values  包含四个 double 类型的结果值,将转换为整数后写入 PLC。
-     * @return true   写入成功。
-     * @return false  写入失败。
-     */
-    bool WriteOutValues(const OutValuesArray& values);
+	/**
+	 * @brief 鍚� PLC 鍐欏叆鍒嗘瀽缁撴灉鍊硷紙閫氬父涓� OUT1 ~ OUT4锛夈��
+	 *
+	 * @param values  鍖呭惈鍥涗釜 double 绫诲瀷鐨勭粨鏋滃�硷紝灏嗚浆鎹负鏁存暟鍚庡啓鍏� PLC銆�
+	 * @return true   鍐欏叆鎴愬姛銆�
+	 * @return false  鍐欏叆澶辫触銆�
+	 */
+	bool WriteOutValues(const OutValuesArray& values);
+
+	/**
+	 * @brief 璇诲彇 PLC 鍐呴儴鐨勪骇鍝� ID锛堝瓧绗︿覆褰㈠紡锛夈��
+	 *
+	 * @param strProductID  杈撳嚭鍙傛暟锛屽瓨鍌ㄨ鍙栧埌鐨勪骇鍝� ID銆�
+	 * @return true         璇诲彇鎴愬姛銆�
+	 * @return false        璇诲彇澶辫触銆�
+	 */
+	bool ReadProductID(std::string& strProductID);
 
 private:
-    /**
-     * @brief 输出日志信息(封装日志回调)。
-     *
-     * @param strText 日志内容文本。
-     * @param nType   日志类型(LOG_TYPE_NORMAL / ERROR / WARNING 等)。
-     */
-    void LogInfo(const CString& strText, int nType);
+	/**
+	 * @brief 杈撳嚭鏃ュ織淇℃伅锛堝皝瑁呮棩蹇楀洖璋冿級銆�
+	 *
+	 * @param strText 鏃ュ織鍐呭鏂囨湰銆�
+	 * @param nType   鏃ュ織绫诲瀷锛圠OG_TYPE_NORMAL / ERROR / WARNING 绛夛級銆�
+	 */
+	void LogInfo(const CString& strText, int nType);
 
-    /**
-     * @brief 向 PLC 写入心跳信号(交替位)。
-     *
-     * @return true  写入成功。
-     * @return false 写入失败(如未连接)。
-     */
-    bool SendHeartbeat();
+	/**
+	 * @brief 鍚� PLC 鍐欏叆蹇冭烦淇″彿锛堜氦鏇夸綅锛夈��
+	 *
+	 * @return true  鍐欏叆鎴愬姛銆�
+	 * @return false 鍐欏叆澶辫触锛堝鏈繛鎺ワ級銆�
+	 */
+	bool SendHeartbeat();
 
-    /**
-     * @brief 检查从 PLC 读取到的心跳信号是否发生变化。
-     *
-     * @return true  心跳有变化(PLC 正常在线)。
-     * @return false 心跳无变化(可能离线)。
-     */
-    bool CheckHeartbeat();
+	/**
+	 * @brief 妫�鏌ヤ粠 PLC 璇诲彇鍒扮殑蹇冭烦淇″彿鏄惁鍙戠敓鍙樺寲銆�
+	 *
+	 * @return true  蹇冭烦鏈夊彉鍖栵紙PLC 姝e父鍦ㄧ嚎锛夈��
+	 * @return false 蹇冭烦鏃犲彉鍖栵紙鍙兘绂荤嚎锛夈��
+	 */
+	bool CheckHeartbeat();
 
-    /**
-     * @brief 监控 PLC 心跳是否中断,并自动记录状态。
-     *
-     * @return true  PLC 在线或在允许的未响应次数内。
-     * @return false PLC 心跳中断,超过允许阈值。
-     */
-    bool MonitorHeartbeat();
+	/**
+	 * @brief 鐩戞帶 PLC 蹇冭烦鏄惁涓柇锛屽苟鑷姩璁板綍鐘舵�併��
+	 *
+	 * @return true  PLC 鍦ㄧ嚎鎴栧湪鍏佽鐨勬湭鍝嶅簲娆℃暟鍐呫��
+	 * @return false PLC 蹇冭烦涓柇锛岃秴杩囧厑璁搁槇鍊笺��
+	 */
+	bool MonitorHeartbeat();
 
-    /**
-     * @brief 启动心跳监控线程(独立于信号监听线程)。
-     */
-    void StartHeartbeatMonitor();
+	/**
+	 * @brief 鍚姩蹇冭烦鐩戞帶绾跨▼锛堢嫭绔嬩簬淇″彿鐩戝惉绾跨▼锛夈��
+	 */
+	void StartHeartbeatMonitor();
 
-    /**
-     * @brief 停止心跳监控线程。
-     */
-    void StopHeartbeatMonitor();
+	/**
+	 * @brief 鍋滄蹇冭烦鐩戞帶绾跨▼銆�
+	 */
+	void StopHeartbeatMonitor();
 
-    /**
-     * @brief 向指定软元件位写入一个脉冲(先写1,延时后自动写0)。
-     *
-     * @param eDevType 位软元件类型(如 M/B)。
-     * @param nBitNo   位地址编号。
-     * @param nDelayMs 脉冲持续时间,默认50毫秒。
-     */
-    void PulseBitDevice(DeviceType eDevType, long nBitNo, int nDelayMs = 50);
+	/**
+	 * @brief 鍚戞寚瀹氳蒋鍏冧欢浣嶅啓鍏ヤ竴涓剦鍐诧紙鍏堝啓1锛屽欢鏃跺悗鑷姩鍐�0锛夈��
+	 *
+	 * @param eDevType 浣嶈蒋鍏冧欢绫诲瀷锛堝 M/B锛夈��
+	 * @param nBitNo   浣嶅湴鍧�缂栧彿銆�
+	 * @param nDelayMs 鑴夊啿鎸佺画鏃堕棿锛岄粯璁�50姣銆�
+	 */
+	void PulseBitDevice(DeviceType eDevType, long nBitNo, int nDelayMs = 50);
 
-    /**
-     * @brief 管理 ACK 响应的生命周期,超时自动清除。
-     *
-     * @param i                控制位索引(0=Start,1=Stop)。
-     * @param bCurrTriggerBit  当前从 PLC 读取到的触发位状态。
-     */
-    void HandleAckLife(int i, bool bCurrTriggerBit);
+	/**
+	 * @brief 绠$悊 ACK 鍝嶅簲鐨勭敓鍛藉懆鏈燂紝瓒呮椂鑷姩娓呴櫎銆�
+	 *
+	 * @param i                鎺у埗浣嶇储寮曪紙0=Start锛�1=Stop锛夈��
+	 * @param bCurrTriggerBit  褰撳墠浠� PLC 璇诲彇鍒扮殑瑙﹀彂浣嶇姸鎬併��
+	 */
+	void HandleAckLife(int i, bool bCurrTriggerBit);
 
-    /**
-     * @brief 主监听线程逻辑,循环读取 PLC 控制信号并处理触发。
-     */
-    void ThreadProc();
+	/**
+	 * @brief 涓荤洃鍚嚎绋嬮�昏緫锛屽惊鐜鍙� PLC 鎺у埗淇″彿骞跺鐞嗚Е鍙戙��
+	 */
+	void ThreadProc();
 
 private:
-    // === PLC 通信核心对象 ===
-    std::unique_ptr<CCCLinkIEControl> m_pPlc; // PLC 通信控制器
-    StationIdentifier m_station;              // PLC 站号
-    std::atomic<bool> m_bConnected{ false };  // 是否成功连接
+	// === PLC 閫氫俊鏍稿績瀵硅薄 ===
+	std::unique_ptr<CCCLinkIEControl> m_pPlc; // PLC 閫氫俊鎺у埗鍣�
+	StationIdentifier m_station;              // PLC 绔欏彿
+	std::atomic<bool> m_bConnected{ false };  // 鏄惁鎴愬姛杩炴帴
 
-    // === 控制参数 ===
-    int m_nIntervalMs = 200;                  // 轮询周期(ms)
+	// === 鎺у埗鍙傛暟 ===
+	int m_nIntervalMs = 200;                  // 杞鍛ㄦ湡锛坢s锛�
 
-    // === 命令触发状态缓存 ===
-    std::vector<bool> m_vecPrevBits;          // 上一周期的命令位状态(用于检测上升沿)
+	// === 鍛戒护瑙﹀彂鐘舵�佺紦瀛� ===
+	std::vector<bool> m_vecPrevBits;          // 涓婁竴鍛ㄦ湡鐨勫懡浠や綅鐘舵�侊紙鐢ㄤ簬妫�娴嬩笂鍗囨部锛�
 
-    // === 回调函数(控制/计算/日志)===
-    Callback m_cbStart;                       // Start 命令回调
-    Callback m_cbStop;                        // Stop 命令回调
-    AnalyzeCallback m_cbAnalyze;              // Analyze 计算回调(返回 OUT1~OUT4)
-    LogCallback m_cbLog;                      // 日志输出回调
+	// === 鍥炶皟鍑芥暟锛堟帶鍒�/璁$畻/鏃ュ織锛�===
+	Callback m_cbStart;                       // Start 鍛戒护鍥炶皟
+	Callback m_cbStop;                        // Stop 鍛戒护鍥炶皟
+	AnalyzeCallback m_cbAnalyze;              // Analyze 璁$畻鍥炶皟锛堣繑鍥� OUT1~OUT4锛�
+	LogCallback m_cbLog;                      // 鏃ュ織杈撳嚭鍥炶皟
 
-    // === 主线程控制 ===
-    std::atomic<bool> m_bRunning{ false };    // 主监听线程是否运行
-    std::thread m_thread;                     // 主监听线程对象
+	// === 涓荤嚎绋嬫帶鍒� ===
+	std::atomic<bool> m_bRunning{ false };    // 涓荤洃鍚嚎绋嬫槸鍚﹁繍琛�
+	std::thread m_thread;                     // 涓荤洃鍚嚎绋嬪璞�
 
-    // === ACK 信号状态 ===
-    std::array<bool, 2> m_vecAckSent = { false, false }; // 是否已发送应答信号(B10/B11)
-    std::array<int, 2>  m_vecAckCounter = { 0, 0 };      // 对应应答信号的生命周期计数器
+	// === ACK 淇″彿鐘舵�� ===
+	std::array<bool, 2> m_vecAckSent = { false, false }; // 鏄惁宸插彂閫佸簲绛斾俊鍙凤紙B10/B11锛�
+	std::array<int, 2>  m_vecAckCounter = { 0, 0 };      // 瀵瑰簲搴旂瓟淇″彿鐨勭敓鍛藉懆鏈熻鏁板櫒
 
-    // === 心跳检测相关 ===
-    std::thread m_heartbeatThread;                  // 心跳检测线程对象
-    std::atomic<bool> m_bHeartbeatRunning = false;  // 心跳线程运行标志
-	std::atomic<bool> m_bHeartbeatLost = false;     // 心跳丢失标志
-    int m_nMissedHeartbeatCount = 0;                // 心跳未变化次数(用于检测 PLC 掉线)
+	// === 蹇冭烦妫�娴嬬浉鍏� ===
+	std::thread m_heartbeatThread;                  // 蹇冭烦妫�娴嬬嚎绋嬪璞�
+	std::atomic<bool> m_bHeartbeatRunning = false;  // 蹇冭烦绾跨▼杩愯鏍囧織
+	std::atomic<bool> m_bHeartbeatLost = false;     // 蹇冭烦涓㈠け鏍囧織
+	int m_nMissedHeartbeatCount = 0;                // 蹇冭烦鏈彉鍖栨鏁帮紙鐢ㄤ簬妫�娴� PLC 鎺夌嚎锛�
 };
 
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
index 2c3c2e6..475924d 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
@@ -1,4 +1,4 @@
-锘�
+
 // SGMeasurement.cpp: 瀹氫箟搴旂敤绋嬪簭鐨勭被琛屼负銆�
 //
 
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.h b/SourceCode/Bond/SGMeasurement/SGMeasurement.h
index 3819dce..6515a3d 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.h
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.h
@@ -1,4 +1,4 @@
-锘�
+
 // SGMeasurement.h: PROJECT_NAME 搴旂敤绋嬪簭鐨勪富澶存枃浠�
 //
 
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
index 05fa356..1bab676 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
@@ -175,7 +175,7 @@
       <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
       <AdditionalIncludeDirectories>.;..;.\DLL\64bit;.\CCLinkPerformance;..\MELSECSDK\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
+      <Optimization>Disabled</Optimization>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
index 110a872..0cecbcc 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>WindowsRemoteDebugger</DebuggerFlavor>
+    <DebuggerFlavor>WindowsLocalDebugger</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 a3f8234..a2afe06 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -1,4 +1,4 @@
-锘�
+
 // SGMeasurementDlg.cpp: 瀹炵幇鏂囦欢
 //
 
@@ -247,7 +247,7 @@
 	strFullLogLine.Format(_T("%s %s"), strLevel, strContent);
 
 	// 鍐欏叆鏃ュ織鏂囦欢
-	// LOG_LINE(strFullLogLine);
+	LOG_LINE(strFullLogLine);
 }
 
 void CSGMeasurementDlg::HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight/* = RGB(255, 165, 0)*/)
@@ -639,7 +639,8 @@
 
 	fAvg1 = CalcAverage(vecGlass1);
 	fAvg2 = CalcAverage(vecGlass2);
-	fOffset = std::fabs(fAvg2 - fAvg1);  // 绗簩鐗� - 绗竴鐗�
+	fOffset = fAvg2 - fAvg1;				// 绗簩鐗� - 绗竴鐗�
+	//fOffset = std::fabs(fAvg2 - fAvg1);	// 绗簩鐗� - 绗竴鐗�
 
 	CString strLog;
 	strLog.Format(_T("绗竴鐗囩幓鐠冨钩鍧囧��: %.3f锛岀浜岀墖鐜荤拑骞冲潎鍊�: %.3f锛屽亸绉婚噺: %.3f"), fAvg1, fAvg2, fOffset);
@@ -723,27 +724,27 @@
 	if (m_nUseTrigger) {
 		UpdateControlStatus(m_bConnected, m_bSaving);
 		AfxMessageBox(_T("褰撳墠鏄‖瑙﹀彂妯″紡锛岃妫�鏌ヨЕ鍙戝櫒鐘舵�併��"), MB_ICONINFORMATION);
-		return -1.0f;
+		return 0xFF;
 	}
 
 	if (!m_bConnected) {
 		AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
-		return -1.0f;
+		return 0xFF;
 	}
 
 	if (m_bSaving) {
 		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍姝e湪杩涜涓紝璇峰厛鍋滄瀛樺偍銆�"), LOG_COLOR_WARNING);
-		return -1.0f;
+		return 0xFF;
 	}
 
 	if (nOutNo < 1 || nOutNo > 4) {
 		AppendLogLineRichStyled(_T("杈撳嚭绔彛缂栧彿鏃犳晥锛屽繀椤诲湪 1 鍒� 4 涔嬮棿銆�"), LOG_COLOR_ERROR);
-		return -1.0f;
+		return 0xFF;
 	}
 
 	if (m_nSavePointCount < 0) {
 		AppendLogLineRichStyled(_T("鏁版嵁鐐规暟蹇呴』澶т簬 0銆�"), LOG_COLOR_ERROR);
-		return -1.0f;
+		return 0xFF;
 	}
 
 	std::vector<float> vecBuffer(m_nSavePointCount, 0.0f);
@@ -754,7 +755,7 @@
 		CString strError;
 		strError.Format(_T("璇诲彇 OUT%d 鏁版嵁澶辫触锛岄敊璇爜锛�%#X"), nOutNo, nRet);
 		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
-		return -1.0f;
+		return 0xFF;
 	}
 
 	vecBuffer.resize(nReceived);
@@ -763,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 -1.0f;
+		return 0xFF;
 	}
 
 	std::vector<float> vecGlass1Filtered, vecGlass2Filtered;
@@ -923,17 +924,12 @@
 	m_plcListener.SetAnalyzeCallback([this]() {
 		if (!m_bConnected) {
 			AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
-			return std::array<double, 4>{ -1.0, -1.0, -1.0, -1.0 };
+			return std::array<double, 4>{ 0xFF, 0xFF, 0xFF, 0xFF };
 		}
 
 		std::array<double, 4> result;
 		for (int i = 0; i < 4; ++i) {
 			result[i] = AnalyzeStoredData(i + 1); // OUT1 ~ OUT4
-		}
-
-		if (std::any_of(result.begin(), result.end(), [](double v) { return v < 0; })) {
-			AppendLogLineRichStyled(_T("鍒嗘瀽澶辫触锛屾煇浜涜緭鍑虹鍙f暟鎹棤鏁堛��"), LOG_COLOR_ERROR);
-			return std::array<double, 4>{ -1.0, -1.0, -1.0, -1.0 };
 		}
 
 		CString strLog;
@@ -998,11 +994,21 @@
 		RC nRet = SGIF_GetCalcDataALL(DeviceID, value);
 		if (nRet == RC_OK) {
 			for (int i = 0; i < 4; ++i) {
-				m_dOutValues[i] = value[i].Value;
-			}
+				double dNew = value[i].Value;
+				if (fabs(m_dOutValues[i] - dNew) > 1e-6) {
+					m_dOutValues[i] = dNew;
 
-			// 鏇存柊缁戝畾鎺т欢
-			UpdateData(FALSE);
+					CString str;
+					str.Format(_T("%.3f"), dNew);
+
+					switch (i) {
+					case 0: GetDlgItem(IDC_EDIT_OUT1)->SetWindowText(str); break;
+					case 1: GetDlgItem(IDC_EDIT_OUT2)->SetWindowText(str); break;
+					case 2: GetDlgItem(IDC_EDIT_OUT3)->SetWindowText(str); break;
+					case 3: GetDlgItem(IDC_EDIT_OUT4)->SetWindowText(str); break;
+					}
+				}
+			}
 		}
 		else {
 			CString strError;
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
index 593f7c9..ab23343 100644
--- a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -1,4 +1,4 @@
-锘�
+
 // SGMeasurementDlg.h: 澶存枃浠�
 //
 
diff --git a/SourceCode/Bond/SGMeasurement/framework.h b/SourceCode/Bond/SGMeasurement/framework.h
index 5672fb5..d6f08b6 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 b6fb8f4..10b8eaa 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 9660927..fe3bd2d 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 9286258..e083afe 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 79934a3..51be421 100644
--- a/SourceCode/Bond/SGMeasurement/targetver.h
+++ b/SourceCode/Bond/SGMeasurement/targetver.h
@@ -1,4 +1,4 @@
-锘�#pragma once
+#pragma once
 
 // 鍖呮嫭 SDKDDKVer.h 灏嗗畾涔夊彲鐢ㄧ殑鏈�楂樼増鏈殑 Windows 骞冲彴銆�
 
diff --git a/SourceCode/Bond/Servo/AlarmManager.cpp b/SourceCode/Bond/Servo/AlarmManager.cpp
index 0ed76e5..2143f34 100644
--- a/SourceCode/Bond/Servo/AlarmManager.cpp
+++ b/SourceCode/Bond/Servo/AlarmManager.cpp
@@ -1,4 +1,5 @@
 #include "stdafx.h"
+#include "Common.h"
 #include "AlarmManager.h"
 #include <sstream>
 #include <fstream>
@@ -88,7 +89,53 @@
             FOREIGN KEY (unit_id) REFERENCES units(unit_id)
         )
     )";
-    return m_pDB->executeQuery(createAlarmsTableQuery);
+    if (!m_pDB->executeQuery(createAlarmsTableQuery)) {
+        return false;
+    }
+
+    // 设备列表 (ID -> 名称)
+    std::vector<std::pair<int, std::string>> devices = {
+        {EQ_ID_LOADPORT1, EQ_NAME_LOADPORT1},
+        {EQ_ID_LOADPORT2, EQ_NAME_LOADPORT2},
+        {EQ_ID_LOADPORT3, EQ_NAME_LOADPORT3},
+        {EQ_ID_LOADPORT4, EQ_NAME_LOADPORT4},
+        {EQ_ID_ARM_TRAY1, EQ_NAME_ARM_TRAY1},
+        {EQ_ID_ARM_TRAY2, EQ_NAME_ARM_TRAY2},
+        {EQ_ID_ALIGNER, EQ_NAME_ALIGNER},
+        {EQ_ID_FLIPER, EQ_NAME_FLIPER},
+        {EQ_ID_VACUUMBAKE, EQ_NAME_VACUUMBAKE},
+        {EQ_ID_Bonder1, EQ_NAME_BONDER1},
+        {EQ_ID_Bonder2, EQ_NAME_BONDER2},
+        {EQ_ID_BAKE_COOLING, EQ_NAME_BAKE_COOLING},
+        {EQ_ID_MEASUREMENT, EQ_NAME_MEASUREMENT},
+        {EQ_ID_EFEM, EQ_NAME_EFEM},
+        {EQ_ID_ARM, EQ_NAME_ARM},
+        {EQ_ID_OPERATOR_REMOVE, EQ_NAME_OPERATOR_REMOVE}
+    };
+
+    // 插入 devices 和对应的默认 unit
+    for (const auto& dev : devices) {
+        int nDeviceId = dev.first;
+        const std::string& strDeviceName = dev.second;
+
+        // 插入设备
+        std::ostringstream ossDev;
+        ossDev << "INSERT OR IGNORE INTO devices (device_id, device_name) VALUES("
+            << nDeviceId << ", '" << strDeviceName << "')";
+        if (!m_pDB->executeQuery(ossDev.str())) {
+            return false;
+        }
+
+        // 插入默认单元 (unit_id = 0, unit_name = device_name)
+        std::ostringstream ossUnit;
+        ossUnit << "INSERT OR IGNORE INTO units (device_id, unit_id, unit_name) VALUES("
+            << nDeviceId << ", 0, '" << strDeviceName << "')";
+        if (!m_pDB->executeQuery(ossUnit.str())) {
+            return false;
+        }
+    }
+
+    return true;
 }
 
 // 销毁报警表
@@ -487,17 +534,7 @@
 }
 
 // 筛选报警数据
-std::vector<AlarmData> AlarmManager::getFilteredAlarms(
-    const std::string& id,
-    const std::string& severityLevel,
-    const std::string& deviceName,
-    const std::string& unitName,
-    const std::string& description,
-    const std::string& startTime,
-    const std::string& endTime,
-    int pageNumber,
-    int pageSize) {
-
+std::vector<AlarmData> AlarmManager::getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize) {
     if (!m_pDB) {
         return {};
     }
@@ -507,25 +544,20 @@
         SELECT a.id, a.severity_level, a.device_id, a.unit_id, d.device_name, u.unit_name, a.description, a.start_time, a.end_time
         FROM alarms a
         JOIN devices d ON a.device_id = d.device_id
-        JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id
+        JOIN units u   ON a.device_id = u.device_id AND a.unit_id = u.unit_id
         WHERE 1=1)";
 
-    // 传入的过滤条件
-    if (!id.empty()) {
-        query << " AND a.id = '" << id << "'";
+    // 统一关键字模糊查询
+    if (!keyword.empty()) {
+        query << " AND ("
+            << "a.id LIKE '%" << keyword << "%' OR "
+            << "a.severity_level LIKE '%" << keyword << "%' OR "
+            << "d.device_name LIKE '%" << keyword << "%' OR "
+            << "u.unit_name LIKE '%" << keyword << "%' OR "
+            << "a.description LIKE '%" << keyword << "%')";
     }
-    if (!severityLevel.empty()) {
-        query << " AND a.severity_level = '" << severityLevel << "'";
-    }
-    if (!deviceName.empty()) {
-        query << " AND d.device_name LIKE '%" << deviceName << "%'";
-    }
-    if (!unitName.empty()) {
-        query << " AND u.unit_name LIKE '%" << unitName << "%'";
-    }
-    if (!description.empty()) {
-        query << " AND a.description LIKE '%" << description << "%'";
-    }
+
+    // 时间条件
     if (!startTime.empty()) {
         query << " AND a.start_time >= '" << startTime << "'";
     }
@@ -534,9 +566,10 @@
     }
 
     // 分页设置
-    int offset = (pageNumber - 1) * pageSize;
-    query << " ORDER BY a.start_time DESC LIMIT " << pageSize << " OFFSET " << offset;
+    int nOffset = (pageNumber - 1) * pageSize;
+    query << " ORDER BY a.start_time DESC LIMIT " << pageSize << " OFFSET " << nOffset;
 
+    // 查询
     auto results = m_pDB->fetchResults(query.str());
 
     // 遍历查询结果,填充 AlarmData 结构体
@@ -560,41 +593,30 @@
 }
 
 // 获取符合条件的报警总数
-int AlarmManager::getTotalAlarmCount(
-    const std::string& id,
-    const std::string& severityLevel,
-    const std::string& deviceName,
-    const std::string& unitName,
-    const std::string& description,
-    const std::string& startTime,
-    const std::string& endTime) {
-
+int AlarmManager::getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime) {
     if (!m_pDB) {
         return 0;
     }
 
     std::ostringstream query;
-    query << "SELECT COUNT(*) FROM alarms a "
-        << "JOIN devices d ON a.device_id = d.device_id "
-        << "JOIN units u ON a.device_id = u.device_id AND a.unit_id = u.unit_id "
-        << "WHERE 1=1";
+    query << R"(
+        SELECT COUNT(*)
+        FROM alarms a
+        JOIN devices d ON a.device_id = d.device_id
+        JOIN units u   ON a.device_id = u.device_id AND a.unit_id = u.unit_id
+        WHERE 1=1)";
 
-    // 添加过滤条件
-    if (!id.empty()) {
-        query << " AND a.id = '" << id << "'";
+    // 统一关键字模糊查询
+    if (!keyword.empty()) {
+        query << " AND ("
+            << "a.id LIKE '%" << keyword << "%' OR "
+            << "a.severity_level LIKE '%" << keyword << "%' OR "
+            << "d.device_name LIKE '%" << keyword << "%' OR "
+            << "u.unit_name LIKE '%" << keyword << "%' OR "
+            << "a.description LIKE '%" << keyword << "%')";
     }
-    if (!severityLevel.empty()) {
-        query << " AND a.severity_level = '" << severityLevel << "'";
-    }
-    if (!deviceName.empty()) {
-        query << " AND d.device_name LIKE '%" << deviceName << "%'";
-    }
-    if (!unitName.empty()) {
-        query << " AND u.unit_name LIKE '%" << unitName << "%'";
-    }
-    if (!description.empty()) {
-        query << " AND a.description LIKE '%" << description << "%'";
-    }
+
+    // 时间条件
     if (!startTime.empty()) {
         query << " AND a.start_time >= '" << startTime << "'";
     }
diff --git a/SourceCode/Bond/Servo/AlarmManager.h b/SourceCode/Bond/Servo/AlarmManager.h
index cbe1bb9..d98fce9 100644
--- a/SourceCode/Bond/Servo/AlarmManager.h
+++ b/SourceCode/Bond/Servo/AlarmManager.h
@@ -115,49 +115,25 @@
      */
     std::vector<AlarmData> getAlarms(int startPosition, int count);
 
-    /**
-     * 获取筛选后的报警数据
-	 * @param id 报警ID的筛选条件
-     * @param severityLevel 报警等级筛选条件
-	 * @param deviceName 设备名称的筛选条件
-     * @param unitName 单元名称的筛选条件
-     * @param description 报警描述的筛选条件
-     * @param startTime 起始时间筛选条件
-     * @param endTime 结束时间筛选条件
-     * @param pageNumber 页码
-     * @param pageSize 每页的记录数
-     * @return 包含查询结果的报警数据
-     */
-    std::vector<AlarmData> getFilteredAlarms(
-        const std::string& id,
-        const std::string& severityLevel,
-        const std::string& deviceName,
-        const std::string& unitName,
-        const std::string& description,
-        const std::string& startTime,
-        const std::string& endTime,
-        int pageNumber,
-        int pageSize);
+	/**
+	 * 筛选报警数据
+	 * @param keyword 关键字筛选条件
+	 * @param startTime 起始时间筛选条件
+	 * @param endTime 结束时间筛选条件
+	 * @param pageNumber 页码
+	 * @param pageSize 每页记录数
+	 * @return 包含筛选后报警数据的结构体
+	 */
+    std::vector<AlarmData> getFilteredAlarms(const std::string& keyword, const std::string& startTime, const std::string& endTime, int pageNumber, int pageSize);
 
     /**
      * 获取符合条件的报警总数
-     * @param id 报警ID的筛选条件
-     * @param severityLevel 报警等级筛选条件
-     * @param deviceName 设备名称的筛选条件
-     * @param unitName 单元名称的筛选条件
-     * @param description 报警描述的筛选条件
+     * @param keyword 关键字筛选条件
      * @param startTime 起始时间筛选条件
      * @param endTime 结束时间筛选条件
      * @return 符合条件的报警总数
      */
-    int getTotalAlarmCount(
-        const std::string& id,
-        const std::string& severityLevel,
-        const std::string& deviceName,
-        const std::string& unitName,
-        const std::string& description,
-        const std::string& startTime,
-        const std::string& endTime);
+    int getTotalAlarmCount(const std::string& keyword, const std::string& startTime, const std::string& endTime);
 
 	/**
 	 * 更新报警结束时间
diff --git a/SourceCode/Bond/Servo/PageAlarm.cpp b/SourceCode/Bond/Servo/PageAlarm.cpp
index 8113dad..6146eaa 100644
--- a/SourceCode/Bond/Servo/PageAlarm.cpp
+++ b/SourceCode/Bond/Servo/PageAlarm.cpp
@@ -140,7 +140,7 @@
 void CPageAlarm::UpdatePageData()
 {
 	// 鏍规嵁杩囨护鏉′欢鍔犺浇鏁版嵁锛屾彁渚涙弿杩板拰鏃堕棿鑼冨洿鏌ヨ
-	auto vecData = AlarmManager::getInstance().getFilteredAlarms("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd, m_nCurPage, PAGE_SIZE);
+	auto vecData = AlarmManager::getInstance().getFilteredAlarms(m_strKeyword, m_szTimeStart, m_szTimeEnd, m_nCurPage, PAGE_SIZE);
 
 	// 濉厖鏁版嵁鍒版帶浠�
 	CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_ALARM);
@@ -297,7 +297,7 @@
 
 
 	// 璁$畻鎬婚〉鏁�
-	int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd);
+	int totalRecords = AlarmManager::getInstance().getTotalAlarmCount(m_strKeyword, m_szTimeStart, m_szTimeEnd);
 	m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
 	m_nCurPage = 1;
 
@@ -426,7 +426,7 @@
 	}
 
 	// 璁$畻鎬婚〉鏁�
-	int totalRecords = AlarmManager::getInstance().getTotalAlarmCount("", "", m_strDeviceName, m_strUnitName, m_strKeyword, m_szTimeStart, m_szTimeEnd);
+	int totalRecords = AlarmManager::getInstance().getTotalAlarmCount(m_strKeyword, m_szTimeStart, m_szTimeEnd);
 	m_nTotalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE;
 	m_nCurPage = 1;
 

--
Gitblit v1.9.3