函数(Function)是一个可赋予参数,但不存储(没有记忆)其状态的POU,即它不存储其输入、内部(或暂存)变量和输出/返回值。如果没有其他说明,POU的公用性能适用于函数。
当用相同的输入参数、输入-输出参数或相同的外部参数的值调用某一函数时,该函数总能够生成相同的结果作为其函数的输出变量、输入-输出变量、外部变量和函数返回值。但一些函数,实施者将它作为系统函数,这时函数可具有不同的值,例如TIME、RANDOM函数。
函数也被译为功能。函数分为标准函数和用户自定义函数等两类。
函数有多个输入变量,没有输出变量,但有一个输出作为该函数的返回值。函数由函数名、函数返回值的数据类型和一个函数本体等组成。函数可以用文字或图形的格式表示。
执行函数的结果可得到下列结果:
1)通常,函数执行结果提供一个暂时结果,它可以是单元素数据或多元素的数组或结构变量的数据。
2)提供可能的具有多值的输出变量。
3)可改变输入-输出变量或外部变量的值。
具有返回值的函数可在一个表达式或一个语句中被调用。没有返回值的函数不能在一个表达式内被调用。在一次函数调用和下一次函数调用之间,函数不存储任何输入、内部(或暂存)和输出元素的值。
1.函数的声明
(1)函数声明的内容
表1-29说明函数声明的内容。
表1-29 函数的声明
①由于兼容性的原因,与功能块的区别是:VAR内部变量在功能块中是静态变量(可被存储)。
函数声明时注意下列事项:
1)函数的文本格式如下:
2)如果没有函数返回值,IEC 61131-3第三版规定,可在函数名后不带“:”和函数返回值的数据类型。
3)函数内变量的声明可参考表1-29的变量声明段。
4)函数中允许使用输入、输出、输入-输出、外部、内部、暂存等变量。有关规定如下:
①如果需要,在VAR_INPUT、VAR_OUTPUT和VAR_IN_OUT的变量结构规定函数参数的名称和数据类型。
②通过VAR_EXTERNAL的变量结构,函数可将变量的值在函数块内进行修改。
③通过VAR_EXTERNALCONSTANT的变量结构,函数不能将常量的值在函数块内进行修改。
④通过VAR_IN_OUT的变量结构,函数可将变量的值在函数块内进行修改。
⑤在VAR_INPUT、VAR_OUTPUT和VAR_IN_OUT的变量结构,可使用可变长度数组变量。
⑥允许输入、输出和暂存变量在变量声明段进行初始化。
⑦如果设置EN和ENO,则根据EN和ENO的规则对该函数进行操作。
⑧如果需要,VAR…END_VAR结构和VAR_TEMP…END_VAR结构一样,可用于规定内部的暂存变量名和其数据类型。在VAR…END_VAR结构中声明的变量不被存储。
⑨标准函数的变量声明段中,如果使用一般数据类型(例如ANY_INT),则这类函数参数的实际数据类型的使用规则是函数定义的一部分。
⑩变量声明段内变量初始化结构能用于函数输入变量初始值声明,以及内部和输出变量初始值声明。
(2)函数声明的示例
【例1-28】函数参数接口的规定。
图1-13是用图形格式表示的函数参数接口关系。可以看到,矩形框(函数框)内上部的SIMPLE_FUN是函数名;函数框右侧没有参数连接的REAL表示函数的返回值数据类型;与函数框左侧内部A、B和C变量连接的,在外部表示的REAL声明函数的这些输入变量数据类型是实数数据类型;需指出,图形格式描述无法显示用户定义的变量的初始值。与函数框左侧和右侧内部COUNT变量连接的,在外部表示的INT声明函数的输入-输出变量COUNT的数据类型是整数数据类型。
图1-13 函数参数接口的图形格式
【例1-29】函数实体的规定。
COUNT:=COUNTP1 //将上述操作结果赋值给变量COUNT
SIMPLE_FUN:=A*B/C; //调用表达式A*B/C,将结果赋值给函数的返回值(即函数名)
图1-14是用图形格式表示的函数实体。IEC 61131-3第三版将内部变量作为函数实体的一部分,因此,没有将它放在函数变量声明段。示例中,第一行声明变量COUNTP1是内部变量,它不被存储,换言之,在该函数调用完成后变量COUNTP1的内容不被保存。图形中不显示该内部变量。第二行函数调用标准函数ADD(COUNT,1),完成将COUNT加1的操作,它用第一部分的图形符号描述。第三行是赋值操作,将调用标准函数ADD(COUNT,1)的返回值赋值给COUNT,用图形格式中的第二部分描述。第四行是将表达式的值赋值给函数返回值,用图形格式的第三部分描述。图形符号中,ADD表示加函数;:=表示赋值操作,也可用MOVE函数表示;*表示乘法运算,也可用MUL函数表示;/表示除法运算,也可用DIV函数表示。为防止除法运算时,除数为零,因此,函数变量声明段,将除数变量C的初始值设置为1.0。
图1-14 函数实体程序的图形格式
IEC 61131-3第三版将内部变量声明段作为函数实体的部分进行编程。
【例1-30】没有函数返回值,用内部变量输出。
图1-15是没有函数返回值的该函数的图形格式。本示例中,LastIndex是不大于100的整数,FirstIndex是不小于0的整数。
图1-15 没有函数返回值的函数的图形格式
图1-15中,Sum是该函数的输出参数,因此,该参数被列写在函数矩形框内的右侧。因没有返回值,图形符号中返回值(没有变量名)没有显示,也没有连接线连接到外部的变量。
2.函数的调用
函数的调用可用文本格式和图形格式表示。由于函数的输入变量、输出变量和函数返回值不被存储,因此,函数调用时,函数输入变量的赋值、函数输出变量的存取和函数返回值的存取立刻进行。
将可变长度数组作为函数的一个参数时,该参数应作为静态变量连接。
表1-30是函数调用的示例。
表1-30 函数调用的示例
【例1-31】标准函数调用的应用。
带函数返回值和EN/ENO的标准函数调用(图形格式见图1-16)。
图1-16 示例的函数调用的图形格式
【例1-32】没有返回值的函数的声明。
(1)文本格式描述:
FUNCTION My_function //没有声明数据类型,表示该函数没有返回值
VAR_INPUT In1:REAL;END_VAR //输入变量声明段
VAR_OUTPUT Out1,Out2:REAL; END_VAR //输出变量声明段
VAR_TEMP Tmp1:REAL;END_VAR //允许采用暂存变量VAR_TEMP
VAR_EXTERNAL Ext:BOOL;END_VAR //外部变量声明段
//此处,函数本体程序未列出
END_FUNCTION
(2)图形格式描述:见图1-17。
【例1-33】带输入-输出变量的函数调用。
(1)文本格式描述:
图1-17 函数图形格式描述
(2)图形格式描述:图1-18是上述示例的程序本体的图形描述。
图1-18 采用输入-输出变量的程序本体的图形描述
3.类型化和过载函数
(1)类型化函数
类型化函数指函数的变量数据类型适用于特定数据类型,用函数名后添加一个“_”(下画线)字符和特定所需的数据类型表示。例如,ADD_INT表示该函数只适用于整数变量的相加。
类型化函数用特定的数据类型作为其输入和输出,可采用显式和隐式数据类型转换。
表1-31是类型化函数的示例。
表1-31 类型化函数的示例
(2)过载转换函数
如果函数的输入变量不限于某个单一的数据类型,而可用于不同数据类型,例如,一般数据类型,则称该函数具有过载(Overloading)属性或超载属性。标准函数都具有过载属性,它能够适用于不同的数据类型。如果函数只适用于某类数据类型,则需在函数名中给予声明,这称为函数的类型化(Typed)。
过载属性的实质是将不同的数据类型经数据类型转换函数转换为所需的数据类型,并进行有关的函数运算,运算结果再转换为所需的数据类型。
过载转换函数的格式是TO_xxx或TRUNC_xxx,其中,xxx表示需要类型化的基本数据类型。例如,TO_INT表示转换为整数的过载函数,它将任何数据类型转换为整数数据类型。
过载转换函数不规定需要转换的数据类型,而规定转换后的数据类型,因此,具有过载属性。而下面介绍的数据类型转换函数规定需要转换的数据类型,也规定转换后的数据类型。因此,不具有过载属性。
过载转换函数只适用于标准函数和标准功能块。
表1-32是过载转换函数的示例。
表1-32 过载转换函数示例
①如果支持序号2的性能,实施者应提供附加的表格,来显示什么函数是可以过载的和在实施时如何类型化。
4.标准函数
IEC61131-3第三版规定10类标准函数。它们是:数据类型转换函数、数值函数、算术函数、位串函数、选择和比较函数、字符串函数、日期和时间函数、字节序转换函数、枚举数据类型函数和验证函数。与第二版比较,增加字节序转换函数和验证函数,并扩展了数据类型转换函数等内容。
(1)数据类型转换函数
表1-33是数据类型转换函数(Data type conversion function)的图形格式和文字格式。
表中,对于序号1a形式的数据类型转换函数,可根据源数据类型和目标数据类型的不同,分为214种不同类型的数据类型转换函数,详见下述。
表1-33 数据类型转换函数的图形格式和文字格式
①本表序号1的一致性声明包括所支持的特定数据类型的转换和执行每个数据转换的影响的声明。
②从数据类型REAL或LREAL到SINT、INT、DINT或LINT的转换应根据GB/T17966—2000与(IEC60559等效)的规定,据此,如果两个最接近的整数是同样接近,则结果是最接近的偶整数,例如:
REAL_TO_INT(1.6)=2;REAL_TO_INT(-1.6)=-2; REAL_TO_INT(1.5)=2; REAL_TO_INT(-1.5)=-2;
REAL_TO_INT(1.4)=1;REAL_TO_INT(-1.4)=-1; REAL_TO_INT(2.5)=2; REAL_TO_INT(-2.5)=-2.
③TRUNC_**函数和*_TRUNC_**函数用于将REAL或LREAL小数尾数截断,获得整数类型的变量,例如:
TRUNC_INT(1.6)=INT#1;TRUNC_INT(-1.6)=INT#-1; TRUNC_SINT(1.4)=SINT#1;TRUNC_SINT(-1.4)=SINT#-1.
④*_BCD_TO_**和**_TO_BCD_*转换函数执行类型为位串变量数据类型BYTE,WORD,DWORD和LWORD和数值数据类型USINT,UINT,UDINT和ULINT之间的转换(相应地表示为*和**)。其中,相应的位串变量包含数据编码为BCD格式。
例如,USINT_TO_BCD_BYTE(25)的值是2#0010_0101,而WORD_BCD_TO_UINT(2#0001_0101_1000)是158。
⑤类型转换函数输入或输出是STRING或WSTRING,则字符串数据应符合1.4.2节规定的相应的数据外部表示和GB13000—2010规定的字符集
1)数字数据类型的数据类型转换。数字数据类型转换时的注意事项如下:
①数据类型转换步骤为:
➢源数据类型被扩展到同一数据类型目录中它的保持其值的最大数据类型。
➢然后,将结果转换为目标数据类型目录中最大的数据类型,作为它所属的目标数据类型。
➢再将结果转换到目标数据类型。
②转换浮点数时,采用舍入规则,即舍入到最接近的整数。根据GB/T 17966—2000(等效IEC60559)的规定,如果同样接近,则舍入到最接近的偶整数,示例见表1-33的注②。
③源数据类型是BOOL时,作为无符号整数数据类型,其值为0和1。
④如果源变量的值不适合转换为目标数据类型,即该值的范围太小,则目标变量的值由实施者规定。
表1-34规定了90种数字数据类型转换函数的转换细节。
表1-34 数字数据类型转换函数的转换细节
【例1-34】数字数据的数据类型转换。
X:=REAL_TO_INT(70_000.4)
本例的转换方法如下:
①实数70_000.4转换到实数数据类型中最大数据类型LREAL的值70_000.400_000...。
②将LREAL的值70_000.400_000...转换为目标数据类型中最大的数据类型LINT的值70_000。
③将LINT的值70_000转换到INT的值,由于INT的最大保持值是65536,因此,导致在目标数据类型的变量X保持同样的值65536作为源变量。
2)位数据类型的数据类型转换。位数据类型的数据类型转换遵循下列规则:
①位数据类型的数据类型转换是二进制传输;
②如图1-19所示,如果源数据类型小于目标数据类型,则源数值被存储在目标变量的最右字节,最左字节被设置为零。
图1-19 位数据类型的数据转换细节
③如果源数据类型大于目标数据类型,则只有源变量最右的字节被存储在目标数据类型。
表1-35是28种位数据类型转换函数的转换细节。
表1-35 位数据类型转换函数的转换细节
3)位数据类型与数字数据类型之间的数据类型转换。位数据类型与数字数据类型之间的数据类型转换遵循下列规则:
①位数据类型到数字数据类型的数据类型转换是二进制传输。
②如果源数据类型小于目标数据类型,则源值被存储在目标变量的最右字节,最左字节被设置为零。
【例1-35】源数据类型小于目标数据类型的数据类型转换。
VAR X:SINT:=34;W:WORD;END_VAR; W:=SINT_TO_WORD(X);
转换结果:W的值是16#0022。
③如果源数据类型大于目标数据类型,则只有源变量的最右的字节被存储在目标数据类型。
【例1-36】源数据类型大于目标数据类型的数据类型转换。
VAR W:WORD:=16#1234;X:SINT; END_VAR; X:=WORD_TO_SINT(W);
转换结果:X的值是16#34,即52。
表1-36是76种位数据类型与数字数据类型的数据类型转换函数的转换细节。
表1-36 位数据类型与数字数据类型的数据类型转换函数的转换细节
(续)
4)日期和时间数据类型的数据类型转换。12种日期和时间数据类型的数据类型转换函数的转换细节见表1-37。
表1-37 日期和时间类型的数据类型转换细节
5)字符类型的数据类型转换。8种字符类型的数据类型转换函数的转换细节见表1-38。
表1-38 日期和时间类型的数据类型转换细节
(2)数值函数
数值函数(Numerical function)用于对数值变量进行数学运算。该函数图形表示是将数值函数名称填写在函数图形符号内,并连接有关输入和输出变量。数值函数的输入是单数值变量。数值函数的输入和返回值(输出)数据类型是相同的。
如果函数求值结果超过该函数返回值规定的数据类型规定范围或如果企图除以零,则出错。
表1-39是12种标准数值类函数的图形格式和文字格式。
表1-39 标准数值函数的图形格式和文字格式
使用数值函数时注意下列事项:
1)数值函数是过载函数,也是类型化函数。
2)正弦、余弦和正切函数的输入数据以弧度为单位,反正弦、反余弦和反正切函数计算获得主值。
3)LN是自然对数,EXP是自然指数,都以自然对数的基e为底数。
4)除绝对值函数的输入-输出数据类型是ANY_NUM外,其他数值函数的输入-输出数据类型是一般数据类型的ANY_REAL。
5)数值函数有一个输入变量和一个返回值。
6)数值函数可用符号表示和函数名表示。
7)IEC 61131-3第三版增加ATAN2函数,它给出平面上的点(x,y)与原点的连线与x轴正方向之间的夹角。因此,是点(x,y)的纵坐标y与横坐标x相除后结果的反正切,即ATAN2(x,y)=ATAN(DIV(y,x))。
【例1-37】数值函数应用示例。
C:=ABS(A);B:=SQRT(C); //计算A的绝对值,并赋值给C,计算C的开方结果,并赋值给B
(3)算术函数
算术函数(Arithmetic function)用于对多个输入变量进行算术运算,包括加(ADD)、减(SUB)、乘(MUL)、除(DIV)、模除(MOD)、幂(EXPT)和赋值(MOVE)等。
表1-40是算术函数的图形格式和文字格式。
表1-40 算术函数的图形格式和文本格式
注:符号列中非空白的项适合用于文本类编程语言中作为操作符;符号IN1,IN2,…,表示从上到下输入的排列顺序;OUT表示输出;用法示例和描述用ST编程语言给出。(www.xing528.com)
①当支持采用函数名表示函数时,在符合性语句声明中,用后缀n表示。例如,1n表示符号“ADD”(第二版在序号12,因此,用12n表示)。
②当支持采用符号表示函数时,在符合性语句声明中,用后缀s表示。例如,1s表示符号“+”(第二版在序号12,因此,用12s表示)。
③这些函数的输入和输出的一般数据类型是ANY_MAGNITUDE。
④整数除法的结果是向零截断的同样数据类型的一个整数,例如,7/3=2和(-7)/3=-2。
⑤MOD函数中,IN1和IN2是一般数据类型的ANY_INT,MOD函数的求值结果是与执行ST编程语言中的下列语句等效:
使用算术函数时注意下列事项:
1)算术函数的输入变量和输出变量的数据类型都是ANY_NUM,都只有一个输出变量。
2)除了加和乘运算函数可有多个输入变量,赋值函数只有一个输入变量外,其他算术函数有两个输入变量,并将第一个输入变量与第二个输入变量进行有关的算术运算,例如IN1-IN2、IN1/IN2、IN1 MOD IN2等。加和乘函数称为可扩展的算术函数。其他算术函数是不可扩展的算术函数。
3)赋值函数将输入变量的数据移动,赋值到函数的返回值,即OUT:=IN。
4)算术函数可用符号表示和函数名表示,见表1-40。
5)输入-输出变量的数据类型符合一般算术运算的要求,例如,整数除法的结果是向零截断的整数,实数除法的结果是实数等。
【例1-38】算术函数应用示例。
Temp_Comp:=(273.15+50.0)/(273.15+S1); //设计温度50℃,实际温度S1时的温度补偿系数
(4)位串函数
位串函数(Bit string function)包括位串移位函数和位串的按位布尔函数。
1)位串移位函数。位串移位函数(Bit shift function)有两个输入变量,第一个变量IN是需要移位的位串,数据类型是ANY_BIT;第二个变量N是移动的位数,数据类型是ANY_INT。函数返回值仍是位串,数据类型是ANY_BIT。
表1-41显示位串函数的图形格式和文字格式。
表1-41 位串函数的图形格式和文本格式
注:说明列中的符号OUT指函数的返回值。示例:IN:=2#1100_1001; 是字节类型数据,N=3;则SHL(IN,3)的结果是2#0100_1000; SHR(IN,3)的结果是2#0001_1001;ROL(IN,3)的结果是2#0100_1110; ROR(IN, 3)的结果是2#0011_1001。
使用位串移位函数时注意下列事项:
①移位函数分不循环左移(SHL)、不循环右移(SHR)、循环左移(ROL)和循环右移(ROR)四种。
②SHL函数将输入位串IN左移N位,右面填零,N是大于0的整数。
③SHR函数将输入位串IN右移N位,左面填零,N是大于0的整数。
④ROL函数对输入位串IN进行左移循环移位N位,N是大于0的整数。
⑤ROR函数对输入位串IN进行右移循环移位N位,N是大于0的整数。
⑥如果N的值小于零则出错。如果N的值为零表示不移位。
⑦输入位串和输出返回值的数据类型是ANY_BIT,即可以是LWORD、DWORD、WORD、BYTE或BOOL中的任何一种数据类型。
2)位串的按位布尔函数。位串的按位布尔函数(Bitwise Boolean function)用于对位串按位进行逻辑运算,例如,与、或、非和异或运算。表1-42显示位串的按位布尔函数的图形格式和文字格式。
表1-42 按位布尔函数的图形格式和文本格式
注:1.当支持采用函数名表示函数时,在符合性语句声明中,可用后缀n表示。例如,1n表示符号“AND”。
2.当支持采用符号表示函数时,在符合性语句声明中,可用后缀s表示。例如,1s表示符号“&”。
①文本编程语言中,该符号作为操作符。
②符号IN1,IN2,…,表示从上到下输入的排列顺序;OUT表示函数的返回值。
③用法示例和描述用ST编程语言给出。
④BOOL类型信号的图形取反也如表1-30所示,用外切圆实现。
使用位串的按位布尔函数时注意下列事项:
①OR和XOR函数不能用文字符号表示形式,其他函数都可用函数名或符号文字形式。
②按位布尔函数可采用函数名或符号两种文字形式。
(5)选择和比较函数
1)选择函数。选择函数(Selection function)用于根据条件来选择输入信号作为输出返回值。选择的条件包括单路选择,输入信号本身的最大、最小、限值和多路选择等。表1-43显示选择函数的图形格式和文字格式。
表1-43 选择函数的图形格式和文本格式
注:1.符号IN1,IN2,…,表示从上到下输入的排列顺序;OUT表示函数返回值。
2.用法示例和描述用ST编程语言给出。
①MOVE函数只有一个类型为ANY的输入IN和一个类型ANY的输出OUT。
②为声明符合本性能,允许(但非必须)实施者支持用户定义的数据类型的变量之间的选择。
③当MUX函数的实际输入K不在{0…n-1}范围内,则出错。
IEC 61131-3第三版将MOVE函数作为赋值函数处理,它也作为选择函数列出。
使用选择类函数时注意下列事项:
①不同选择函数的各输入变量允许的数据类型不同,见表1-43。
②从上到下顺序,IN1,IN2,…,INn符号表示输入,OUT表示输出的返回值。多路选择器MUX函数中无名称的输入,从上到下顺序,有默认的名称IN0,IN1,…,INn,其中,n是输入变量的总数。这些名称可以显示,也可不在图形描述中显示。
③多路选择器MUX函数也可用MUX_*_**的文字形式表示,其中,*是输入变量K的数据类型,**是其他输入和输出变量的数据类型。例如,MUX_INT_REAL(A,B,C)。
④应用时,MUX的输入变量K的数据应在被选择变量个数n的范围内,即输入变量K的值应在0到n-1间选择。例如,A:=MUX(0,B,C,D);表示K=0,因此,选择第二个输入变量B作为其函数的返回值。
⑤除SEL选择函数的G输入和MUX多路选择器的K输入外,其他选择类函数中的输入和输出需采用相同的数据类型,以保证数据类型的正确。
⑥LIMIT函数是限幅函数。当输入IN在下限MN和上限MX之间时,输出的返回值与输入相等。当低于下限时,输出返回值被限幅到下限输出。反之,当高于上限时,输出返回值被限幅到上限输出。图1-20是LIMIT函数的输入-输出关系曲线。
2)比较函数。比较函数(Comparison function)用于比较多个输入变量数值的大小。比较函数对所有数据类型是过载的。所有比较函数,除了NE外都是可扩展的。表1-44显示比较函数的图形格式和文字格式。
图1-20 LIMIT的输入-输出关系
表1-44 比较函数的图形格式和文本格式
注:1.本表显示的所有符号适合在文本类编程语言中作为操作符。
2.用ST编程语言给出用法示例和描述。
①当支持采用函数名表示函数时,在符合性语句声明中,可用后缀n表示。例如,1n表示符号“GT”。
②当支持采用符号表示函数时,在符合性语句声明中,可用后缀s表示。例如,1s表示符号“>”。
使用比较类函数时注意下列事项:
①IN1,IN2,…,INn符号表示从上到下顺序的输入,OUT表示输出的返回值。
②比较的输入变量应具有相同的数据类型,可以比较数值,也可以比较字符串。
③NE函数用于比较两个输入变量的不相等,它是不可扩展的,即只有两个变量进行比较。其他比较类函数都有多个输入变量可选,因此,是可扩展的。
④大于比较是递减序列的比较,小于比较是递增序列的比较,大于等于比较是单调序列的比较,小于等于比较也是单调序列的比较。
⑤比较函数的符号在文本类编程语言中也作为操作符号使用。
⑥可以比较的输入变量个数由实施者规定。
⑦两个字符串比较,如果它们的长度不等时,可在短串的右面填充零,然后进行比较运算。因此,字符串的比较应与无符号整数变量的比较具有相同的结果。
⑧两个字符串的比较从最高有效位(最左面)开始,逐位向最低有效位(最右面)进行比较。因此,'ABC'比'CBA'小,'AX'比'AGGY'大。字符串比较的不是字符串的长度,而是字符串对应的ASCII代码的大小。
(6)字符串函数
字符串函数(Character string function)用于处理输入的字符串,例如,确定字符串的长度、对输入的字符串进行截取。处理后的新字符串作为该函数的返回值。表1-45是字符串函数的图形格式和文本格式。
表1-45 字符串函数的图形格式和文本格式
注:表中的示例用ST编程语言给出。
使用字符串函数时应注意下列事项:
1)字符串的位置从最左开始编号,依次为1,2,3,…,L。L是字符串长度。
2)字符串函数中,用于定位的输入变量应是大于零的整数。其他定位的整数应使运算能够正确进行。如果函数运算结果要存取一个在字符串中不存在的字符位置时,系统就出错。
3)字符串串联扩展函数CONCAT是可扩展的,即输入字符串的个数可扩展。CONCAT函数的所有输入、INSERT、REPLACE和FIND函数的输入IN2的数据类型是ANY_CHARS,即也可以是CHAR或WCHAR数据类型。
4)最大串的长度由实施者规定。
5)下列情况出现,则出错:
①表1-45中指定为ANY_INT的任何输入的实际值小于零。
②函数的求值结果企图去存取字符串中不存在的字符位置,或生成一个字符串,其长度超出供应商规定的字符串最大长度。
③在同一函数中,数据类型STRING或CHAR和数据类型WSTRING或WCHAR混杂设置。
(7)日期和持续时间函数
日期和持续时间函数(Date and duration functions)是当数据类型是时间和持续时间数据类型时,有关函数的扩展。IEC61131-3第三版扩展了其内容,例如,长持续时间、长日期、长日时和长日期和时间的有关函数。
IEC61131-3第三版将时间数据类型的转换函数分类划归到数据类型转换函数中,并进行扩展。
1)日期和持续时间的数值函数。除了比较和选择函数外,表1-46中的输入和输出的时间和持续时间的数据类型的组合允许有相关的数值函数。如果这些函数之一的求值结果超出实施者规定的输出数据类型值的范围,则出错。
表1-46 时间和持续时间数据类型的数值函数
(续)
注:这些标准函数支持过载,但只在数据类型TIME,DT,DATE,TOD和LTIME,LDT,LDATE,LTOD数据类型内支持过载。
【例1-39】日期和时间的数值函数示例。
A:=T#35s+T#2h5s;B:=T#1h3s-T#1h18s;
运算结果:A=T#2h40s;B=T#-15s。
由于持续时间的数值允许有负值,因此,运算结果B的负值是允许的。
2)附加的日期和时间函数。附加的日期和时间函数包括对日期和时间的组合和分解。表1-47和表1-48是附加的日期和时间函数图形形式和文本形式。
表1-47 附加的日期和时间函数CONCAT的图形格式和文本格式
(续)
注:1.实施者规定ANY_INT输出所提供的数据类型。
2.实施者可根据支持的精度定义附加的输入或输出,例如微秒和纳秒。
表1-48 附加的日期和时间函数SPLIT和一周日期函数的图形格式和文本格式
(续)
注:1.在数据类型中,年的输入是至少16位数据类型,这样,才能支持有效的年的数值。
2.实施者规定ANY_INT输出所提供的数据类型。
3.实施者可根据支持的精度定义附加的输入或输出,例如微秒和纳秒。
附加的日期和时间函数是IEC61131-3第三版的扩展。它将第二版的CONCAT_DATE_TOD函数扩展为各种日期和时间的组合和分解,并增加了一周日期等函数。
(8)字节序转换函数
字节序转换函数(Functions for endianess conversion)将实施者规定所请求字节序转换到内部PLC所用的字节序或从内部PLC所用的字节序转换到实施者规定的所请求的字节序。
字节序是在一个较长的数据类型或变量内字节的存储序列。字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。有下列两种不同的存储方式:
1)高端优先(大端存储)的字节序中,数据的数据值放置在存储器的位置,开始是在第一字节的最左面,最后是在字节的最右面,即存储器的最低位地址用于存储数据的最高位数据。
2)低端优先(小端存储)的字节序中,数据的数据值放置在存储器的位置,开始是在第一字节的最右面,最后是在字节的最左面,即存储器的最低位地址用于存储数据的最低位数据。
独立于高端和低端字节序,对一个数据类型的最右面位,位的偏移是0地址。
不同CPU上运行不同的操作系统,其字节序不同。例如,x86系统、MIPSNT、PowerPC NT等是小端存储,而HP-UNIX、MIPS UNIX、SPARC UNIX等是大端存储。
【例1-40】字节序示例一。
TYPED:DWORD:=16#1234_5678;END_TYPE;
存储器配置:低地址 → 高地址
高端优先的字节序:16#12,16#34,16#56,16#78;
低端优先的字节序:16#78,16#56,16#34,16#12。
【例1-41】字节序示例二。
TYPEL:ULINT:=16#1234_5678_9ABC_DEF0;END_TYPE;
存储器配置:低地址 → 高地址
高端优先的字节序:16#12,16#34,16#56,16#78,16#9A,16#BC,16#DE,16#F0;
低端优先的字节序:16#F0,16#DE,16#BC,16#9A,16#78,16#56,16#34,16#12。
表1-49是字节序转换函数的图形格式和文本格式。
表1-49 字节序转换函数的图形格式和文本格式
注:输入和输出侧的数据类型应相同;如果变量已经在所请求的数据类型,则函数不改变该数据的表示。
(9)枚举数据类型的函数
在选择和比较函数中,SEL和MUX的输入变量是ANY类型,因此,它适用于用户定义的数据类型。当用于枚举数据时,输入和输出的枚举数据个数应相同。例如,在正常工况,某个变量可用三原色的某种组合显示,在某限值(例如下限)时,该变量以另一种颜色组合显示,用于作为警告信号。当达到另一限值(例如下下限)时,需用第三种颜色的组合显示并报警。这类应用项目就可用枚举变量的三种不同颜色组合作为多路选择器的三个输入变量,并用K来选择输出采用哪种颜色组合。K对应三种不同的工况(用0、1和2表示)。表1-50是能用于枚举类数据类型的选择和比较函数。
表1-50 枚举数据类型的选择和比较函数
注:表1-43的注1和注2适用于本表;表1-43的注①和②适用于本性能。
枚举数据类型的比较函数有EQ和NE函数。如果输入变量的枚举数据对应相等,则EQ函数的返回值为1。如果两个输入变量的枚举数据不相等,则NE函数的返回值为1。
(10)验证函数
IEC61131-3第三版扩展的验证函数(Validate functions)用于检查给出的输入参数是否包含一个验证的值。
过载验证函数IS_VALID用于数据类型REAL和LREAL的验证。如果实数是非数(NaN)或无穷(+Inf,-Inf),该验证函数的返回值是FALSE。
过载验证函数IS_VALID_BCD用于数据类型BYTE、WORD、DWORD、LWORD的验证。如果该值不执行定义的BCD,该验证函数的返回值是FALSE。
实施者可以支持验证函数IS_VALID带附加数据类型,其扩展结果由实施者规定。
表1-51是验证函数的图形格式和文本格式。
表1-51 验证函数的图形格式和文本格式
5.用户定义的函数
用户定义的函数也称为派生函数,它可以是标准函数的组合或调用,也可以是用户根据应用项目的要求编写的函数。可用派生函数编写新的派生函数。作为派生函数,它与标准函数具有相同的特性。
表1-52是两个派生函数的示例。
表1-52 派生函数的示例
(续)
编写派生函数时注意下列事项:
1)变量声明中变量的数据类型不允许采用一般数据类型。
2)派生函数只允许有一个返回值,IEC61131-3第三版规定可没有返回值,但可有多个输出。
3)派生函数中的变量名与实际应用时的实参变量可以同名。
4)派生函数输入变量的排列次序与输入变量声明时的先后次序相同。
【例1-42】用派生函数建立新的派生函数。
(1)建立长度函数LENGTH,用于计算两点之间的距离。
根据两点的坐标确定直线的长度,即建立如下派生函数LENGTH:
假设两点坐标为(X1,Y1)和(X2,Y2),则长度计算公式为
派生函数LENGTH的程序如下:
图1-21 LENGTH函数的本体程序
(2)建立面积函数AREA,它通过调用长度函数计算三角形的三条边长,然后,计算三角形面积。
假设三角形三顶点坐标为(X1,Y1)、(X2,Y2)和(X3,Y3),则三角形面积计算公式为
式中,S是三条边长S1、S2、S3之和的一半,即S=(S1+S2+S3)/2。
派生函数AREA的程序如下:
(3)派生函数的调用。
SS:=AREA(0.0,0.0,0.0,1.0,1.0,1.0,START);当START=BOOL#1时,计算结果SS是0.5。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。