簇labview系列教程之八_第1页
簇labview系列教程之八_第2页
簇labview系列教程之八_第3页
簇labview系列教程之八_第4页
簇labview系列教程之八_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、08、簇簇是一种类似数组的数据结构,用于分组数据。簇和数组有着重要的差别,其中一个 重要差别是,簇可以包含不同的数据类型,而数组仅可以包含相同的数据类型。例如, 一个 数组可以包含 10 个数字指示器,一个簇却可以包含一个数字控件,一个开关和一个字符串 控件。尽管簇和数组的元素都是有序存放的,但访问簇的元素最好是通过释放的方法同时访 问其中部分或全部元素, 而不是通过索引一次访问一个元素。 簇和数组的另一个差别是簇具 有固定的大小。簇通常用于将出现在框图上的有关数据元素分组管理。因为簇在框图中仅用唯一的连 线表示,所以对于减少连线混乱和子 VI 需要的连接器端子个数,使用簇有着积极的效果。 可

2、以将簇看做是一捆连线, 线缆中每一个连线表示簇的不同元素。 在框图上, 只有当簇具有 相同类型,相同元素数量和相同元素顺序时,才可以将簇的子端连接。多态性应用于簇时, 只需要簇具有同样顺序,同样数量的元素。面来向大家介绍簇的创建簇的创建框位于前面板中的控件新式数组 , 矩阵和簇簇 ,如图 :然后就可以往簇的框中添加各种类型的控件了, 例如现在要建立一个学生的记录信息, 一个数包括学生的 , 学号, 性别和年龄 .这就需要在簇外壳里依次放入两个字符串输入控件字控件和一个布尔控件 . 如图 :与数组的创建类似,簇也可以从程序框图中创建,先在程序框图上放置一个簇外壳, 然后就可以在簇外壳里放置各种数

3、据类型常数。如图:簇对象的大小是可以调整的,右击簇边界,在弹出的快捷菜单中可以选择各种调节操 作,如图:选择调整为匹配大小,即可缩小簇的边框,如图为调整后的结果:簇结构中的元素排列是按照它们放置的先后来排序的,它与簇元素的位置无关。放入 簇的第一个元素序号为 0,第二个元素序号是 1,依次向下排列。如果删除了一个元素,序 号将重新自动调整。 簇的排序很重要, 它直接影响着后面将要介绍的“捆绑”以及“接触捆 绑”函数的端口顺序,如果你想将一个簇与另一个簇连接,这两个簇的序和类型必须相同。如果想要改变簇元素的排列顺序,可以右击簇结构的边框,在弹出的快捷菜单中执行重新排序簇中控件”,如图:这时鼠标会

4、变成一个带“”号的手柄箭头,黑框指出新设置的排列序号,白框表示 原先的排列序号, 可以改变标题栏上的“单击设置”容, 然后单击簇元素即可设置新的序号。 设置完毕后单击工具栏上的“”按钮确定更改, 如果想恢复原先设定值, 单击“”取消设置。b) 簇函数簇函数的模版如图:簇函数中最主要的就是构造打包生成簇的“捆绑”函数,还有从簇中解包提取簇中元 素的“解除捆绑”函数。 它们是根据簇成员的顺序来进行操作的, 这也说明了簇成员顺序排 列的重要性。簇函数举例:1. 创建簇,解包簇,再打包簇 该例的目的是学习使用簇的两个基本函数,如图:首先放置一个簇外壳到前面 板上,将标签容改为“输入簇”在簇外壳中依次放

5、入字符串控件“ Name”,布尔控件“ Sex”,数字输入控件“ Pay”以及字符串控件“ Address ”,通过这些簇元素来组成某一公司一名员工的 工资记录。如图:切换到程序框图,放置一个“解除捆绑”解包簇函数,函数刚放入时,它的右 侧只有 2 个输出端口,当输入端口与“输入簇”端子相连后,右侧端口会自动增加 为簇元素的数目,端口从上向下排列的顺序与簇元素的放置顺序相对应,并且数据 类型也是与簇元素数据类型相对应。如图:同样放置一个“捆绑”打包簇函数, 用定位工具将输入端口的数目增加到4 个,依次将它们与解包出来的 4 个簇元素相连, 表示又把它们进行打包生成一个新的簇。 在输出端口创建一

6、个簇显示器,把标签改为“输出簇”,如图:2. 替换簇成员该例的目的是学习使用“按名称捆绑”函数来替换簇的某些元素。1. 新建一个 VI ,在前面板上创建一个簇外壳,依次向簇添加一个数字输入控件,一个布尔控件,一个字符串输入控件,如图:2. 打开程序框图, 选择“按名称捆绑”函数, 它的功能是按照名称来替换簇成 员的值。在函数刚放入时, 它的左侧只有一个输入端口, 将函数的“输入簇” 端口与创建的簇端子相连之后,左侧端口会显示簇第一个元素的名称数值, 用操作工具单击它可以选择其他的簇成员。如图:3. 在前面板上创建一个输入控件, 将标签改为“输入数字”, 在程序框图将它与“数值”端口相连,表示将

7、用它来替换簇元素。如图:4.3. 插接生成簇数组 该例的目的是学习使用“索引与捆绑簇数组”函数插接簇数组函数来生成一 个簇数组。1. 新建一个 VI ,打开程序框图,放置一个该函数,刚放入时它只有一个输入 的端口,用定位工具拖拉它为 3 个输入端口。2. 在程序框图上放置三个数组外壳, 然后分别添加字符串常量, 数值常量和布尔常量,建立三个数组,如图 :然后给他们赋如图所示的值,如图:然后连线,并创建显示控件,如图:运行,结果如图:说明:该函数从输入的 3个数组中依次取值,相同索引值的数据被攒程一个簇,所有的簇构成一个一维数组。 插接成的数组的长度与所有输入数 组中长度最短的一个相等,多余的数

8、据被丢弃。4. 建立“数组的数组”该例看起来好像是不可以实现的,因为在数组的学习中,已经知道数组的成员 不可以是数组。这里将学习把一维数组当成一个簇,然后通过建立簇的数组,因为 簇数组的每一个成员都是一个簇(即一维数组),从而实现建立“数组的数组”的 目的。1. 先新建一个 VI ,打开程序框图,放置一个“创建簇数组” 函数,该函数的 功能是建立簇的数组,簇数组的每个成员都是一个簇。刚放入程序框图时, 函数只有一个输入端口,用定位工具拖动它的边框, 使它具有 3 个输入端口。2. 在程序框图上创建 3个数值型数组,分别对它们进行赋值, 第一个和第三个 数组长度设定为 5,第二个数组的长度设定为

9、 4。在“创建簇数组”函数的 输出端口创建一个簇显示器, 将簇显示器的标签容改为“数组的数组”, 如 图:3. 运行程序,即可在前面板上看到结果,如图:Error 簇Error 簇是一类很重要的簇, 许多的控件里都有“错误输入”和“错误输出”这两个簇的端口,通常来讲,当一个VI 中间出现错误而导致不能运行时,可以在出错的控件的“错Error 簇:Error误输出”端子创建一个显示控件,则可以让程序继续运行,如图所示,即为而 Error 簇更重要的应用在于,它可以控制控件执行的先后顺序,也可以通过 簇来控制循环的终止。如图:当信号的发生出现错误的时候,就可以把循环停止。4.1.1 枚举类型( E

10、num )、和下拉列表型控件 整型数值的一个极特殊应用情况就是 enum ,或称为枚举类型。 枚举类型是从 C 语言中借用 来的一个概念。在枚举类型中, 可将每个从零开始的、 连续的整数值按顺序分配给一组名称或字符串。 例如: 红、绿、黄,就对应着 0、1、2。开始、停止、纪录、打印、就分别对应于0、1 、2、3。显然,使用文字或字符串要比使用数字更直观、方便、概念性更强。假如,你有 20 个朋友, 你是喜欢直接用 0-19 个数字来代表他们,还是用名字表示他们,那个更好呢?LabVIEW 图形化语言提供了枚举类型的控件,用户可以从控件选板上找到它。枚举类型的 引入为程序设计提供了许多意想不到

11、的好处。我们借用A Software Engineering Approach toLabVIEW Jon Conway 一书中有关枚举的说法,来介绍枚举控件在程序设计中的一些用途: 可以将枚举类型的控件看作下拉列表控件枚举型的数据类型是: 8(256 )、 16( 65536 )、 32 (更多),括号是枚举类型可 保留的元素数目 将枚举类型控件连接到 Case 结构时, Case 结构中标签显示的是字符串,而不是数字除了递增和递减外,枚举类型可按数字方式进行算法操作 递增和递减操作在开始和结束位置交替进行 可将数字转换成为最接近的枚举类型数据, 超出围的数字则被设置为最后一个枚举类型数据除

12、了枚举类型外,还有下拉列表控件也有类似的功能,在 LabVIEW 图形化语言程序中,这 两种控件的使用情况是随处可见, 特别是在状态机中, 枚举常数使用的更为普遍。 下面看看它们 在 LabVIEW 图形化语言 VI 中的几个应用实例。例 1 、随处可见的枚举常数和下拉表常数在许多 VI 的程序框图中,枚举和下拉列表常数随处可见。在例图中,左端带有双向箭头, 右端带有下拉箭头的是枚举常数;而仅右端带有下拉箭头的是下拉列表常数。例 2 、状态机中使用的枚举常数枚举常数在状态机中也大量使用。在例图中,我们可以看到在不同的地方使用了四个枚举常 数。在上面介绍枚举控件在程序设计中的用途中,第一条就是:

13、 “可以将枚举类型的控件看作下 拉列表控件”, 从例 1 中也看到了他们的用法比较相似, 那么枚举控件与下拉表控件本质上有什 么不同呢?如何在程序设计中灵活使用呢?根据我的了解做了一个简单的对比, 请看下面的对比 说明:可以说:枚举类型(特别是枚举常数)在应用程序设计中使用的非常广泛,它的使用即增 加了程序设计的灵活性, 同时也增加了程序的可读性。 关于它的其它方面应用实例, 也可参考 A Software Engineering Approach to LabVIEW Jon Conway 一书中有关枚举的介绍。显示枚举控件的容用字符串的方式显示枚举控件中的容,有两种方法:1 、使用 “格式

14、化写入字符串 ”函数 “格式化写入字符串 ”在字符串函数板上可以找到,应用见例图。 利用这个特性可以显示状态机所处的状态。2 、使用 “属性节点 ” 见例图中的:属性下拉列表文本文本 这些简单的应用在程序设计中经常会用到,我在编程过程中曾大量的使用三、线程的优先级在 VI 的属性设置面板 VI Properties - Execution中还有一个下拉选项控件是用来设置线程优先级的( Priority )。这一选项可以改变这个 VI 运行线程的优先级。优先级设置中共有六项,其中前五项是分别从低到高的五个优先级。优先级越高,越容易抢占到CPU 资源。比如你把某个负责运算的 VI 的优先级设为最高

15、级( time critical priority),程序在运行时, CPU 会更频繁地给这个 VI 所在线程分配时间片段,其代价是分配给其它线程的运算时间 减少了。如果这个程序另有一个线程负责界面刷新,那么用户会发现在把执行线程的优先级提高后, 界面刷新会变得迟钝,甚至根本就没有响应。优先级设置的最后一项是 subroutine , 它与前五项别有很大的不同。 严格的说 subroutine 不 能作为一个优先级,设置 subroutine 会改变 VI 的一些属性:设置为 subroutine 的 VI 的前面板的信息会被移除。 所以这样的 VI 不能用作界面, 也不能单 独执行。设置为

16、subroutine 的 VI 的调试信息也会被移除。这样的 VI 无法被调试。 当程序执行到被设置为 subroutine 的 VI 的时候, 程序会暂时变为单线程执行方式。 即程序在 subroutine VI 执行完之前,不会被别的线程打断。以上的三点保证了 subroutine VI 在执行时可以得到最多的 CPU 资源,某些作为关键运算的 VI ,又不是特别耗时的,就可以被设置为 subroutine 以提高运行速度。比如有这样一个 VI ,他的 输入是一个数值数组,输出是这组数据的平均值。这个运算在程序中需要被尽快完成,以免拖延数据 的显示,这个 VI 就是一个蛮适合的 subro

17、utine VI 。在设置 VI 优先级的时候有几点需要注意的。提高一个 VI 的优先级一般不能显著缩短程序的运行时间。提高了优先级,它所需要的 CPU 时 间还是那么多,但是 CPU 被它占用的频率会有所提高。高优先级的 VI 不一定在低优先级 VI 之前执行。现在常用的多线程操作系统采用的都是抢占式 方式,线程优先级别高,抢到 CPU 的可能性比低级别的线程大,但也不是绝对的。使用 subroutine 时要格外注意,因为他会让你的程序变成单线程方式执行,这在很多情况下反 而会降低你的程序的效率。 比如一个 VI 并非只是用来运算, 它还需要等待其它设备传来的数据, 这 样的 VI 就绝对

18、不能被设置为 subroutine 。现在多核 CPU 已经很流行了,在这样的计算机上,单 线程运行的程序通常比多线程效率低,这也是需要考虑的。在 LabVIEW 中编程更改进程的优先级问题: 在Windows 9x/NT/2000/XP主要软件 : 主要软件版本 : N/A 主要软件修正版本 : N/A 次要软件 : N/A下,能否使用 LabVIEW 编程设置一个进程的优先级?解答 : 在 labVIEW 中您可以调用kernel32 动态库来更改进程的优先级。我们需要两个函数:GetCurrentProcess() 和SetPriorityClass() 。有 6 个优先级可供您选择,这

19、 6 个优先级及其标识码列表如下:空闲(IDLE):IDLE_PRIORITY_CLASS次低(BELOW NORMAL): BELOW_NORMAL_PRIORITY_CLASS普通(NORMAL):NORMAL_PRIORITY_CLASS次高(ABOVE NORMAL):ABOVE_NORMAL_PRIORITY_CLASS高级(HIGH PRIORITY):HIGH_PRIORITY_CLASS实时(REAL TIME):REALTIME_PRIORITY_CLASS在 LabVIEW 中,首先建立一个调用库函数节点,并指向您的 kernel32.dll( 一般位于 c:windows

20、system32) 。建立调用 后函数原型的样子为:unsigned long GetCurrentProcess(void)因为这是调用了 Windows 的 API 函数,调用方式改为 stdcall(WINAPI) 。第二个调用库函数 VI 与第一个相似, 除了您是使用 SetPriorityClass 函数。建立第二个调用库函数节点后函数原型的样子为:unsigned long SetPriorityClass(unsigned long handle, unsigned long priority)同样的,调用方式改为 stdcall(WINAPI) 。 GetPriorityCla

21、ss 函数的返回值与 SetPriorityClass 函数的句柄相关, 相应的优先级类型是十六进制 (hex)。在 winbase.h 文件中(包含在 Microsoft 的WIN32 SDK 中),您可以找到定义优先 级的声明。它们是:#define IDLE_PRIORITY_CLASS 0x00000040#define BELOW_NORMAL_PRIORITY_CLASS 0x00004000#define NORMAL_PRIORITY_CLASS 0x00000020#define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000#define HI

22、GH_PRIORITY_CLASS 0x00000080#define REALTIME_PRIORITY_CLASS 0x00000100使用这些值,您可以指定线程的优先级。举例来说,如果您想把您进程的优先级设置为空闲 (IDLE) ,只要在调用库函数 节点的输入端连上一个十六进制值为 40 的常数就好了。打开、运行附件中的例子。运行例子的时候,打开 Windows 的任务管理器,在您更改 LabVIEW 程序的优先级的时候可 以观察 LabVIEW 优先级的状态。在循环结构中经常用到一种数据处理方式,即把第 i次循环执行的结果作为第 i1次循环的输入, LabVIEW 循环结 构中的移位寄存器可以实现这种功能。在循环结构框左侧或右侧边框单击鼠标右键,在弹出的快捷菜单中选择 “添加移 位寄存器 ”,添加移位寄存器,如图 1 所示。图2和图3分别显示为 For循环结构和 While 循环结构添加移位寄存器后的结果移位寄存器在循环结构框的左右 两侧是成对出现的,一个寄存器右侧的端子 只能有一个元素,而左侧的端子 可以有多个元素。移位寄存器的颜色和输入数据类型的系统颜

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论