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 指针|菜鸟教程

参考JavaC++thissuper的定义,thissuper本质上就是指针,分别指向对象本身父类。在IEC61131-3THISSUPER也是同样的作用,是系统内置隐藏的关键字。

但是有一点不同的是,在JavaC#中存在值类型引用类型的概念,因此它们在使用thissuper时可以直接使用 "this.变量" 的方式,而在PLC ST中需要使用 "THIS^.变量" 的方式。其中符号"^"为指针的解引符(解除引用的符号)

Tips : Java中的关键字thissuper是区分大小写的,并且在IEC61131-3中也是THISSUPER这两个关键字,而在 C# 中则分别是thisbase(区分大小写)。

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中是没有的,具体有哪些不同,还需要继续挖掘。