南向采集通道决策方案
- BACnet 通道
- OPC UA 通道
- Modbus 通道
- 多设备并发轮询架构
目标:
✔ 通道状态真实反映链路健康度 ✔ 单设备异常不误判通道 ✔ 避免抖动 ✔ 可量化 ✔ 可用于前端展示(Excellent / Good / Degraded / Offline)
一、设计原则
- 通道状态 ≠ 单设备状态
- 必须基于统计窗口
- 必须具备抗抖动能力
- 必须支持恢复提升
- 必须支持趋势衰减
二、状态分级定义
通道状态共四级:
| 状态 | 语义 | 业务解释 |
|---|---|---|
| Excellent | 极佳 | 几乎无错误 |
| Good | 正常 | 少量异常 |
| Degraded | 退化 | 明显异常 |
| Offline | 不可用 | 通道失效 |
三、统计模型设计
通道状态由以下 5 个核心指标计算:
1️⃣ 成功率 (Success Rate)
successRate = 成功次数 / 总请求次数
统计窗口:最近 N 秒(建议 60 秒滑动窗口)
2️⃣ 平均响应时间 (Avg Latency)
avgLatency = Σ响应时间 / 成功次数
单位:ms
3️⃣ 超时比例 (Timeout Ratio)
timeoutRatio = 超时次数 / 总请求次数
4️⃣ 设备在线比例 (Online Ratio)
onlineRatio = 在线设备数 / 总设备数
5️⃣ 连续失败计数 (Consecutive Failures)
用于快速判断 Offline。
四、状态裁决阈值模型
建议工业级阈值如下:
Excellent
必须同时满足:
successRate ≥ 99%
avgLatency ≤ 200ms
timeoutRatio ≤ 1%
onlineRatio ≥ 98%
Good
successRate ≥ 95%
avgLatency ≤ 500ms
timeoutRatio ≤ 5%
onlineRatio ≥ 90%
Degraded
successRate ≥ 80%
OR avgLatency > 500ms
OR timeoutRatio > 5%
OR onlineRatio < 90%
Offline
任意满足:
successRate < 50%
OR onlineRatio == 0
OR 连续失败 ≥ 阈值 (建议 10 次)
OR 通道通信层错误
五、评分加权模型(推荐实现)
为避免简单 if-else 带来的跳变问题,推荐采用加权评分。
1️⃣ 评分模型
定义总分 100 分。
成功率权重 40%
score_success = successRate * 40
延迟权重 20%
avgLatency ≤ 200ms → 20分
200-500ms → 15分
500-1000ms → 8分
>1000ms → 0分
超时比例 15%
timeoutRatio ≤1% → 15分
≤5% → 10分
≤10% → 5分
>10% → 0分
在线率 20%
onlineRatio * 20
连续失败惩罚 5%
if consecutiveFailures > 5:
score -= 10
2️⃣ 状态映射
| 总分 | 状态 |
|---|---|
| ≥90 | Excellent |
| ≥75 | Good |
| ≥50 | Degraded |
| <50 | Offline |
六、防抖机制(必须实现)
工业系统不能频繁跳状态。
1️⃣ 滞后判定机制
- 升级需要连续满足 3 次判断
- 降级立即生效
示例:
Degraded → Good
必须连续 3 个周期评分 ≥75
2️⃣ 状态保持时间
每个状态最小保持时间:
| 状态 | 最小保持 |
|---|---|
| Excellent | 10s |
| Good | 10s |
| Degraded | 5s |
| Offline | 3s |
七、快速离线检测机制
不能完全依赖滑动窗口。
增加快速判定:
if 连续失败 ≥ 10:
立即 Offline
恢复条件:
连续成功 ≥ 5 次
八、完整裁决流程
采集完成 →
更新统计 →
计算窗口指标 →
计算评分 →
应用快速失败规则 →
应用滞后规则 →
更新通道状态 →
上报UI/API
九、时间窗口设计
推荐:
滑动窗口 = 60秒
刷新周期 = 5秒
每 5 秒重新计算一次状态。
十、工业级边界场景处理
场景 1:单设备离线
若:
总设备 100 台
1 台离线
onlineRatio = 99%
状态仍应为:
Excellent
场景 2:部分网络抖动
若:
成功率 92%
应为:
Good
而不是 Offline。
场景 3:全部设备超时
立即:
Offline
而不是等待 60 秒窗口结束。
十一、示例伪代码
func EvaluateChannel(metrics Metrics) ChannelState {
if metrics.ConsecutiveFailures >= 10 {
return Offline
}
score := 0
score += int(metrics.SuccessRate * 40)
score += latencyScore(metrics.AvgLatency)
score += timeoutScore(metrics.TimeoutRatio)
score += int(metrics.OnlineRatio * 20)
if metrics.ConsecutiveFailures > 5 {
score -= 10
}
switch {
case score >= 90:
return Excellent
case score >= 75:
return Good
case score >= 50:
return Degraded
default:
return Offline
}
}
十二、API输出结构建议
{
"channelId": "modbus-1",
"state": "Excellent",
"score": 96,
"successRate": 0.998,
"avgLatency": 120,
"timeoutRatio": 0.002,
"onlineRatio": 1.0
}
十三、与设备状态解耦原则
重要:
- 设备状态用于采集逻辑
- 通道状态用于链路健康度
二者不能混用。
十四、工业级设计总结
一个合格的工业级通道裁决算法必须:
✔ 基于统计 ✔ 具备评分模型 ✔ 支持快速离线 ✔ 支持抗抖动 ✔ 可量化 ✔ 可解释
后续优化改进方向:
- ✅ 通道+设备双层裁决融合方案