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 |   90 ++++++++++++++++++++++-----------------------
 1 files changed, 44 insertions(+), 46 deletions(-)

diff --git a/config/ModbusDataParser.cs b/config/ModbusDataParser.cs
index c42bf90..2d47586 100644
--- a/config/ModbusDataParser.cs
+++ b/config/ModbusDataParser.cs
@@ -75,6 +75,7 @@
 
         /// <summary>
         /// 瑙f瀽鏁存暟鏁版嵁锛堟敮鎸佸瀵勫瓨鍣ㄥ拰缂╂斁锛�
+        /// 鏍规嵁PLC鏁版嵁鏍煎紡锛氭寜瀛楄妭璇诲彇锛岄珮浣庡瓧鑺備氦鎹㈢粍鍚�
         /// </summary>
         private static object ParseInteger(int[] registers, DataField config)
         {
@@ -84,64 +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")
-                {
-                    // 灏忕锛氫綆浣嶅瘎瀛樺櫒鍦ㄥ墠锛岄珮浣嶅瘎瀛樺櫒鍦ㄥ悗
-                    value = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16);
-                }
-                else
-                {
-                    // 瀵逛簬娴嬮噺鏁版嵁鐨勭壒娈婂鐞嗭細PLC鏁伴噰鏂圭‘璁ょ殑鏁版嵁鏍煎紡
-                    // 娴嬮噺鏁版嵁浣跨敤灏忕缁勫悎鍚庨櫎浠�10鐨勭壒娈婄紪鐮佹柟寮�
-                    // 渚嬪锛歔-7616, 1] 鈫� 灏忕缁勫悎寰楀埌123456 鈫� 闄や互10寰楀埌12345
-                    if (registers.Length >= 2)
-                    {
-                        // 鍏堟寜灏忕鏂瑰紡缁勫悎锛堝嵆浣块厤缃笉鏄痩ittleendian锛�
-                        long littleEndianValue = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16);
-                        
-                        // 妫�鏌ユ槸鍚﹂渶瑕佺壒娈婄殑闄や互10澶勭悊锛堥拡瀵规祴閲忔暟鎹級
-                        if (littleEndianValue > 100000) // 6浣嶆暟鎴栨洿澶氾紝鍙兘闇�瑕侀櫎浠�10
-                        {
-                            long dividedValue = littleEndianValue / 10;
-                            Console.WriteLine($"[PARSER-DEBUG] 娴嬮噺鏁版嵁鐗规畩澶勭悊: [{registers[0]}, {registers[1]}] 鈫� 灏忕缁勫悎={littleEndianValue} 鈫� 闄や互10={dividedValue}");
-                            value = dividedValue;
-                        }
-                        else
-                        {
-                            // PLC榛樿浣跨敤澶х鏍煎紡杩涜澶氬瘎瀛樺櫒缁勫悎锛氶珮浣嶅瘎瀛樺櫒鍦ㄥ墠锛屼綆浣嶅瘎瀛樺櫒鍦ㄥ悗
-                            value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);
-                        }
-                    }
-                    else
-                    {
-                        // PLC榛樿浣跨敤澶х鏍煎紡杩涜澶氬瘎瀛樺櫒缁勫悎锛氶珮浣嶅瘎瀛樺櫒鍦ㄥ墠锛屼綆浣嶅瘎瀛樺櫒鍦ㄥ悗
-                        value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);
-                    }
-                }
+                // 鍙屽瘎瀛樺櫒锛氭寜瀛楄妭璇诲彇锛岀浉閭诲瓧鑺備氦鎹㈢粍鍚�
+                // 鏍规嵁鐢ㄦ埛璇存槑锛�"鏁板�肩被鍨嬭鎸夊瓧鑺傝鍙栵紝楂樹綆瀛楄妭浜ゆ崲鍦ㄧ粍鍚�"
+                // 浠ュ強"鏁村瀷鏄鍦板潃"鐨勭壒娈婂鐞�
                 
-                Console.WriteLine($"[PARSER-DEBUG] 鍙屽瘎瀛樺櫒缁勫悎: [{registers[0]}, {registers[1]}] 鈫� 0x{value:X8} ({value})");
+                var reg1 = registers[0];
+                var reg2 = registers[1];
                 
-                // 妫�鏌ユ槸鍚︿负鏃犳晥鏁版嵁鏍囪瘑
-                if (IsInvalidData(registers, value))
+                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瑙勫垯
                 {
-                    Console.WriteLine($"[PARSER-DEBUG] 妫�娴嬪埌鏃犳晥鏁版嵁鏍囪瘑锛岃繑鍥�0");
-                    return 0;
+                    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);
-                    Console.WriteLine($"[PARSER-DEBUG] 姝ラ{i+1}: 0x{value:X} (瀵勫瓨鍣▄i}: {registers[i]})");
+                    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}");
                 }
             }
 
@@ -149,11 +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);
             }
             
-            // 濡傛灉娌℃湁閰嶇疆缂╂斁锛屾暣鏁版暟鎹粯璁よ繑鍥炲師濮嬪�硷紙涓嶅啀鑷姩搴旂敤灏忔暟杞崲锛�
-            // 鏍规嵁閰嶇疆鏂囦欢锛屾祴閲忔暟鎹凡缁忛厤缃簡Scale: 0.01锛屾墍浠ヤ細璧颁笂闈㈢殑鍒嗘敮
             return value;
         }
 

--
Gitblit v1.9.3