4. SECS-I与HSMS传输层

在SECS/GEM体系中,传输层负责把SECS-II消息可靠地从一端送到另一端。设备端常见两种实现:SECS-I基于RS-232串行链路,HSMS基于TCP/IP以太网。二者承载的消息语义相同,但链路特性、连接建立方式、超时机制和消息传输流程差异很大。理解这些差异,是排查“消息发不出、回不来、超时断连”等问题的基础。

一、核心原理:两种传输层的本质差异

SECS-I是点对点、半双工、面向块的串行协议。它把一条SECS-II消息封装成若干数据块,通过RS-232逐字节发送,并用块头中的System Bytes、Block Number等字段完成重组与确认。链路本身没有“连接”概念,只有物理线路通断和协议层握手。

HSMS则运行在TCP之上,是面向连接、全双工、基于消息的协议。它不关心字节如何分块,而是把整条SECS-II消息作为HSMS消息发送,依靠TCP保证字节流可靠。HSMS支持主动/被动连接、多会话(Session ID)和更丰富的状态机。

关键区别:SECS-I用“块”传输并逐块确认;HSMS用“消息”传输,由TCP负责可靠交付,HSMS自身负责连接与超时管理。
SECS-I 与 HSMS 传输层结构对比 SECS-I(RS-232 串行) SECS-II 消息 分块:Block 1 / Block 2 / … 块头 + 数据 + 校验 RS-232 逐字节发送 / 逐块 ACK HSMS(TCP/IP 以太网) SECS-II 消息 HSMS 消息头(Session ID / System Bytes) TCP 字节流(可靠交付) Select / Deselect / Linktest 状态机 对比

二、连接建立:从物理链路到逻辑会话

SECS-I没有真正的“连接建立”过程。设备上电后,只要串口参数(波特率、数据位、停止位、校验位)与主机一致,物理链路即可通信。协议层通过ENQ、EOT、ACK、NAK等控制字符完成握手与块确认。若参数不匹配,表现为乱码、超时或持续NAK。

HSMS的连接建立分为主动方和被动方。主动方发起TCP连接,随后发送Select.req;被动方回复Select.rsp,状态进入Selected后,才允许传输SECS-II消息。若长时间未Select,连接可能被关闭。HSMS还支持Deselect和Linktest,用于会话释放与链路保活。

HSMS 连接建立典型流程:
主动方                        被动方
  |------ TCP SYN ------------>|
  |<----- TCP SYN-ACK ---------|
  |------ TCP ACK ------------->|
  |------ Select.req ---------->|
  |<----- Select.rsp -----------|
  |====== Selected 状态 ========|
  |------ SECS-II 消息 --------->|

三、超时机制:T1~T8 与 HSMS 定时器

SECS-I使用T1~T4定时器:T1控制字符超时、T2块间超时、T3回复超时、T4块间等待。HSMS则使用T5、T6、T7、T8:T5连接分离超时、T6控制事务超时、T7未Select超时、T8网络字符间超时。两者都通过超时判断链路异常,但触发条件和处理动作不同。

定时器 所属协议 作用 典型超时动作
T1SECS-I等待控制字符响应重发或报错
T2SECS-I块间接收超时发送NAK,请求重发
T3SECS-I等待回复消息上层超时,事务失败
T4SECS-I块间发送等待中止发送,链路复位
T5HSMS连接分离超时关闭TCP连接
T6HSMS控制事务超时重试或断开
T7HSMS未Select超时关闭连接
T8HSMS网络字符间超时判定链路异常
常见误区:把T3当作TCP超时。T3是SECS-I的回复超时,HSMS中对应的是T6/T7等控制超时,二者不能混用。调参时必须确认协议类型。

四、消息传输流程与案例场景

以设备向主机发送S1F1为例。SECS-I流程:设备将消息分块,发送ENQ,收到EOT后逐块发送,每块等待ACK;主机重组后回复S1F2,设备在T3内等待。若某块NAK,则重发该块。

HSMS流程:设备在Selected状态下直接发送S1F1消息,主机回复S1F2。若设备在T6内未收到回复,可重发或上报事务超时。若TCP断开,HSMS状态机回到Not Connected,需重新连接并Select。

设备端日志示例(HSMS):
[HSMS] TCP connected, local=10.0.0.5:5000 remote=10.0.0.1:5000
[HSMS] Send Select.req
[HSMS] Recv Select.rsp, status=0
[HSMS] State -> Selected
[HSMS] Send S1F1 W-bit=1 SystemBytes=0x00000001
[HSMS] Recv S1F2 SystemBytes=0x00000001
[HSMS] Transaction complete

复盘时重点看三处:连接是否进入Selected;System Bytes是否匹配;超时定时器是否被正确触发。若SECS-I持续NAK,优先检查串口参数和块序号;若HSMS频繁断连,优先检查T5/T7和网络稳定性。

实操建议:设备端调试时,先用Linktest确认HSMS链路保活正常,再验证Select/Deselect流程,最后跑SECS-II消息。SECS-I则先用示波器或串口助手确认波特率和控制字符时序。

总结来看,SECS-I与HSMS的差异集中在链路形态、连接语义、超时体系和消息封装方式。掌握这些差异,才能在设备端通信功能拆解中准确定位问题,并为后续SECS-II消息层和GEM状态机的学习打好基础。