记不清是在哪里拷贝的一段程序,今天试着用一下SCL编程,运行有误。程序是拷贝的:
FUNCTION FC10 : void
// Block Parameters
VAR_INPUT
// Input Parameters
Addr1:ANY; // 输入变量:Addr1是 ANY类型
END_VAR
VAR_OUTPUT
Sum:REAL; //输出变量:Sum是 实数类型
END_VAR
VAR_TEMP
// Temporary Variables
TempAny:ANY;
STRForDB AT TempAny: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:INT;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DataNum:INT; //临时变量 整数类型
TempSum:REAL; //临时变量 Sum 实数类型 用于求和
END_VAR
TempAny:=Addr1; //将同为any类型的输入变量Addr1赋值给临时变量TempAny
TempSum:=0.0; //临时变量赋初值
FOR DataNum:= 0 TO STRForDB.DataCount-1 BY 1 DO //共10字节
TempSum:=TempSum+DWORD_TO_REAL(WORD_TO_BLOCK_DB(STRForDB.DB_Number).DD[DataNum*4]);
END_FOR;
Sum:=TempSum;
END_FUNCTION
ORGANIZATION_BLOCK OB1
VAR_TEMP
// Reserved
info : ARRAY[0..19] OF BYTE;
// Temporary Variables
DBAddr: STRUCT
SyntaxID:BYTE;
DataType:BYTE;
DataCount:WORD;
DB_Number:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
DBAddrAny AT DBAddr: ANY; //any类型的DBAddrAny可以访问DBAddr
RealSum:REAL;
END_VAR
// Statement
DBAddr.SyntaxID:=16#10; //赋实参
DBAddr.DataType:=16#08; //08代表数据类型是实数
DBAddr.DataCount:=10; //长度10个实数
DBAddr.DB_Number:=16#1; //DB号为1
DBAddr.Byte_Pointer:=dw#16#84000000; //dbb0.0
Sum(Addr1:=DBAddrAny, Sum:=RealSum ); // IN: ANY
// OUT: REAL // VOID
END_ORGANIZATION_BLOCK
报警大致如下:1.can not find / copy block sum.
2.function not defind.
3.invalid or missing function type.
请教:1. OB1是这样直接在SCL源程序环境中,写在function10 后面吗?
2. 这里也没有在OB1里面用CALL调用(像语句表和梯形图语言那样在OB1里面调用FC),语法不对吧?
3. 那个SUM好像是上边的FUNCTION10里面出现过,但在OB1里面的应用,好像是在调用函数,这里用法出错了吗?
刚学习着用,程序也是搬来的,请指教一下这程序应该怎样安排才是正确的。先谢过了