标签: 无标签 使用SCL语言编程时,如何对ANY类型的虚参赋值
在使用SCL语言编程时,需要调用SFB13(BRCV)系统功能块,而SFB13有一个类型为ANY的参数RD_1。如果是使用LAD或STL语言,可以容易的以“P#DB1.DBX0.0 byte 20”这样的表达式来赋值,但在SCL语言中,这样写会报语法错误。 在我们熟悉的LAD/STL编程语言中,对ANY类型的参数赋值时,可以写成"P#DB1.DBX0.0 byte 20"就行了。其实这时系统在私下帮我们作了些事情,而在SCL语言中,这些事情就得由我们自己作。 是什么事情呢?这得回归到本质--ANY类型的参数是以怎样的结构存储在PLC中的?查资料可知,它是以长度为10个字节(byte)的连续区域来存储的,这10 bytes的定义为: Syntax_ID:1 byte //对ANY类型始终为16#10 DataType: 1 byte //01=BOOL,02=BYTE....(可查相关资料) Repetition_factor: 2 bytes(1 word) DB_Number: 2 bytes(1 word) Byte_Pointer: 4 bytes(1 dword) 对"P#DB1.DBX0.0 byte 20"这个例子而言,各部分的数值分别为: Syntax_ID = 16#10 DataType = 16#02 //BYTE Repetition_factor = 16#14 //16#14=20 DB_Number = 16#01 Byte_Pointer = 16#8400_0000 把ANY类型的参数在PLC中的存储结构搞清楚后,可以有两种方法来用SCL语言对ANY类型的虚参赋值,先介绍第一种的步骤。 1、建立以10 bytes结构为基础的UDT。 TYPE UDT_ANY_Pointer STRUCT Syntax_ID:BYTE DataType: BYTE Repetition_factor: WORD DB_Number: WORD Byte_Pointer: DWORD END_STRUCT END_TYPE 2、在创建的OB、FB、FC块中,先在temp变量定义区中建立UDT的实例,然后用AT功能构建ANY指针,指向该实例。 Buffer: UDT_ANY_Pointer;//建立UDT的实例 Temp_Any_Pointer AT Buffer: ANY; //用AT功能构建ANY指针,指向实例 3、在OB、FB、FC块的代码区中向UDT实例的各变量赋值后,再调用ANY指针。 Buffer.Syntax_ID := B#16#10; Buffer.DataType := B#16#2; Buffer.Repetition_factor := INT_TO_WORD(20); Buffer.DB_Number := INT_TO_WORD(1); Buffer.Byte_Pointer := DW#16#8400_0000; .... ... := Temp_Any_Pointer; 至此,第一种方法就介绍完了。至于第二种方法,基本原理是相同的,只是直接在OB、FB、FC块的temp变量定义区中,建立以10 bytes结构为基础的STRUCT类型的变量,而后用AT功能构建ANY指针,指向该STRUCT类型的变量。最后的赋值和调用是一样的。 |
|