4. 轮询策略核心概念:轮询周期、轮询队列、轮询优先级、轮询超时与重试机制
在 SECS/GEM 数据采集系统中,轮询策略决定了主机(Host)如何高效、有序地从设备端获取 SVID(状态变量)。一个设计不良的轮询策略会导致网络拥塞、数据延迟或关键变量丢失。本章深入剖析构成轮询策略的四个核心概念:轮询周期、轮询队列、轮询优先级以及轮询超时与重试机制。
核心观点: 优秀的轮询策略不是“越快越好”,而是在“数据实时性”与“系统负载”之间找到最佳平衡点。理解这四个概念是进行策略优化的前提。
4.1 轮询周期 (Polling Cycle)
轮询周期定义了主机连续两次向设备请求同一个 SVID 的时间间隔。它是轮询策略中最基础的参数,直接决定了数据采集的粒度。
- 固定周期: 无论设备状态如何,始终以恒定间隔轮询。实现简单,但效率较低。
- 动态周期: 根据设备状态、数据变化率或系统负载自动调整间隔。例如,在设备处于“运行”状态时缩短周期,在“待机”状态时延长周期。
实战建议: 对于温度、压力等缓慢变化的模拟量,建议使用 1-5 秒的周期;对于晶圆计数、报警状态等离散量,建议使用 0.5-1 秒的周期。切勿对所有 SVID 使用相同的周期。
4.2 轮询队列 (Polling Queue)
轮询队列是主机端用于管理待轮询 SVID 列表的数据结构。它决定了 SVID 被轮询的顺序和并发度。常见的队列模型包括:
| 队列模型 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| FIFO (先进先出) | 按注册顺序依次轮询 | 实现简单,公平性好 | 无法区分紧急程度 |
| 优先级队列 | 高优先级 SVID 始终优先被轮询 | 保证关键数据实时性 | 低优先级可能被饿死 |
| 时间片轮转 | 每个 SVID 分配固定时间片,超时则切换 | 避免单个 SVID 阻塞队列 | 上下文切换开销较大 |
避坑指南: 当队列中 SVID 数量超过 50 个时,单纯的 FIFO 模型会导致严重的“头部阻塞”问题。建议采用“优先级 + 时间片”的混合队列模型。
4.3 轮询优先级 (Polling Priority)
轮询优先级为每个 SVID 分配一个等级,用于在资源有限时决定哪些数据必须优先采集。优先级通常分为 3 级或 5 级。
- 高优先级 (Critical): 报警、急停、安全互锁等与安全相关的 SVID。必须立即响应,周期通常 < 200ms。
- 中优先级 (Important): 工艺参数、设备状态等影响产品质量的 SVID。周期通常 500ms ~ 2s。
- 低优先级 (Normal): 统计信息、日志、非关键状态。周期通常 > 5s,可在系统空闲时采集。
优先级反转问题: 当低优先级任务持有高优先级任务所需的资源时,会导致高优先级任务被阻塞。在轮询系统中,应避免 SVID 之间存在资源依赖关系,或使用优先级继承协议解决。
4.4 轮询超时与重试机制
在 SECS/GEM 通信中,网络波动或设备繁忙可能导致轮询请求失败。超时与重试机制是保证数据采集可靠性的最后一道防线。
4.4.1 超时定义
- T3 超时 (Reply Timeout): 主机发送请求后,等待设备回复的最长时间。通常设置为 5~10 秒。
- T5 超时 (Connect Timeout): 建立 TCP 连接的超时时间。通常设置为 10~30 秒。
- T6 超时 (Control Transaction Timeout): 控制事务(如 S1F13/F14)的超时时间。通常设置为 5~15 秒。
4.4.2 重试策略
| 策略 | 描述 | 适用场景 |
|---|---|---|
| 固定间隔重试 | 每次重试间隔相同时间(如 2s) | 网络稳定,偶发丢包 |
| 指数退避重试 | 重试间隔逐次加倍(如 1s, 2s, 4s, 8s) | 网络拥塞或设备过载 |
| 快速失败 | 重试 N 次后放弃,上报异常 | 关键数据,避免无限等待 |
重要提醒: 重试次数不宜过多(建议 3~5 次),否则会加剧网络拥塞。每次重试前应检查设备连接状态,避免在断连状态下盲目重试。
4.5 实战配置示例
以下是一个基于 SECS/GEM 协议的轮询策略配置文件示例,展示了如何将上述四个概念组合使用:
{
"polling_strategy": {
"queue_model": "priority_time_slice",
"time_slice_ms": 100,
"max_retries": 3,
"retry_interval_ms": 1000,
"retry_backoff": "exponential",
"timeout": {
"t3_ms": 5000,
"t5_ms": 15000,
"t6_ms": 10000
},
"svid_list": [
{"id": 101, "name": "Alarm_Status", "priority": 1, "period_ms": 200},
{"id": 201, "name": "Chamber_Temp", "priority": 2, "period_ms": 1000},
{"id": 301, "name": "Recipe_Step", "priority": 2, "period_ms": 500},
{"id": 401, "name": "Cumulative_Count", "priority": 3, "period_ms": 10000}
]
}
}
优化要点: 在实际项目中,建议将轮询策略参数(如周期、超时、重试次数)设计为可动态调整的配置项,而非硬编码。这样可以在不重启系统的情况下,根据现场网络状况进行实时调优。