您现在的位置是:首页 > PLC技术 > PLC技术
用SCL编程用户自己的功能
来源:艾特贸易2017-06-05
简介如果在 SCL 标准功能库和 IEC 功能中没有找到合适的功能, SCL 允许用户编写自己的功能,从而适合自己的需求。 具有功能值的 FC 功能是正确的块类型。具有功能值的 FC 功能的编程和调
如果在SCL标准功能库和IEC功能中没有找到合适的功能,SCL允许用户编写自己的功能,从而适合自己的需求。
具有功能值的FC功能是正确的块类型。具有功能值的FC功能的编程和调用,艾特贸易网将在后续文章中进行介绍。
多数情况下,SCL语言的资源对于所需功能的编程来说是不够的,这时还可以使用STL来实现这种功能。但是从数据类型一览原理看,SCL使复杂变量的处理成为可能。
1.基本数据类型变量的位处理
举例:要用某种方式处理双字变量中的单个位,比如扫描或从逻辑上结合并将结果写入到其他位。为此,将一个数据类型视图以位域的形式应用到一个变量,然后就可以和字段组件一样对个别的位进行寻址。
VAR_TEMP
DW_Var : DWORD;
Pattern AT DW_Var : ARRAY[ 0..31] OF BOOL;
END_VAR
…
Pattern [1] := Pattern[10] & Pattern [11];
在这个举例中,变量DW_VAR的第10位和第1 l位进行逻辑与操作,并将结果赋值到第1位。
2.数据类型为DT和STRING的变量的处理
数据类型为DT和STRING的变量,SCL通常把它作为“完整的”变量来处理,比如初始化功能输入,或从一个块参数传递给另一个块参数时。在数据类型为DT和STRING的变量的处理中,STEP 7标准库中的IEC功能是有效的。
对于数据类型为DT和STRING的变量,如果要用SCL处理变量的一部分,可以将数据类型视图应用到变量,从而能够使用SCL来处理变量的组件。BYTE字段适合于表示DT和STRING变量(如表30-6所示)。
表30-6 常用的数据类型视图
3.SCL功能举例
功能“Hour”是从数据格式DT中提取出来的,它使用数据类型INT的格式表示。
FUNCTION Hour : INT
VAR_INPUT
DAT : DT;
TMP AT DAT : ARRAY[1..8]OF BYTE;
END_VAR
Hour :=
WORD_TO_INT(SHR(IN:=TMP[4],N:=4))*10 +
WORD_TO_INT(TMP[4] AND 16#0F);
END_FUNCTION
(*READ THE CPU-TIME AND
CALL THE FUNCTION "Hour" *)
SFC_ERROR := READ_CLK( DATE_TIME);
IFHour(DATE_TIME) >=18
THEN FINISH_WORK :=TRUE;
END_IF;
4.字段和结构的不同视图
对于数据类型为ARRAY和STRUCT的变量,可以给其赋值一个自身也是ARRAY和STRUCT的数据类型视图。其应用之一是给消息帧的发送或接收邮箱创建一个数据区。
使用字节字段为邮箱设定一个最大长度值,比如,对于邮箱中需要处理的每一个消息帧,可以将一个具有消息帧结构的数据类型视图应用到邮箱。数据类型视图特别适合于相关的消息帧,因此它比邮箱的长度短些。
5.处理ANY指针
如果在暂态局部数据中创建一个数据类型为ANY的变量,编译器将其解释为一个指针,并将其直接传输给调用块中的一个ANY类型的输入参数。
在数据类型视图的帮助下,就可以在运行时处理这个ANY指针,比如,可以动态地给复制块指定不同的源数据区。
举例:把使用DataBlock、DataStart和Num_of_Bytes等变量指定的一个数据区,复制给一个叫做Send_Mailbox的变量。
FUNCTION_BLOCK COPY
VAR_INPUT
AREA :ANY;
DATABLOCK :INT;
DATASTART :INT;
NUM_OF_BYTES :INT;
END_VAR
VAR_TEMP
SFC_ERROR :INT;
SEND_MAILBOX :ANY;
VIEW AT SEND_MAILBOX : STRUCT
ID :WORD;
TYP :BYTE;
NUM :INT;
DBN :INT;
PTR :DWORD,
END_STRUCT;
END_VAR
BEGIN
VIEW.ID :=16#10;
VIEW.TYP :=16#02;
VIEW.NUM :=NUM_OF_BYTE;
VIEW.DBN :=DATABLOCK;
VIEW. PTR :=INT_TO_WORD ( 8*DATASTART);
SFC_ERROR :=BLKMOV ;
SRCBLK :=AREA,
DSTBLK := SEND_MAILBOX );
END_FUNCTION_BLOCK
(* Call of the FB*)
COPY.COPYDATA(
AREA :=SEND_MAILBOX,
DATABLOCK :=309,
DATASTART :=32,
NUM_OF_BYTE :=32 );
点击排行
