在保持 simonvetter/modbus 底层库不变的前提下,通过上层封装实现智能调度与自适应机制。
- TransportLayer: 负责 TCP 连接管理、长连接维护、心跳保活、自动重连(基于 simonvetter 库封装)。
- SmartScheduler: 负责自适应调度、批量优化、地址合并、流量控制。
- ProtocolEngine: 负责数据编解码、零拷贝解析、类型转换。
- ReliabilityManager: 负责熔断保护、故障恢复、智能探测。
- MetricsCollector: 负责全维度指标监控与统计。
- 单一长连接:
- 每个采集通道(Channel)仅维护一个
modbus.Client实例。 - 所有下属设备(Device)共享此连接,通过
SetSlaveID切换上下文。 - 禁用
simonvetter库内部的自动重连(如果可能),或在上层实现更精细的退避策略。
- 每个采集通道(Channel)仅维护一个
- 指数退避重连:
- 在
Transport层封装Connect方法。 - 失败时执行退避:
wait = min(max_wait, base * 2^retry_count)。 - 初始间隔 1s,最大 300s。
- 在
- MTU 探测:
- 连接建立后,二分法尝试读取 [32, 125] 个寄存器。
- 确定当前链路的最大 PDU 长度,设置
MaxBatchSize。
- 有效区间探测:
- 基于配置的点位地址,向前后尝试读取,构建
ValidAddressMap。 - 避免无效地址导致的读取失败。
- 基于配置的点位地址,向前后尝试读取,构建
- 响应时间建模:
- 记录不同
BatchSize下的 RTT。 - 用于调度器决策最佳批量大小。
- 记录不同
- AIMD 算法:
- 动态调整
BatchSize。 - 成功率 > 95% 且延迟低 ->
BatchSize += 8。 - 失败或超时 ->
BatchSize *= 0.75。
- 动态调整
- 动态合并:
- 对排序后的点位进行分组。
Gap <= DynamicThreshold时合并请求。
- 零拷贝实现:
- 直接操作
[]byte,使用binary.BigEndian。 - 避免
bytes.Reader和切片拷贝。
- 直接操作
- 全类型支持:
- 优化所有 16 种数据格式的解析路径。
- 动态采集间隔:
- 目标负载率 30%-50%。
NextInterval根据LastDuration动态计算。
- 背压控制:
- 数据处理队列积压时,主动延长采集间隔。
- 点位级: 连续 3 次失败 -> 熔断 5 分钟。
- 设备级: 失败率 > 50% -> 降级模式。
- Counter:
tx_total,rx_total,errors_total. - Gauge:
connected,latency,batch_size. - Histogram:
response_time.
ModbusDriver内部结构调整,引入Transport和Scheduler接口。- 配置文件
DriverConfig增加优化参数(默认关闭或自动模式)。
- 完全兼容现有
channels.yaml。 - 如果需要可以增加 Modbus-TCP 配置项目(那么UI也需要调整)
- 对外 API 保持不变。