技术论坛

 回复:使用SCL语言编程时,如何对ANY类型的虚参赋值

返回主题列表
作者 主题
sjshej
游民

经验值:121
发帖数:74
精华帖:2
楼主    2006-08-20 21:32:47
主题:使用SCL语言编程时,如何对ANY类型的虚参赋值
在使用SCL语言编程时,需要调用SFB13(BRCV)系统功能块,而SFB13有一个类型为ANY的参数RD_1。如果是使用LAD或STL语言,可以容易的以“P#DB1.DBX0.0 byte 20”这样的表达式来赋值,但在SCL语言中,这样写会报语法错误。请问如何解决?
sjshej
游民

经验值:121
发帖数:74
精华帖:2
    2006-09-10 11:28:32
精华帖  主题:回复:使用SCL语言编程时,如何对ANY类型的虚参赋值
感谢Zane斑竹的点拨,我已解决了这个问题。现将解决方法写下来,与大家分享。
在我们熟悉的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类型的变量。最后的赋值和调用是一样的。
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。