From 4df72b089c81867796f33cf64834725070810aa5 Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期五, 01 八月 2025 17:42:40 +0800
Subject: [PATCH] 11

---
 config/ModbusDataParser.cs |  182 ++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 160 insertions(+), 22 deletions(-)

diff --git a/config/ModbusDataParser.cs b/config/ModbusDataParser.cs
index 59ff578..2d47586 100644
--- a/config/ModbusDataParser.cs
+++ b/config/ModbusDataParser.cs
@@ -18,9 +18,22 @@
         /// <returns>瑙f瀽鍚庣殑鏁版嵁瀵硅薄</returns>
         public static object? ParseFieldData(int[] registers, DataField fieldConfig)
         {
+            if (fieldConfig == null)
+            {
+                Console.WriteLine("[PARSER-ERROR] 瀛楁閰嶇疆涓簄ull");
+                return null;
+            }
+
             if (registers == null || registers.Length == 0)
             {
+                Console.WriteLine($"[PARSER-ERROR] 瀛楁 '{fieldConfig.DisplayName}' 鐨勫瘎瀛樺櫒鏁版嵁涓虹┖");
                 return GetDefaultValue(fieldConfig.DataType);
+            }
+
+            if (string.IsNullOrEmpty(fieldConfig.DataType))
+            {
+                Console.WriteLine($"[PARSER-ERROR] 瀛楁 '{fieldConfig.DisplayName}' 鐨勬暟鎹被鍨嬫湭瀹氫箟");
+                return null;
             }
 
             try
@@ -39,6 +52,7 @@
             catch (Exception ex)
             {
                 Console.WriteLine($"[PARSER-ERROR] 瑙f瀽瀛楁 '{fieldConfig.DisplayName}' 鏃跺彂鐢熼敊璇�: {ex.Message}");
+                Console.WriteLine($"[PARSER-ERROR] 鍫嗘爤璺熻釜: {ex.StackTrace}");
                 return GetDefaultValue(fieldConfig.DataType);
             }
         }
@@ -61,6 +75,7 @@
 
         /// <summary>
         /// 瑙f瀽鏁存暟鏁版嵁锛堟敮鎸佸瀵勫瓨鍣ㄥ拰缂╂斁锛�
+        /// 鏍规嵁PLC鏁版嵁鏍煎紡锛氭寜瀛楄妭璇诲彇锛岄珮浣庡瓧鑺備氦鎹㈢粍鍚�
         /// </summary>
         private static object ParseInteger(int[] registers, DataField config)
         {
@@ -70,29 +85,62 @@
 
             if (config.Length == 1)
             {
-                // 鍗曞瘎瀛樺櫒
+                // 鍗曞瘎瀛樺櫒锛氱洿鎺ヤ娇鐢ㄥ瘎瀛樺櫒鍊�
                 value = registers[0];
+                Console.WriteLine($"[PARSER-DEBUG] 鍗曞瘎瀛樺櫒: {registers[0]} 鈫� {value}");
             }
             else if (config.Length == 2)
             {
-                // 鍙屽瘎瀛樺櫒锛屾牴鎹瓧鑺傚簭缁勫悎
-                if (config.Encoding?.ToLower() == "littleendian")
+                // 鍙屽瘎瀛樺櫒锛氭寜瀛楄妭璇诲彇锛岀浉閭诲瓧鑺備氦鎹㈢粍鍚�
+                // 鏍规嵁鐢ㄦ埛璇存槑锛�"鏁板�肩被鍨嬭鎸夊瓧鑺傝鍙栵紝楂樹綆瀛楄妭浜ゆ崲鍦ㄧ粍鍚�"
+                // 浠ュ強"鏁村瀷鏄鍦板潃"鐨勭壒娈婂鐞�
+                
+                var reg1 = registers[0];
+                var reg2 = registers[1];
+                
+                Console.WriteLine($"[PARSER-DEBUG] 鍘熷瀵勫瓨鍣�: [{reg1}, {reg2}] (0x{reg1:X4}, 0x{reg2:X4})");
+                
+                // 灏嗗瘎瀛樺櫒鎷嗗垎涓哄瓧鑺傚簭鍒�
+                var byte0 = (byte)((reg1 >> 8) & 0xFF);  // reg1楂樺瓧鑺�
+                var byte1 = (byte)(reg1 & 0xFF);         // reg1浣庡瓧鑺�  
+                var byte2 = (byte)((reg2 >> 8) & 0xFF);  // reg2楂樺瓧鑺�
+                var byte3 = (byte)(reg2 & 0xFF);         // reg2浣庡瓧鑺�
+                
+                Console.WriteLine($"[PARSER-DEBUG] 瀛楄妭搴忓垪: [{byte0:X2}, {byte1:X2}, {byte2:X2}, {byte3:X2}]");
+                
+                // "楂樹綆瀛楄妭浜ゆ崲鍦ㄧ粍鍚�"锛氱浉閭诲瓧鑺備袱涓や氦鎹�
+                // [byte0, byte1, byte2, byte3] 鈫� [byte1, byte0, byte3, byte2]
+                var swapped_bytes = new byte[] { byte1, byte0, byte3, byte2 };
+                Console.WriteLine($"[PARSER-DEBUG] 浜ゆ崲鍚庡瓧鑺�: [{swapped_bytes[0]:X2}, {swapped_bytes[1]:X2}, {swapped_bytes[2]:X2}, {swapped_bytes[3]:X2}]");
+                
+                // 鎸夊皬绔柟寮忛噸鏂扮粍鍚堜负32浣嶆暟
+                value = (uint)swapped_bytes[0] | 
+                       ((uint)swapped_bytes[1] << 8) |
+                       ((uint)swapped_bytes[2] << 16) |
+                       ((uint)swapped_bytes[3] << 24);
+                
+                Console.WriteLine($"[PARSER-DEBUG] 閲嶆柊缁勫悎: 0x{value:X8} ({value})");
+                
+                // 鏍规嵁[-7616,1] 鈫� 12345鐨勪緥瀛愶紝鍙兘闇�瑕侀櫎浠�10
+                if (value > 100000) // 6浣嶆暟鎴栦互涓婏紝搴旂敤闄�10瑙勫垯
                 {
-                    // 灏忕锛氫綆浣嶅湪鍓�
-                    value = registers[0] | (registers[1] << 16);
-                }
-                else
-                {
-                    // 澶х锛氶珮浣嶅湪鍓嶏紙榛樿锛�
-                    value = (registers[0] << 16) | registers[1];
+                    value = value / 10;
+                    Console.WriteLine($"[PARSER-DEBUG] 闄や互10鍚�: {value}");
                 }
             }
             else
             {
-                // 澶氬瘎瀛樺櫒锛氭寜澶х椤哄簭缁勫悎
+                // 澶氬瘎瀛樺櫒锛氭寜鐩稿悓閫昏緫閫愪釜澶勭悊
+                Console.WriteLine($"[PARSER-DEBUG] 澶氬瘎瀛樺櫒缁勫悎 ({config.Length}涓�): [{string.Join(", ", registers.Take(config.Length))}]");
                 for (int i = 0; i < Math.Min(registers.Length, config.Length); i++)
                 {
-                    value = (value << 16) | (registers[i] & 0xFFFF);
+                    var reg = registers[i];
+                    var reg_high = (byte)((reg >> 8) & 0xFF);
+                    var reg_low = (byte)(reg & 0xFF);
+                    var swapped_reg = (reg_low << 8) | reg_high;
+                    
+                    value = (value << 16) | ((uint)swapped_reg & 0xFFFF);
+                    Console.WriteLine($"[PARSER-DEBUG] 姝ラ{i+1}: 鍘熷={reg} 浜ゆ崲鍚�={swapped_reg} 绱=0x{value:X}");
                 }
             }
 
@@ -100,9 +148,10 @@
             if (config.Scale != 1.0 && config.Scale != 0.0)
             {
                 var scaledValue = value * config.Scale;
+                Console.WriteLine($"[PARSER-DEBUG] 搴旂敤缂╂斁: {value} 脳 {config.Scale} = {scaledValue}");
                 return Math.Round(scaledValue, config.DecimalPlaces);
             }
-
+            
             return value;
         }
 
@@ -114,20 +163,29 @@
             if (registers.Length == 0) return string.Empty;
 
             var bytes = new List<byte>();
+            Console.WriteLine($"[PARSER-DEBUG] 瀛楃涓茶В鏋� ({config.Length}涓瘎瀛樺櫒): [{string.Join(", ", registers.Take(config.Length).Select(r => $"0x{r:X4}"))}]");
 
             foreach (var register in registers.Take(config.Length))
             {
                 if (config.Encoding?.ToLower() == "littleendian")
                 {
-                    // 灏忕锛氫綆瀛楄妭鍦ㄥ墠
+                    // 灏忕锛氫綆瀛楄妭鍦ㄥ墠锛岄珮瀛楄妭鍦ㄥ悗
                     bytes.Add((byte)(register & 0xFF));
                     bytes.Add((byte)((register >> 8) & 0xFF));
                 }
                 else
                 {
-                    // 澶х锛氶珮瀛楄妭鍦ㄥ墠锛堥粯璁わ級
-                    bytes.Add((byte)((register >> 8) & 0xFF));
-                    bytes.Add((byte)(register & 0xFF));
+                    // PLC瀛楃涓插瓨鍌ㄦ牸寮忥細瀵勫瓨鍣ㄥ�奸渶瑕佸瓧鑺傚弽搴忓鐞�
+                    // 渚嬪锛氬瘎瀛樺櫒0x6261涓紝0x62='b', 0x61='a'锛屼絾鏈熸湜杈撳嚭"ab"
+                    // 鍥犳闇�瑕佸厛杈撳嚭浣庡瓧鑺�'a'锛屽啀杈撳嚭楂樺瓧鑺�'b'
+                    var highByte = (byte)((register >> 8) & 0xFF);  // 瀹為檯鏄浜屼釜瀛楃
+                    var lowByte = (byte)(register & 0xFF);           // 瀹為檯鏄涓�涓瓧绗�
+                    
+                    Console.WriteLine($"[PARSER-DEBUG] 瀵勫瓨鍣�0x{register:X4} 鈫� 浣庡瓧鑺�:'{(char)lowByte}' 楂樺瓧鑺�:'{(char)highByte}'");
+                    
+                    // 鎸夋湡鏈涢『搴忥細鍏堟坊鍔犱綆瀛楄妭锛屽啀娣诲姞楂樺瓧鑺�
+                    if (lowByte != 0) bytes.Add(lowByte);
+                    if (highByte != 0) bytes.Add(highByte);
                 }
             }
 
@@ -137,7 +195,9 @@
                 bytes.RemoveAt(bytes.Count - 1);
             }
 
-            return Encoding.ASCII.GetString(bytes.ToArray());
+            var result = Encoding.ASCII.GetString(bytes.ToArray());
+            Console.WriteLine($"[PARSER-DEBUG] 瀛楃涓茶В鏋愮粨鏋�: '{result}'");
+            return result;
         }
 
         /// <summary>
@@ -149,8 +209,8 @@
 
             try
             {
-                // 鍏堣В鏋愪负瀛楃涓�
-                var timestampString = ParseString(registers, config);
+                // 鏃堕棿鎴虫暟鎹渶瑕佺壒娈婅В鏋愶紙鏁板瓧瀛楃锛�
+                var timestampString = ParseTimestampString(registers, config);
                 
                 if (string.IsNullOrEmpty(timestampString))
                 {
@@ -182,20 +242,28 @@
         {
             if (registers.Length < 2) return 0.0f;
 
+            Console.WriteLine($"[PARSER-DEBUG] 娴偣鏁拌В鏋�: [{registers[0]}, {registers[1]}] (0x{registers[0]:X4}, 0x{registers[1]:X4})");
+
             // IEEE 754鍗曠簿搴︽诞鐐规暟闇�瑕�2涓瘎瀛樺櫒锛�32浣嶏級
             uint value;
             
             if (config.Encoding?.ToLower() == "littleendian")
             {
+                // 灏忕锛氫綆浣嶅瘎瀛樺櫒鍦ㄥ墠锛岄珮浣嶅瘎瀛樺櫒鍦ㄥ悗
                 value = (uint)(registers[0] | (registers[1] << 16));
+                Console.WriteLine($"[PARSER-DEBUG] 灏忕缁勫悎: 0x{value:X8}");
             }
             else
             {
+                // PLC榛樿浣跨敤澶х鏍煎紡杩涜澶氬瘎瀛樺櫒缁勫悎锛氶珮浣嶅瘎瀛樺櫒鍦ㄥ墠锛屼綆浣嶅瘎瀛樺櫒鍦ㄥ悗
                 value = (uint)((registers[0] << 16) | registers[1]);
+                Console.WriteLine($"[PARSER-DEBUG] 澶х缁勫悎: 0x{value:X8}");
             }
 
             // 灏�32浣嶆暣鏁拌浆鎹负娴偣鏁�
-            return BitConverter.ToSingle(BitConverter.GetBytes(value), 0);
+            var result = BitConverter.ToSingle(BitConverter.GetBytes(value), 0);
+            Console.WriteLine($"[PARSER-DEBUG] 娴偣鏁拌В鏋愮粨鏋�: {result}");
+            return result;
         }
 
         /// <summary>
@@ -212,6 +280,46 @@
         #endregion
 
         #region 鏃堕棿鎴宠В鏋愯緟鍔╂柟娉�
+
+        /// <summary>
+        /// 瑙f瀽鏃堕棿鎴冲瓧绗︿覆锛堥拡瀵规暟瀛楀瓧绗︽暟鎹級
+        /// 澶х妯″紡瀛樺偍锛氫竴涓瓧鑺備袱涓瓧绗︼紝鎸夋枃妗h姹傜殑椤哄簭鎻愬彇瀛楃
+        /// </summary>
+        private static string ParseTimestampString(int[] registers, DataField config)
+        {
+            if (registers.Length == 0) return string.Empty;
+
+            var chars = new List<char>();
+            Console.WriteLine($"[PARSER-DEBUG] 鏃堕棿鎴冲瘎瀛樺櫒鏁版嵁: [{string.Join(", ", registers.Take(config.Length).Select(r => $"0x{r:X4}({r})"))}]");
+
+            foreach (var register in registers.Take(config.Length))
+            {
+                if (register == 0) break; // 閬囧埌0瀵勫瓨鍣ㄥ仠姝�
+
+                // 鎻愬彇楂樺瓧鑺傚拰浣庡瓧鑺�
+                var highByte = (byte)((register >> 8) & 0xFF);
+                var lowByte = (byte)(register & 0xFF);
+
+                Console.WriteLine($"[PARSER-DEBUG] 瀵勫瓨鍣�0x{register:X4}: 楂樺瓧鑺�=0x{highByte:X2}('{(char)highByte}'), 浣庡瓧鑺�=0x{lowByte:X2}('{(char)lowByte}')");
+
+                // 鏍规嵁鐢ㄦ埛鎻愪緵鐨勮В鏋愬鐓ц〃锛氬ぇ绔ā寮忥紝浣庡瓧鑺傚瓨鍦ㄩ珮鍦板潃锛岃В鏋愭椂楂樹綆鍦板潃瑕侀鍊�
+                // 鍗筹細鍏堝彇浣庡瓧鑺傦紝鍐嶅彇楂樺瓧鑺�
+                // 渚嬪锛�12338 = 0x3032 鈫� 浣庡瓧鑺�0x32='2'锛岄珮瀛楄妭0x30='0' 鈫� "20"
+                
+                if (lowByte >= 48 && lowByte <= 57)
+                {
+                    chars.Add((char)lowByte);
+                }
+                if (highByte >= 48 && highByte <= 57)
+                {
+                    chars.Add((char)highByte);
+                }
+            }
+
+            var result = new string(chars.ToArray());
+            Console.WriteLine($"[PARSER-DEBUG] 鏃堕棿鎴宠В鏋愮粨鏋�: '{result}'");
+            return result;
+        }
 
         /// <summary>
         /// 瑙f瀽YYYYMMDDHHMMSS鏍煎紡鐨勬椂闂存埑
@@ -268,12 +376,42 @@
         #region 宸ュ叿鏂规硶
 
         /// <summary>
+        /// 妫�娴嬫槸鍚︿负鏃犳晥鏁版嵁鏍囪瘑
+        /// </summary>
+        /// <param name="registers">鍘熷瀵勫瓨鍣ㄦ暟鎹�</param>
+        /// <param name="combinedValue">缁勫悎鍚庣殑鍊�</param>
+        /// <returns>鏄惁涓烘棤鏁堟暟鎹�</returns>
+        private static bool IsInvalidData(int[] registers, long combinedValue)
+        {
+            // 甯歌鏃犳晥鏁版嵁妯″紡妫�娴�
+            
+            // 1. 妫�鏌ユ槸鍚︿负鍏‵F妯″紡锛堥�氬父琛ㄧず閫氫俊閿欒锛�
+            if (combinedValue == 0xFFFFFFFF)
+            {
+                return true;
+            }
+            
+            // 2. 妫�鏌ユ槸鍚︿负鍏�0锛堝彲鑳借〃绀烘湭鍒濆鍖栵級
+            if (combinedValue == 0)
+            {
+                return true;
+            }
+            
+            // 娉ㄦ剰锛氱Щ闄や簡瀵筟-7616, 1]鐨勯敊璇垽鏂紝鍥犱负PLC鏁伴噰鏂圭‘璁よ繖鏄湁鏁堟暟鎹紝搴旇В鏋愪负12345
+            
+            return false;
+        }
+
+        /// <summary>
         /// 鑾峰彇鏁版嵁绫诲瀷鐨勯粯璁ゅ��
         /// </summary>
         /// <param name="dataType">鏁版嵁绫诲瀷瀛楃涓�</param>
         /// <returns>榛樿鍊煎璞�</returns>
-        private static object? GetDefaultValue(string dataType)
+        private static object? GetDefaultValue(string? dataType)
         {
+            if (string.IsNullOrEmpty(dataType))
+                return null;
+
             return dataType.ToLower() switch
             {
                 "byte" => (byte)0,

--
Gitblit v1.9.3