对S7-SCL中的AT指令进行详细讲解

描述

什么是“AT”指令,如何使用?

AT指令是S7-SCL中特有的一个指令,初学者可能会忽略此指令,或者对其理解不够深刻。AT指令在S7-SCL中有着非常重要的地位,很多应用程序都必须使用此指令。下面将对此指令进行详细讲解。

AT指令可以使用户能够以不同的数据类型来访问一个已经声明的变量。此指令类似于高级编程语言中的“继承”概念。此指令有如下特点:

· 特点一:定义仅在块内有效,在接口参数中不出现

· 特点二:在块中可以使用其它数据类型的视图

· 特点三:它只是让另外一些变量继承了某个变量的特性,仅仅数据类型是新的,其它特性相同。

下面将通过具体程序对以上三个特点进行说明,首先定义UDT100,UDT200,大小都为12个字节,但结构不同。

UDT100包括一个DATE_AND_TIME数据类型(8个字节),还包括一个实数(4个字节);UDT200包括6个字(12个字节);在FC2定义输入参数Buffer, Frame1,Frame2:

特点一:定义仅在块内有效,在接口参数中不出现。块内定以的输入参数有3个,但仅在块内有效,在接口参数仅出现Buffer输入参数

AT指令

特点三:它只是让Frame1继承了Buffer的特性,仅仅数据类型是新的,其它特性相同。此处的UDT100长度应小于等于所继承的Buffer大小,否则编译错误

AT指令

注意:此处的UDT200长度应小于等于所继承的Buffer大小,否则编译错误

AT指令

注意:UDT100,UDT200继承了Buffer特性

在OB1中调用FC2,并将一个数组赋值给Buffer输入参数

AT指令

特点一:块内定以的输入参数有3个,但仅在块内有效,在接口参数仅出现Buffer输入参数

AT指令

特点二:对于输入参数Buffer得到的数据,可以按照Frame1,或Frame2的格式来寻址。例如可以将 Buffer 的前8 个字节认为是DATA_AND_TIME,送至临时变量TEST_DT中

AT指令应用例子1:在STL中,用户如果希望取得MB0的某一位的数值是非常容易的,例如第3位,直接寻址M0.2就可以了。

而在S7-SCL中,由于其具备高级语言的特点,所以定义的变量的绝对地址一般是不显现的。

因此在STL中简单的操作,在S7-SCL中却复杂起来。但是通过使用AT指令即可解决这个问题。

下图中的例子中,当输入的某个字节,其输出依次为此字节的8个位。

AT指令

AT指令应用例子2:在S7-SCL中,ANY数据类型的使用,经常会伴随着AT指令的使用,下面的例子演示了如何拆分改写ANY数据类型中的内容。程序执行结果相当于:

AT指令

AT指令

AT指令在使用当中,还有如下注意事项:

· AT指令用于对某个变量进行其它数据类型的声明时,必须放在此变量的声明语句后面

· AT指令生成的变量不可以初始化

· AT指令用于对某个变量其它数据类型的声明时,占用内存大小要小于等于此变量的长度

· AT指令用于对某个变量其它数据类型的声明时,如下的组合是允许的:

AT指令

(1)AT指令用于ANY类型在VAR_OUT中是不允许的

Elementary (基本数据类型包括) :BOOL, BYTE, WORD, DWORD, INT, DINT, DATE, TIME,

S5TIME, CHAR Complex (复杂数据类型包括) :ARRAY, STRUCT, DATE_AND_TIME, STRING

在VASS标准中的应用实例:

    pMeldFeld AT TempPointerMsys: STRUCT   变量格式是结构

                              BYTE0 :BYTE;  // Byte 0

                              TYP   :BYTE;  // Byte 1        Daten/Parametertyp

                              ANZ   :WORD;  // Byte 2+3      Laenge der Variablen

                              DBNR  :WORD;  // Byte 4+5      DB-Nummer

                              BZ    :DWORD; // Byte 6  故障信息号

                           END_STRUCT;

程序中

TempPointerMsys := Msys; 故障信息号给入变量

故障报警信息

AT指令

MeldSend(AufrufNr :=  1

         ,Anz_Meld :=  27

         ,pMeldFeld :=  pMeldFeld.BZ 故障信息号被用来发出

         ,pMeldAbb :=  pMeldAbb.BZ

         ,MeldDB :=  WORD_TO_INT(pMeldDBNR.DBNR)

         ,AenderungsID :=  AenderungsID

         ,Integritaet :=  Integritaet

         ,Neustart :=  Neustart

         ); // VOID






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分