LabVIEW应用程序性能优化

LabVIEW应用程序性能优化
LabVIEW应用程序性能优化

7.3 LabVIEW应用程序性能优化《上》(LabVIEW Application Performance Optimization)

VERSION 5

Created on: Apr 23, 2011 5:46 AM by jwdz - Last Modified: Apr 23, 2011 8:35 PM by jwdz

LabvIEW图形化系统的最伟大之处就是降低了程序设计过程的复杂度,使用过它的工程师和科学家们已经充分的体会到这一点。它已经使得程序的设计者将关注度放在了待解问题上,而不是如何实现程序设计上。

是的,大家已经学会了按照LabVIEW数据流的编程思想进行了应用程序的设计,并且采用LabVIEW所提供的设计模式(模版)来设计应用程序的架构。对于这样设计完

成的应用程序还需要进一步优化吗?答案是肯定的,因为任何设计都不会完美无缺。

优化的目的和过程

在软件工程中,有一个著名的法则:80/20法则。

该法则意思说:在应用程序中,程序执行时间的80%被20%的代码所占用。

性能优化的目的就是真对20%的这部分程序代码进行改进和提高。并且性能优化的过程是一个不断循环的过程。也就是检查——优化,再检查——再优化,直至满意为止。

图 7.3-1 软件的循环优化过程

非常遗憾的是,即使是经验十分丰富的程序员要想确定和发现20%这部分代码中的问题仍然是很困难的一件事。

显然,选择合适的分析工具应该显得更为重要。

7.3.1 性能优化工具

有许多可以进行程序性能优化的工具,用来帮助我们查找问题的来源和观察出现问题的现象。其中,包括来自操作系统的和LabVIEW本身所自带的。下面简单介绍几种。

7.3.1.1 Windows任务管理器

Windows任务管理器就是一个非常简单而实用的工具,并且它是内置在Windows操作系统中,使用起来也相当方便。

无论是学习LabVIEW之初还是现阶段的程序设计中,它都被用来做监测和查看CPU使用率的一个工具。同时,它可以被最小化到任务栏中,实时获得监测结果。

假如:我们在While循环或状态机的循环中忘了放置一个小定时器,程序运行起来会使CPU的使用率达到100%。通过查看它,就可以及时发现此类问题的存在。

当然,借助于它还可以查看到内存的使用情况,乃至发现程序中不良代码导致内存泄露的现象。

由于大家对任务管理器都很熟悉,所以关于它的使用方法就不做更多介绍了。下面谈谈LabVIEW所提供的一些测试分析工具。

7.3.1.2 查看VI的性能和内存

这个工具在前面的内容中曾经使用过,这是LabVIEW中最常用的一个工具,可以很有效的评价一个VI,包括V I的执行速度和内存使用。

VI分析器提供了对应用程序中所有VI的平均执行时间进行粗略的估计。但它也仅限于毫秒的时间分辨率。

因为它给出的是应用程序中所有VI的平均执行时间,所以直接断定哪20%的代码出现问题还是比较困难的,主要依靠编程者的经验和判断力。

建议,执行时间分析和内存分析最好分开进行,因为二者同时进行分析可能会有一些相互影响,分析结果未必准确。

而对于那些执行时间小于1毫秒的VI,最好使用下面的方法来测试。

7.3.1.3 查看VI的执行时间

利用下图所示的程序代码就可以测量某个VI的执行时间。被测量VI或程序代码被放置下图中的For循环内,当VI的执行时间很小时,可以适当加大N的数值,利用多次测量来获得程序的平均执行时间(单位为:秒)。

这样就可以改进和提高某些代码的执行速度,从而进一步提高程序的执行性能。

图 7.3.1.3-1 测试代码的执行时间

如果安装了MGI的VI库,它也给出了一个代码执行时间的测试VI,它使用的是层叠式顺序结构。

7.3.1.4 LabVIEW VI Analyzer

如果你是NI 开发者套件用户,便会获得LabVIEW VI Analyzer工具。否者那就必须购买该工具包。

安装该工具包后,在LabVIEW开发环境下,选择:工具》VI分析器》分析VI,就可以打开这个工具包,对某个VI进行基本性能分析。

NI LabVIEW

VI分析器可以自动实现VI的代码分析、测试,测试内容多达60多种,包括代码性能和样式的测试。从而能够轻松地找出VI中潜在存在的问题。

大致与VI性能相关的基本测试分析:

循环中的数组和字符串

数据强制转换点

启用调试

While循环中的Wait

VI的大小

数组的默认值

结构中隐藏的对象

全局变量和局部变量

未曾使用的代码

子框图中的接线端

顺序结构的用法

当然,它的分析中有些提示(警告)也是可以忽略的,主要注意查看红色惊叹号所标明的问题。

7.3.1.5 LabVIEW Desktop Execution Trace Toolkit

这是一个需要付费的工具包。它可以实现动态的代码分析和代码调试。由于笔者也没有使用过这个工具包,所以这里也仅仅是提名形式的介绍。具体可参考该工具包的相关文档。

7.3.2 代码性能优化的几个方式

如果在程序设计之初,就能够有意识的避免某些潜在问题的出现,那肯定是最好不过的事情了。换句话说,如果能够了解更多的简单错误产生的原因,届时就可以避免常见的错误出现在程序设计中。

下面谈谈常见的几个问题。

7.3.2.1 避免数据强制转换

数据强制转换这是一个老生常谈的话题,最令大家记忆犹新的就是那个强制转换标志:小红点。

1、U8与I8、U16与I16、U32与I32相对应所发生的数据强制转换

下面还是以Memory Test(2010-

Mac).vi为例,看看数据强制转换发生时,VI的内存使用情况将如何发生变化。

图 7.3.2.1-1 Memory Test(2010-Mac).vi程序框图(均为U8数据类型)在图 7.3.2.1-1

中,设定:常数“2”和数组显示控件都是由U8的数据类型构成,因为二者的数据类型一致,所以并没有看到数据的强制转换发生。

如果将常数“2”的数据类型改变为:I8,而数组显示控件的数据类型还是使用U8。在这种情况下,会发生那些变化呢?参见下图。

图 7.3.2.1-2 Memory Test(2010-Mac).vi程序框图(I8与U8)

很明显,此时由于所使用的数据类型不同,这里已经发生了数据的强制转换,因为那个小红点已经给出了提示。问题是内存的使用情况也会发生变化吗?下面来看看!

图 7.3.2.1-3 Memory Test(2010-Mac).vi程序框图(I8与U8)的内存使用情况

尽管此时已经发生了数据的强制转换,但是内存使用情况没有发生变化或改变,与数据类型同是U8的情况一样(2M)。

此时,即便是使用To Unsigned Byte

Integer函数进行转换,消除了那个小红点,内存使用情况依然没有变化,参见下图。

图 7.3.2.1-4 Memory Test(2010-Mac).vi (I8与U8)消除强制转换

图 7.3.2.1-5 Memory Test(2010-Mac).vi (I8与U8)消除强制转换后内存使用情况

即便是再将常数“2”的数据类型设定为U8,而数组显示控件数据类型改为I8,同样也发生了数据的强制转换,但内存使用情况的结果也是与上图一样。

实际上,无论使用U8还是I8的数据类型,内存的使用情况都没有发生本质上的改变(U8的内存使用情况与上图一样,所以这里并没有给出)。

根据上面的现象,现在也只能这样认定:在数据类型内存使用相同的情况下(数据存储时使用的字节相同),尽管发生了数据的强制转换,但是这里似乎并没有发生内存的重新再分

配或通常所说的数据拷贝。为什么会这样呢?

是否可以这样来解释:U8和I8的数据都只占用一个字节的内存,所以尽管发生了数据的强制转换但内存的使用情况并没有发生任何改变(似乎没有发生新的数据拷贝,或者说数

据拷贝使用了原有的部分内存)。至少LabVIEW2010是这样的。

其实,将U16和I16(4096k);U32和I32(8192k)对应测试,结果也是一样的,并不增加内存的实际使用量。

2、其它数据类型的强制转换

U8-I16

现在将“常数2”的数据类型设定为:U8,将数组显示控件的数据类型设定为:I16。再来看看内存使用情况的变化,参见下图。

图 7.3.2.1-6 Memory Test(2010-Mac).vi (U8-I16)的数据强制转换

此时的内存使用情况参见下图。

图 7.3.2.1-7 Memory Test(2010-Mac).vi (U8-I16)的数据强制转换内存使用情况

显然,内存的使用情况发生了变化(5M)。前面谈到过,U16-I16或I16-

U16时内存使用为:4M,而现在为:5M。这里显然发生了数据的拷贝。

那就消除强制转换再试试,参见下图。

图 7.3.2.1-8 Memory Test(2010-Mac).vi 消除(U8-I16)数据强制转换

在上图中,将“常数2”的后面加入一个数据转换函数(转换成I16),实现了预先的数据转换。此时内存使用情况如何呢?参见下图。

图 7.3.2.1-9 Memory Test(2010-Mac).vi 消除(U8-I16)数据强制转换后内存的使用情况

预先数据转换不仅消除了数据强制转换(消除了大量的数据拷贝),实现了所期待的内存使用结果(4M)。

其实,消除强制转换有两种方式,一个是上面所谈到的预先数据类型转换;如果我们将转换函数放置在数组显示控件之前,也可以实现消除数据强制转换的作用。但是这并不改善内存的使用情况,参见下图。

图 7.3.2.1-10 Memory Test(2010-Mac).vi 事后消除(U8-I16)数据强制转换

图 7.3.2.1-11 Memory Test(2010-Mac).vi 事后消除(U8-I16)数据强制转换不改善内存的使用情况

从这里可以看出,解决数据拷贝的问题,必须在前端处理(注意:这里不是没有数据拷贝发生,而是数据拷贝的数量极小);事后处理虽然好像也解决了强制状换的问题(消除了小

红点),但是没有解决数据大量拷贝的问题。

I16-U8

如果“常数2”为:I16数据类型,而数组显示控件仍为:U8数据类型;那会又发生什么情况?参见下图。

图 7.3.2.1-12 Memory Test(2010-Mac).vi (I16-U8)的数据强制转换

图 7.3.2.1-13 Memory Test(2010-Mac).vi (I16-U8)数据强制转换的内存使用情况显然,这里发生了数据的大量拷贝(4M)。试着消除强制转换再看看,参见下图。

图 7.3.2.1-14 Memory Test(2010-Mac).vi 消除(I16-U8)的数据强制转换

图 7.3.2.1-15 Memory Test(2010-Mac).vi 消除(I16-U8)的数据强制转换后内存的使用情况

显然,这回到了U8或U8已及U8与I8时的情况下(2M)。自己试试在后端进行消除数据强制转换会是如何?结论不会改善数据拷贝的问题,不信就试试看。

关于其它数据类型间出现的强制转换问题,因为篇幅的关系,这里就不一一的进行讨论了,感兴趣的可以自己做做试试。

针对数据强制转换这个话题,这里想说明的是(仅对于LabVIEW 2010):

——

依据数据流的关系,当数据源端与数据终端的数据类型不一致时会发生数据的强制转换。换句话说,数据转换时伴随数据拷贝的发生,对于使用数据量很大的地方,比如:数组、

字符串等,尽可能的消除数据转换所带来的数据拷贝。

——

当数据源端与数据终端的数据类型相类似时,如:U8与I8、U16与I16、U32与I32等,数据强制转换或数据拷贝虽然发生,但并不会增加内存的使用量。

——

依据数据流的关系,消除数据拷贝应该在源端进行。也就是说,在数据拷贝的发生地进行,尽管事后(后端)也可以消除数据的强制转换,但并不改善内存的使用。

7.3 LabVIEW应用程序性能优化《下》(LabVIEW Application Performance Optimization)

VERSION 3

Created on: Apr 23, 2011 8:33 PM by jwdz - Last Modified: May 15, 2011 11:38 AM by jwdz

7.3.2.2 避免数据拷贝

尽管通过节点上“小红点”的提示可以消除数据类型的强制转换,从而避免数据拷贝所占用大量的内存。但是,数据拷贝并不是仅仅发生在数据类型的强制转换方面。

1、分支产生数据拷贝

先来看看没有数据分支时的情况。下图中,内存的使用量为:8M。

图 7.3.2.2-1 创建数组(I32)使用8M内存

如果创建一个数组的分支,也会产生数据拷贝(这是LabVIEW所特有的特性),参见下图。

图 7.3.2.2-2 创建数组并产生分支(I32)

同样,会查看到内存的使用情况,参见下图。

图 7.3.2.2-3 创建数组并产生分支(I32)内存使用增加了4M

图 7.3.2.2-4 创建数组并产生分支(I32)改变连接方式内存使用也是增加4M

2、局部变量(全局变量)产生数据拷贝

现在,为数组Array创建一个局部变量,然后将局部变量连接到数组显示控件Array2,参见下图。

图 7.3.2.2-5 创建数组并用局部变量代替分支(I32)

此时的内存使用情况如何呢?

图 7.3.2.2-6 创建数组并用局部变量代替分支(I32)内存使用增加8M

这里所说的内存使用增加8M,是相比与图 7.3.2.2-

1而言。显然使用局部变量会导致比直接连线产生更多的数据拷贝。同样,使用属性节点传递数据亦如此。并且因为属性节点工作在用户界面的线程,所以会引起

线程交换会导致执行速度降低。而局部变量可以工作在任意线程中,所以它的执行速度会较快。

这也就意味着,尽可能的采用直接连线的方式来传递数据。

Case结构也可以有效的降低内存的使用量,参见下图。

图 7.3.2.2-7 Case结构=T,内存使用8M; Case结构=F,内存使用4M

如果将图 7.3.2.2-1所示的VI做为子VI使用,在它的前面版不打开时,其内存使用量也是4M。

7.3.2.3 避免过多的缓存区分配

避免过多缓存器分配的最好方法就是使用“In Place Element Structrure”。该函数在函数选板》结构》In Place Element Structrure。

右键该结构可以选择如下所示的功能。

图 7.3.2.3-1 In Place Element Structrure的基本功能

这里通过展示一个来自NI的例子进一步说明该结构的作用。例子中每个子VI都包含了波形数据数组。通过查看缓存器分配,可以获得下图所示的结果。

图 7.3.2.3-2 查看到的缓存器分配关系

现在,对第一个VI进行“In Place”处理,参见下图。

图 7.3.2.3-3 对第一个VI进行“In Place”处理

图 7.3.2.3-4 对第二个VI进行“In Place”处理

图 7.3.2.3-5 对第三个VI进行“In Place”处理

图 7.3.2.3-6 对比图 7.3.2.3-2会发现少了许多内存分配的小黑点

LabVIEW程序设计步骤

LabVIEW 程序设计步骤 下面通过一个设计实例来详细介绍虚拟仪器软件LabVIEW 的程序设计步骤。 设计目标:假设有一台仪器,需要调整其输入电压,当调整电压超过某一设定电压值时,需通过指示灯颜色变化发出警告。 1 建立新VI 启动LabVIEW 程序,单击VI 按钮,建立一个新VI 程序。 这时将同时打开LabVIEW 的前面板和后面板(框图程序面板)。在前面板中显示控件选板,在后面板中显示函数选板。在两个面板中都显示工具选板。 如果选板没有被显示出来,可以通过菜单查看(View )/工具选板(Tools Palette )来显示工具选板,通过查看(View )/控件选板(Controls Palette )显示控件选板,通过查看(View )/函数选板(Functions Palette )显示函数选板。 也可以在前面板的空白处,单击鼠标右键,以弹出控件选板。 2 前面板设计 输入控制和输出显示可以从控件选板的各个子选板中选取。 本例中,程序前面板中应有1个调压旋钮,1个仪表,1个指示灯,1个关闭按钮共4个控件。 1)往前面板添加1个旋钮控件:控件(Controls )→ 新式(Modern ) → 数值(Numeric ) → 旋钮(Knob ),如图2-14所示,标签改为“调压旋钮”; 2)往前面板添加1个仪表控件:控件(Controls )→ 新式(Modern ) → 数值(Numeric ) → 仪表(Meter ),如图2-14所示,标签改为“电压表”。 3)往前面板添加1个指示灯控件:控件(Controls )→ 新式(Modern )→ 布尔(Boolean ) → 圆形指示灯(Round LED ),如图2-15所示,将标签改为“上限灯”。 4)往前面板添加1个停止按钮控件:控件(Controls )→ 新式(Modern )→ 布尔 图2-15 添加指示灯、按钮控件 图2-14 添加旋钮、仪表控件

LABview 程序设计

基于Labview的ADD波形 第一部分:概述 随着计算机技术、大规模集成电路技术和通讯技术的飞速发展,仪器技术领域发生了巨大的变化,美商国家仪器公司(National Instruments)于八十年代中期首先提出基于计算机技术的虚拟仪器的概念,把虚拟测试技术带入新的发展时期,随后研制和推出了基于多种总线系统的虚拟仪器。 LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。 与C和BASIC一样,LabVIEW也是通用的编程系统,有一个完成任何编程任务的庞大函数库。LabVIEW的函数库包括数据采集、GPIB、串口控制、数据分析、数据显示及数据存储,等等。LabVIEW也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。 本次就是一个基于labview平台的一次设计来达到对虚拟仪器课程的掌握,尽量使用学习到知识,在设计过程中有些部分存在对于总体设计影响不大,仅仅作为对知识的巩固。 本次的ADD waveforms 设计能够对两种不同的信号进行的运算,由于现有的示波器仅能对两组波形进行简单的加减,而ADD waveforms能够进行除加减意外的乘除运算。 第二部分:设计的思路与基本原理 本次设计是基于labiew界面的一个虚拟仪器的设计,所设计的虚拟仪器要具有对一个正弦波、一个三角波进行各种合成运算的功能,可完成add、divide、multip、subtra四种基本数学运算的功能。 通过以上的目标,我们可以分别选择能产生三角波、正弦波的子VI,再通过一个条件结构来确定每次输入的波形需要进行那种运算,然后在波形图中显示出来以供观察,最后可以比较ADD前的波形与ADD之后的,同时对最终信号进行了频谱分析。 本次设计结构主要有这基本分组成:条件结构、信号产生子VI、信号合并、波形验证部分、控制开关部分、频谱分析部分。在接下来的部分会对这些部分做详细的介绍。 第三部分:设计模块与元器件的介绍

labview基本程序设计

虚拟仪器导论 实验报告 目录 一.实验目的

二.实验原理 2.1 一阶系统状态空间表达式 2.2 四阶龙格—库塔法 2.3 PID控制算法 三.实验内容 四.实验报告 4.1一阶系统仿真前面板 4.2 一阶系统仿真程序框图 五.实验分析 5.1 一阶系统特点 5.2 PID参数对控制系统性能的影响 5.3 PID参数整定方法 六.实验总结 实验二 LabVIEW基本程序设计 一、实验目的 (1) 熟悉LabVIEW 8.5开发环境; (2) 掌握LabVIEW编程语言的程序结构和图形控件的使用方法; (3) 掌握LabVIEW编程环境的程序调试方法; 二、实验原理与内容 已知一阶系统状态空间表达式

x y u x x = + - =2 2.0 编程时可采用4阶龙格-库塔算法求解上述方程: K1 = -0.2*X(k)+2*u(k); K2 = -0.2*(X(k)+0.5*T*K1)+2*u(k); K3 = -0.2*(X(k)+0.5*T*K2)+2*u(k); K4 = -0.2*(X(k)+T*K3)+2*u(k); X(k+1) = X(k)+(K1+2*K2+2*K3+K4)*T/6; Y = X(k+1); 控制算法可采用增量式PID控制算法: du = Kp*(e(k)-e(k-1))+T/Ti*e(k)+Td/T*(e(k)-2*e(k-1)+e(k-2)); u(k) = u(k-1)+du; 本实验要求基于LabVIEW编程环境,针对上述一阶系统进行控制仿真。通过控制系统仿真,分析一阶系统的特点和各个PID参数对控制系统性能的影响。 三、实验报告 (1)简述实验目的及实验原理。 (2)完成实验内容,并附上前面板和程序框图。 (3)分析一阶系统特点和各PID参数对控制系统性能的影响,总结PID参数整定的方法。 (4)总结在编程过程中遇到的问题、解决办法。

基于labview的贪吃蛇游戏程序设计

成绩评定表

课程设计任务书

目录 1 目的及基本要求 0 本程序是基于常看到的一款小游戏贪吃蛇而设计的,即有一条小 蛇不停地在屏幕上游走,吃各个方向上出现的苹果(姑且称它为 “苹果”),越吃越长,只要蛇头碰到屏幕四壁或者碰到自己的 身子,游戏就立刻结束。本程序基于传统贪吃蛇游戏的特点利用LabVIEW制作的一款完整的迷你贪吃蛇游戏。 0 4.1 运行结果 (8)

1 目的及基本要求 本程序是基于常看到的一款小游戏贪吃蛇而设计的,即有一条小蛇不停地在屏幕上游走,吃各个方向上出现的苹果(姑且称它为“苹果”),越吃越长,只要蛇头碰到屏幕四壁或者碰到自己的身子,游戏就立刻结束。本程序基于传统贪吃蛇游戏的特点利用LabVIEW制作的一款完整的迷你贪吃蛇游戏。 熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器原理、设计方法和实现技巧,运用专业课程中的基本理论和实践知识,采用LabVIEW开发工具,实现贪吃蛇游戏的设计和仿真。要求通过本课程设计使学生熟悉LabVIEW开发环境,掌握基于LabVIEW的虚拟仪器设计原理、设计方法和实现技巧,使学生掌握通信系统设计和仿真工具,为毕业设计做准备,为将来的学习及今后从事科学研究、工程技术工作打下较坚实的基础。 2 贪吃蛇游戏设计原理 贪吃蛇游戏大体上可分为以下几个部分: 1) 控制部分就是通过输入输出来控制蛇的运动 2) 逻辑部分进行判断蛇吃了没有是否撞墙同时把蛇的长度增加一节还要实现分数的计算 3) 图象显示部分就是将游戏显示出来 本程序的主要实现如下功能:1.小蛇在屏幕上不停的游走;2.用键盘方向键可控制小蛇的移动方向;3.吃过一个苹果后小蛇长度增加并随机产生另一个蛋; 4.小蛇碰到四壁或者碰到自己的身体时游戏结束并给出得分和提示是否继续; 5.游戏可以有多种难度选择等 3 贪吃蛇游戏设计与仿真 3.1 前面板设计 采用LabVIEW中提供的“Express XY图”作为游戏界面,显示蛇和苹果,这样就可以通过方向键来移动小蛇到想要去的地方。对XY图的属性做如下修改:

LabVIEW和声卡控制系统程序设计

LabVIEW和声卡控制系统程序设计 1 引言 目前,控制系统的编程软件非常多,各类编程语言也数不胜数,具有代表性的有C语言、C++及汇编语言等,相比LabVIEW软件来讲,由于他们具有严格的语言逻辑以及语言规则,所有在设计、实践中往往比较复杂,而LabVIEW作为一种G语言,以图形,线条,结点的形式进行编程,简单易学。而且图形所表示的功能已经用完善的代码集成过,拿来就用,也节省了大量的工作任务。声卡作为一种普遍而且常用的材料,能够在LabVIEW自带的声卡VI中得到更好的运用和体现,二者结合是作为平面控制系统最实用的,最方便的,而且成本较低的体现。 2 LabVIEW软件介绍 LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发,类似于C和BASIC开发环境,但是它与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G 编写程序,产生的程序是框图的形式。用图标代替文本行创建应用程序的图形化编程语言,LabVIEW采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。VI指虚拟仪器,是LabVIEW的程序模块。虚拟仪器

具备很好的数据采集、仿真、数字信号处理的功能。LabVIEW 拥有专门用于控制领域的模块――LabVIEWDSC以及 NI-Motion。除此之外,工业控制领域常用的设备、数据线等通常也都带有相应的LabVIEW驱动程序。使用LabVIEW可以非常方便的编制各种控制程序。 3 声卡介绍 3.1 PCI声卡 PCI声卡就是指采用PCI接口的独立声卡,PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。从结构上看,PCI是在CPU 的供应商和原来的系统总线之间插入的一级总线,具体由一个桥接电路实现对这一层的管理,并实现上下之间的接口以协调数据的传送。 3.2 USB声卡 USB声卡在原理上和结构上与普通的板载声卡很相似,但是由于USB具有其外置特点,他就没有了电路体积的限制,所以他能够通过复杂的模拟电路并采用更好的屏蔽设计从 而提高音质。脱离机箱,拥有不错的音质使他在性能上,实用性上得到了很大的提升,价格也相对较低,因此我们采用的是USB声卡作为平面控制系统的输出部分。 4 LabVIEW程序设计

LabVIEW程序设计-课程设计

LabVIEW程序设计-课程设计 成绩评定表 学生姓名班级学号 基于UDP的点对点专业通信工程课程设计题目 和广播通信 评 语 组长签字: 成绩 20 年月日日期 沈阳理工大学信息科学与工程 课程设计任务书 学院信息科学与工程学院专业通信工程学生姓名班级学号课程设计题目基于UDP的点对点和广播通信实践教学要求与任务: 1,学习LabVIEW的虚拟仪器原理、设计方法和实现技巧, 2(掌握简单LabVIEW程序的编程实现, 3(掌握简单通信系统设计和分析方法, 4(采用Labview语言,实现点对点和广播通信。 ,1,通过检索、查资料、调查研究、确定方案、画出组成系统结构方框图,,2,采用LabVIEW实现点对点和广播通信系统, ,3,系统调试与改进,调整系统参数,分析系统运行结果, ,4,写出设计总结报告。 工作计划与进度安排:

17周学习LabVIEW虚拟仪器原理、设计方法和实现技巧,掌握简单LabVIEW程序的编程实现,掌握简单通信系统设计和分析方法。 19周采用LabVIEW语言,实现点对点和广播通信,并对系统进行性能分析。 指导教师: 专业负责人: 学院教学副院长: 201 年月日 201 年月日 201 年月日 2 沈阳理工大学信息科学与工程 目录 1(概述 ........................................... 4 1.1 LABVIEW简 介 ......................................... 4 2.2 UDP协议简 介 ........................................ 4 2.基于UDP的点对点和广播通信的设计原理 ............ 5 3(基于UDP的点对点和广播通信的程序设 计 ........... 5 3.1 前面板设计 ......................................... 5 3.2 程序框图(后面板)设计 (7) 3.2.1 后面板设计概述 (7) 3.2.2 打开/关闭本地UDP端口功能 (8) 3.2.3 选择广播或者点对点方式发送数据功能设计 (9) 3.2.4 发送数据功能设计 (9) 3.2.5 接受数据功能设计 ........................... 10 4.程序调 试 ....................................... 10 5.总 结 ........................................... 12 6.参考文 献 (13) 3 沈阳理工大学信息科学与工程

labview课程设计

《虚拟仪器》课程设计 题目:摩托车仪表盘 学院名称:物理与电子工程学院 专业班级:电子信息科学与技术 学生姓名:方皖南 学号: 201540620302 指导教师:胡楠 时间:2018-10-25

目录 一、labVIEW介绍 (3) 二、摩托车仪表盘的设计 (4) 2.1前面板图示 (4) 2.2程序框图 (4) 2.3程序说明 (5) (1)左转灯以及右转灯的控制 (5) (2)让左右等闪烁的控制 (6) (3)里程表控制 (6) (4)速度表控制 (7) (5)油罐的控制 (7) (6)所有数值归零控制 (7) 三、设计小结 (7) 四、参考文献 (8)

一、labVIEW介绍 LabVIEW (Laboratory Virtual Instrument EngineeringWorkbench,实验室虚拟仪器集成环境)是一个基于G(Graphic)语言的图形编程开发环境,在工业界和学术界中广泛用作开发数据采集系统、仪器控制软件和分析软件的标准语言,对于科学研究和工程应用来说是很理想的语言。它含有种类丰富的函数库,科学家和工程师们利用它可以方便灵活地搭建功能强大的测试系统。LabVIEW编程语言最主要的两个特点是图形化编程和数据流驱动:(1)图形化编程 LabVIEW与Visual C++、Visual Basic、LabWindows/CVI等编程语言不同,后几种都是基于文本的语言,而LabVIEW则是使用图形化程序设计语言G语言,用框图代替了传统的程序代码,编程的过程即是使用图形符号表达程序行为的过程,源代码不是文本而是框图。一个VI有三个主要部分组成:框图、前面板和图标/连接器。框图是程序代码的图形表示。 LabVIEW的框图中使用了丰富的设备和模块图标,与科学家、工程师们习惯的大部分图标基本一致,这使得编程过程和思维过程非常的相似。多样化的图标和丰富的色彩也给用户带来不一样的体验和乐趣。 前面板是VI的交互式用户界面,外观和功能都类似于传统仪器面板,用户的输入数据通过前面板传递给框图,计算和分析结果也在前面板上以数字、图形、表格等各种不同方式显示出来。 图标是VI的图形符号,连接器则用来定义输入和输出,每一个VI都有图标和连接器。用户要做的工作就是恰当地设置参数,并连接各个子VI。编程一般步骤就是使用鼠标选取合适的模块、连线和设置参数的过程,与烦琐枯燥的文本编程相比更为简单、生动和直观。 如果将虚拟仪器与传统仪器作一类比,前面板就像是仪器的操作和显示面板,提供各种参数的设置和数据的显示,框图就像是仪器内部的印刷电路板,是仪器的核心部分,对用户来讲是透明的,而图标和连接器可以比作电路板上的电子元器件和集成电路,保证了仪器正常的逻辑和运算功能。 (2)数据流驱动 宏观上讲,LabVIEW的运行机制已不再是传统上的冯·诺伊曼式计算机体系结构的执行方式了。传统计算机语言(如C语言)中的顺序执行结构在LabVIEW中被并行机制所代替。本质上讲它是一种带有图形控制流结构的数据流模式,程序中的每一个函数节点只有在获得它的全部输入数据后才能够被执行。既然LabVIEW程序是数据流驱动的,数据流程序设计规定,一个目标只有当它的所有输入有效时才能够被执行;而目标的输出只有当它的功能完全时才是有效的。于是LabVIEW中被连接的函数节点之间的数据流控制着程序的执行次序,而

LabVIEW程序设计方法

LabVIEW程序设计方法 为了提高程序设计效率、保证程序设计质量、便于程序的维护,在设计程序时应遵循一些基本的设计方法。 当开发一个较大的项目时,有必要使用由顶向下的设计方法。LabVIEW语言在使用由顶向下的设计方法上,比其他语言有优势,因为可以先做出用户的接口,然后再逐渐完善它。 1.使用由顶向下的设计方法 1)用户需求列表 先列出一个表格,包括用于用户操作的面板(指大的程序中需要弹出的子程序的面板),这些面板上一般包含控制量与显示量类型,实时分析需求以及数据的表达等。然后创建一个临时的前面板,提供给预期的用户。通过一系列交互的过程,按用户的要求反复调整用户接口。在这个阶段,可能还需要做一些底层的调研,确定可以达到预期的设计要求。 2)设计程序的层次结构 LabVIEW语言的强大功能建立在它的层次特性之上。每创建一个程序,就可以在高层程序的框图中把它当做子程序使用。在这种层次结构下,从本质上说层数是无限的。 确定所需顶层模块之后,使用这些顶层模块创建程序代码。为每个模块创建一个子程序,这个子程序不具备任何功能,只是代表未来子程序的一个模型。每个子程序应有一个图标和一个包括所有必要的输入输出量的前面板。但是暂时不必为它创建程序代码,而是确认它是否为顶层程序所必需的。 把这些模型程序组合在一起后,一般说来就应该去理解每个模块的功能,以及它们如何提供需要的结果。研究每一个模块是否能提供后续程序所必需的信息,然后确认顶层程序代码包含了各程序间传递数据的正确连线。 尽量避免使用不必要的全局变量,因为它们会掩盖了程序间的数据依存关系。对一个大的程序来说,如果依赖全局变量作为程序间传递信息的手段,会使调试变得困难。 3)程序编码 在程序编制过程中,应按照工作的逻辑划分和考虑代码复用的可能性,通过创建子程序实现模块化的编程,把解决一般性问题与特殊问题相结合。 子程序创建以后及时调试。高层的调试尽管是不可避免的,但是在一个小模块中发现程序缺陷要比在多个程序的层次上方便得多。 2.规划接口板 有些子程序尽管已经具备足够的功能,但有时考虑在此基础上修改为其他的函数,并且新的函数有可能需要增加输入或输出,那么应该选择一个有富裕端口的接口板样式,暂时不为那些多余端口连线。这样,以后如果需要另外的输入或输出时就不必再改变接口板了,从而减小这些改变对整个层次结构的影响。 把控制量和显示量连接到接口板时,把输入量放在左侧,输出量放在右侧。这样可以避免程序中连线的混乱。 如果创建了一组经常用在一起的子程序,尽量使它们的接口板一致,通用的输入放在同样的位置。这样容易记住每个输入的位置,而不必再使用帮助窗口。如果我们创建了一个子程序它产生的输出是另一个子程序的输入,尽量将输入与输出端口对齐。这种技巧使连线看上去简洁。

Labview程序设计

《Labview程序设计》教学大纲 课程名称:Labview程序设计 学分:2.5 总学时:40 讲课学时:24 实验学时:16 考核方式:考试 先修课程:《C语言》、《计算机技术基础》、《单片机原理及应用》 适用专业:机械电子工程 开课系或教研室:机械电子工程 一、课程性质与任务 1.课程性质 本课程是机械电子工程专业的专业任选课。 2.课程任务 (1)了解LabVIEW的功能,熟悉LabVIEW的开发环境、VI的组成与创建步骤。 (2)熟悉LabVIEW的数据类型、数组控件及常量的创建与使用、簇及常量的创建与使用。 (3)掌握For/While Loop (Shift Register、Auto-indexing)、Charts与Graphs的概念、创建与使用。 (4)掌握Case Structure、Sequence Structure与Formula Node的创建与使用。 (5)掌握LabVIEW中的属性节点与调用节点的创建与使用方法。 (6)了解LabVIEW中的字符串、文件I/O的操作;了解全局变量与局部变量的创建与使用方法。 (7)了解LabVIEW中的Control Reference的创建与使用;了解事件驱动编程;掌握对菜单的编 辑与响应步骤,掌握对VI的属性进行设置。 (8)掌握有关数据采集的基本概念及在LabVIEW中进行数据采集编程的方法。 二、课程教学基本要求 对课程教学环节的要求(包括理论课时;课堂实践、实验、上机课时;课堂实践课时的具体安排意见;成绩考核形式等) 1、课时分配 理论课时为24,实践课时为16。 2、成绩评定 成绩评定采用百分制。 3、计分原则本课程为期末闭卷考试和平时成绩相结合进行综合评定,最终成绩由以下三部分组成: 第一部分:期末闭卷考试成绩占总成绩的70%; 第二部分:平时作业成绩占总成绩的20%; 第三部分:上课考勤占总成绩的10%。 三、课程教学内容 第一章LabVIEW概述 1.1虚拟仪器概述 1.2LabVIEW是什么? 1.3 LabVIEW的运行机制

Labview程序设计模式

LabVIEW程序设计模式,这个相对学术化的词语是对一系列用于LabVIEW程序设计结构的归纳和总结。在建造房子时,需要针对房子的用途设计整个房屋的架构,确保房子在这个架构上的坚固性和可建造性。写程序时同样如此,不同的应用需要使用不同的程序设计结构。例如我们在LabVIEW中构建一个用户界面型程序时,往往首先在背面板中加入一个大的while循环以使程序持续运行。如果需要响应用户界面事件则还需要加入一个Event事件结构。那么我们是否曾经考虑过以下的这些问题: (1) 应用中是否存在并行响应的情况?如在持续的数据采集过程中,是否需要同时响应单击菜单的事件? (2) 底层获取的数据如何与上层的数据显示部分进行数据交互? (3) 上层的界面如何受底层程序的控制? (4) 同一个循环中采用哪种方式进行数据交换?是局域变量、全局变量、共享变量还是移位寄存器? (5) 程序是否具有可扩展性? (6) 如果程序运行过程中,发生系统错误或者硬件通讯错误,是否会停止运行?待错误排除后是否会继续运行? (7) 如何组织程序中的核心数据结构?是否需要采用面向对象程序设计? (8) 如何记录测试数据并生成报表?如何保存用户配置参数? (9) 如何处理程序运行中的断电情况?重新启动时的继续运行?数据的最低丢失? (10) 如何实现运行过程的采样触发和多点采样的同步? 当然,也许只是使用LabVIEW临时地调试或开发某个小的应用,无需考虑上述的问题。但是,如果使用LabVIEW开发一个典型应用的程序却无法回避这些问题。因此,有必要对各种程序开发的应用进行归纳和总结,提取它们对应的LabVIEW程序结构中的共性。此外,针对这些共性研究哪种结构更加适合于应用。这些结论综合起来就形成了程序设计的模式。 对于初学者而言,理解和掌握程序设计模式往往能起到事半功倍的效果;而对高级用户而言,归纳各种程序设计模式又能够不断完善程序中遇到的问题,并衍生一套符合特定应用的特有的程序设计模式。 状态机是一种最为经典的程序设计模式,在LabVIEW 7.1(含)之前它几乎统治了大部分的LabVIEW主程序。最基本的状态机结构如图 1所示。状态是状态机运行的经脉,在开始使用状态机模式撰写程序时需要将应用分为若干个状态。下面以图中的应用为例说明基本状态机的使用。 【应用1】 前面板具有3个按钮(Control)和1个波形显示控件Chart(Indicator),功能分别是: 1) 开始采集:Label是start,单击后开始进行模拟数据采集程序(这里使用随机数代替)。 2) 关于:Label是dialog,单击后弹出对话框以说明这个程序的版权、帮助等信息。 3) 停止:Label是stop,单击后停止程序的运行。 4) Chart:用于显示获取的随机数。 这是一个非常简单的应用,但是具有一定的代表性。根据要求,该应用至少包含以下5种状态结构。 1) Initial:初始化状态; 2) Idle:空闲状态,用于响应各种用户界面操作; 3) acquire:采集状态,用于持续模拟采集数据; 4) about:用于弹出关于和帮助对话框; 5) stop:停止状态,退出循环并中止程序。

LabVIEW程序设计步骤

LabVIEW程序设计步骤 下面通过一个设计实例来详细介绍虚拟仪器软件LabVIEW的程序设计步骤。 设计目标:假设有一台仪器,需要调整其输入电压,当调整电压超过某一设定电压值时,需通过指示灯颜色变化发出警告。 1 建立新VI 启动LabVIEW程序,单击VI按钮,建立一个新VI程序。 这时将同时打开LabVIEW的前面板和后面板(框图程序面板)。在前面板中显示控件选板,在后面板中显示函数选板。在两个面板中都显示工具选板。 如果选板没有被显示出来,可以通过菜单查看(View)/工具选板(Tools Palette)来显示工具选板,通过查看(View)/控件选板(Controls Palette)显示控件选板,通过查看(View)/函数选板(Functions Palette)显示函数选板。 也可以在前面板的空白处,单击鼠标右键,以弹出控件选板。 ) 2 前面板设计 输入控制和输出显示可以从控件选板的各个子选板中选取。 本例中,程序前面板中应有1个调压旋钮,1个仪表,1个指示灯,1个关闭按钮共4个控件。 1)往前面板添加1个旋钮控件:控件(Controls)→新式(Modern)→ 数值(Numeric)→旋钮(Knob),如图2-14所示,标签改为“调压旋钮”; 2)往前面板添加1个仪表控件:控件(Controls)→新式(Modern)→数值(Numeric)→仪表(Meter),如图2-14所示,标签改为“电压表”。 3)往前面板添加1个指示灯控件:控件(Controls)→新式(Modern)→布尔(Boolean)→圆形指示灯(Round LED),如图2-15所示,将标签改为“上限灯”。 … 图2-15 添加指示灯、按钮控件…

LabVIEW程序设计模式(四)—状态机和事件结构的结合

LabVIEW程序设计模式(四)—状态机和事件结构的结合 LabVIEW程序设计2009-05-04 14:25:19 阅读497 评论0 字号:大中小订阅 上两节分别解决了基本状态机的第(1~5)个问题,但是是否具备一种模式能够综合队列型状态机模式和用户界面事件型模式的优点呢?这样可以同时避免基本状态机的第(1~5)个问题。答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。 状态机模式的基本构成元素是while循环和case结构,而事件结构模式的基本构成元素是while循环和event结构,因此新的模式应该由while循环、case 结构和event结构组成。而while循环的目的是为了保证程序的持续运行,因此必须在最外层,这样就只剩下了图20所示的两种组合方式。 在第一种方式中,每次循环的运行需要经过一个事件结构才能够实现case 中各个分支的运行,那么到底需要多少个分支呢?一般而言不同的事件都会有不同的事件处理函数(这些函数可以在case结构中共用),显示这是无法满足要求的,它从本质上而言仍然是一种事件结构。 在第二种方式中,程序的主体是一个状态机结构,不同的是在某一个状态分子中有一个事件结构。我们可以回忆状态机模式中的“空闲Idle”状态,这正是长时间占用CPU资源的源头,如果在Idle中加入一个事件结构后就有效地规避了这个问题。 图20 三种结构的组合方式 因此图20中的第二种结构综合了状态机和事件结构的优点,有效地克服了基本状态机的第(1~5)个问题。此外,在【应用2_自动贩卖机】例程中,按钮1USD、2USD和5USD的作用是相同的,唯一不同的是它们的代表的币值不同。如果我们希望系统共用“币值相加”这个功能,即当这三个按钮任何一个被按下后都调用同一个函数(该函数的功能是将系统中原来的货币值与新加入的币值相加得到新的值)。这样,需要有一种途径把1USD、2USD和5USD代表的币值作为参数传递给函数。 图21所示为带参数的状态机结构,在消息队列的状态机模式中,加入了一个变体型的变量作为状态传递的参数。实际上,可以把红色的部分做成子vi,不仅节省了背面板空间而且能够进行错误处理。程序中应该设置一个专门的错误处

相关文档
最新文档