文章目录 一、编程基础 - 掌握核心概念,降低入门难度 1.1 TwinCAT2 编程入口 - POUs(Program Organization Unit) 1、PRG 2、FUNCTION 3、FB 4、其他入口 1.2 常用功能块简介 1.3 程序编写实例 - 流水灯 1.4 附录 一、编程基础 - 掌握核心概念,降低入门难度 我初学倍福PLC,学习过程的一些总结: 1、熟系编程环境,多操作几次就熟系了。 2、了解一些功能块,资料主要在官方帮助系统中查找。 3、理解程序执行流,从代码第一行开始一步一步执行,再套上周期循环,简单来说 在PLC中写代码就是在周期中断服务函数中写代码。 4、还是与理解程序流有关系,就是plc程序的机制是不断循环的(周期扫描机制),在PLC中要实现顺序控制/状态机,有固定的套路,有的厂家会提供顺序控制功能块,使用倍福plc + st语言编程,就借助于case语法实现。 1.1 TwinCAT2 编程入口 - POUs(Program Organization Unit) 新建POU程序文件(Ctrl+N / File>New POU) 界面区域功能
1、PRG 新建PRG
ACT子程序
2、FUNCTION 可重入问题(如何开启多线程) 3、FB 类似高级语言的类 4、其他入口 Data Types(数据类型) Visu(可视化) Resources(资源) 1.2 常用功能块简介 R_TRIG/F_TRIG TON/FON CASE … END_CASE 1.3 程序编写实例 - 流水灯 在我看来,理解程序的执行过程是编程的重要一步。
PLC程序执行流的常见描述如下:
采用不断循环的顺序扫描工作方式,从上往下,从左往右,每一次扫描所用的时间称为扫描周期或工作周期。
通过资料查询,经常会看到如下图所示的执行顺序解释。这对不熟悉梯形图语言设计意图,又习惯文本程序编程的人来说,理解PLC程序如何被执行就比较困难。 习惯文本语言编程(比如用C语言来描述plc程序的执行流),可以简单的这样理解:PLC程序 一直是在死循环中的。 如果了解嵌入式,可以用中断服务函数更准确的模拟PLC执行机制(比起c语言用死循环模拟,中断的方式可以表达 plc程序是在被周期性循环执行)。如果你倍福plc开发环境中,设置PLC task (扫描周期)是10ms,那么PLC就能做到程序执行一次的时间一定在10ms(扫描时间)以内。(那如果在PLC里面写一个死循环呢? 程序当然会卡住吧(系统利用率会飙升))。 所以,在PLC的循环机制的作用下,一个典型的一步步执行的加工流程怎么写出来?举个栗子,让变量i从1一步步的变到10000

tDelay1(IN:=START,PT:=t#2s,ET:=) IF tDelay1.Q THEN i:=1 tDelay1(IN:=FLASE,PT:=t#2s,ET:=) tDelay2(IN:=TRUE,PT:=t#2s,ET:=) END if tDelay2.Q THEN i:=10 tDelay2(IN:=FLASE,PT:=t#2s,ET:=) tDelay3(IN:=TRUE,PT:=t#2s,ET:=) END if tDelay3.Q THEN i:=100 tDelay3(IN:=FLASE,PT:=t#2s,ET:=) tDelay4(IN:=TRUE,PT:=t#2s,ET:=) END if tDelay4.Q THEN i:=1000 tDelay4(IN:=FLASE,PT:=t#2s,ET:=) tDelay5(IN:=TRUE,PT:=t#2s,ET:=) END if tDelay5.Q THEN i:=10000 tDelay5(IN:=FLASE,PT:=t#2s,ET:=) END 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 实现流程顺序控制 - 流水灯。借助CASE OF语法(类似与C语言的 switch case) + 信号上升沿功能块, rt_Execute(CLK:=Execute , Q=>Execute_Q); IF rt_Execute.Q THEN iState:=0; END_IF
rt_Restart(CLK:=Restart , Q=>); IF rt_Restart.Q THEN iState:=iStateSave; END_IF
rt_STOP(CLK:=STOP , Q=>); IF rt_STOP.Q THEN iStateSave:=iState; iState:=-1; END_IF
rt_RESET(CLK:=RESET , Q=>); IF rt_RESET.Q THEN iState:=1000; END_IF
CASE iState OF -1: ; 0: el2809[0]:=TRUE; iState := 1; 1: el2809[1]:=TRUE; iState := 2; 2: el2809[2]:=TRUE; iState := 3; 3: el2809[3]:=TRUE; iState := 4; 4: el2809[4]:=TRUE; iState := 5; 5: el2809[0]:=FALSE; el2809[1]:=FALSE; el2809[2]:=FALSE; el2809[3]:=FALSE; el2809[4]:=FALSE; iState := 0; 1000: el2809[0]:=FALSE; el2809[1]:=FALSE; el2809[2]:=FALSE; el2809[3]:=FALSE; el2809[4]:=FALSE; END_CASE
1.4 附录 倍福帮助系统
官方PLC编程手册
IEC61131-3 代码风格(编程约定) 常见数据类型
文件后缀名解释