From 1b3d57f133b494114c1cdd30627c7057eecdf1b1 Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期一, 28 七月 2025 10:02:51 +0800
Subject: [PATCH] 修复时间戳解析和数据验证逻辑

---
 UniversalModbusManager.cs     |  107 +++++++++++++++++
 config/ModbusDataParser.cs    |   98 +++++++++++++--
 config/DynamicModbusData.cs   |   13 ++
 原始值.txt                       |   73 +++++++++++
 config/modbus_config.json     |   32 ++--
 config/production_config.json |    4 
 6 files changed, 287 insertions(+), 40 deletions(-)

diff --git a/UniversalModbusManager.cs b/UniversalModbusManager.cs
index 53d4fbe..a57816f 100644
--- a/UniversalModbusManager.cs
+++ b/UniversalModbusManager.cs
@@ -536,12 +536,27 @@
                     // 璇诲彇鍘熷瀵勫瓨鍣ㄦ暟鎹�
                     var registers = await Task.Run(() => 
                         _modbusClient.ReadHoldingRegisters(fieldConfig.Address, fieldConfig.Length));
+                    
+                    // 楠岃瘉瀵勫瓨鍣ㄨ鍙栫粨鏋滅殑鏈夋晥鎬�
+                    ValidateRegisterData(fieldName, fieldConfig, registers);
 
                     // 妫�鏌ヨ鍙栫粨鏋滄槸鍚︿负null
                     if (registers == null)
                     {
                         LogWarning($"瀛楁 '{fieldName}' 璇诲彇缁撴灉涓簄ull锛屽湴鍧�: {fieldConfig.Address}, 闀垮害: {fieldConfig.Length}");
                         continue;
+                    }
+
+                    // 璁板綍鍘熷瀵勫瓨鍣ㄦ暟鎹敤浜庤皟璇�
+                    LogDebug($"[RAW-DATA] 瀛楁 '{fieldName}' 鍘熷瀵勫瓨鍣�: [{string.Join(", ", registers)}] (鍗佸叚杩涘埗: [{string.Join(", ", registers.Select(r => $"0x{r:X4}"))}])");
+                    
+                    // 璇︾粏璁板綍姣忎釜瀵勫瓨鍣ㄧ殑瀛楄妭鍒嗚В
+                    for (int i = 0; i < registers.Length; i++)
+                    {
+                        var reg = registers[i];
+                        var highByte = (byte)((reg >> 8) & 0xFF);
+                        var lowByte = (byte)(reg & 0xFF);
+                        LogDebug($"[RAW-DATA] 瀵勫瓨鍣▄i}: {reg} (0x{reg:X4}) 鈫� 楂樺瓧鑺�:{highByte}('{(char)highByte}') 浣庡瓧鑺�:{lowByte}('{(char)lowByte}')");
                     }
 
                     // 楠岃瘉鏁版嵁闀垮害
@@ -601,6 +616,98 @@
 
         #endregion
 
+        #region 鏁版嵁楠岃瘉鏂规硶
+
+        /// <summary>
+        /// 楠岃瘉瀵勫瓨鍣ㄦ暟鎹殑鏈夋晥鎬�
+        /// </summary>
+        /// <param name="fieldName">瀛楁鍚�</param>
+        /// <param name="fieldConfig">瀛楁閰嶇疆</param>
+        /// <param name="registers">璇诲彇鐨勫瘎瀛樺櫒鏁版嵁</param>
+        private void ValidateRegisterData(string fieldName, DataField fieldConfig, int[]? registers)
+        {
+            if (registers == null)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 瀵勫瓨鍣ㄦ暟鎹负null");
+                return;
+            }
+
+            LogDebug($"[VALIDATE] 瀛楁 '{fieldName}' 鍘熷鏁版嵁楠岃瘉:");
+            LogDebug($"[VALIDATE] - 鍦板潃: {fieldConfig.Address}, 鏈熸湜闀垮害: {fieldConfig.Length}, 瀹為檯闀垮害: {registers.Length}");
+            LogDebug($"[VALIDATE] - 鏁版嵁绫诲瀷: {fieldConfig.DataType}");
+            
+            // 妫�鏌ユ暟鎹暱搴�
+            if (registers.Length != fieldConfig.Length)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 鏁版嵁闀垮害涓嶅尮閰�: 鏈熸湜{fieldConfig.Length}, 瀹為檯{registers.Length}");
+            }
+
+            // 妫�鏌ユ槸鍚﹀寘鍚湁鏁堟暟鎹�
+            var hasNonZeroData = registers.Any(r => r != 0);
+            if (!hasNonZeroData)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 鎵�鏈夊瘎瀛樺櫒閮戒负0锛屽彲鑳芥槸鏃犳晥鏁版嵁");
+            }
+
+            // 妫�鏌ユ暟鎹寖鍥达紙16浣嶆湁绗﹀彿鏁存暟鑼冨洿锛�
+            var outOfRangeCount = registers.Count(r => r < -32768 || r > 32767);
+            if (outOfRangeCount > 0)
+            {
+                LogWarning($"[VALIDATE] 瀛楁 '{fieldName}' 鏈墈outOfRangeCount}涓瘎瀛樺櫒鍊艰秴鍑�16浣嶆湁绗﹀彿鏁存暟鑼冨洿");
+            }
+
+            // 鐗规畩鏁版嵁妯″紡妫�娴�
+            DetectSpecialDataPatterns(fieldName, registers);
+        }
+
+        /// <summary>
+        /// 妫�娴嬬壒娈婄殑鏁版嵁妯″紡
+        /// </summary>
+        /// <param name="fieldName">瀛楁鍚�</param>
+        /// <param name="registers">瀵勫瓨鍣ㄦ暟鎹�</param>
+        private void DetectSpecialDataPatterns(string fieldName, int[] registers)
+        {
+            // 妫�娴嬪叏FF妯″紡锛堥�氫俊閿欒锛�
+            if (registers.All(r => r == -1 || r == 0xFFFF))
+            {
+                LogWarning($"[PATTERN] 瀛楁 '{fieldName}' 妫�娴嬪埌鍏‵F妯″紡锛屽彲鑳芥槸閫氫俊閿欒");
+            }
+
+            // 妫�娴嬪父瑙佺殑閿欒鐮佹ā寮�
+            if (registers.Length >= 2)
+            {
+                var combined = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);
+                if (combined == 0xE2400001)
+                {
+                    LogInfo($"[PATTERN] 瀛楁 '{fieldName}' 妫�娴嬪埌宸茬煡鐨勬棤鏁堟暟鎹爣璇� 0xE2400001");
+                }
+            }
+
+            // 妫�娴婣SCII瀛楃妯″紡锛堢敤浜庡瓧绗︿覆鍜屾椂闂存埑瀛楁锛�
+            if (registers.Any(r => IsLikelyAsciiData(r)))
+            {
+                LogDebug($"[PATTERN] 瀛楁 '{fieldName}' 鍖呭惈鍙兘鐨凙SCII瀛楃鏁版嵁");
+            }
+        }
+
+        /// <summary>
+        /// 妫�鏌ュ瘎瀛樺櫒鍊兼槸鍚﹀彲鑳藉寘鍚獳SCII瀛楃
+        /// </summary>
+        /// <param name="register">瀵勫瓨鍣ㄥ��</param>
+        /// <returns>鏄惁鍙兘鏄疉SCII鏁版嵁</returns>
+        private bool IsLikelyAsciiData(int register)
+        {
+            if (register == 0) return false;
+            
+            var highByte = (byte)((register >> 8) & 0xFF);
+            var lowByte = (byte)(register & 0xFF);
+            
+            // 妫�鏌ユ槸鍚︿负鍙墦鍗癆SCII瀛楃鑼冨洿锛�32-126锛�
+            return (highByte >= 32 && highByte <= 126) || (lowByte >= 32 && lowByte <= 126);
+        }
+
+        #endregion
+
         #region 鏁版嵁鍙戦�佹柟娉�
 
         /// <summary>
diff --git a/config/DynamicModbusData.cs b/config/DynamicModbusData.cs
index bb7a973..8191eac 100644
--- a/config/DynamicModbusData.cs
+++ b/config/DynamicModbusData.cs
@@ -56,7 +56,18 @@
         public void SetFieldData(string fieldName, object? value, int[] rawRegisters)
         {
             _data[fieldName] = value;
-            _rawData[fieldName] = rawRegisters;
+            
+            // 澶嶅埗鍘熷瀵勫瓨鍣ㄦ暟鎹互閬垮厤寮曠敤闂
+            if (rawRegisters != null)
+            {
+                _rawData[fieldName] = (int[])rawRegisters.Clone();
+                Console.WriteLine($"[DATA-STORE] 瀛楁 '{fieldName}' 瀛樺偍: 瑙f瀽鍊�={value}, 鍘熷=[{string.Join(", ", rawRegisters)}]");
+            }
+            else
+            {
+                _rawData[fieldName] = Array.Empty<int>();
+                Console.WriteLine($"[DATA-STORE] 瀛楁 '{fieldName}' 瀛樺偍: 瑙f瀽鍊�={value}, 鍘熷鏁版嵁涓簄ull");
+            }
         }
 
         /// <summary>
diff --git a/config/ModbusDataParser.cs b/config/ModbusDataParser.cs
index 7ca9e9b..3c5ac79 100644
--- a/config/ModbusDataParser.cs
+++ b/config/ModbusDataParser.cs
@@ -92,28 +92,32 @@
                 // 鍙屽瘎瀛樺櫒锛屾牴鎹瓧鑺傚簭缁勫悎
                 if (config.Encoding?.ToLower() == "littleendian")
                 {
-                    // 灏忕锛氫綆浣嶅湪鍓�
+                    // 灏忕锛氫綆浣嶅瘎瀛樺櫒鍦ㄥ墠锛岄珮浣嶅瘎瀛樺櫒鍦ㄥ悗
                     value = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16);
                 }
                 else
                 {
-                    // 澶х锛氶珮浣嶅湪鍓嶏紙榛樿锛�
+                    // PLC榛樿浣跨敤澶х鏍煎紡杩涜澶氬瘎瀛樺櫒缁勫悎锛氶珮浣嶅瘎瀛樺櫒鍦ㄥ墠锛屼綆浣嶅瘎瀛樺櫒鍦ㄥ悗
                     value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);
                 }
                 
-                // 妫�鏌ユ槸鍚︿负鏃犳晥鏁版嵁鏍囪瘑锛堝璐熷�肩粍鍚堬級
-                if (value == 0xE2400001 || value > 0x7FFFFFFF)
+                Console.WriteLine($"[PARSER-DEBUG] 鍙屽瘎瀛樺櫒缁勫悎: [{registers[0]}, {registers[1]}] 鈫� 0x{value:X8} ({value})");
+                
+                // 妫�鏌ユ槸鍚︿负鏃犳晥鏁版嵁鏍囪瘑
+                if (IsInvalidData(registers, value))
                 {
-                    // 鍙兘鏄棤鏁堟暟鎹紝杩斿洖0鎴栦娇鐢ㄧ壒娈婃爣璇�
+                    Console.WriteLine($"[PARSER-DEBUG] 妫�娴嬪埌鏃犳晥鏁版嵁鏍囪瘑锛岃繑鍥�0");
                     return 0;
                 }
             }
             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]})");
                 }
             }
 
@@ -123,7 +127,9 @@
                 var scaledValue = value * config.Scale;
                 return Math.Round(scaledValue, config.DecimalPlaces);
             }
-
+            
+            // 濡傛灉娌℃湁閰嶇疆缂╂斁锛屾暣鏁版暟鎹粯璁よ繑鍥炲師濮嬪�硷紙涓嶅啀鑷姩搴旂敤灏忔暟杞崲锛�
+            // 鏍规嵁閰嶇疆鏂囦欢锛屾祴閲忔暟鎹凡缁忛厤缃簡Scale: 0.01锛屾墍浠ヤ細璧颁笂闈㈢殑鍒嗘敮
             return value;
         }
 
@@ -135,23 +141,27 @@
             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
                 {
-                    // 澶х锛氶珮瀛楄妭鍦ㄥ墠锛堥粯璁わ級
-                    // 娉ㄦ剰锛氭牴鎹疄闄匬LC鏁版嵁锛屽瓧鑺傞『搴忔槸鍙嶇殑
-                    var highByte = (byte)((register >> 8) & 0xFF);
-                    var lowByte = (byte)(register & 0xFF);
+                    // PLC瀛楃涓插瓨鍌ㄦ牸寮忥細瀵勫瓨鍣ㄥ�奸渶瑕佸瓧鑺傚弽搴忓鐞�
+                    // 渚嬪锛氬瘎瀛樺櫒0x6261涓紝0x62='b', 0x61='a'锛屼絾鏈熸湜杈撳嚭"ab"
+                    // 鍥犳闇�瑕佸厛杈撳嚭浣庡瓧鑺�'a'锛屽啀杈撳嚭楂樺瓧鑺�'b'
+                    var highByte = (byte)((register >> 8) & 0xFF);  // 瀹為檯鏄浜屼釜瀛楃
+                    var lowByte = (byte)(register & 0xFF);           // 瀹為檯鏄涓�涓瓧绗�
                     
-                    // 鍏堟坊鍔犱綆瀛楄妭锛屽啀娣诲姞楂樺瓧鑺傦紙閫傚簲PLC鐨勫瓧鑺傚簭锛�
+                    Console.WriteLine($"[PARSER-DEBUG] 瀵勫瓨鍣�0x{register:X4} 鈫� 浣庡瓧鑺�:'{(char)lowByte}' 楂樺瓧鑺�:'{(char)highByte}'");
+                    
+                    // 鎸夋湡鏈涢『搴忥細鍏堟坊鍔犱綆瀛楄妭锛屽啀娣诲姞楂樺瓧鑺�
                     if (lowByte != 0) bytes.Add(lowByte);
                     if (highByte != 0) bytes.Add(highByte);
                 }
@@ -163,7 +173,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>
@@ -208,20 +220,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>
@@ -241,12 +261,14 @@
 
         /// <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))
             {
@@ -256,8 +278,12 @@
                 var highByte = (byte)((register >> 8) & 0xFF);
                 var lowByte = (byte)(register & 0xFF);
 
-                // 鎸塒LC鏁版嵁鏍煎紡娣诲姞瀛楃锛堝厛浣庡瓧鑺傦紝鍚庨珮瀛楄妭锛�
-                // 妫�鏌ユ槸鍚︿负鏁板瓧瀛楃锛圓SCII 48-57, '0'-'9'锛�
+                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);
@@ -269,6 +295,7 @@
             }
 
             var result = new string(chars.ToArray());
+            Console.WriteLine($"[PARSER-DEBUG] 鏃堕棿鎴宠В鏋愮粨鏋�: '{result}'");
             return result;
         }
 
@@ -327,6 +354,45 @@
         #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;
+            }
+            
+            // 3. 鐗瑰畾鐨勯敊璇爜妯″紡锛欵240xxxx
+            if ((combinedValue & 0xFFFF0000) == 0xE2400000)
+            {
+                Console.WriteLine($"[PARSER-DEBUG] 妫�娴嬪埌E240閿欒鐮佹ā寮�: 0x{combinedValue:X8}");
+                return true;
+            }
+            
+            // 4. 妫�鏌ユ槸鍚︿负鍏稿瀷鐨勯敊璇粍鍚堬細绗竴涓瘎瀛樺櫒涓哄ぇ璐熸暟锛堝-7616锛夛紝绗簩涓负灏忔鏁�
+            if (registers.Length >= 2 && registers[0] == -7616 && registers[1] == 1)
+            {
+                Console.WriteLine($"[PARSER-DEBUG] 妫�娴嬪埌鐗瑰畾閿欒妯″紡: [{registers[0]}, {registers[1]}]");
+                return true;
+            }
+            
+            return false;
+        }
+
+        /// <summary>
         /// 鑾峰彇鏁版嵁绫诲瀷鐨勯粯璁ゅ��
         /// </summary>
         /// <param name="dataType">鏁版嵁绫诲瀷瀛楃涓�</param>
diff --git a/config/modbus_config.json b/config/modbus_config.json
index dc07a58..0a3b1f4 100644
--- a/config/modbus_config.json
+++ b/config/modbus_config.json
@@ -1,15 +1,15 @@
 {
   "ConfigVersion": "1.0",
-  "ProjectName": "GSModbus閫氱敤閰嶇疆",
-  "Description": "閫氱敤Modbus TCP閫氫俊閰嶇疆鏂囦欢",
-  
+  "ProjectName": "娑﹁揪椤圭洰",
+  "Description": "娑﹁揪椤圭洰TCP閫氫俊閰嶇疆鏂囦欢",
+
   "Connection": {
-    "IpAddress": "192.168.3.250",
+    "IpAddress": "192.168.1.231",
     "Port": 502,
     "ConnectionTimeoutMs": 5000,
     "OperationTimeoutMs": 3000
   },
-  
+
   "Communication": {
     "HeartbeatIntervalMs": 1000,
     "DataPollingIntervalMs": 500,
@@ -17,7 +17,7 @@
     "ReconnectDelayMs": 3000,
     "MaxRetryCount": 3
   },
-  
+
   "OutputAddresses": {
     "Description": "MES鍙戦�佺粰PLC鐨勫湴鍧�閰嶇疆",
     "HeartbeatAddress": {
@@ -27,11 +27,11 @@
     },
     "DataConfirmationAddress": {
       "Address": 6001,
-      "DataType": "Byte", 
+      "DataType": "Byte",
       "Description": "MES鏁版嵁璇诲彇纭鍦板潃"
     }
   },
-  
+
   "InputAddresses": {
     "Description": "浠嶱LC璇诲彇鐨勫湴鍧�閰嶇疆",
     "ControlSignals": {
@@ -50,7 +50,7 @@
         "Description": "PLC鏁版嵁鍑嗗灏辩华淇″彿"
       }
     },
-    
+
     "ProductData": {
       "ProductModel": {
         "Address": 6004,
@@ -90,13 +90,13 @@
         "Address": 6026,
         "DataType": "Timestamp",
         "Length": 7,
-        "Format": "YYYYMMDDHHMMSS",
+        "Format": "YYYYMMDDHHMM",
         "Encoding": "BigEndian",
         "DisplayName": "璁板綍鏃堕棿",
-        "Description": "鏁版嵁璁板綍鏃堕棿鎴�"
+        "Description": "鏁版嵁璁板綍鏃堕棿鎴筹紝澶х妯″紡瀛樺偍锛屼竴涓瓧鑺備袱涓瓧绗︼紝鏍煎紡锛氬勾鏈堟棩鏃跺垎锛�12浣嶏級"
       }
     },
-    
+
     "MeasurementData": {
       "MinInstallSize": {
         "Address": 6033,
@@ -123,7 +123,7 @@
         "DataType": "Integer",
         "Length": 2,
         "Scale": 0.01,
-        "Unit": "mm", 
+        "Unit": "mm",
         "DecimalPlaces": 2,
         "DisplayName": "琛岀▼",
         "Description": "鎵ц鍣ㄨ绋嬫祴閲忓��"
@@ -180,7 +180,7 @@
       }
     }
   },
-  
+
   "DataTypes": {
     "Description": "鏀寔鐨勬暟鎹被鍨嬪畾涔�",
     "Byte": "鍗曞瓧鑺傛暟鍊� (0-255)",
@@ -190,7 +190,7 @@
     "Float": "娴偣鏁�",
     "Boolean": "甯冨皵鍊�"
   },
-  
+
   "UI": {
     "WindowTitle": "GSModbus - 閫氱敤MES涓嶱LC閫氫俊绯荤粺",
     "AutoStartPolling": false,
@@ -201,7 +201,7 @@
   "Database": {
     "Enabled": true,
     "Type": "Oracle",
-    "ConnectionString": "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.92)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = ORCL))); Persist Security Info=True;User ID = lts_dev; Password=ltsdev",
+    "ConnectionString": "Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.223)(PORT = 1521))(CONNECT_DATA = (SERVICE_NAME = ORCL))); Persist Security Info=True;User ID = rdmes_dev; Password=rdmesdev",
     "AutoCreateTables": true,
     "DataRetentionDays": 90,
     "Tables": {
diff --git a/config/production_config.json b/config/production_config.json
index 5bae258..f506b7e 100644
--- a/config/production_config.json
+++ b/config/production_config.json
@@ -94,10 +94,10 @@
         "Address": 6026,
         "DataType": "Timestamp",
         "Length": 7,
-        "Format": "YYYYMMDDHHMMSS",
+        "Format": "YYYYMMDDHHMM",
         "Encoding": "BigEndian",
         "DisplayName": "璁板綍鏃堕棿",
-        "Description": "鏁版嵁璁板綍鏃堕棿鎴筹紝澶х妯″紡瀛樺偍锛屼竴涓瓧鑺備袱涓瓧绗︼紝鏍煎紡锛氬勾鏈堟棩鏃跺垎绉�"
+        "Description": "鏁版嵁璁板綍鏃堕棿鎴筹紝澶х妯″紡瀛樺偍锛屼竴涓瓧鑺備袱涓瓧绗︼紝鏍煎紡锛氬勾鏈堟棩鏃跺垎锛�12浣嶏級"
       }
     },
 
diff --git "a/\345\216\237\345\247\213\345\200\274.txt" "b/\345\216\237\345\247\213\345\200\274.txt"
index c197d8c..ae66de8 100644
--- "a/\345\216\237\345\247\213\345\200\274.txt"
+++ "b/\345\216\237\345\247\213\345\200\274.txt"
@@ -1,7 +1,70 @@
 锘�--鍘熷鍊�
-{"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]}
+{"PlcHeartbeat":[0],"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
+澶х妯″紡锛屼綆瀛楄妭瀛樺湪楂樺湴鍧�锛岃В鏋愭椂楂樹綆鍦板潃瑕侀鍊掍竴涓�
+D6026   12338 -> 20
+D6027   13618 -> 25
+D6028   14128 -> 07
+D6029   14641 -> 19
+D6030   13105 -> 13
+D6031   12340 -> 40
+D6032   0 -> 
+
+
+//鏂囨。涓殑璇存槑
+璁板綍鏃堕棿  鏁版嵁闀垮害涓�7 澶х妯″紡瀛樺偍锛屼竴涓瓧鑺備袱涓瓧绗︺�傚勾鏈堟棩鏃跺垎绉掞紝渚嬧��20250718105959鈥�
+D6026	璁板綍鏃堕棿B1
+D6027	璁板綍鏃堕棿B2
+D6028	璁板綍鏃堕棿B3
+D6029	璁板綍鏃堕棿B4
+D6030	璁板綍鏃堕棿B5
+D6031	璁板綍鏃堕棿B6
+D6032	璁板綍鏃堕棿B7
+
+鏈�灏忓畨瑁呭昂瀵�  鏁版嵁闀垮害涓�2  榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45 
+D6033 D6034	 
+
+鏈�澶у畨瑁呭昂瀵�	鏁版嵁闀垮害涓�2  榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45 
+D6035 D6036	
+
+琛岀▼ 鏁版嵁闀垮害涓�2  榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45
+D6037 D6038	
+
+閫熷害 鏁版嵁闀垮害涓�2  榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45
+D6039 D6040	
+
+宸ヤ綔鐢靛帇 鏁版嵁闀垮害涓�2  榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45
+D6041 D6042
+
+宸ヤ綔鐢垫祦 鏁版嵁闀垮害涓�2  榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45
+D6043 D6044	
+
+宸ヤ綔鍘嬪姏 鏁版嵁闀垮害涓�2 榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45
+D6045 D6046	
+
+涓婂崌闇嶅皵 鏁版嵁闀垮害涓�2 榛樿涓や釜灏忔暟鐐癸細渚嬶細鏀跺埌12345搴斾负123.45
+D6047 D6048	
+
+
+鎺у埗鍙板疄闄呰В鏋�
+馃搳 [鏁版嵁 #6] 08:55:24.329
+   鎺у埗淇″彿:
+     鈥� PLC蹇冭烦: 0
+     鈥� 鏁版嵁灏辩华: 1
+   浜у搧鏁版嵁:
+     鈥� 浜у搧鍨嬪彿: abcdefghij1234567890
+     鈥� 娴嬭瘯宸ヤ綅: 1
+     鈥� 浜у搧鐮�: abcdefghij1234567890
+     鈥� 娴嬭瘯缁撴灉: 鍚堟牸
+     鈥� 璁板綍鏃堕棿: 0001-01-01 00:00:00
+   娴嬮噺鏁版嵁:
+     鈥� 鏈�灏忓畨瑁呭昂瀵�: 0 mm
+     鈥� 鏈�澶у畨瑁呭昂瀵�: 0 mm
+     鈥� 琛岀▼: 0 mm
+     鈥� 閫熷害: 0 mm/s
+     鈥� 宸ヤ綔鐢靛帇: 0 V
+     鈥� 宸ヤ綔鐢垫祦: 0 A
+     鈥� 宸ヤ綔鍘嬪姏: 0 bar
+     鈥� 涓婂崌闇嶅皵浼犳劅鍣�: 0
+
+

--
Gitblit v1.9.3