3. 状态编程核心思想
PLCopen 状态编程(Sequential Function Chart,SFC)的底层逻辑并非简单的“画流程图”,而是一套严谨的离散事件驱动模型。理解状态机模型、状态转移条件以及动作与状态的关系,是掌握状态编程的三大支柱。本章将深入剖析这三者的本质联系,并通过一个完整的工程案例,展示如何将设备工艺逻辑转化为可执行、可维护的状态程序。
3.1 状态机模型:从物理世界到逻辑抽象的映射
3.1.1 核心原理:为什么需要状态机
在PLC编程中,传统的梯形图(LD)和结构化文本(ST)擅长处理连续的逻辑运算,但在面对多步骤、多分支、需要记忆历史流程的工艺时,代码会迅速膨胀且难以调试。状态机模型的核心思想是将设备的整个工作过程划分为若干个稳定且互斥的状态(State),设备在任一时刻只能处于其中一个状态。这种“互斥性”从根源上避免了多个输出同时动作的竞争风险。
一个完整的状态机模型包含四个要素:状态集合(S)、事件集合(E)、转移函数(T)和动作集合(A)。在PLCopen的SFC中,状态用“步(Step)”表示,事件对应“转移(Transition)”。例如,一个简单的气缸控制,可以抽象为“伸出”、“缩回”、“停止”三个状态,而“到位传感器触发”就是驱动状态切换的事件。
| 模型要素 | PLCopen SFC 对应 | 物理意义 | 示例 |
|---|---|---|---|
| 状态集合 S | 步 (Step) | 设备所处的稳定工况 | 待机、夹紧、加工、松开 |
| 事件集合 E | 转移条件 (Transition) | 触发状态切换的布尔条件 | 启动按钮、限位开关、定时器到达 |
| 转移函数 T | 有向连线 | 定义状态间的跳转路径 | S1→S2,S2→S3 |
| 动作集合 A | 动作 (Action) | 进入状态后执行的输出控制 | 置位Q0.0,复位Q0.1 |
3.1.2 判断方法:如何划分状态边界
划分状态是状态编程的第一步,也是最容易出错的一步。判断状态是否独立,应遵循以下三条原则:
- 输出稳定性原则:在一个状态内,所有关键输出(如电机正转、阀门开)的状态应保持不变。如果某个输出需要变化,则必须划分新的状态。
- 等待外部响应原则:当设备需要等待一个外部信号(如传感器、操作员确认)才能继续时,这个“等待”过程本身就是一个独立状态。
- 异常处理隔离原则:报警、急停等异常工况应单独划分为状态,避免与正常流程混杂。
3.2 状态转移条件:精确控制流程的“触发器”
3.2.1 转移条件的本质与类型
转移条件是连接两个状态的“桥梁”,它是一个布尔表达式。只有当该表达式为TRUE时,源状态才会被激活(Deactivate),目标状态才会被激活(Activate)。转移条件必须具有边沿敏感性或电平敏感性的明确语义。在PLCopen中,转移条件分为三类:
- 信号驱动型:直接读取输入信号,如
I0.0(启动按钮)、I0.3(气缸缩回到位)。 - 时间驱动型:使用定时器(TON、TOF)或系统时钟,如
TON.Q(延时5秒后触发)。 - 逻辑组合型:多个信号与或非组合,如
I0.0 AND NOT I0.1(启动且未急停)。
3.2.2 操作流程:编写转移条件的规范
编写转移条件时,建议遵循以下流程,以避免“条件竞争”和“误触发”:
- 列出所有可能触发跳转的事件:包括正常完成信号、异常报警信号、手动干预信号。
- 排除互斥条件:确保同一时刻只有一个转移条件可能为TRUE。例如,从“运行”状态跳转到“停止”和“报警”两个状态的条件不能同时满足。
- 添加必要的延时或滤波:对于机械抖动信号(如限位开关),应在条件中加入10~50ms的滤波延时,防止误跳转。
- 使用中间变量简化复杂逻辑:如果条件过于复杂,建议在梯形图中计算一个中间标志位(如
M0.0),然后在SFC中直接引用该标志位。
// 示例:转移条件 T2 的ST语言实现(在SFC转移属性中编写)
T2 := (I0.4 = TRUE) AND (TON1.Q = TRUE) AND (NOT Alarm_Active);
// 解释:当加工完成信号I0.4为ON,且定时器TON1(设定5秒)已到达,且无报警时,允许从“加工”状态跳转到“完成”状态。
3.3 动作与状态的关系:限定符与执行策略
3.3.1 动作限定符(Qualifier)的工程应用
动作是附着在状态上的输出控制指令。PLCopen定义了多种动作限定符,用于精确控制动作在状态激活期间的行为。理解这些限定符是避免输出混乱的关键。
| 限定符 | 含义 | 执行时机 | 典型应用场景 |
|---|---|---|---|
| N | 非存储型 | 状态激活期间持续执行 | 控制电机运行、指示灯常亮 |
| S | 置位(存储型) | 状态激活时执行一次并保持 | 锁存夹紧气缸、保持阀门打开 |
| R | 复位 | 状态激活时执行一次并清除 | 解除之前的S动作、清除报警 |
| P | 脉冲 | 状态激活时执行一个扫描周期 | 发送一次数据、触发一次计数 |
| D | 延时 | 状态激活后延时指定时间再执行 | 避免气缸快速切换冲击 |
3.3.2 动作与状态的执行时序
在SFC执行中,一个扫描周期内遵循“先转移后动作”的原则。即:先判断当前激活状态的转移条件,若条件满足,则先退出当前状态(停止执行N动作),再进入下一个状态(开始执行新状态的N动作)。对于S/R动作,它们不受状态退出的影响,会一直保持,直到被显式的R动作复位。
3.4 实战案例:全自动包装线贴标机控制
3.4.1 案例背景与初始目标
某食品包装线需要改造一台贴标机。原设备采用梯形图编程,逻辑混乱,每次更换产品规格时需修改大量程序。目标:使用PLCopen状态编程,实现“自动运行”和“手动调试”两种模式,并要求在异常停机后能快速恢复。
3.4.2 状态划分与转移条件定义
经过分析,将自动流程划分为5个状态:S1_待机、S2_进料、S3_贴标、S4_压紧、S5_出料。关键转移条件如下:
- T1 (S1→S2):启动按钮
I0.0按下,且安全门关闭I0.1。 - T2 (S2→S3):产品检测传感器
I0.2检测到到位,且贴标头已复位I0.3。 - T3 (S3→S4):贴标气缸伸出到位
I0.4,且定时器T1(0.5秒)已到达。 - T4 (S4→S5):压紧气缸缩回到位
I0.5。 - T5 (S5→S1):出料输送带运行3秒(T2定时器),且无计数完成信号。
3.4.3 动作分配与程序实现
在SFC中,为每个状态分配动作。特别注意使用S/R限定符控制夹紧气缸,防止突然断电导致气缸失压。
// 状态 S3_贴标 内部动作定义(结构化文本表示)
// 动作1 (N):控制贴标头下行
Q0.0 := TRUE; // 贴标头下行输出
// 动作2 (S):锁存压紧气缸(防止断电缩回)
S Q0.1; // 压紧气缸伸出并保持
// 动作3 (D):延时0.5秒后启动贴标电磁阀
TON1(IN:=TRUE, PT:=T#500MS);
IF TON1.Q THEN
Q0.2 := TRUE; // 贴标电磁阀
END_IF;
3.4.4 调试过程与结果对比
在调试中,发现从S3跳转到S4时,偶尔出现贴标头未完全伸出但气缸已压紧的故障。分析原因为:T3条件中的 I0.4(伸出到位)信号存在2ms的抖动。解决方案:在T3条件中增加一个10ms的滤波定时器 TON_FILTER,将 I0.4 与 TON_FILTER.Q 串联。修改后,连续运行72小时无故障。
结果对比:原梯形图程序共320行,修改工艺需改动5处。采用状态编程后,程序结构清晰,共5个状态、8个转移条件,修改工艺只需调整转移条件中的定时器参数或传感器地址,维护效率提升60%以上。
3.4.5 复盘与经验总结
- 状态划分要“粗中有细”:状态太少会导致一个状态内逻辑复杂,状态太多则增加扫描周期负担。本案例中,将“贴标”和“压紧”分开,是因为两者动作时间不同,便于单独调试。
- 转移条件必须做“防抖”处理:所有来自机械触点的信号,在作为转移条件前,建议先经过输入滤波或软件定时器滤波。
- S/R动作的“恢复”策略:在S1_待机状态中,必须添加R动作来复位所有S动作,确保设备在重新启动时处于已知安全状态。