| | |
| | | if (config.Encoding?.ToLower() == "littleendian") |
| | | { |
| | | // 小端:低位寄存器在前,高位寄存器在后 |
| | | value = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16); |
| | | value = ((uint)registers[0] & 0xFFFF) | ((long)((uint)registers[1] & 0xFFFF) << 16); |
| | | } |
| | | else |
| | | { |
| | |
| | | if (registers.Length >= 2) |
| | | { |
| | | // 先按小端方式组合(即使配置不是littleendian) |
| | | long littleEndianValue = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16); |
| | | long littleEndianValue = ((uint)registers[0] & 0xFFFF) | ((long)((uint)registers[1] & 0xFFFF) << 16); |
| | | |
| | | // 检查是否需要特殊的除以10处理(针对测量数据) |
| | | if (littleEndianValue > 100000) // 6位数或更多,可能需要除以10 |
| | |
| | | else |
| | | { |
| | | // PLC默认使用大端格式进行多寄存器组合:高位寄存器在前,低位寄存器在后 |
| | | value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF); |
| | | value = ((long)((uint)registers[0] & 0xFFFF) << 16) | ((uint)registers[1] & 0xFFFF); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // PLC默认使用大端格式进行多寄存器组合:高位寄存器在前,低位寄存器在后 |
| | | value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF); |
| | | value = ((long)((uint)registers[0] & 0xFFFF) << 16) | ((uint)registers[1] & 0xFFFF); |
| | | } |
| | | } |
| | | |
| | |
| | | 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); |
| | | value = (value << 16) | ((uint)registers[i] & 0xFFFF); |
| | | Console.WriteLine($"[PARSER-DEBUG] 步骤{i+1}: 0x{value:X} (寄存器{i}: {registers[i]})"); |
| | | } |
| | | } |