第3章:通信状态机详解 — COMM 状态(DISABLED、ENABLED、COMMUNICATING)
通信状态机,说白了就是设备与主机之间的“握手协议”。
我刚开始接触 SECS/GEM 时,总觉得这玩意儿就是个简单的连接断开。后来被现场设备坑了几次才明白——COMM 状态机才是整个通信的命门。状态不对,啥协议都白搭。
3.1 三个核心状态
COMM 状态机只有三个状态,但每个状态背后都藏着不少细节。咱们一个一个来拆。
| 状态 | 含义 | 典型表现 |
|---|---|---|
| DISABLED | 通信功能被禁用 | 设备不响应任何主机消息 |
| ENABLED | 通信功能已启用,但未建立连接 | 设备在等待主机发起连接 |
| COMMUNICATING | 与主机建立通信连接 | 正常收发 SECS 消息 |
3.2 DISABLED 状态 — 通信的“休眠期”
这个状态我习惯叫它“死锁状态”。设备上电后,默认就待在这儿。
为什么会这样?说白了,设备还没准备好跟主机说话。可能是初始化没完成,也可能是操作员手动禁用了通信。
关键特征:
- 设备不处理任何来自主机的 SECS 消息
- 设备也不会主动发送消息
- 只有 S1F13(建立通信请求)或 S1F17(通信状态变更请求)才能唤醒它
我记得有一次在现场,客户说设备连不上主机。我过去一看,COMM 状态卡在 DISABLED。查了半天,发现是设备配置文件里把通信使能位写死了。改了一行参数,重启后就好了。
避坑指南:我曾经遇到过设备在 DISABLED 状态下收到 S1F13 后没反应。后来发现是设备固件里把 S1F13 的处理逻辑写错了。记住:DISABLED 状态下,设备必须能响应 S1F13,这是 GEM 标准强制要求的。
3.3 ENABLED 状态 — 等待连接的“待机期”
从 DISABLED 跳出来,设备就进入 ENABLED 状态了。这时候设备已经准备好通信,但还没跟主机建立连接。
你想想看,这就像手机开了蓝牙,但还没配对。设备在等主机主动来“配对”。
个人经验:我建议在 ENABLED 状态下,设备要开启一个定时器。如果超过设定时间(比如 30 秒)还没收到主机的连接请求,就自动回到 DISABLED 状态。这样做能避免设备一直空等,浪费资源。
ENABLED 状态下,设备能做什么?
- 可以接收 S1F13 并进入 COMMUNICATING
- 可以接收 S1F17 并切换状态
- 可以发送 S1F0(中止通信)回到 DISABLED
- 不能发送数据消息(如 S6F11)
3.4 COMMUNICATING 状态 — 正常通信的“工作期”
这才是设备真正干活的状态。主机和设备之间建立了逻辑连接,可以收发各种 SECS 消息了。
我习惯把这个状态叫做“绿灯状态”。只要设备在这儿,通信就没问题。
| 操作 | 是否允许 | 说明 |
|---|---|---|
| 发送 S1F0 | 是 | 主动断开连接,回到 ENABLED |
| 发送 S1F13 | 否 | 已经连接了,不需要再建立 |
| 发送数据消息 | 是 | 如 S6F11 上报数据 |
| 接收主机命令 | 是 | 如 S2F41 远程命令 |
注意:我曾经遇到过设备在 COMMUNICATING 状态下突然掉线。查日志发现是网络闪断导致的。但设备没有自动重连机制,就一直卡在 ENABLED 状态。后来我加了一个心跳检测(S1F1/S1F2 轮询),问题才解决。
3.5 状态转换条件
状态转换不是随便跳的,有严格的触发条件。我画了一张图,把整个流程串起来。
3.6 状态转换的触发条件详解
咱们把每个转换条件掰开揉碎了讲。
3.6.1 DISABLED → ENABLED
- S1F13:主机发送建立通信请求,设备响应后进入 ENABLED
- S1F17:主机发送通信状态变更请求,参数设为 ENABLE
- 本地操作:操作员通过 HMI 手动启用通信
3.6.2 ENABLED → COMMUNICATING
- S1F13 成功:设备收到 S1F13 后,回复 S1F14(建立通信确认),然后进入 COMMUNICATING
- 这是最常用的转换路径,我建议在代码里加一个超时保护,防止 S1F14 发送失败导致状态卡死
3.6.3 COMMUNICATING → ENABLED
- S1F0:设备或主机主动中止通信
- 连接断开:TCP 连接断开、网络故障、设备重启
- 超时:通信空闲超时(T3 超时)
个人经验:我建议在 COMMUNICATING 状态下,设备要维护一个“通信健康计数器”。每收到一条有效消息,计数器加 1;每过 10 秒没有消息,计数器减 1。当计数器降到 0 时,自动触发 S1F0 断开连接。这样做能避免“假连接”问题。
3.6.4 ENABLED → DISABLED
- 超时:在 ENABLED 状态下等待连接超时(我一般设 30 秒)
- S1F17:主机发送通信状态变更请求,参数设为 DISABLE
- 本地操作:操作员手动禁用通信
3.6.5 COMMUNICATING → DISABLED
- 严重错误:设备检测到不可恢复的通信错误(如协议解析失败、内存溢出)
- S1F17(DISABLE):主机强制禁用通信
- 这个转换要谨慎使用,我一般只在设备需要紧急停机时才走这条路
3.7 实战中的状态机调试技巧
说了这么多理论,来点干货。我在现场调试 COMM 状态机时,一般按这个步骤来:
- 检查当前状态:用 S1F1(查询设备状态)获取当前 COMM 状态
- 确认网络连通性:ping 一下主机 IP,排除网络问题
- 查看设备日志:找 S1F13、S1F0、S1F17 的收发记录
- 手动触发状态转换:用 S1F17 强制切换状态,看设备反应
- 抓包分析:用 Wireshark 抓 SECS 消息,确认消息格式是否正确
核心原则:状态机调试,先看状态,再看消息,最后查代码。别一上来就翻代码,容易迷失方向。
嗯,COMM 状态机就讲这么多。记住三个状态、五个转换条件,再加上我分享的那些坑,现场遇到通信问题基本能搞定。