| ModbusManager.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| UniversalModbusManager.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| config/ModbusDataParser.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ModbusManager.cs
@@ -76,17 +76,17 @@ /// <summary> /// EasyModbus TCP客户端实例 /// </summary> private ModbusClient _modbusClient; private ModbusClient? _modbusClient; /// <summary> /// 心跳定时器 - 用于定期发送心跳包 /// </summary> private System.Timers.Timer _heartbeatTimer; private System.Timers.Timer? _heartbeatTimer; /// <summary> /// 数据轮询定时器 - 用于定期读取PLC数据 /// </summary> private System.Timers.Timer _dataPollingTimer; private System.Timers.Timer? _dataPollingTimer; /// <summary> /// 心跳包状态 - 在0和1之间交替 @@ -110,17 +110,17 @@ /// <summary> /// 连接状态改变事件 /// </summary> public event EventHandler<bool> ConnectionStatusChanged; public event EventHandler<bool>? ConnectionStatusChanged; /// <summary> /// 接收到PLC数据事件 /// </summary> public event EventHandler<PlcData> DataReceived; public event EventHandler<PlcData>? DataReceived; /// <summary> /// 错误发生事件 /// </summary> public event EventHandler<string> ErrorOccurred; public event EventHandler<string>? ErrorOccurred; #endregion @@ -340,7 +340,7 @@ // 检查PLC数据是否准备就绪 if (controlSignals[1] == 0) // DataOK信号为0表示数据未准备好 { return null; return new PlcData(); // 返回空的PlcData对象而不是null } // 读取产品型号 (10个寄存器) @@ -554,7 +554,11 @@ Disconnect(); // EasyModbus的ModbusClient没有实现IDisposable接口 _modbusClient = null; // 清理连接引用 if (_modbusClient != null) { _modbusClient = null; } _cancellationTokenSource?.Dispose(); } UniversalModbusManager.cs
@@ -363,13 +363,13 @@ LogWarning($"将在 {delay}ms 后尝试第 {_retryCount} 次重连"); Task.Delay(delay, _cancellationTokenSource.Token).ContinueWith(async _ => Task.Delay(delay, _cancellationTokenSource?.Token ?? CancellationToken.None).ContinueWith(async _ => { if (!_cancellationTokenSource.Token.IsCancellationRequested) if (!(_cancellationTokenSource?.Token.IsCancellationRequested ?? true)) { await ConnectAsync(); } }, _cancellationTokenSource.Token); }, _cancellationTokenSource?.Token ?? CancellationToken.None); } #endregion @@ -676,7 +676,7 @@ // 检测常见的错误码模式 if (registers.Length >= 2) { var combined = ((long)(registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF); var combined = ((long)((uint)registers[0] & 0xFFFF) << 16) | ((uint)registers[1] & 0xFFFF); if (combined == 0xE2400001) { LogInfo($"[PATTERN] 字段 '{fieldName}' 检测到已知的无效数据标识 0xE2400001"); @@ -739,7 +739,7 @@ /// <summary> /// 处理连接丢失 /// </summary> private async Task HandleConnectionLoss() private Task HandleConnectionLoss() { if (_isConnected) { @@ -754,6 +754,8 @@ ScheduleReconnect(); } } return Task.CompletedTask; } #endregion config/ModbusDataParser.cs
@@ -93,7 +93,7 @@ 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 { @@ -103,7 +103,7 @@ 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 @@ -115,13 +115,13 @@ 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); } } @@ -140,7 +140,7 @@ 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]})"); } }