您现在的位置是:首页 > 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.数据类型为DTSTRING的变量的处理

    数据类型为DTSTRING的变量,SCL通常把它作为“完整的”变量来处理,比如初始化功能输入,或从一个块参数传递给另一个块参数时。在数据类型为DTSTRING的变量的处理中,STEP 7标准库中的IEC功能是有效的。

    对于数据类型为DTSTRING的变量,如果要用SCL处理变量的一部分,可以将数据类型视图应用到变量,从而能够使用SCL来处理变量的组件。BYTE字段适合于表示DTSTRING变量(如表30-6所示)。

    30-6    常用的数据类型视图

常用的数据类型视图

    3SCL功能举例

    功能“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.字段和结构的不同视图

    对于数据类型为ARRAYSTRUCT的变量,可以给其赋值一个自身也是ARRAYSTRUCT的数据类型视图。其应用之一是给消息帧的发送或接收邮箱创建一个数据区。

    使用字节字段为邮箱设定一个最大长度值,比如,对于邮箱中需要处理的每一个消息帧,可以将一个具有消息帧结构的数据类型视图应用到邮箱。数据类型视图特别适合于相关的消息帧,因此它比邮箱的长度短些。

    5.处理ANY指针

    如果在暂态局部数据中创建一个数据类型为ANY的变量,编译器将其解释为一个指针,并将其直接传输给调用块中的一个ANY类型的输入参数。

    在数据类型视图的帮助下,就可以在运行时处理这个ANY指针,比如,可以动态地给复制块指定不同的源数据区。

    举例:把使用DataBlockDataStartNum_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 );