2016年12月13日

PLC编程再思考之三:面向过程

现在的高级语言基本上都是面向对象的,但是PLC编程象较早的BASIC/FORTRAN语言一样,是面向过程的。
PLC逻辑处理的基本过程为:
1)       将外部设备输入的数据写入输入映像区(I)
2)       逻辑处理,包括读I区、写Q区。
3)       将输出映像区(Q)的数据输出到外部设备。
其中,1)3)PLC内部处理的,所有的PLC用户程序只处理第2)部分。
PLC的这种处理方式带来了下面2个特点。

特点1OB1调用的程序不存在并发
我们知道,PLC用户程序主要运行在2个地方:中断和OB1
一般而言,能够在一个扫描周期里完成的逻辑处理,通常我们会在OB1中进行调用,而OB1中的程序是按照严格的调用顺序进行处理的。
比如CPU扫描周期是20ms,那么在某个nsCPU只会处理某个特定的FC/FB/NW
举个例子,1工位的工人同时按个2个按钮,而在PLC层面,对这2个按钮的事件处理是有先后顺序的。
因此,严格地说起来,PLC不存在真正的并发。
有效利用这一特点,可以让编程变得更轻松。
比如1条线有30个工位要进行呼叫处理,而每个工位的呼叫处理逻辑是一样的,那么我们可以建立一个临时DB,存储任意一个工位的所有中间变量。
OB1按照工位的顺序进行处理,当执行到第N个工位时,临时DB的变量值就记录了第N个工位的中间变量值。当执行到下一工位时,临时DB被重写,以用于下一工位业务处理。
由于PLC在任意一个瞬间只处理一个特定的工位,因此临时DB的值和此工位有严格的对应关系,因此我们无需在FC里声明变量,因为所有的变量都已定义在临时DB中。
这样处理可以让程序更加简洁通用、变量少,可以用FC变相地实现FB的功能。

特点2:后面赋值覆盖前面赋值
高级语言在符合条件的时候就会输出,而PLC只会在所有逻辑处理完成以后才会输出,并且只输出最后写入的值。
比如在同一个扫描周期,先执行了Q0.0=0,后执行了Q0.0=1,由于在执行的过程中,数据仍然存储于输出映像区,这2步操作相当于在同一个扫描周期内对Q0.0的映像区进行了2个赋值操作,并用后一次赋值覆盖前一次赋值,因此OB1最终将Q0.0赋值为1,然后将此值输出到外部设备。
我们在编程的时候利用这一特点,可以减少一些比较的运算处理。
比如某工位按下按钮1则亮黄灯(红灯灭),按下按钮2则亮红灯(黄灯灭),同时按下则红灯亮(黄灯灭)
也就是说从业务上来说,按钮2的级别较高。
相对的,我们可以先写按钮1的处理逻辑,再写按钮2的处理逻辑,当2个按钮都按下时,根据PLC的特点,CPU只输出按钮2的处理结果,因此我们无需写比较的程序。


没有评论: