什么是“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输入参数
特点三:它只是让Frame1继承了Buffer的特性,仅仅数据类型是新的,其它特性相同。此处的UDT100长度应小于等于所继承的Buffer大小,否则编译错误
注意:此处的UDT200长度应小于等于所继承的Buffer大小,否则编译错误
注意:UDT100,UDT200继承了Buffer特性
在OB1中调用FC2,并将一个数组赋值给Buffer输入参数
特点一:块内定以的输入参数有3个,但仅在块内有效,在接口参数仅出现Buffer输入参数
特点二:对于输入参数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指令应用例子2:在S7-SCL中,ANY数据类型的使用,经常会伴随着AT指令的使用,下面的例子演示了如何拆分改写ANY数据类型中的内容。程序执行结果相当于:
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; 故障信息号给入变量
故障报警信息
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
-------------------------------END--------------------------
责任编辑:lq
全部0条评论
快来发表一下你的评论吧 !