| | |
| | | /// <param name="groupName">组名称(用于日志)</param> |
| | | private async Task ReadFieldGroup(DynamicModbusData dynamicData, Dictionary<string, DataField> fieldGroup, string groupName) |
| | | { |
| | | if (_modbusClient == null) return; |
| | | if (_modbusClient == null) |
| | | { |
| | | LogWarning($"Modbus客户端为null,无法读取 {groupName}"); |
| | | return; |
| | | } |
| | | |
| | | if (!_isConnected) |
| | | { |
| | | LogWarning($"Modbus未连接,无法读取 {groupName}"); |
| | | return; |
| | | } |
| | | |
| | | if (fieldGroup == null || fieldGroup.Count == 0) |
| | | { |
| | | LogDebug($"{groupName} 没有配置字段,跳过读取"); |
| | | return; |
| | | } |
| | | |
| | | foreach (var kvp in fieldGroup) |
| | | { |
| | |
| | | |
| | | try |
| | | { |
| | | // 检查Modbus客户端状态 |
| | | if (_modbusClient == null || !_modbusClient.Connected) |
| | | { |
| | | LogWarning($"Modbus客户端未连接,跳过字段 '{fieldName}'"); |
| | | continue; |
| | | } |
| | | |
| | | // 读取原始寄存器数据 |
| | | var registers = await Task.Run(() => |
| | | _modbusClient.ReadHoldingRegisters(fieldConfig.Address, fieldConfig.Length)); |
| | | |
| | | // 检查读取结果是否为null |
| | | if (registers == null) |
| | | { |
| | | LogWarning($"字段 '{fieldName}' 读取结果为null,地址: {fieldConfig.Address}, 长度: {fieldConfig.Length}"); |
| | | continue; |
| | | } |
| | | |
| | | // 验证数据长度 |
| | | if (!ModbusDataParser.ValidateRegisterLength(registers, fieldConfig)) |
| | | { |
| | | LogWarning($"字段 '{fieldName}' 的数据长度不足:期望{fieldConfig.Length},实际{registers.Length}"); |
| | | LogWarning($"字段 '{fieldName}' 的数据长度不足:期望{fieldConfig.Length},实际{registers?.Length ?? 0}"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | catch (Exception ex) |
| | | { |
| | | LogError($"读取字段 '{fieldName}' 失败: {ex.Message}"); |
| | | |
| | | // 记录详细错误信息 |
| | | await _databaseManager?.LogErrorAsync( |
| | | "FieldReadError", |
| | | $"读取字段 '{fieldName}' 失败: {ex.Message}", |
| | | ex, |
| | | ErrorSeverity.Medium)!; |
| | | |
| | | // 继续读取其他字段 |
| | | } |
| | | } |