3、HSMS协议详解:TCP/IP基础、HSMS连接建立与关闭、HSMS消息格式、会话管理

HSMS,全称是High-Speed SECS Message Services。说白了,它就是SECS/GEM协议在以太网上的“运输工具”。

我刚开始接触半导体设备通信时,有个困惑:SECS-II定义了消息的内容和格式,那这些消息到底怎么在网络上传输?谁来保证数据不丢包、不乱序?答案就是HSMS。它把SECS-II消息打包,然后通过TCP/IP协议栈发出去。

这一章,我们就来拆解HSMS。我会从最底层的TCP/IP讲起,然后带你看看HSMS的连接怎么建立、怎么关闭,消息长什么样,以及会话怎么管理。嗯,这些都是实战中绕不开的核心知识点。

3.1 TCP/IP基础:HSMS的“高速公路”

HSMS依赖TCP/IP,这一点非常重要。TCP提供的是面向连接的、可靠的字节流服务。为什么选TCP而不是UDP?

我在一个项目中遇到过,设备端和上位机之间偶尔会丢包。如果用UDP,SECS消息就可能丢失,导致生产流程卡死。换成TCP后,底层自动重传,问题就解决了。你想想看,半导体制造对可靠性要求极高,丢一个晶圆的数据可能就是几万美金的损失。

核心要点: HSMS使用TCP端口号5000(默认)进行通信。IP地址和端口号必须在连接前配置好。

TCP/IP的四层模型(应用层、传输层、网络层、链路层)中,HSMS位于应用层。它把SECS消息当作数据载荷,交给TCP去分段、传输、重组。

OSI模型层 TCP/IP模型层 HSMS相关协议/组件
应用层 应用层 HSMS (SECS-II消息封装)
表示层 应用层 —
会话层 应用层 —
传输层 传输层 TCP (可靠传输)
网络层 网络层 IP (路由寻址)
数据链路层 网络接口层 以太网 (物理连接)
物理层 网络接口层 网线/光纤

3.2 HSMS连接建立与关闭:三次握手与四次挥手

HSMS的连接管理,本质上就是TCP连接的建立和关闭。但HSMS在此基础上,增加了自己的“控制消息”来确认通信双方的身份和状态。

3.2.1 连接建立:主动方与被动方

在HSMS中,有两个角色:主动方(Active)和被动方(Passive)。主动方发起TCP连接,被动方监听等待连接。

我个人习惯把主动方比作“客户端”,被动方比作“服务器”。但注意,在SEMI标准中,它们有更严格的定义:主动方通常是上位机(Host),被动方通常是设备(Equipment)。

  1. TCP三次握手:主动方发送SYN,被动方回复SYN+ACK,主动方再回复ACK。TCP连接建立。
  2. HSMS Select.indication:TCP连接建立后,主动方发送一条HSMS控制消息——Select.req,请求建立HSMS会话。
  3. HSMS Select.confirm:被动方收到后,回复Select.rsp,携带状态码(0表示成功)。
避坑指南: 我曾经调试一个设备,发现TCP连接已经建立,但HSMS通信就是不通。后来抓包发现,主动方发了Select.req,但被动方没有回复。原因是被动方的HSMS状态机还没准备好。记住:TCP连接成功 ≠ HSMS会话建立成功。

3.2.2 连接关闭:优雅与强制

HSMS连接关闭有两种方式:优雅关闭和强制关闭。

  • 优雅关闭:一方发送Deselect.req,对方回复Deselect.rsp,然后关闭TCP连接。这就像说“我要走了,再见”。
  • 强制关闭:直接关闭TCP连接(发送FIN或RST)。这就像突然挂断电话。对方会检测到连接断开,触发Connection Lost事件。

嗯,这里要注意:在生产环境中,尽量使用优雅关闭。强制关闭可能导致对方来不及处理未完成的消息,造成数据丢失。

3.3 HSMS消息格式:报文头与数据

HSMS消息的格式非常清晰。它由两部分组成:消息头(Header)和数据(Data)。消息头固定为10个字节,数据部分长度可变。

偏移量(字节) 字段名 长度(字节) 说明
0 Length 4 消息体总长度(Header + Data),大端序
4 Device ID 2 设备ID,低15位有效,最高位为0
6 Stream/Function 2 高字节为Stream,低字节为Function
8 PType 1 协议类型:0=SECS-II,1=HSMS控制消息
9 SType 1 会话类型:0=数据消息,非0=控制消息
10 System Bytes 4 系统字节,用于消息匹配
14 Data 可变 SECS-II消息体(仅当PType=0时)
重要: Length字段是整个消息体的长度,包括Header和Data。但Length本身不计算在内。例如,一个只有Header的消息,Length=10。

举个例子,一个Select.req控制消息的十六进制表示:

00 00 00 0A  // Length = 10 (只有Header)
FF FF        // Device ID = 0x7FFF (广播)
00 00        // Stream/Function = 0 (控制消息)
01           // PType = 1 (HSMS控制消息)
01           // SType = 1 (Select.req)
00 00 00 01  // System Bytes = 1

3.4 会话管理:状态机与心跳

HSMS的会话管理,核心是一个状态机。它定义了连接在不同阶段的行为。我建议你把这个状态机画下来,贴在工位上。

HSMS会话状态机 Not Connected Connected Selected TCP连接建立 Select.req/rsp Deselect / 连接断开 连接断开 监听/等待 重新连接 状态说明: Not Connected: 未建立TCP连接 Connected: TCP已连接,但HSMS会话未建立 Selected: HSMS会话已建立,可以收发SECS-II消息

除了状态机,HSMS还有一个重要的机制——心跳(Heartbeat)。它用来检测连接是否还活着。

我记得有一次,设备长时间没有发送数据,上位机以为连接断了,就关闭了TCP连接。但实际上设备还在运行。后来我们启用了心跳机制:每隔一段时间(比如10秒),双方互相发送一个Linktest.req和Linktest.rsp。如果连续几次收不到回复,就认为连接已断开,触发重连逻辑。

关键参数:
  • T3 (Reply Timeout): 等待回复的超时时间,默认45秒。
  • T5 (Connect Timeout): 连接建立的超时时间,默认10秒。
  • T6 (Control Timeout): 控制消息的回复超时,默认5秒。
  • T8 (Network Timeout): 网络空闲超时,用于触发心跳,默认5秒。

这些超时参数,在实战中一定要根据网络状况调整。网络延迟大,就把T3设大一点;网络稳定,可以把T8设小一点,加快心跳检测。

个人经验: 我建议你在调试阶段,把HSMS的日志级别开到最详细。每次状态变化、每条消息收发都记录下来。这样一旦出问题,可以快速定位是TCP层的问题,还是HSMS层的问题。

好了,这一章的内容就到这里。HSMS协议并不复杂,但它是SECS/GEM通信的基石。理解了TCP/IP基础、连接建立与关闭、消息格式和会话管理,你就能看懂设备与上位机之间的“对话”了。