1
泛型
泛型是gaoji编程语言的一种特性。它允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前再作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象。
2
TIA PORTAL中的Variant
VARIANT是TIAPORTAL中一种全新的数据类型,仅适用于S7-1200/1500,它被设计用来取代ANY、POINTER类型。VARIANT是一种安全的类型,它不会产生类似于内存访问错误之类的问题。和ANY、POINTER类型一样,VARIANT的意义在于传递参数,也就是作为模块的接口参数,这几种类型的引入极大的提高了PLC编程的灵活性。和ANY、POINTER类型不一样的是它不可以被解析,只能通过系统提供的指令进行操作。
本质上,Variant和Any及Pointer这三种类型区别并不大,都是属于引用类型,并不占用内存空间,它们访问的是传入参数的地址。也正因为这个原因在DB中是不允许声明Variant类型的变量的。但作为接口参数,在背景DB中允许Variant存在。将背景DB切换为标准访问模式可以发现Variant类型的变量是不占用空间的,它们没有地址偏移,
3
Variant作为模块接口VARIANT一般用于FB/FC接口参数的传递,而它被创建的意义也在于此。VARIANT可以传递除POINTER和ANY以外的任何类型的参数,在使用时用指令判断实参的实际类型进行读写。对于SCL编程,TIAPortal提供了四种指令用以判断传入参数的数据类型,如下表所列。
当我们获得了传入参数的数据,那我们就可以分别调用VariantGet和VariantPut指令去读写该参数的值,下面的变量声明和代码清单演示了这一操作。
这段代码的功能是先判断变量in3是否属于INT类型,若不是则退出。若是的话,先读出该变量的值并传送到变量Q,再将该变量的值初始化为零。
VARIANT类型在易用性方面较ANY和POINTER类型更强一点。Zui重要的是,它是安全的,不会发生在运行时指向一个不存在的内存区域的情况。当然在提供安全性的VARIANT类型也牺牲了一定的功能。
通常我们在开发一个带外部参数的FC或FB时都要为其指定相应的数据类型。而常常我们在调用该FC或FB时可能需要传入不同类型的变量。以一个开关选择器模块为例,这个模块有三个数值输入引脚、二个开关信号引脚和一个选择后的输出数值信号引脚,
对于该选择器模块,当我们在调用它时,有时可能传入的变量是整型,有时可能是双整型,而有时可能又是实型。基于这种情况,那我们可能需要分别编写参数类型为整型、双整型、单精度实型和双精度实型的模块来满足不同情况下的调用。而可不可能我们只编写一个模块就能满足不同情况下的调用呢?Variant类型可以满足这样的需求,只要我们将三个输入的数值参数和一个输出的数值参数定义为Variant类型就可以实现。这样我们在调用该模块时将被允许传入整型或双整型等不同类型的变量。
下面我们以编写一个这样的模块来了解Variant变量的使用。限于篇幅下图贴出了部分代码
完成模块并调用,并为之分别赋予不同类型的参数。编译并下载到PLC中,可以看到无论是双整型变量还是浮点型变量,该模块都能正确的工作。但缺点也显而易见,就是模块的体积太大了。如前说述,Variant是引用传入参数的地址,自身无法做运算,只能将数据移入各种类型的临时变量再做运算。