3. HSMS通信协议深入

HSMS(High-Speed SECS Message Services)是SEMI E37标准定义的通信协议,用于在TCP/IP之上承载SECS-II消息。与老式的SECS-I串行通信相比,HSMS把通信角色划分为Active(主动方)和Passive(被动方):Active端主动发起TCP连接,Passive端监听端口等待连接。理解HSMS的关键,在于掌握它独立于SECS-II消息之外的一套控制会话机制——连接建立、心跳保活、优雅分离,以及围绕这些机制展开的TCP/IP参数配置与故障排查。

一、连接建立:Select.req / Select.rsp 握手

TCP三次握手成功只代表链路通了,并不代表HSMS会话可用。HSMS要求在TCP连接之上再做一次Select握手,双方确认彼此可以开始交换SECS-II消息。流程如下:

  1. Active端建立TCP连接后,发送 Select.req(S1F1之外的独立控制消息,SessionID通常为0xFFFF)。
  2. Passive端收到后,若自身状态允许,回复 Select.rsp,其中SelectStatus=0表示接受,非0表示拒绝(如1=已在使用,2=不支持,3=已连接)。
  3. 双方进入Selected(已选择)状态,此后才允许发送Data消息(如S1F1、S2F13等)。

需要特别注意:Select.req/rsp 是HSMS控制消息,不是SECS-II消息,它们没有SxFy编号,属于E37定义的独立消息类型。设备端(Passive)在收到Select.req之前,即使TCP已连接,也不能发送任何Data消息,否则主机可能直接丢弃或报协议错误。

二、心跳保活:Linktest.req / Linktest.rsp

HSMS连接可能因网络中断、对端进程崩溃、防火墙超时而“假死”——TCP层未感知断开,但实际已无法通信。为此E37定义了Linktest机制:

  • 任一方可周期性发送 Linktest.req,对端必须回复 Linktest.rsp。
  • 若在T7(Not Selected Timeout)或自定义心跳超时内未收到响应,则判定链路失效,主动断开并尝试重连。
  • 心跳周期通常配置为10~60秒,工程上常取30秒;超时时间应大于心跳周期,例如心跳30秒、超时10秒。

心跳不是“越频繁越好”:过密会增加无谓流量,过疏则故障发现慢。建议根据产线对通信中断的容忍度设定,并在主机与设备两端保持一致。

三、分离:Deselect.req / Deselect.rsp

当一方需要主动结束HSMS会话但保留TCP连接时,发送 Deselect.req,对端回复 Deselect.rsp,双方回到Not Selected状态。此后若需继续通信,必须重新执行Select握手。Deselect常用于:设备维护前通知主机、切换通信角色、或在不关闭TCP的情况下重置会话状态。

Deselect与直接关闭TCP的区别:Deselect是“礼貌地暂停会话”,TCP仍保持;关闭TCP则是彻底断开,需重新三次握手。工程中优先使用Deselect,避免频繁重连带来的状态抖动。

四、TCP/IP参数配置要点

HSMS的TCP/IP配置直接影响连接稳定性,关键参数包括:

参数典型值说明
端口号5000E37默认端口,可自定义但需双方一致
角色Active / Passive主机常为Active,设备常为Passive
Device ID0~32767HSMS中通常置0xFFFF或按设备编号
T3(Reply Timeout)45秒等待Data消息回复的超时
T5(Connect Separation)10秒重连间隔
T6(Control Transaction)5秒控制消息超时
T7(Not Selected)10秒未选择状态超时
T8(Network Intercharacter)5秒字节间超时

配置时务必保证双方T3/T5/T6/T7/T8一致或兼容,否则会出现一方已超时重连、另一方仍在等待的“错位”现象。

五、故障排查思路

HSMS故障排查应遵循“先链路、再会话、后消息”的顺序:

  1. 链路层:用 ping 和 telnet 设备IP 5000 确认TCP可达;若不通,检查网线、IP、防火墙、端口监听。
  2. 会话层:抓包看是否有Select.req/rsp;若只有req无rsp,检查Passive端是否已处于Selected状态、SelectStatus是否被拒。
  3. 心跳层:观察Linktest是否规律收发;若单向无响应,检查对端心跳配置或进程是否卡死。
  4. 消息层:确认已Selected后再发Data消息;检查T3超时是否过短、SECS-II格式是否正确。
常见误区:TCP连接成功就认为HSMS可用。实际上未完成Select握手前,任何Data消息都可能被丢弃。排查时务必先确认Selected状态。
HSMS 会话生命周期与状态迁移 Active(主机) Passive(设备) TCP 三次握手(SYN / SYN-ACK / ACK) Select.req Select.rsp(SelectStatus=0 接受) Selected 状态 · 可收发 Data 消息 Linktest.req(周期 30s) Linktest.rsp Deselect.req Deselect.rsp → 回到 Not Selected 超时未收 Linktest.rsp → 判定链路失效,断开重连 Select/Deselect Linktest 心跳 TCP 链路

掌握上述机制后,HSMS的调试就有了清晰的抓手:Select决定能不能通,Linktest决定通得稳不稳,Deselect决定怎么优雅地停。实际工程中,建议在设备端记录每次Select、Linktest、Deselect的时间戳与结果,形成通信日志,一旦出现断连可快速定位是链路问题、会话问题还是对端进程问题。