quote:以下是引用*在2013-08-30 16:31:00的发言:
有没有谁在SCL编写的FC中使用ANY指针做为输入接口?个人感觉在SCL中很不方便,就又用回至STL了。大家有什么体会?
可以作为输入参数的接口,有些系统功能块的接口参数就是ANY类型。做了个相加求和的小程序供参考:
FUNCTION FC10 : Void
VAR_INPUT
Addr1:ANY;
END_VAR
VAR_OUTPUT
Sum:REAL;
END_VAR
VAR_TEMP
TempAny:ANY;
STRForDB AT TempAny: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:INT;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DataNum:INT;
TempSum:REAL;
END_VAR
TempAny:=Addr1;
TempSum:=0.0;
FOR DataNum:= 0 TO STRForDB.DataCount-1 BY 1 DO
TempSum:=TempSum+DWORD_TO_REAL(WORD_TO_BLOCK_DB(STRForDB.DB_Number).DD[DataNum*4]);
END_FOR;
Sum:=TempSum;
END_FUNCTION
在OB1中调用FC10:
ORGANIZATION_BLOCK OB1
VAR_TEMP
info : ARRAY[0..19] OF BYTE;
DBAddr: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:WORD;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DBAddrAny AT DBAddr: ANY;
RealSum:REAL;
END_VAR
DBAddr.SyntaxID:=16#10;
DBAddr.DataType:=16#08;
DBAddr.DataCount:=10;
DBAddr.DB_Number:=16#1;
DBAddr.Byte_Pointer:=dw#16#84000000;
Sum(Addr1 :=DBAddrAny // IN: ANY
,Sum:=RealSum // OUT: REAL
); // VOID
END_ORGANIZATION_BLOCK
这样就完成了从OB1中传递参数给FC10,求和,本例中相当于求“P#DB1.DBX0.0 REAL 10”的和。
例子中是用AT指令和两个STRUCT将ANY指针“分解”,至于有没有STL简洁,就仁者见仁智者见智了。
不过在循环体中,SCL语言明显比STL语言简洁,数据处理也是SCL语言的优势。