『7x24小时有问必答』
状态机的核心价值是将复杂的顺序逻辑拆解为清晰的 “状态” 和 “状态转移规则”,能极大提升工业控制程序的可读性、可维护性和稳定性。

一、状态机核心概念

状态机(Finite State Machine, FSM)本质是:
有限个状态
:如 “待机”“运行”“暂停”“报警”;
触发事件
:如 “启动按钮按下”“传感器到位”“超时”;
转移规则
:某个状态下触发特定事件,切换到另一个状态;
状态行为
:进入 / 退出某个状态时执行的动作(如 PLC 输出、机械手运动)。

二、状态机在不同场景的具体应用

1. C# 上位机编程中的应用

上位机主要负责人机交互、逻辑协调、数据监控,状态机常用于封装设备控制逻辑,避免大量 if-else/switch 嵌套。

(1)典型应用场景

设备运行流程控制(如 “待机→启动→运行→完成→复位”);
报警处理逻辑(如 “正常→低报→高报→停机→复位”);
通信状态管理(如 “未连接→连接中→已连接→断开→重连”)。

(2)代码示例(基于简单状态机实现)

// 1. 定义状态枚举public  enum  MachineState{       Standby,      // 待机       Running,      // 运行       Paused,        // 暂停       Alarm           // 报警}// 2. 定义触发事件枚举public  enum  TriggerEvent{       Start,         // 启动       Pause,         // 暂停       Resume,        // 恢复       Stop,           // 停止       Error,         // 报错       ClearAlarm    // 清除报警}// 3. 状态机核心类public  class  MachineFSM{       // 当前状态       public  MachineState  CurrentState  { get;  private  set; } =  MachineState.Standby;       // 状态转移规则(核心:当前状态+触发事件 → 新状态+执行动作)       private  readonly  Dictionary<(MachineState,  TriggerEvent), (MachineState  NewState,  Action  Action)> _transitions =  new()      {             // 待机状态下触发Start → 切换到运行,执行启动动作            { (MachineState.Standby,  TriggerEvent.Start), (MachineState.Running,  () =>  Console.WriteLine("执行:启动设备,发送运行指令到PLC")) },             // 运行状态下触发Pause → 切换到暂停,执行暂停动作            { (MachineState.Running,  TriggerEvent.Pause), (MachineState.Paused,  () =>  Console.WriteLine("执行:发送暂停指令到PLC,保存当前参数")) },             // 暂停状态下触发Resume → 切换到运行,执行恢复动作            { (MachineState.Paused,  TriggerEvent.Resume), (MachineState.Running,  () =>  Console.WriteLine("执行:发送恢复指令到PLC,恢复运行参数")) },             // 任意运行/暂停状态下触发Error → 切换到报警,执行报警动作            { (MachineState.Running,  TriggerEvent.Error), (MachineState.Alarm,  () =>  Console.WriteLine("执行:发送停机指令,记录报警码,上位机弹窗提示")) },            { (MachineState.Paused,  TriggerEvent.Error), (MachineState.Alarm,  () =>  Console.WriteLine("执行:发送停机指令,记录报警码,上位机弹窗提示")) },             // 报警状态下触发ClearAlarm → 切换到待机,执行清除报警动作            { (MachineState.Alarm,  TriggerEvent.ClearAlarm), (MachineState.Standby,  () =>  Console.WriteLine("执行:清除报警记录,复位PLC状态")) },             // 任意状态下触发Stop → 强制切换到待机            { (MachineState.Running,  TriggerEvent.Stop), (MachineState.Standby,  () =>  Console.WriteLine("执行:发送急停指令,复位所有参数")) },            { (MachineState.Paused,  TriggerEvent.Stop), (MachineState.Standby,  () =>  Console.WriteLine("执行:发送急停指令,复位所有参数")) },            { (MachineState.Alarm,  TriggerEvent.Stop), (MachineState.Standby,  () =>  Console.WriteLine("执行:发送急停指令,复位所有参数")) }      };       // 触发事件,执行状态转移       public  void  Trigger(TriggerEvent  trigger)      {             var  key = (CurrentState, trigger);             if  (_transitions.TryGetValue(key, out  var  transition))            {                   // 执行状态对应的动作                  transition.Action.Invoke();                   // 更新当前状态                   CurrentState  = transition.NewState;                   Console.WriteLine($"状态更新:{CurrentState}");            }             else            {                   Console.WriteLine($"无效操作:{CurrentState}状态下无法触发{trigger}事件");            }      }}// 测试调用public  class  Program{       public  static  void  Main()      {             var  fsm =  new  MachineFSM();             // 模拟操作流程:待机→启动→暂停→恢复→报错→清除报警→停止            fsm.Trigger(TriggerEvent.Start);      // 待机→运行,执行启动动作            fsm.Trigger(TriggerEvent.Pause);      // 运行→暂停,执行暂停动作            fsm.Trigger(TriggerEvent.Resume);     // 暂停→运行,执行恢复动作            fsm.Trigger(TriggerEvent.Error);      // 运行→报警,执行报警动作            fsm.Trigger(TriggerEvent.ClearAlarm);  // 报警→待机,执行清除报警            fsm.Trigger(TriggerEvent.Stop);        // 待机→待机(无变化)      }}

(3)C# 上位机状态机的特点

常用实现方式:自定义字典 / 枚举(简单场景)、开源库(如 Stateless、CSharpStateMachine);
核心:将 “操作逻辑” 和 “状态转移” 解耦,上位机界面按钮点击只需触发对应事件,无需关心底层逻辑;
扩展:可结合异步编程(async/await)处理 PLC / 机械手的通信延迟,避免界面卡死。

---

2. PLC 编程中的应用

PLC 是工业控制的核心,状态机是 PLC 编程的主流范式(替代传统的顺序继电器逻辑),尤其适用于多步骤、多条件的控制流程(如产线工位流转、物料搬运)。

(1)典型应用场景

产线工位流程:上料→夹紧→加工→松夹→下料;
安全逻辑控制:门关闭→允许启动→运行→门打开→紧急停机;
设备联动控制:PLC1 触发→PLC2 执行→PLC2 反馈→PLC1 继续。

2)梯形图 / 结构化文本(ST)示例(以西门子 S7-1200/1500 为例)

PLC 中状态机常用SFC(顺序功能图)  或结构化文本(ST)  实现,以下是 ST 语言的核心逻辑:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码