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中是沒有的,具體有哪些不同,還需要繼續挖掘。