| | |
| | | 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 |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | try |
| | | { |
| | | // 先解析为字符串 |
| | | var timestampString = ParseString(registers, config); |
| | | // 时间戳数据需要特殊解析(数字字符) |
| | | var timestampString = ParseTimestampString(registers, config); |
| | | |
| | | if (string.IsNullOrEmpty(timestampString)) |
| | | { |
| | |
| | | #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) |