PLC结构化文本(ST)——特殊指针(This&Super)
PLC Structured Text Object Oriented Programming
PLC结构化文本(ST)——特殊指针(This&Super)
关键字This和Super是什么?
this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。---Java 中 this 和 super 的用法总结|菜鸟教程
在 C++ 中,this 指针是一个特殊的指针,它指向当前对象的实例。
在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。
this是一个隐藏的指针,可以在类的成员函数中使用,它可以用来指向调用对象。---C++ this 指针|菜鸟教程
参考Java和C++对this和super的定义,this和super本质上就是指针,分别指向对象本身和父类。在IEC61131-3中THIS和SUPER也是同样的作用,是系统内置隐藏的关键字。
但是有一点不同的是,在Java和C#中存在值类型与引用类型的概念,因此它们在使用this和super时可以直接使用 "this.变量" 的方式,而在PLC ST中需要使用 "THIS^.变量" 的方式。其中符号"^"为指针的解引符(解除引用的符号)。
Tips : Java中的关键字this和super是区分大小写的,并且在IEC61131-3中也是THIS和SUPER这两个关键字,而在 C# 中则分别是this和base(区分大小写)。
this 和 super 的使用方法
- Java代码示例---Java 中 this 和 super 的用法总结|菜鸟教程
// this
class Person {
private int age = 10;
public Person(){
System.out.println("初始化年龄:"+age);
}
public int GetAge(int age){
this.age = age;
return this.age;
}
}
public class test1 {
public static void main(String[] args) {
Person Harry = new Person();
System.out.println("Harry's age is "+Harry.GetAge(12));
}
}
// super
class Country {
String name;
void value() {
name = "China";
}
}
class City extends Country {
String name;
void value() {
name = "Shanghai";
super.value(); //调用父类的方法
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
- IEC61131-3代码示例
FUNCTION_BLOCK FB_A
VAR_INPUT
nVarA: INT;
END_VAR
--------------
nVarA := 1;
---------------------------
FUNCTION_BLOCK FB_B EXTENDS FB_A
VAR_INPUT
nVarB : INT := 0;
END_VAR
--------------
nVarA := 11;
nVarB := 2;
---------------------------
// 这里的方法是属于FB_B功能块的
METHOD DoIt : BOOL
VAR_INPUT
END_VAR
VAR
nVarB : INT;
END_VAR
-------------
nVarB := 22; // 指的是DoIt方法本地声明的nVarB变量
THIS^.nVarB := 222; // 指的是功能块FB_B声明的nVarB变量
方法内部变量与功能块内部成员变量名重复时可以用THIS指针来指定。
// 父类
FUNCTION_BLOCK FB_Base
VAR_OUTPUT
nCnt : INT;
END_VAR
-------------------------
// METH_DoAlso 和 METH_DoIt都属于FB_Base方法成员
METHOD METH_DoAlso : BOOL
VAR_INPUT
END_VAR
-------------
METH_DoAlso := TRUE;
------------------------
METHOD METH_DoIt : BOOL
-------------
nCnt := -1;
------------------------
// 子类
FUNCTION_BLOCK FB_1 EXTENDS FB_Base
VAR_OUTPUT
nBase: INT;
END_VAR
------------
THIS^.METH_DoIt();
THIS^.METH_DoAlso();
SUPER^.METH_DoIt();
SUPER^.METH_DoAlso();
nBase := SUPER^.nCnt;
------------------------
// METH_DoAlso 和 METH_DoIt 是 FB_1 的方法成员
METHOD METH_DoAlso : BOOL
------------
nCnt := 123;
METH_DoAlso := FALSE;
------------------------
METHOD METH_DoIt : BOOL
------------
nCnt := 1111;
METH_DoIt := TRUE;
当父类方法成员和子类方法成员相同时,可以使用THIS和SUPER指针来指定目标成员。
总结
THIS和SUPER是指针,存储的是16进制的内存地址,使用时需要解除引用,但也看具体编程需求。
THIS和SUPER不仅仅只有上面描述的使用场景,它们的功能用法与高级语言的Java & C# 对应关键字类似,但是毕竟PLC主要应用在工业,服务对象和使用场景不同,因此高级语言中的很多特性在PLC ST中是没有的,具体有哪些不同,还需要继续挖掘。