Skip to the content.

南向采集通道决策方案

目标:

✔ 通道状态真实反映链路健康度 ✔ 单设备异常不误判通道 ✔ 避免抖动 ✔ 可量化 ✔ 可用于前端展示(Excellent / Good / Degraded / Offline)


一、设计原则

  1. 通道状态 ≠ 单设备状态
  2. 必须基于统计窗口
  3. 必须具备抗抖动能力
  4. 必须支持恢复提升
  5. 必须支持趋势衰减

二、状态分级定义

通道状态共四级:

状态 语义 业务解释
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️⃣ 滞后判定机制

示例:

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
}

十三、与设备状态解耦原则

重要:

二者不能混用。


十四、工业级设计总结

一个合格的工业级通道裁决算法必须:

✔ 基于统计 ✔ 具备评分模型 ✔ 支持快速离线 ✔ 支持抗抖动 ✔ 可量化 ✔ 可解释


后续优化改进方向: