在实现函数或者功能块的时候如想要实现一个输入支持多种数据类型的输入,可以将输入(VAR_INPUT)声明为具有通用IEC数据类型(ANYANY_<type>)的变量。结果,你可以实现对数据类型具有不同调用参数的调用。在runtime中,你可以通过编程块中输入变量的预定义结构来检索传输的值及其类型。

编译代码时,ANY数据类型被内部替换为以下结构:

TYPE AnyType :
STRUCT
        // 实际参数的类型
    typeclass : __SYSTEM.TYPE_CLASS ;
        // 指向实际参数的指针
    pvalue : POINTER TO BYTE;
        // 指针指向的数据大小
    diSize : DINT;
END_STRUCT
END_TYPE

以下代码实现了将任意byte类型的排列转换为字符串

FUNCTION AryToStringTest : String

VAR_INPUT

In:ANY;

Size:UINT;

END_VAR

VAR_OUTPUT

Out:STRING(255);

END_VAR

VAR

ByteAry:ARRAY[0..1984]OF BYTE;

StringAry:ARRAY[0..255]OF STRING;

index:DINT;

ByteLenght:DINT;

END_VAR

//获取数组数据

FOR index:=0 TO In.diSize-1 DO

ByteAry[index]:=In.pValue[index];

END_FOR

//转换成字符编码

FOR index:=0 TO Size -1 DO

StringAry[index]:=F_ByteToAsc(ByteAry[index]);

END_FOR

//合成字符串

FOR index:=0 TO Size -1 DO

Out:=CONCAT(STR1:=Out,StringAry[index]);

END_FOR