在探秘1中,探讨了属性,知道属性是类的代码。这里跟大家探讨类的其他代码。我们还是以一个简单例子开头。(本文档中所有例子的环境是CODESYS V3.5 SP20)
, 图 1
一,FB中的代码
这个我们很熟悉。比如在类FB1中,填写代码
statVar1 := tempVAR;
这一行代码就属于FB中的代码。
这里要注意一点。在非PLC的OOP语言中,是没有FB代码的。FB中有代码完全是历史遗留问题。在IEC61131-3的早期版本中,是没有典型的OOP编程的,但是有FB,FB里面允许有代码。这个特点是沿袭了SIEMENS的S7系列PLC,该系列PLC在1992年就推出到市场了。也就是说1992年的时候FB中就有代码了。到近期的IEC61131-3版本中增加了完全的OOP特性,不过FB中允许有代码这一特点也保留了下来。所以从OOP的角度看FB的代码就有些四不象。下一讲中,会说到OOP在继承时会抛弃这个4不象。
个人建议,如果用纯OOP思想编程,那么FB中不要添加代码。
二,Action
1,Action的基本概念
给这个类添加一个ACTION,中文翻译为动作。如图2
,图2
从图2,我们可以获取3个信息。
第一,动作没有任何变量声明的位置,也就意味着动作不允许做变量声明。但是可以使用类中的任意变量。
第二,动作可以对FB声明的任意类型变量做读和写的访问操作。
第三,从以上2点看,动作实际上是FB中代码的延申或者补充。在某种意义上,可以认为,在FB中的一些代码写在了动作中,只不过动作中的代码可以独立调用。
2,Action的调用
既然是代码,就有调用的问题。在哪里允许调用。这里先给出测试结果:在哪里都可以调用。
在对象外可以调用,如图3
,图 3
在对象内部可以调用,如图4
, 图 4
在对象内部的其他动作中可以调用,如图5
, 图 5
ACT也可以调用自己形成递归算法。
既然FB内部的动作可以互相调用,那么注意不要形成无限调用死循环。
另外,在方法中也可以调用动作。这里不做例子。
三,Method
1,方法中变量的存活期
在FB中,创建一个Meth方法。
, 图 6
从图6中,可以看出2点:
1, 方法可以有返回值,本例中的返回值是INT类型
2,方法中不可以声明临时变量。这是为什么呢?因为除了stat区域声明的变量外,其余变量都是临时变量。所以无需再额外有临时变量的声明区。
除了stat区域声明的变量外,其余变量都是临时变量。这个结论从下例中得到。
我们首先在方法中,填写代码如图7
,图7
再为执行这段代码编程,如图8
,图8
执行程序得到执行效果,如图9
,图9
变量VAR2永远是0。虽然每个周期都累加1,但是因为是临时变量,所以每个周期的初始值是0。但是变量statVAR2也是每个周期累加1,该变量的值可以跨越周期保存。在此我们有个猜想。既然statVAR2变量在STAT区域声明的,那么是不是就象在FB中STAT区声明的变量一样,statVAR2是所有对象共用变量。看图8和图10
,图10
从图10中观察到变量i1和i2不相等,由此得到一个重要结论,在方法中STAT区域声明的变量存活期不同于类的STAT区声明的变量,而完全等同与类中普通变量。
到此我们是不是觉得OOP有些复杂呢!
2,方法中变量的作用域
方法中的变量只能在方法内使用。在方法外不可见。
,图 11
如果方法中有变量名称与对象的变量名称同名,如图11红框的VAR1。在本方法内如果写为VAR1,那么这个变量就是本方法内声明的变量。写法是this^.VAR1 ,那么就是对象的VAR1变量。
3,方法中访问对象的变量
下面的例子,对方法重新定义,如图12
,图12
从图12得到结论:方法中可以访问除了对象的临时变量外的所有变量。这一点与动作不同。
如果欲访问的对象变量名称与方法中的变量重名,那么需要加“this^.”。这在第2小节中已经讨论过。
4,方法的调用
1,方法可以在类中调用
,图13
动作是FB中代码的延申,所以动作中也可以调用方法,如图14。
,图14
方法也可以在类内部的方法中调用,如图15
,图15
方法也可以在自己中调用,这就是递归算法,如图16
,图16
方法也可以在类外部调用,如图17
,图17
5,与经典OOP的比较
通过上面的讨论,发现PLC中的OOP的方法与经典OOP高级语言的方法特性是一样。
四,属性
在探秘1中我们就对属性进行了探讨,知道属性就是代码。在本文档中就不做更多的阐述。
到这里,本文档的内容就结束了。本文档总结了OOP中代码的一些特性。通过前文的讨论,我们知道OOP中代码的特性很复杂。不过好在有本文档在,如果在编写代码过程中对一些特性记忆模糊了,可以到此翻阅。
PLC面向对象编程类的代码探秘
599

被折叠的 条评论
为什么被折叠?



