一、HSMS协议概述

各位同学,今天咱们来聊聊HSMS。说实话,这个协议在半导体设备自动化里,就像人的神经系统一样关键。我做了十几年设备自动化,见过太多因为HSMS没搞明白导致产线停摆的案例。嗯,咱们先从最基础的概念说起。

1.1 HSMS在半导体设备自动化中的角色

HSMS,全称是High-Speed SECS Message Services。说白了,它就是SECS-II消息在TCP/IP网络上的传输通道。你想想看,在半导体工厂里,上百台设备要跟主机(Host)通信,总不能每台都拉根RS-232串口线吧?

HSMS解决了三个核心问题:

  • 高速传输:相比老旧的SECS-I(串口),HSMS跑在以太网上,速度从9600bps直接跳到100Mbps甚至更高
  • 连接管理:设备可以随时上线、下线,主机能同时管理几百个连接
  • 消息可靠性:TCP/IP协议栈保证了数据不丢包、不乱序

核心观点:HSMS不是取代SECS-II,而是给SECS-II换了一条高速公路。消息内容还是SECS-II的格式,只是传输方式从串口变成了网络。

我在一个12寸晶圆厂的项目里遇到过这样的情况:设备端和主机端明明都支持HSMS,但就是连不上。查了两天,最后发现是端口号配错了。这种低级错误,其实很常见。

1.2 HSMS与SECS-II的关系

很多新手会混淆这两个概念。我习惯用一个比喻来解释:

层次 比喻 职责
SECS-II 信封里的信 定义消息内容(S1F13、S2F41等)
HSMS 邮递员+卡车 负责把信安全送到目的地

SECS-II定义了消息的格式和含义,比如S1F13是"建立通信请求",S1F14是"建立通信确认"。而HSMS负责把这些消息打包成TCP数据包,发出去,再收回来。

我的经验:调试时先确认SECS-II消息格式对不对,再查HSMS连接。很多人一上来就抓TCP包,其实90%的问题出在SECS-II消息体上。

1.3 HSMS协议栈模型

HSMS的协议栈分四层,我画了一张图,你看完就明白了:

HSMS协议栈模型 应用层 SECS-II 消息(S1F13, S2F41...) HSMS消息层 消息头(10字节)+ 消息体 TCP传输层 端口号、序列号、确认机制 IP网络层 IP地址、路由、子网掩码 关键点 • HSMS消息头固定10字节 • TCP端口默认5000 • 支持IPv4和IPv6

从上往下看,每一层都依赖下一层提供服务。我调试时有个习惯:先确认IP层通不通(ping一下),再确认TCP端口能不能连(telnet一下),最后才看HSMS消息对不对。

1.4 HSMS消息类型

HSMS定义了三种消息类型,这个必须记住:

消息类型 代码 用途 方向
Data Message 0x00 传输SECS-II数据 双向
Select.req / Select.rsp 0x01 / 0x02 建立通信会话 设备→主机
Deselect.req / Deselect.rsp 0x03 / 0x04 断开通信会话 设备→主机
Linktest.req / Linktest.rsp 0x05 / 0x06 连接保活检测 双向
Reject.req 0x07 拒绝非法消息 双向
Separate.req 0x09 正常断开连接 双向

避坑指南:我曾经遇到一个案例,设备每隔30秒发一次Linktest.req,但主机端没响应。结果设备认为连接断了,自动重连,导致产线频繁中断。后来发现是主机端的Linktest超时设置太短。记住:Linktest的间隔和超时要匹配,一般建议间隔30-60秒,超时设成间隔的3倍。

1.5 HSMS连接状态机

HSMS的连接管理是一个有限状态机,有四个状态:

  • Not Connected:TCP连接未建立,啥也干不了
  • Connected:TCP已连接,但还没建立HSMS会话
  • Selected:HSMS会话已建立,可以收发SECS-II消息
  • Retry:连接失败,等待重试

状态切换的规则其实不复杂:

Not Connected → (TCP连接成功) → Connected
Connected → (发送Select.req并收到Select.rsp成功) → Selected
Selected → (发送Separate.req或TCP断开) → Not Connected
Connected → (超时或失败) → Retry → (等待重试) → Not Connected

嗯,这里要注意:从Connected到Selected,必须由设备端发起Select请求。主机端不能主动Select,这是SEMI标准规定的。我见过有厂商搞反了,结果设备死活连不上。

实战要点:调试HSMS连接时,我建议先抓一个完整的Select流程包看看。正常的Select.req里,消息头中的Session ID应该是0xFFFF,Device ID在消息体里。如果Session ID不对,主机端会直接Reject。

1.6 小结