1.4.1 功能

功能(FUN)可以指定参数,但没有静态变量,也就是没有存储空间,在用相同的输入参数调用函数时总是返回相同的结果。


1.功能声明

文本方式下的功能声明必须包含以下元素:

● 关键字FUNCTION,以及紧跟其后的用于表明功能名称的标示符,一个冒号(:)和函数返回值的数据类型。

● 一个VAR_INPUT ... END_VAR结构,用于定义功能的输入变量的名字和数据类型。

● 如果需要的话,一个或多个VAR_IN_OUT ... END_VAR和VAR_OUTPUT ... END_VAR结构,用于定义功能输入输出(in-out)和输出变量的名字和类型。

● 如果需要的话,一个VAR ... END_VAR结构,用于定义功能内部变量的名字和数据类型。

● 一个功能体,用于指定针对变量所要执行的操作。其中一个与功能名相同的变量会被赋值,以作为函数的返回值。

● 功能声明的结束关键字END_FUNCTION。

功能声明的例子如下所示。

        FUNCTION SIMPLE_FUN : REAL
            VAR_INPUT
                A, B : REAL ;
                  C : REAL := 1.0;
            END_VAR
            VAR_IN_OUT COUNT : INT ; END_VAR
            VAR COUNT1 : INT ; END_VAR
        COUNT1 := ADD(COUNT,1);  (*Function body specification   *)
        COUNT := COUNT1 ;
            SIMPLE_FUN := A*B/C;
        END_FUNCTION

图形方式的功能声明包含下列元素:

● 关键字对FUNCTION ... END_FUNCTION,或同等的图形方式。

● 以图形方式指定的函数名,功能结果,以及变量(输入变量、输出变量和输入输出变量)的名称、数据类型及可能的初始化值。

● 对于功能内部变量名称、数据类型和可能的初始化声明,如利用VAR ... END_VAR结构。

● 功能体。

图形方式的功能声明如图1-9所示。

图1-9 功能图形方式声明


2.类型强制、重载和类型转换

对于一个标准功能、功能块类型、操作符或者指令而言,所谓的可重载(Overloading)指的是,能够在一类基本数据内操作不同类型的输入变量。比如,一个在基本数据ANY_NUM上的可重载的加法功能可以操作所有LREAL、REAL、DINT、INT和SINT类型的输入数据。

当一个PLC系统支持可重载标准功能、功能块类型、操作符或者指令时,这个标准功能、功能块类型、操作符或者指令必须能够被应用到该PLC系统支持的基本数据内的所有数据类型。例如,假如一个PLC系统支持可重载功能ADD以及数据类型SINT、INT和REAL,则该功能块应该支持所有的输入数据类型SINT、INT和REAL(因为它们都属于同一基本数据类型ANY_NUM)。

类型强制(Typing)指的是当一个可重载操作的功能被强制指定类型时,它的输入和输出变量的类型就被限制在一个特定的基本或者派生数据类型上。这可以通过在功能名后加上一个下划线和数据类型名称来实现,比如,基本ADD功能,其强制指定INT数据类型的表现形式为ADD_INT。

当一个在下节中说明的标准功能的输出结果为基本数据类型时,那么在一次功能调用中,所有输入变量(具有相同的基本数据类型)的实际数据类型必须与功能结果的实际类型相一致。假如需要的话,类型转换功能可以被用来满足该要求。


3.标准功能

这一节描述了所有PLC编程语言通用的功能。当一个标准功能为可扩展时,它允许拥有两个或更多的输入参数,而功能指定的操作将被应用到这些输入参数上。例如,可扩展加法功能,将其所有的输入参数相加,并将结果作为它的输出结果,如下所示。

        1:
        X := ADD(Y1, Y2, Y3);

        等价于:
        X := ADD(IN1 := Y1, IN2 := Y2, IN3 := Y3);
        2:
        I := MUX_INT(K:=3, IN0 := 1, IN2 := 2, IN4 := 3);
        等价于:
        I := 0;

(1)类型转换功能(Type Conversion Function)

类型转换功能必须具有*_TO_**的形式,其中*为输入参数IN的数据类型,而**则为输出变量OUT的数据类型,比如INT_TO_REAL。类型转换功能的转换精度、在转换过程中可能出现的错误类型都是与特定实现相关的参数。

(2)数值功能(Numeric Function)

数值功能实现针对一个或多个输入参数的数值运算,如一些常用的对数运算、三角函数和基本的算术运算。数值功能包括:ABS, SQRT, LN, LOG, EXP, SIN, COS, TAN, ASIN, ACOS, ATAN, ADD, MUL, SUB, DIV, MOD, EXPT和MOV。

(3)位串功能(Bit String Function)

位串功能实现的是针对位串(bit string)变量的移位。包括SHL、SHR、ROR和ROL。

位操作功能包括AND、OR、XOR和NOT。

(4)选择和比较功能(Selection and Comparison Function)

选择和比较功能都应当是可重载的。除了NE功能外,所有的比较功能都应是可扩展的。

位串数据类型的比较必须从most significant位到least significant位顺序按位比较。当较短的位串与较长的位串比较时,较短位串的左端必须以零补齐,也就是说,位串变量之间的比较结果应当与它们作为无符号整型变量比较的结果相同。

选择功能包含SEL、MAX、MIN、LIMIT和MUX。

比较功能包含GT、GE、EQ、LE、LT和NE。

(5)字符串功能(Character String Function)

所有在上节选择和比较功能中定义的功能都适用于字符串。当比较两个不同长度的字符串时,较短字符串右侧应当被视为扩展至较长字符串的长度,并且以零值填充。比较应当从左向右进行,并且基于IEC 61131标准2.1.1中定义的字符集内字符的数值。比如,字符串'Z'应当大于'AZ',而'AZ'应当大于'ABC'。

字符串功能包括LEN、LEFT、RIGT、MID、CONCAT、INSERT、DELETE、REPLACE和FIND。

(6)时间和日期相关功能(Functions of Time Date Type)

除了上述比较和选择功能,不同时间和日期数据类型的输入输出组合在相关的功能中也是允许的。该类型包含ADD_TIME、SUB_TIME、MULTIME和DIVTIME。

(7)枚举类型相关功能(Functions of Enumerated Data Type)

选择和比较功能也可应用于输入为枚举类型的情况,如SEL、MUX、EQ和NE。