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后,底层自动重传,问题就解决了。你想想看,半导体制造对可靠性要求极高,丢一个晶圆的数据可能就是几万美金的损失。
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)。
- TCP三次握手:主动方发送SYN,被动方回复SYN+ACK,主动方再回复ACK。TCP连接建立。
- HSMS Select.indication:TCP连接建立后,主动方发送一条HSMS控制消息——Select.req,请求建立HSMS会话。
- HSMS Select.confirm:被动方收到后,回复Select.rsp,携带状态码(0表示成功)。
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时) |
举个例子,一个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还有一个重要的机制——心跳(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协议并不复杂,但它是SECS/GEM通信的基石。理解了TCP/IP基础、连接建立与关闭、消息格式和会话管理,你就能看懂设备与上位机之间的“对话”了。