111
啊鑫
2025-08-01 cd32500504c97874c8fc0f8ceb1ac58f3cb37b01
111
已修改3个文件
42 ■■■■■ 文件已修改
ModbusManager.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UniversalModbusManager.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/ModbusDataParser.cs 10 ●●●● 补丁 | 查看 | 原始文档 | 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]})");
                }
            }