分享

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

 ZLM_图书馆 2014-01-26

                                     标签: 无标签

使用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类型的变量。最后的赋值和调用是一样的。

系统分类: PLC与PAC   |   用户分类: PLC   |   来源: 无分类                                 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多