3. HSMS 连接建立与断开模拟:T5/T6/T7/T8 定时器作用与连接状态机

HSMS(High-Speed SECS Message Services)是 SEMI E37 标准定义的 TCP/IP 通信协议,负责在主机(Host)与设备(Equipment)之间建立可靠的双向连接。本章聚焦 HSMS 连接的生命周期管理,深入解析四个关键定时器(T5/T6/T7/T8)的作用,以及连接状态机在 Not Connected、Connected、Selected 三个状态之间的转换逻辑。理解这些机制是设计通信容错方案的基础。

3.1 HSMS 连接状态机总览

HSMS 连接状态机定义了通信链路的三种基本状态,以及状态之间的合法转换路径。设备与主机各自维护独立的状态机,通过协议消息同步状态。

关键概念: HSMS 状态机是对称的——主机和设备都运行相同的状态机逻辑,但角色(主动/被动)不同。状态转换由定时器超时或收到特定消息触发。
HSMS 连接状态机(Not Connected / Connected / Selected) Not Connected 未连接 / 断开状态 Connected TCP 已连接,未选择 Selected 已选择,可收发数据 TCP 连接建立 T7 超时 / 断开 Select.req / Select.rsp T8 超时 / Deselect T6 超时 / 链路失败 状态转换触发条件: • 实线箭头:正常流程(TCP 连接 / Select 协商) • 虚线箭头:异常流程(定时器超时 / 断开 / 链路失败) • 所有状态均可因 T5 重试超时或物理断开直接进入 Not Connected

3.2 四大定时器:T5 / T6 / T7 / T8

HSMS 协议定义了四个关键定时器,用于控制连接建立、数据确认、连接空闲检测和选择状态维护。每个定时器都有明确的超时动作和容错含义。

定时器 默认值 触发位置 超时动作 容错意义
T5 10 s 连接建立阶段 重试 TCP 连接(最多 N 次) 防止连接请求无限阻塞,控制重试间隔
T6 5 s 数据事务等待回复 终止当前事务,断开连接 检测对端无响应,避免事务死锁
T7 10 s Connected 空闲状态 发送 Linktest.req,若 T7 再次超时则断开 检测连接活性,防止“死连接”残留
T8 5 s Selected 空闲状态 发送 Linktest.req,若 T8 再次超时则降级为 Connected 检测选择状态活性,避免虚假 Selected
常见误区: T7 和 T8 都用于链路检测,但 T7 在 Connected 状态触发,超时后直接断开连接;T8 在 Selected 状态触发,超时后先降级为 Connected,而不是立即断开。这种分层设计避免了因短暂网络抖动导致频繁断开。

3.3 T5 定时器:连接建立重试控制

T5 定时器在 Not Connected 状态启动,控制 TCP 连接请求的重试间隔。设备或主机在主动发起连接时,若连接请求失败或超时,会等待 T5 时长后再次尝试。

  • 启动时机: 发送 TCP SYN 包时启动。
  • 超时处理: 若 T5 超时仍未收到 SYN-ACK,则重试连接,重试次数由配置决定(通常 3~5 次)。
  • 容错设计: T5 防止了连接风暴——如果对端暂时不可用,T5 间隔避免了 CPU 和网络资源的浪费。
  • 典型场景: 设备启动时主机尚未就绪,设备每 10 秒重试一次,直到主机上线。
// T5 重试逻辑伪代码
int retryCount = 0;
while (retryCount < MAX_RETRY) {
    if (tcp_connect(host_ip, port) == SUCCESS) {
        state = CONNECTED;
        break;
    }
    sleep(T5_VALUE);  // 默认 10 秒
    retryCount++;
}
if (retryCount == MAX_RETRY) {
    log_error("T5 重试耗尽,连接失败");
    // 触发上层告警
}

3.4 T6 定时器:事务级响应超时

T6 定时器是 HSMS 中最严格的定时器,用于确保每个消息事务都能在预期时间内收到回复。一旦 T6 超时,意味着对端可能已经崩溃或网络中断,必须立即断开连接以释放资源。

最佳实践: T6 值应设置为略大于对端最大处理时间(通常 5 秒)。在半导体设备中,某些复杂指令(如远程 Job 下载)可能需要更长的处理时间,此时应适当增大 T6 或使用异步回复机制。
  • 启动时机: 发送需要回复的消息(如 S2F17、S6F11)时启动。
  • 超时处理: 立即断开 TCP 连接,状态回到 Not Connected,并记录事务 ID 用于诊断。
  • 容错意义: 防止事务堆积导致内存泄漏,快速失败让上层应用及时感知。

3.5 T7 与 T8 定时器:链路活性检测

T7 和 T8 是 HSMS 的“心跳”定时器,用于检测连接是否仍然有效。它们的区别在于作用状态和超时后果。

对比维度 T7(Connected 状态) T8(Selected 状态)
启动条件 进入 Connected 状态,且无消息收发 进入 Selected 状态,且无消息收发
超时动作 发送 Linktest.req,启动 T7 副本等待回复 发送 Linktest.req,启动 T8 副本等待回复
二次超时 断开连接 → Not Connected 降级为 Connected(不断开 TCP)
恢复机制 需重新建立 TCP 连接 可重新发起 Select 协商
适用场景 连接刚建立,尚未选择 正常通信中,检测选择状态
T7 / T8 定时器工作流程对比 T7 流程(Connected 状态) T7 超时 发送 Linktest.req 二次超时 断开 TCP 连接 T8 流程(Selected 状态) T8 超时 发送 Linktest.req 二次超时 降级为 Connected 关键差异总结: • T7 二次超时 → 断开连接(状态回到 Not Connected),需要重新建立 TCP 连接 • T8 二次超时 → 降级为 Connected(保留 TCP 连接),可重新发起 Select 协商 • 两者都使用 Linktest.req/rsp 消息进行活性探测,但超时后果不同

3.6 连接建立与断开模拟流程

下面通过一个完整的连接建立与断开模拟流程,展示状态机与定时器的协同工作。

3.6.1 正常连接建立流程

  1. Not Connected → Connected: 主动方(如设备)发起 TCP 连接,三次握手成功后进入 Connected 状态。
  2. Connected → Selected: 主动方发送 Select.req 消息,被动方回复 Select.rsp(状态码 0 表示成功),双方进入 Selected 状态。
  3. 数据通信: 在 Selected 状态下,双方可以自由收发 SECS-II 消息,T6 定时器监控每个事务的回复。
  4. 空闲检测: 若在 Selected 状态下长时间无消息,T8 定时器启动,定期发送 Linktest.req 保持活性。

3.6.2 异常断开模拟场景

异常场景 触发定时器 状态变化 恢复方式
对端进程崩溃 T6 超时 Selected → Not Connected T5 重试连接
网络闪断 T7 超时 Connected → Not Connected T5 重试连接
对端无响应但 TCP 未断开 T8 超时 Selected → Connected 重新 Select
连接请求被拒绝 T5 重试耗尽 Not Connected(持续) 人工干预或切换备用主机
容错设计要点: 在实现 HSMS 通信层时,必须为每个定时器设置合理的超时值,并实现超时后的状态回滚和重试逻辑。特别要注意 T6 超时后的资源清理——包括未完成的事务队列、临时缓冲区等,避免内存泄漏。

3.7 状态机实现中的常见陷阱

  • 状态不同步: 主机和设备的状态机可能因消息丢失而不同步。例如,主机认为处于 Selected 状态,但设备因 T8 超时已降级为 Connected。此时主机发送的数据消息会被设备拒绝(状态码 3:Not Selected)。
  • 定时器重置遗漏: 每次收到消息或发送消息时,必须重置 T7/T8 定时器。如果忘记重置,会导致不必要的 Linktest 请求或连接断开。
  • T5 重试风暴: 如果 T5 值设置过小(如 1 秒),且对端持续不可用,会导致大量 TCP 连接请求消耗系统资源。建议 T5 至少 5 秒,并限制最大重试次数。
  • 多连接冲突: 在同一个 TCP 连接上,不允许同时存在多个 Select 协商。必须等待前一个 Select 完成(成功或失败)后才能发起新的 Select。
// 状态机转换核心逻辑(简化版)
enum HSMS_STATE { NOT_CONNECTED, CONNECTED, SELECTED };

void on_tcp_connected() {
    state = CONNECTED;
    start_timer(T7, T7_VALUE);
}

void on_select_rsp(uint8_t status) {
    if (status == 0) {
        state = SELECTED;
        stop_timer(T7);
        start_timer(T8, T8_VALUE);
    } else {
        // Select 被拒绝,保持在 Connected
        state = CONNECTED;
    }
}

void on_t6_timeout(uint32_t transaction_id) {
    log_error("T6 timeout for transaction %d", transaction_id);
    cleanup_transaction(transaction_id);
    disconnect_tcp();
    state = NOT_CONNECTED;
    start_timer(T5, T5_VALUE);  // 自动重连
}

void on_t8_timeout() {
    if (state == SELECTED) {
        send_linktest_req();
        // 若二次超时,降级
        if (linktest_retry_count++ >= 1) {
            state = CONNECTED;
            stop_timer(T8);
            start_timer(T7, T7_VALUE);
            linktest_retry_count = 0;
        }
    }
}

3.8 本章小结

HSMS 连接状态机与 T5/T6/T7/T8 定时器共同构成了半导体设备通信的可靠性基石。理解每个定时器的触发条件、超时动作和状态转换影响,是设计健壮通信容错机制的前提。在实际项目中,建议通过状态机日志和定时器监控面板来可视化连接状态,便于调试和故障定位。