From a8cc46897af0ec2f9d5ae0cb7a27798ba300e9bb Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期六, 26 七月 2025 16:10:11 +0800
Subject: [PATCH] 根据实际PLC数据修复数据解析逻辑

---
 config/ModbusDataParser.cs |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/config/ModbusDataParser.cs b/config/ModbusDataParser.cs
index 4665c15..7ca9e9b 100644
--- a/config/ModbusDataParser.cs
+++ b/config/ModbusDataParser.cs
@@ -93,12 +93,19 @@
                 if (config.Encoding?.ToLower() == "littleendian")
                 {
                     // 灏忕锛氫綆浣嶅湪鍓�
-                    value = registers[0] | (registers[1] << 16);
+                    value = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16);
                 }
                 else
                 {
                     // 澶х锛氶珮浣嶅湪鍓嶏紙榛樿锛�
-                    value = (registers[0] << 16) | registers[1];
+                    value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);
+                }
+                
+                // 妫�鏌ユ槸鍚︿负鏃犳晥鏁版嵁鏍囪瘑锛堝璐熷�肩粍鍚堬級
+                if (value == 0xE2400001 || value > 0x7FFFFFFF)
+                {
+                    // 鍙兘鏄棤鏁堟暟鎹紝杩斿洖0鎴栦娇鐢ㄧ壒娈婃爣璇�
+                    return 0;
                 }
             }
             else
@@ -140,8 +147,13 @@
                 else
                 {
                     // 澶х锛氶珮瀛楄妭鍦ㄥ墠锛堥粯璁わ級
-                    bytes.Add((byte)((register >> 8) & 0xFF));
-                    bytes.Add((byte)(register & 0xFF));
+                    // 娉ㄦ剰锛氭牴鎹疄闄匬LC鏁版嵁锛屽瓧鑺傞『搴忔槸鍙嶇殑
+                    var highByte = (byte)((register >> 8) & 0xFF);
+                    var lowByte = (byte)(register & 0xFF);
+                    
+                    // 鍏堟坊鍔犱綆瀛楄妭锛屽啀娣诲姞楂樺瓧鑺傦紙閫傚簲PLC鐨勫瓧鑺傚簭锛�
+                    if (lowByte != 0) bytes.Add(lowByte);
+                    if (highByte != 0) bytes.Add(highByte);
                 }
             }
 
@@ -163,8 +175,8 @@
 
             try
             {
-                // 鍏堣В鏋愪负瀛楃涓�
-                var timestampString = ParseString(registers, config);
+                // 鏃堕棿鎴虫暟鎹渶瑕佺壒娈婅В鏋愶紙鏁板瓧瀛楃锛�
+                var timestampString = ParseTimestampString(registers, config);
                 
                 if (string.IsNullOrEmpty(timestampString))
                 {
@@ -228,6 +240,39 @@
         #region 鏃堕棿鎴宠В鏋愯緟鍔╂柟娉�
 
         /// <summary>
+        /// 瑙f瀽鏃堕棿鎴冲瓧绗︿覆锛堥拡瀵规暟瀛楀瓧绗︽暟鎹級
+        /// </summary>
+        private static string ParseTimestampString(int[] registers, DataField config)
+        {
+            if (registers.Length == 0) return string.Empty;
+
+            var chars = new List<char>();
+
+            foreach (var register in registers.Take(config.Length))
+            {
+                if (register == 0) break; // 閬囧埌0瀵勫瓨鍣ㄥ仠姝�
+
+                // 鎻愬彇楂樺瓧鑺傚拰浣庡瓧鑺�
+                var highByte = (byte)((register >> 8) & 0xFF);
+                var lowByte = (byte)(register & 0xFF);
+
+                // 鎸塒LC鏁版嵁鏍煎紡娣诲姞瀛楃锛堝厛浣庡瓧鑺傦紝鍚庨珮瀛楄妭锛�
+                // 妫�鏌ユ槸鍚︿负鏁板瓧瀛楃锛圓SCII 48-57, '0'-'9'锛�
+                if (lowByte >= 48 && lowByte <= 57)
+                {
+                    chars.Add((char)lowByte);
+                }
+                if (highByte >= 48 && highByte <= 57)
+                {
+                    chars.Add((char)highByte);
+                }
+            }
+
+            var result = new string(chars.ToArray());
+            return result;
+        }
+
+        /// <summary>
         /// 瑙f瀽YYYYMMDDHHMMSS鏍煎紡鐨勬椂闂存埑
         /// </summary>
         private static DateTime ParseTimestampYYYYMMDDHHMMSS(string timestampString)

--
Gitblit v1.9.3