我们在探秘1中讲解了类的属性。类的属性相比今天要讲解的成员变量要难一些。在探秘1中我们知道类的属性本质是函数是代码。但是今天所讲的成员变量的本质是变量。为什么先讲难一点的?因为想给各位一个心里预期:OOP并不是看上去那么简单。
在探秘1中我们留了一个尾巴没有展开讲解,这个尾巴就是成员变量的Private访问权限,本文档将对这个问题进行封闭。
关于FB中的成员变量,本文档探讨2个问题。
1,声明的区域不同,变量存储性有何不同。
2,声明的区域不同,在对象外部,变量的访问性有何不同
类(FB)可以有4种变量变量声明区。输入类型(还有一种输入输出类型变量,它与输入变量有着完全相同的特性,下文不在单列讨论。),输出类型,静态类型,临时类型。
下图所展示的是在FB中声明这4种变量。(本文档展示出代码均在CODESYS V3.5 SP20环境下)
,图1
临时变量最简单,先讨论临时变量。临时变量类似解几何题的辅助线。有没有辅助线,有何种辅助线对解题没有本质影响。在OOP或者非OOP编程中,临时变量的表现也是一样的。临时变量都是函数的伴生物,FB中的临时变量也不例外,它们是FB中代码的伴生物,FB中的代码可以视为一个函数。临时变量是存储在栈中,跨扫描周期读取数据时数值会变化,也不能被外部访问。这些都与SIMATIC中的临时变量表现一致。临时变量讨论完毕,下文只讨论其他3种变量。
一、 先讨论存储性。
静态变量:即使在不同的对象中静态变量占用相同的存储单元,可跨周期。在传统SIMATIC的FB中没有这种变量,SIMATIC是用全局数据块代替。
输入、输出、普通变量:不同的对象中占用不同的存储单元,可跨周期。这些都与传统SIMATIC中的表现一致。
二、再讨论在对象外的访问性。OOP中,变量或者代码共有以下4种访问性。
public:成员可以随意访问
private:成员只能在声明它们的类内部访问
protected:成员可以在类内部及其子类(派生类)中访问
internal:成员可以在同一程序集(assembly)或模块中的所有类中访问
这些关键词更详细的解释在网上可以容易查到,这里不做重点介绍。
有趣的是在图1中,声明变量时不可以添加上述4个关键词。否则编译器会报错。那么它们的访问性到底是怎样的呢?先看下图的例子,该例子中使用图1的FB1,并在PLC_PRG中声明一个对象fb1,做测试得到下面截图。
,图2
由这个例子,我们得到这样的结论:
IN和静态类型的访问性是PUBLIC;
OUT类型和普通类型的变量是有条件的PUBLIC,也就是只读不可写;
以上这2点是CODESYS编译系统的设置。在传统SIMATIC中,并没有任何设置,所有变量都是public访问属性。在SIMATIC AX中,可以用public等修饰符。
三、子类对父类变量的访问权限
创建一个子类FB1E,在该子类中编程测试,得到下图
,图3
由此得到结论,子类中可以完全访问父类的任何变量。
子类都可以完全访问,本类当然也可以完全访问。
四、重要推论
有了上面这些结论。在CODESYS中我们得到2个重要推论:
推论1:类外的代码即使不用get属性,也可以读取对象中的变量。
有了这个推论,我们就有一个疑问:get属性还有什么作用呢?这个问题我们留到后续讨论接口的时候再封闭。
推论2:类外的代码只能通过set属性对普通变量进行写操作。

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



