4、通信状态模型(COMMUNICATION STATE MODEL)

通信状态模型,说白了就是设备与主机之间的「电话线」状态管理。我刚开始接触SECS/GEM时,觉得这玩意儿不就是个连接断开嘛,有啥好讲的?后来在产线上被坑过一次才明白——通信状态的切换,直接决定了设备能不能正常干活。

这个模型定义了四个状态:NOT COMMUNICATINGCOMMUNICATINGWAIT CRAWAIT CID。嗯,咱们一个一个来拆解。

通信状态模型状态转换图 NOT COMMUNICATING 未通信状态 WAIT CRA 等待通信建立确认 COMMUNICATING 通信中状态 WAIT CID 等待设备ID确认 S1F13 S1F14 S1F1 S1F2 超时/断开 超时 超时 图例: S1F13 建立请求 S1F14 建立确认 S1F1 设备ID请求 超时/断开

4.1 NOT COMMUNICATING — 未通信状态

这是设备的初始状态,也是「安全状态」。说白了,设备刚上电、或者通信链路断了,就会待在这个状态。

在这个状态下,设备不会主动发任何消息。它只做一件事:监听连接请求。我见过不少新手工程师,设备还没建立通信就急着发数据,结果消息全丢了。嗯,这是典型的「还没连上就想跑」。

关键特征:

  • 设备不处理任何远程命令
  • 只有S1F13(建立通信请求)能触发状态迁移
  • 所有其他消息都会被忽略或返回错误

我的经验:有一次在调试一台刻蚀机,发现设备老是莫名其妙地回到NOT COMMUNICATING。查了半天,原来是网线接触不良。你想想看,物理层都不稳定,通信状态怎么可能稳得住?从那以后,我调试通信问题第一件事就是先检查物理连接。

4.2 WAIT CRA — 等待通信建立确认

设备收到S1F13后,会进入WAIT CRA状态。这个状态是个「过渡态」,设备在等主机回复S1F14。

为什么会设计这个中间状态?我个人的理解是:防止通信建立过程中的竞态条件。如果设备直接跳到COMMUNICATING,万一主机那边还没准备好,两边就会乱套。

事件 动作 下一状态
收到S1F14(建立确认) 进入COMMUNICATING COMMUNICATING
超时(T3超时) 回到NOT COMMUNICATING NOT COMMUNICATING
收到其他消息 忽略或返回错误 WAIT CRA

注意:WAIT CRA的超时时间通常由T3定时器控制。我建议设置为45秒,太短容易误判,太长又浪费等待时间。曾经有个项目,客户把T3设成10秒,结果网络稍微波动一下设备就断连了,折腾了两天才找到原因。

4.3 COMMUNICATING — 通信中状态

这是设备正常工作的状态。说白了,就是「电话打通了,可以正常聊天了」。

在这个状态下,设备可以收发各种SECS消息。但要注意一点:通信建立不等于设备就绪。我见过有人把COMMUNICATING当成设备可以开始干活了,其实不对。设备还得完成初始化、进入合适的状态机(比如EQUIPMENT STATE MODEL)才能真正开始生产。

COMMUNICATING状态下能做的事:

  • 收发S1F1/S1F2(设备ID查询)
  • 收发S1F3/S1F4(设备属性查询)
  • 收发S2F13/S2F14(设备常量设置)
  • 收发S6F11/S6F12(事件报告)
  • ... 几乎所有SECS消息都可以正常交互

4.4 WAIT CID — 等待设备ID确认

这个状态比较特殊。它是在COMMUNICATING状态下,主机发送S1F1(请求设备ID)后进入的过渡态。

设备收到S1F1后,必须回复S1F2(包含设备ID)。在回复之前,设备就处于WAIT CID状态。嗯,这个状态的存在是为了保证设备ID查询的原子性。

我个人习惯把WAIT CID看作一个「短暂停留点」。正常情况下,设备应该立即回复S1F2,所以这个状态通常一闪而过。但如果设备因为某些原因(比如正在处理高优先级任务)延迟回复,就会卡在这里。

避坑指南:我曾经遇到过一个案例,设备在WAIT CID状态下收到了其他消息,结果直接崩溃了。后来查代码发现,工程师没处理这个边界情况。记住:WAIT CID状态下,除了S1F2的回复,其他消息都应该被缓存或延迟处理,不能直接丢弃。

4.5 状态转换的完整流程

咱们把整个流程串起来看看:

  1. 设备上电 → NOT COMMUNICATING
  2. 主机发送S1F13 → 设备进入 WAIT CRA
  3. 设备回复S1F14 → 进入 COMMUNICATING
  4. 主机发送S1F1 → 设备进入 WAIT CID
  5. 设备回复S1F2 → 回到 COMMUNICATING
  6. 通信断开或超时 → 回到 NOT COMMUNICATING

这个流程看起来简单,但实际实现时有很多细节。比如:超时时间怎么设?重试机制怎么搞?异常情况怎么处理?这些我都会在后面的章节里详细讲。

我的建议:实现通信状态机时,一定要把状态转换的日志打全。每次状态变化都记录时间戳、触发事件、当前状态、目标状态。这样出了问题,一看日志就知道是哪一步卡住了。我当年就是靠这个习惯,帮客户解决了好几个疑难杂症。

好了,通信状态模型的四个状态就讲到这里。记住一句话:状态机是设备的「交通规则」,不遵守规则就会出事故。下一节咱们聊聊设备状态模型,那个更贴近实际生产流程。


公众号:蓝海资料掘金营,微信deep3321