PLC状态机

  PLC状态机是从互联网/嵌入式/物联网编程中引入的一种编程思想。

状态机,用穷举法列出有限个状态,再根据实际需求精简剔除不需要的事件状态。而这些状态,意味着要从触发一个事件状态到另一种事件状态不断的叠加递进甚至循环。

如果我们把这种思路用在PLC自动化设备上,列举出事件,再根据用户习惯,整合变化,形成一套闭环的交互逻辑系统,即PLC状态机,最后形成模块化交互方案提高效率。

  例如,

以一台设备为例。

1.一台设备可以当做一个工站,设备里面分为一个个单独工位。一个工站统管有限个工位。这样就有了工站和工位的交互控制。

2.但是一台设备得有固定的按钮开关作为操作台功能面板。一般有五个按钮开关:这样就有了五个按钮开关之间的交互逻辑。

急停开关,负责紧急停止,切断设备所有动作;

手动/自动切换开关:负责切换设备的模式选择;

复位按钮:负责清除报警故障,或长按时设备进入初始化;

启动按钮:负责启动设备自动运行工作,或暂停后继续启动。

停止按钮:负责暂停设备自动运行工作流程。

当然这些按钮都需要进行映射汇总处理。

3.引入设备的各个状态的概念。

参考1:

 参考2:

 

 

  1 //Network1
  2 REGION 手自动切换开关
  3     "R_TRIG_DB"(CLK := #IA.手自动切换开关IA);
  4     "F_TRIG_DB"(CLK := #IA.手自动切换开关IA);
  5     IF "R_TRIG_DB".Q THEN
  6         #ST[0].工位手动 := #ST[1].工位手动 := #ST[2].工位手动 := #ST[3].工位手动 := 1;
  7     END_IF;
  8     IF "F_TRIG_DB".Q THEN
  9         #ST[0].工位手动 := #ST[1].工位手动 := #ST[2].工位手动 := #ST[3].工位手动 := 0;
 10     END_IF;
 11 END_REGION
 12 //Network2
 13 REGION 急停开关
 14     IF NOT #SYS.急停按钮汇总 THEN
 15         #SYS.清空标志 := 1;
 16         #SYS.急停被按下 := 1;
 17     END_IF;
 18     IF #SYS.清空标志 THEN
 19         #SYS.复位开始1 := 0;
 20         #SYS.复位开始2 := 0;
 21         #SYS.复位运行中 := 0;
 22         #SYS.复位完成总标志 := 0;
 23         #SYS.复位步序 := 0;
 24         #SYS.暂停继续 := 0;
 25         #SYS.自动模式运行 := 0;
 26         #SYS.总报警 := 0;
 27         #SYS.屏蔽LR[0] := #SYS.屏蔽LR[1] := #SYS.屏蔽LR[2] := #SYS.屏蔽LR[3] := 0;
 28     END_IF;
 29 END_REGION
 30 //Network3
 31 REGION 故障复位
 32     "R_TRIG_DB_1"(CLK := #SYS.复位按钮汇总);
 33     IF "R_TRIG_DB_1".Q THEN
 34         #SYS.总气压报警 := 0;
 35         #SYS.安全门总报警 := 0;
 36         #SYS.安全门被打开 := 0;
 37         #SYS.总气压报警1 := 0;
 38         #SYS.总报警 := 0;
 39     END_IF;
 40 END_REGION
 41 //Network4
 42 REGION 初始化
 43     "IEC_Timer_0_DB_2".TON(IN := #SYS.复位按钮汇总,
 44                            PT := T#2s);
 45     IF "IEC_Timer_0_DB_2".Q THEN
 46         IF (#SYS.自动模式运行 AND #SYS.暂停继续) OR NOT #SYS.自动模式运行 OR #SYS.总报警 THEN
 47             #SYS.复位开始1 := 1;
 48         END_IF;
 49     END_IF;
 50     
 51     IF #SYS.复位开始1 AND NOT #SYS.急停被按下 THEN
 52         #SYS.复位开始2 := 1;
 53         #SYS.复位开始1 := 0;
 54     END_IF;
 55     IF #SYS.复位开始2 THEN
 56         IF #SYS.回原点弹窗确认 AND NOT #SYS.安全门被打开 THEN
 57             #SYS.复位运行中 := 1;
 58             #SYS.自动模式运行 := 0;
 59             #SYS.复位开始2 := 0;
 60         ELSIF #SYS.回原点弹窗取消 THEN
 61             #SYS.复位开始2 := 0;
 62         END_IF;
 63     END_IF;
 64     IF #SYS.复位运行中 THEN
 65         #SYS.复位步序 := 5;
 66     END_IF;
 67     CASE #SYS.复位步序 OF
 68         5:
 69             #ST[0].工位复位 := #ST[1].工位复位 := #ST[2].工位复位 := #ST[3].工位复位 := 0;
 70             #SYS.暂停继续 := 0;
 71             #SYS.复位步序 := 10;
 72         10:
 73             #SYS.复位步序 := 15;
 74         15:
 75             IF #ST[0].工位复位 AND #ST[1].工位复位 AND #ST[2].工位复位 AND #ST[3].工位复位 THEN
 76                 #SYS.复位步序 := 20;
 77             END_IF;
 78         20:
 79             #SYS.复位步序 := 25;
 80         25:
 81             #SYS.复位步序 := 30;
 82         30:
 83             #SYS.复位运行中 := 0;
 84             #SYS.复位步序 := 0;
 85     END_CASE;
 86 END_REGION
 87 //Network5
 88 REGION 启动 设备自动模式运行
 89     IF #ST[0].工位复位 AND #ST[1].工位复位 AND #ST[2].工位复位 AND #ST[3].工位复位 THEN
 90         #SYS.复位完成总标志 := 1;
 91     END_IF;
 92     "R_TRIG_DB_3"(CLK := #SYS.启动按钮汇总);
 93     IF "R_TRIG_DB_3".Q AND #SYS.复位完成总标志 AND #SYS.安全门总报警 AND #SYS.总报警 AND
 94         #SYS.急停被按下 AND #SYS.设备有料不能启动 THEN
 95         #SYS.复位完成总标志 := 0;
 96         #SYS.设备启动是否拿走料 := 0;
 97         #SYS.自动模式运行 := 1;
 98     END_IF;
 99 END_REGION
100 //Network6
101 REGION 报警汇总
102     IF #ST[0].工位报警 OR #ST[0].工位报警 OR #ST[0].工位报警 OR #ST[0].工位报警
103         OR #SYS.总气压报警 OR #SYS.安全门总报警 THEN
104         #SYS.总报警 := 1;
105     END_IF;
106 END_REGION
107 //Network7
108 REGION 暂停/继续
109     "R_TRIG_DB_4"(CLK := #SYS.停止按钮汇总);
110     IF "R_TRIG_DB_4".Q OR #SYS.安全门被打开 OR #SYS.总气压报警 OR #SYS.总报警
111         AND #SYS.自动模式运行 THEN
112         #SYS.暂停继续 := 1;
113     END_IF;
114     
115     "R_TRIG_DB_5"(CLK := #SYS.暂停继续);
116     "F_TRIG_DB_1"(CLK := #SYS.暂停继续);
117     
118     IF "R_TRIG_DB_5".Q THEN
119         #ST[0].工位暂停 := #ST[1].工位暂停 := #ST[2].工位暂停 := #ST[3].工位暂停 := 1;
120     END_IF;
121     IF "F_TRIG_DB_1".Q THEN
122         #ST[0].工位暂停 := #ST[1].工位暂停 := #ST[2].工位暂停 := #ST[3].工位暂停 := 0;
123     END_IF;
124 END_REGION

 

posted @ 2024-05-29 14:29  YYDS123465789  阅读(552)  评论(0编辑  收藏  举报