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