新闻中心

EEPW首页 > 测试测量 > 设计应用 > labview的数据类型----通过类型描述符提取控件名称(LABEL)

labview的数据类型----通过类型描述符提取控件名称(LABEL)

作者:时间:2017-01-09来源:网络收藏
通过分析类型描述符结构,我们已经得到的类型描述符的头部信息,我们知道,LV的存储结构中同时包括了控件的标签信息,看看如何能通过描述符得到控件的标签.OPENG中提供了这个功能,我们跟踪一下看看它实现的方法:


本文引用地址:http://www.eepw.com.cn/article/201701/337264.htm

首先根据类型描述符头部信息中的类型码对LV的数据类型进行分类,每个CASE中的数据存储结构都是类似的.

先看看第一个CASE: 条件是:"I8".."CXT", "Boolean", "Variant" ,这说明从I8--->"CXT",包括BOOLEAN VARIANT类型描述符的结构都是类似的.看看I8 和BOOLEAN的类型描述符的内容,我们分析一下.


I8和BOOLEAN除了类型码不同(0X01,0X21),其它结构完全相同.第一个字(两个字节)表示存储结构的长度,*2表示字节数.

0X40是LABVIEW保留的.第三个字的高位字节0X02表示名称包括两个字节(字符,ASCII).可以看出它的标签是aa.

前4个字节(两个字I16)是类型描述符的头部信息,第5个字节0X02表示名称的长度是2个字符,这样,通过把类型描述符的结构转换成U8数组或者16进制字符串,就可以拆分出它的标签信息.




左边的图通过铸模函数,把I16数组转换成16进制字符串,通过一个Get PString(有点类似C指针),提取出标签.

右边的图是Get PString的程序框图,因为以后要经常用到,重点解释一下.

我们前文谈到过,字符串和U8数组在内存中的存储形式是完全相同的,所以操作字符串和操作U8数组是等价的.

表示名称长度信息在第5个字节中,所以首先用索引数组取出第5个字节(索引4,ARRAY从索引0开始)

通过截取字符串函数,字符串长度参数是刚刚从数组中取出的,开始位置是4+1(去掉长度字节),至此,完成了

提取标签信息.


枚举类型的类型描述符结构是不同于I8,U8的,下一个CASE是用于提取ENUM的标签的.首先看看ENUM的类型描述符的组成结构.



类型描述符号的头部信息都是类似的,由长度,类型码组成.重点看第5个字节,这里的0X03表示枚举由3个元素组成,以下分别是第一个元素标签(这里称名称可能更合适)的长度(字符个数)和名称的相应的ASCII,分析可以得到,第一个元素名称包括两个字符,41,41,即AA,第二个元素包括两个字符,42,42,即BB,第三个包括两个字符43,43,既CC.值得注意的是接下来并不是标签的长度,而是用00来填充补位,而下一个字的高位字节才表示标签的长度,长度为2,标签字符6D 6E即mn.

看看OPENG是如何提取ENUM标签的.


CASE的条件是ENUM8..ENUM64说明,ENUM8,16,32,64结构都是相同的

头部信息中的ELEMENTS表示一共三个元素,所以利用一个三次FOR循环,计算出标签的索引,注意有一个加余数的过程,这个就是解决上面的填充0问题,这个0不体现在长度字节中的.然后再次调用Get PString就得到了枚举的标签.实际上,上面的过程也可以得到枚举中的每个元素的名称.

在看string,path 和picture(本质是一系列二进制数据),它们的类型描述符的结构是相同的.

通过分析类型描述符结构,我们已经得到的类型描述符的头部信息,我们知道,LV的存储结构中同时包括了控件的标签信息,看看如何能通过描述符得到控件的标签.OPENG中提供了这个功能,我们跟踪一下看看它实现的方法:




首先根据类型描述符头部信息中的类型码对LV的数据类型进行分类,每个CASE中的数据存储结构都是类似的.


上一页 1 2 下一页

评论


技术专区

关闭