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 +++++++++++++++++++++++++---
 Program.cs                 |   13 ++++++
 原始值.txt                    |    7 +++
 3 files changed, 70 insertions(+), 7 deletions(-)

diff --git a/Program.cs b/Program.cs
index 512d5ab..2b5f525 100644
--- a/Program.cs
+++ b/Program.cs
@@ -6,8 +6,19 @@
         ///  The main entry point for the application.
         /// </summary>
         [STAThread]
-        static void Main()
+        static void Main(string[] args)
         {
+            // 妫�鏌ュ懡浠よ鍙傛暟
+            if (args.Length > 0)
+            {
+                switch (args[0].ToLower())
+                {
+                    case "demo":
+                        ConfigDemo.RunDemoAsync().Wait();
+                        return;
+                }
+            }
+
             // To customize application configuration such as set high DPI settings or default font,
             // see https://aka.ms/applicationconfiguration.
             ApplicationConfiguration.Initialize();
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)
diff --git "a/\345\216\237\345\247\213\345\200\274.txt" "b/\345\216\237\345\247\213\345\200\274.txt"
new file mode 100644
index 0000000..c197d8c
--- /dev/null
+++ "b/\345\216\237\345\247\213\345\200\274.txt"
@@ -0,0 +1,7 @@
+锘�--鍘熷鍊�
+{"PlcHeartbeat":[1],"DataReady":[1],"ProductModel":[25185,25699,26213,26727,27241,12849,13363,13877,14391,12345],"TestStation":[1],"ProductCode":[25185,25699,26213,26727,27241,12849,13363,13877,14391,12345],"TestResult":[1],"Timestamp":[12338,13618,14128,14641,13105,12340,0],"MinInstallSize":[-7616,1],"MaxInstallSize":[-7616,1],"Stroke":[-7616,1],"Speed":[-7616,1],"WorkingVoltage":[-7616,1],"WorkingCurrent":[-7616,1],"WorkingPressure":[-7616,1],"UpHallSensor":[-7616,1]}
+
+--閮ㄥ垎鐩爣鍊�
+--瀛楃涓插唴濉殑鏄痑bcdefghij1234567890
+--鏁村瀷鍐呮槸12345锛屽氨鏄�123.45銆�
+--鏃ユ湡鏄�202507191340瀛楃涓�
\ No newline at end of file

--
Gitblit v1.9.3