| | |
| | | } |
| | | else |
| | | { |
| | | // 对于测量数据的特殊处理:PLC数采方确认的数据格式 |
| | | // 测量数据使用小端组合后除以10的特殊编码方式 |
| | | // 例如:[-7616, 1] → 小端组合得到123456 → 除以10得到12345 |
| | | if (registers.Length >= 2) |
| | | { |
| | | // 先按小端方式组合(即使配置不是littleendian) |
| | | long littleEndianValue = (registers[0] & 0xFFFF) | ((long)(registers[1] & 0xFFFF) << 16); |
| | | |
| | | // 检查是否需要特殊的除以10处理(针对测量数据) |
| | | if (littleEndianValue > 100000) // 6位数或更多,可能需要除以10 |
| | | { |
| | | long dividedValue = littleEndianValue / 10; |
| | | Console.WriteLine($"[PARSER-DEBUG] 测量数据特殊处理: [{registers[0]}, {registers[1]}] → 小端组合={littleEndianValue} → 除以10={dividedValue}"); |
| | | value = dividedValue; |
| | | } |
| | | else |
| | | { |
| | | // PLC默认使用大端格式进行多寄存器组合:高位寄存器在前,低位寄存器在后 |
| | | value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // PLC默认使用大端格式进行多寄存器组合:高位寄存器在前,低位寄存器在后 |
| | | value = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF); |
| | | } |
| | | } |
| | | |
| | | Console.WriteLine($"[PARSER-DEBUG] 双寄存器组合: [{registers[0]}, {registers[1]}] → 0x{value:X8} ({value})"); |
| | |
| | | return true; |
| | | } |
| | | |
| | | // 3. 特定的错误码模式:E240xxxx |
| | | 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; |
| | | } |
| | | // 注意:移除了对[-7616, 1]的错误判断,因为PLC数采方确认这是有效数据,应解析为12345 |
| | | |
| | | return false; |
| | | } |