PLC結構化文字(ST)——特殊指標(This&Super)

J_Sheng發表於2024-09-04

PLC Structured Text Object Oriented Programming

PLC結構化文字(ST)——特殊指標(This&Super)

關鍵字This和Super是什麼?

this 是自身的一個物件,代表物件本身,可以理解為:指向物件本身的一個指標。
super 可以理解為是指向自己超(父)類物件的一個指標,而這個超類指的是離自己最近的一個父類。---Java 中 this 和 super 的用法總結|菜鳥教程

在 C++ 中,this 指標是一個特殊的指標,它指向當前物件的例項。
在 C++ 中,每一個物件都能透過 this 指標來訪問自己的地址。
this是一個隱藏的指標,可以在類的成員函式中使用,它可以用來指向呼叫物件。---C++ this 指標|菜鳥教程

參考JavaC++thissuper的定義,thissuper本質上就是指標,分別指向物件本身父類。在IEC61131-3THISSUPER也是同樣的作用,是系統內建隱藏的關鍵字。

但是有一點不同的是,在JavaC#中存在值型別引用型別的概念,因此它們在使用thissuper時可以直接使用 "this.變數" 的方式,而在PLC ST中需要使用 "THIS^.變數" 的方式。其中符號"^"為指標的解引符(解除引用的符號)

Tips : Java中的關鍵字thissuper是區分大小寫的,並且在IEC61131-3中也是THISSUPER這兩個關鍵字,而在 C# 中則分別是thisbase(區分大小寫)。

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;

父類方法成員和子類方法成員相同時,可以使用THISSUPER指標來指定目標成員。

總結

THISSUPER是指標,儲存的是16進位制的記憶體地址,使用時需要解除引用,但也看具體程式設計需求。
THISSUPER不僅僅只有上面描述的使用場景,它們的功能用法與高階語言的Java & C# 對應關鍵字類似,但是畢竟PLC主要應用在工業,服務物件和使用場景不同,因此高階語言中的很多特性在PLC ST中是沒有的,具體有哪些不同,還需要繼續挖掘。

相關文章