啊鑫
2025-07-26 a8cc46897af0ec2f9d5ae0cb7a27798ba300e9bb
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));
                    // 注意:根据实际PLC数据,字节顺序是反的
                    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>
        /// 解析时间戳字符串(针对数字字符数据)
        /// </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);
                // 按PLC数据格式添加字符(先低字节,后高字节)
                // 检查是否为数字字符(ASCII 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>
        /// 解析YYYYMMDDHHMMSS格式的时间戳
        /// </summary>
        private static DateTime ParseTimestampYYYYMMDDHHMMSS(string timestampString)