4、GEM状态模型:设备状态模型、通信状态模型、控制状态模型、状态转换图
状态模型,说白了就是设备的行为规范。
我刚开始接触GEM协议时,觉得这东西太抽象了。什么设备状态、通信状态、控制状态,绕来绕去。直到有一次在产线上调试,设备莫名其妙卡住了,我才意识到——不理解状态模型,你连问题出在哪都说不清楚。
今天咱们就把这三个模型掰开揉碎,讲明白。
4.1 设备状态模型(Equipment State Model)
设备状态模型描述的是设备本身的运行状态。它只有两个状态:EQUIPMENT_OFF 和 EQUIPMENT_ON。
嗯,你没看错,就两个。
核心要点:
- EQUIPMENT_OFF:设备断电或完全不可用。这时候GEM通信都建立不起来。
- EQUIPMENT_ON:设备上电,可以正常工作。但注意,这不代表设备已经准备好处理任务。
我个人习惯把设备状态模型看作是「电源开关」。你想想看,设备没电,啥都干不了。但设备有电,也不代表它就能干活——还得看通信和控制状态。
避坑指南:
我曾经在项目中遇到过一个问题:设备明明上电了,但HMI上一直显示OFF。查了半天,发现是设备状态上报的S1F13消息里,MDLN参数写错了。嗯,这种低级错误最容易让人抓狂。
4.2 通信状态模型(Communication State Model)
通信状态模型描述的是设备与主机之间的连接状态。这个模型稍微复杂一点,有四个状态:
| 状态 | 含义 | 说明 |
|---|---|---|
| NOT COMMUNICATING | 未通信 | 设备与主机之间没有建立TCP连接 |
| COMMUNICATING | 通信中 | TCP连接已建立,可以收发消息 |
| COMMUNICATION ERROR | 通信错误 | 连接断开或超时,需要重新建立 |
| WAITING FOR COMMUNICATION | 等待通信 | 设备已启动,但主机还没连上来 |
这里要注意的是,通信状态模型和设备状态模型是独立的。设备可以ON但没通信,也可以通信中但设备OFF——虽然这种情况很少见。
重要提醒:
通信状态模型中的状态转换,必须通过S1F13/S1F14消息来触发。你不能直接改状态变量,那样会出大问题。我曾经见过有人直接写寄存器改状态,结果设备直接死机了。
4.3 控制状态模型(Control State Model)
控制状态模型,这才是真正的核心。它描述了设备到底听谁的指挥。
控制状态模型有三个状态:
- OFF-LINE:离线模式。设备完全由本地操作员控制,主机发来的命令会被忽略。
- ON-LINE LOCAL:在线本地模式。设备与主机通信,但操作员可以在本地面板上操作。
- ON-LINE REMOTE:在线远程模式。设备完全由主机控制,本地操作被禁止。
你想想看,这三个状态其实对应了三种不同的控制权分配方式。OFF-LINE是本地说了算,ON-LINE REMOTE是主机说了算,ON-LINE LOCAL是两边都能说但主机优先。
状态转换规则:
- OFF-LINE → ON-LINE LOCAL:通过S1F13消息或本地操作
- ON-LINE LOCAL → ON-LINE REMOTE:通过S1F17消息(远程控制请求)
- ON-LINE REMOTE → ON-LINE LOCAL:通过S1F18消息(远程控制释放)
- 任何状态 → OFF-LINE:通过本地操作或S1F15消息
个人经验:
我建议在设备初始化时,默认进入OFF-LINE状态。等主机确认连接正常后,再通过S1F13切换到ON-LINE LOCAL。这样能避免设备在未准备好时被主机误操作。
4.4 状态转换图
下面我用SVG画了一张状态转换图,把三个模型的关系和转换路径都标出来了。这张图我当年画了不下十遍,每次调试都要对着看。
这张图里,三个模型是并列的,彼此独立。但实际项目中,它们之间会有隐式的依赖关系。比如,设备状态必须是ON,通信状态才能进入COMMUNICATING。控制状态必须是ON-LINE,主机才能下发命令。
常见陷阱:
我见过有人把控制状态和通信状态混为一谈。其实它们是两回事:通信状态管的是「能不能发消息」,控制状态管的是「听谁的指挥」。设备可以通信正常但处于OFF-LINE状态,这时候主机发的命令会被忽略。
4.5 实战中的状态管理
在实际项目中,状态管理通常通过状态机来实现。我一般会在设备初始化时,先设置设备状态为OFF,通信状态为NOT COMMUNICATING,控制状态为OFF-LINE。然后按顺序启动:
- 设备上电 → 设备状态变为ON
- TCP连接建立 → 通信状态变为COMMUNICATING
- 发送S1F13 → 控制状态变为ON-LINE LOCAL
- 等待主机确认 → 如果需要远程控制,再发S1F17
这个顺序不能乱。我曾经在项目中跳过第二步,直接发S1F13,结果主机根本不认。嗯,后来查了协议才知道,通信状态没到位,消息发不出去。
调试技巧:
我建议在设备日志中,每次状态变化都打印出来。格式可以这样:
[2025-01-15 10:30:00] EQUIPMENT: OFF → ON
[2025-01-15 10:30:01] COMM: NOT_COMM → COMM
[2025-01-15 10:30:02] CONTROL: OFF_LINE → ON_LINE_LOCAL
这样一旦出问题,看日志就能定位到是哪一步卡住了。
好了,状态模型就讲到这里。记住一句话:状态模型是GEM协议的骨架,不理解它,后面的所有内容都是空中楼阁。
公众号:蓝海资料掘金营,微信deep3321