3. 设备连接与通信协议基础
在EAP(Equipment Automation Program)高可用架构中,协议层是设备与上层系统之间的“语言层”。如果协议选型、连接建立方式、心跳与超时参数设置不当,即使上层应用做了双机热备,仍然会出现设备“假在线”、指令丢失、状态不同步等问题。本节从半导体、泛半导体及通用工业设备常见的三类协议入手,说明它们的特点、连接建立过程,以及心跳与超时机制的设计要点。
三类协议的定位与特点
SECS/GEM(SEMI Equipment Communications Standard / Generic Equipment Model)是半导体设备通信的事实标准,基于HSMS(High-Speed SECS Message Services)承载,通常使用TCP端口5000。它不仅有消息层,还定义了状态模型、事件报告、报警、配方管理、远程命令等行为规范,因此“连接”不只是TCP连通,还包含通信状态(Not Connected / Connected / Selected)的迁移。设备与主机之间通过S1F13/S1F14建立通信,通过S1F17/S1F18完成在线选择(Online Request),之后才能进行远程命令和事件上报。
OPC UA(Open Platform Communications Unified Architecture)是跨平台、面向服务的工业通信标准,支持TCP二进制、HTTPS、WebSocket等多种传输,具备信息模型、订阅、方法调用、安全策略(None / Sign / SignAndEncrypt)等能力。它适合需要语义化建模、复杂数据结构和安全通道的场景,例如整线数据采集、MES与设备之间的结构化交互。OPC UA的连接建立包含Endpoint发现、SecureChannel创建、Session创建与激活,超时参数通常涉及SessionTimeout、SecureChannelLifetime等。
Modbus TCP则是最轻量的工业协议之一,基于TCP端口502,采用请求/响应模式,功能码如0x03读保持寄存器、0x10写多个寄存器。它没有会话层、没有标准心跳、没有设备状态模型,连接建立就是TCP三次握手。正因为简单,它在EAP中常用于PLC、传感器、辅助设备的数据采集,但也意味着断线检测、重连、事务匹配都需要上层自行实现。
连接建立:从TCP连通到“可通信”
很多现场问题出在把“TCP连上了”当成“设备可通信”。以SECS/GEM为例,HSMS连接建立后,设备处于Connected但未Selected状态,此时主机不能下发远程命令,设备也不会主动上报事件。正确流程是:EAP先作为Active端或Passive端建立TCP连接,然后发送S1F13(Establish Communications Request),设备回S1F14确认;接着主机发S1F17请求Online,设备回S1F18并进入Online Remote状态。只有完成这两步,EAP才应把设备标记为“可调度”。
OPC UA的连接建立更复杂:客户端先通过GetEndpoints获取端点描述,选择安全策略和消息编码,建立SecureChannel,再创建Session并激活。若使用用户名密码或证书认证,还要完成ActivateSession。工程上建议把“SecureChannel建立成功”和“Session激活成功”分别记录日志,因为两者失败原因不同:前者多为证书、加密套件不匹配,后者多为认证失败或Session数超限。
Modbus TCP最简单,TCP握手成功即可发送功能码请求。但要注意,Modbus TCP的MBAP头包含事务标识符(Transaction ID)、协议标识符、长度和单元标识符。EAP必须为每个请求分配唯一事务ID,并在响应中校验,否则在并发读写时容易把A请求的响应错配给B请求。示例请求:事务ID 0x0001,功能码0x03,起始地址0x0000,寄存器数量0x000A;响应中事务ID必须一致,字节数应为0x14。
心跳与超时:如何判断“真断线”
心跳的本质是用低成本、可预期的报文确认对端仍然存活。SECS/GEM使用Linktest.req/rsp,通常由主机侧定时发送,设备回Linktest.rsp。若连续多个周期无响应,则判定通信中断。T7是“等待Linktest响应”的超时,默认10秒;T8是“两次Linktest之间的间隔”,默认10秒。实际部署中,T7不宜小于3秒,否则网络抖动会误判;也不宜大于30秒,否则断线发现太慢。
OPC UA的KeepAlive由客户端在SecureChannel上发送,服务器返回响应;同时订阅的Publish请求本身也起到保活作用。SessionTimeout默认60秒,若客户端在超时内没有任何请求,服务器会关闭Session。工程上建议SessionTimeout设为心跳周期的3~5倍,例如心跳20秒,SessionTimeout设60~100秒。
Modbus TCP没有标准心跳,常见做法是周期读取一个固定寄存器(如设备状态字),周期1~5秒。若连续3次读超时,则判定断线并触发重连。Socket读超时建议设为1~3秒,重连采用指数退避:1s、2s、4s、8s,上限30s,避免网络恢复瞬间大量重连冲击设备。
实践建议:在EAP中为每台设备维护“连接状态机”,至少包含Disconnected、Connected、Selected/Online、Faulted四个状态。心跳失败只触发状态迁移和告警,不要直接删除设备配置;重连成功后应重新执行在线选择或Session激活,再恢复数据采集和指令下发。
参数配置示例与判断依据
以下是一段EAP侧连接参数配置示例,用于说明各协议关键参数如何落地。参数值为示例,实际需根据设备手册和现场网络质量调整。
# SECS/GEM HSMS 示例
hsms:
mode: active # EAP主动连接设备
ip: 192.168.10.21
port: 5000
t3: 45s # 回复超时
t5: 10s # 连接分离超时
t6: 5s # 控制事务超时
t7: 10s # 等待Linktest响应
t8: 10s # Linktest发送间隔
linktest_enable: true
# OPC UA 示例
opcua:
endpoint: opc.tcp://192.168.10.31:4840
security_policy: Basic256Sha256
session_timeout: 60000ms
request_timeout: 10000ms
keepalive_interval: 20000ms
subscription_publish_interval: 1000ms
# Modbus TCP 示例
modbus:
ip: 192.168.10.41
port: 502
unit_id: 1
read_timeout: 3s
heartbeat_register: 40001
heartbeat_interval: 2s
reconnect_backoff: [1s, 2s, 4s, 8s, 30s]
判断依据可以归纳为三条:第一,心跳周期应小于业务允许的最大断线感知时间;第二,协议超时参数应大于现场P99网络往返时延的2~3倍;第三,重连退避必须有上限,且重连成功后要重新完成协议层的“可通信”握手,而不是只恢复TCP连接。把这三条落实到EAP的连接管理模块中,才能为后续的容错切换和断线恢复打下可靠基础。