labview与数据保存

labview与数据保存
labview与数据保存

基于Labview的数据保存

The date consersation based on LabVIEW

杨建伟 郑琼华 沈昱明

(上海理工大学,上海 200093)

摘 要:在单片机—PC机的串口通信中, 以LABVIEW为开发平台,根据PC侧对串口采集到数据的显示、保存、回读的不同需要,提出了相应的解决办法,编写了PC侧的程序。

关键词:虚拟仪器 串口通信 数据保存

Abstract:Microcontroller communicate with computer based on LabVIEW platform,according to the different need of display、conservasion and review of data.Give the relevant way to solve the problem , and compile the programme of computer.

Keywords:LabVIEW RS232 Data conservasion

0 引言

LabVIEW是一种基于图形编程语言的开发环境。它与传统编程语言有着诸多相似之处,如相似的数据类型、数据流控制结构、程序调试工具等。但二者最大的区别在于: 传统编程语言是用文本语言编程, 而LabVIEW 用图形语言( 即各种图标、图形符号、连线等) 编程 ,编程简单方便, 界面形象直观, 具有强大的数据可视化分析和仪器控制能力。

Labview有丰富的文件操作函数库,可以方便地进行文件的读写。Labview可以读写文本文件、数据报表文件、二进制文件和测试文件。主程序中从VISA read的read buffer 端读上来的数据需要转换成表格数据进行保存,数据的保存分为两个阶段。第一阶段,通过表单形式(带时间头)显示在主程序界面,方便用户直观查看测试参数是否已满足要求。第二阶段,把表单数据保存到Excel文件中,可供用户打印查询。如果数据不需直观显示在主程序界面上,也可保存到TXT(可以用Excel打开)文件中。

在工程中,有一个用户需求值得注意,即在测试开始时,由于只需要观测系统的测试状态,而无需进行数据存储;当系统测试状态达到要求后,再进行实时测试数据的相应存储。也就是说,无论何时都可以对数据进行选择性存储,以实现数据存储的动态控制。

1 工程背景

1.1 labview里的数据存储文件形式

数据的存储就是将采集的数据保存在某种介质中,常见的就是硬盘。

ASCII字节流——一种常用的数据文件格式。许多其他软件(如字处理程序或者电子表格程序)都可以访问ASCII格式文件,因此如果测试数据需要用其他软件来处理的话,可以先把所有数据都转换成ASCII字符串,然后存储至文件中。

数据日志文件——这种文件采用的是只有G语言可以访问的二进制格式。数据日志文件类似于数据库文件,因为可以把不同的数据类型存储到同一个文件记录中。

二进制字节流——这种文件的格式是最紧凑的、最快速的存储文件格式。必须把数据转换成二进制字符串的格式,还必须清楚的知道在对文件读写数据时采用的是哪种数据。

Labview测试数据文件——一种特定格式的文本文件,以.lvm为扩展名。数据测试文件除了数据以外,还保存数据产生的日期时间等信息。

TDM文件格式——NI测试数据交换文件格式。

ActiveX方式——调用Word生产测试报表文件。

1.2 基本文件I/O功能函数

在测控程序设计中,总要涉及到测量数据信息的交互,文件I/O是非常重要的。保存测试数据,或回放存储的数据就要使用文件I/O操作。这些操作包括:打开和关闭文件、读写文件、读写文件格式的文件、移动和重命名目录及文件、改变文件属性文件,以及创建、更改和读写特定格式文件。

工程中利用VISA实现通信。VISA是虚拟仪器软件体系结构的缩写,即Virtualln Strument Software Architecture,是应用于仪器编程的标准I/O应用程序接口(API)。VISA 本身并不具有仪器编程能力,VISA是调用低层驱动器的高层API。VISA可以和VXI、GPIB 及串口仪器按照所使用的仪器调用相应的设备驱动器,具体的使用方法可参考Labview的用户手册。

大多数的文件I/O操作都包括3个基本的步骤:打开一个已有的文件或者新建一个文件;对文件进行读写,关闭文件。Labview 在Function>File I/中提供了很多有用的工具VI。

1.2.1 Write File VI

用于数据写入一个新建文件或已有文件。写入数据在文件中的位置由pos mode及pos offset决定。如图1所示。

图1

1.2.2 Read File

用于从一个已打开的文件读出数据。读数据的起始位置由pos mode及pos offset决定。如图2所示。

图2

1.2.3 Close File

用于关闭一个已打开的文件。如图3所示。

图3

2 数据显示模块的设计

工程中充分考虑动态实时性,显示的每一帧数据都对应不同的时刻,并且对于数据显示、存储功能可以进行时间大小、时间间隔设定,以满足不同测试时刻的数据要求。图4为显示子程序显示的动态数据表格。

考虑到读串口的频繁性,我们提出两种可能:① 上位机需要周期性的对串口进行读操作,这样一来串口上来的数据最好也能周期行性地显示、保存;② 上位机对串口的读操作是非周期性的,而且间隔时间有时较长,这样串口数据上来时显示,没有数据上来就不显示。

对于第一种情况图5给出了具体的子程序代码。主程序中上来的一串串口数据经过String Subset这一功能模块各个参数被依次分割开来。再经过Merge Signals和Build Table最终实现为图4中的Table3。从图4中我们看到了数据被以3s的间隔周期性的保存在表单中。怎么来实现这种周期性呢?这就需要在While循环中用到Combo box控件,预设好各种需要的保存周期以供选择。值得注意的是图4中子程序显示的数据是模拟输入的固定值。

对于第二种情况需要在源程序(图5)的基础上稍加改动,在原程序中去掉Combo box 控件。为了实现数据上来才显示,没数据上来就不显示的功能,可以考虑增加一个Case框,设置一个局部变量(串口是否有数据读上来)来决定执行显示操作还是执行不显示操作。具体的程序读者可自行编写。

图4

图5

工程中因为要直观实时显示各个测试参数,把每个参数数据都接到了各自的Waveform Chart(实时趋势图控件),这样各个参数的波形变化就能被趋势图实时显示了。用户就能直

观地从PC上判断测试参数是否满足要求了。

3 数据保存模块的设计

3.1 把主程序显示的表单记录保存到文件

程序中串口数据可以直观的显示在前面板上并保存下来,但是为了对实验结果进行精确分析,数据存储也很重要。好的数据保存有利于数据的后期处理和分析。

在实时测试主程序的界面图中,继上个模块数据显示在主程序表单中后,测试设置按钮用一个Boolean类型按钮“保存数据”,它就是用来设置数据是否保存的设置按钮。当它为True时,表单中所显示的所有实时测试数据即可保存到指定的测试文件中;当它为False 时,实时测试数据将不被保存。其实质是用户通过保存设置按钮的状态有选择地决定数据是否保存。在LabVIEW 7.1/help/find example自带的例子中就有这样的程序,所需要改动的就是把其中的Table换成所需要保存的Table,创建相应的属性节点,并分别选中Row headers[],Columu headers[]有效。这样⑴中的表单文件就可以连同行表头和列表头一并保存到文件中。

3.2 串口数据保存到能用Exce打开的TXT文件

如果串口数据只需要暂时性地用Indicator显示,而不需要每次累加式的放到表单中,但日后又要查询,数据也可以直接保存到能用Excel打开的文件中。

图6子程序中用到了labview功能模板上的Open/Create/Replace File子VI。该子VI 的功能是生成(打开或替换一个现存文件)一个新文件。该VI的data端的子VI的功能是产生文件的列表头。图7是保存效果。

由于在程序代码中采用了Tab键的特殊处理,使得TXT文件可以用Excel打开,而且格式和表单文件中一样工整。

图6

图7

在以上数据显示、保存的基础上,用户就可以调出保存数据选择性地显示。

4 结束语

总之,在上位机上能够以文本或波形的形式动态地显示串口采集到的测试数据,并可以根据需要将采集到的数据以电子表格、文本、波形等形式保存下来,还可以调出保存的数据进行有选择性地显示,达到了设计的要求。

参考文献

1 杨乐平,李海涛,赵勇,等.LabVIEW高级程序设计[M].北京:清华大学出版社,2003年4月第1版.

2 雷振山.LabVIEW 7 Express.北京:中国铁道出版社,2004年4月第1版.

3 侯国屏,王坤,叶齐鑫.LabVIEW7.1编程与虚拟仪器设计.北京:清华大学出版社,2005年2月第1版.

4 戴鹏飞,王胜开,王格芳,等.测试工程与LabVIEW应用[M].北京:电子工业出版社,2006年5月第一次印刷.

labview事件结构学习

labview事件结构学习 编程的主要目的是为了实现用户的某种功能,用户通过用鼠标、键盘、程 序内部等触发某种程序动作,从而达到某种结果,这些操作都被称作为事件,LabVIEW 中相应这些事件最常用的结构就是事件结构。事件结构内容丰富,基 本上大的程序结构都需要用到事件结构,下面将详细介绍事件结构。事件结构 在程序不能够单独响应各种事件,必须与循环结构一同使用,如下图事件添加 方式很简单,鼠标右键事件框弹出菜单如上图,有添加、删除、复制、编辑事 件等选项,按照操作即可。如下图,为事件结构添加Stop 事件,布尔控件触发 事件的方式有多种,鼠标按下、经过、离开、进入等,这里我们选择值改变。 确定后,stop 事件就被添加进去了,如下图,当我们运行程序后,点击前面板 的stop 按钮,触发事件使while 循环停止而后程序也停止。同一事件分支只能 添加一种事件吗?当然不是!有的时候有很多不同操作却会执行相同代码,怎 么编程才不会让代码冗余呢?看个例子,如下图2 个按钮stop1,stop2 点击后 都可以让程序停止,我们怎么为其添加事件呢?我们先添加一个事件stop1 的,方法上面已经描述了。由于stop2 的执行代码和stop1 一样,我们在事件stop1 上右键->弹出菜单->编辑本事件分支(Edit Event Handled by This Case)会弹出已添加事件stop1 的编辑框,这是左侧有2 个按钮如下截图我们点击Add Event 左侧事件列表会出现如下变化选中这个后,右侧列表选中stop2 的Value Change 事件后,点击确定在看该事件分支如下,2 个事件就添加在同一个分支当中了,运行程序后,点击stop1 或stop2 均可让程序停止。超时超时是事件结构特有的,看名字就知道是怎么回事,即超过一定时间没有触发事件则执行超时 事件。如果超时时间设置所以如果程序事件功能不多,又需要定时执行一段代码,可以考虑用此方式来完成;如果程序操作频繁,则不建议用此事件来定时

Labview执行结构:详细说明

执行结构:详细说明 While循环 与文本编程语言中的Do循环或Repeat-Until循环类似,必须满足特定条件之后,While循环才会执行其内的程序代码,如图1所示。 图1. LabVIEW中的While循环;具备While循环功能的流程图; 还有While循环功能的伪码范例 While 循环位于Structures面板上。从面板上选择While Loop之后,针对所要重复的代码区块,可用鼠标拖拽出矩 形并将之圈住。放开鼠标之后,即会有While循环圈住用户所选的区块。 只要将对象拖拽至While循环中,即可将其新增至While循环中。 只要条件接线端接收特定的布尔值之后,While循环随即执行代码 也可通过While 循环的条件接线端来处理基本错误。若将错误簇连接至条件接线端,则只有Status参数的真或假值传送至接线端。同样,Stop if True和Continue if True快捷菜单项目,将分别变更为Stop if Error和Continue while Error。 计数接线端属于输出端点,其中包含已完成的循环次数。 While循环的循环计数均从零开始。 注意: While循环将至少执行一次。 无限循环 无限循环为常见的程序错误,即无法停止的循环。若条件接线端 i为True时停止,而用户又在While循环外部放置布 尔控件接线端。一旦循环开始,控件值即成为FALSE,就会形成无限循环。

图2.While循环之外的布尔控件 因为在循环开始之前,仅读取该值一次,所以改变控件的值并无法停止无限循环。若要通过控件停止While循环,则必须在循环中配置控件接线端。若要停止无限循环,则按下工具栏上的Abort Execution按钮,即可终止该VI。 在图3中的While 循环将不断执行,直到随机数函数的输出大于或等于10.00,且Enable控件为TRUE时才会停止。当且仅当“与”函数的两个输入都为真时,函数的返回值才为真。否则,与函数将回传FALSE。 在图3中,只要随机函数不产生10.00以上的值,就会成为无限循环。 图3.无限循环 结构隧道 隧道负责为结构传送数据。 While循环边框上的实心区块即为隧道。此区块的颜色与隧道所连接的数据类型的颜色相同。在循环终止之后,随即有数据送回循环。当隧道传送数据进入循环时,只有数据抵达隧道之后,才会执行循环。 图4即以计数接线端连至隧道。直到While 循环执行完毕,隧道中的数值才会传送至Iterations显示控件。计数接线端在Iterations显示控件中只会显示最后的数值。 图4. While循环的隧道

labview控制程序流程——labview事件结构

labview控制程序流程——labview事件结构 1 事件结构及它的图形化表示法事件被用来通知用户有异步活动发生。图 形化语言的事件响应包括:用户界面事件、外部I/O 事件和程序其它部分的事件。对事件的处理程序也被称为:事件驱动程序。事件驱动程序可以分为若干 个分支,每个分支处理不同的事件响应。所以对事件的响应结果也可以控制程 序的流程。事件驱动机制来自于可视化的操系统,可视化操作系统对用户事件 提供了简洁、有效的响应方式,最常见的事件来自于鼠标和键盘。虚拟仪器借 助于操作系统的事件处理机制实现了图形化语言的事件响应能力。在没有引入 事件结构之前,LabVIEW 是借助于轮询的方式来查询用户操作,由于轮询的方 式会占用一定的CPU 资源,甚至可能遗漏事件,所以这种处理方式并非理想。事件结构的出现避免了对CPU 资源的占用,同时也避免了事件的遗漏。事件 结构在函数选板》编程》结构子选板中可以找到,并可以将其直接拖拽到程序 框图中,图形化表示的事件结构,参见下图。图 1 图形化的事件结构与Case 结构和循环结构类似,事件结构也包含了一个主框架,这个框架内将用来放置 事件处理的事件驱动程序代码。如果事件处理任务众多,会有众多事件分支存在,在结构上类似Case 的多帧结构(选择器标签)。当在程序框图上拖放一个 事件结构时,我们只能看到上图所示的一帧已经预先注册的超时事件(Timeout),超时事件分支。它具有定时延迟的基本功能(不包括While 循环),参见下图。图 2 具有定时延迟的基本功能当然也可以采用另一种表示方法,参 见下图。图 3 利用事件结构内部节点获得中止时间通过这个例子也好理解内部 节点中时间的含义(是事件响应的停止时间)。超时事件超时事件是一种特殊 的事件,当然也可以看成是默认的事件分支。如果存在其它事件源时,超时事 件完全可以被忽略或取消。看下面一个例子。图 4 仅有的两个事件之一超时事

LabVIEW事件结构的妙用

LabVIEW事件结构的妙用 首先,我们回顾一下上期节目:LabVIEW网络讲坛乊悬案迷思中关于事件结构的几个重要知识点。 事件结构的基本组成部分: 事件结构五大基本组成部分 事件结构由——事件选择器、超时接线端、事件数据节点、事件过滤节点和动态事件接线端5个基本部分组成。 事件结构编程的3条黄金原则: 在使用LabVIEW事件结构迚行编程的时候,我们应该注意:1.不要将事件结构放置在while循环乊外,而应该放置在while循环的内部;2.不要在事件结构的内部使用循环处理事件,可选择采用生产者消费者结构,在生产者循环中放置事件结构,在消费者循环中处理事件;3.记得为事件结构添加一个单独处理停止按钮的分支。 遵守以上三条原则将使我们的程序更加健壮,避免在使用事件结构的时候出现前面板死锁等问题。 过滤事件与通知事件:

在LabVIEW中,以问号结束的事件被称为过滤事件,其余的事件被称为通知事件。对于通知事件,程序可以感知事件的发生并且响应该事件,然后再处理在事件结构中定义的任务;而对于过滤事件,程序感知事件发生后,首先处理在事件结构中定义的任务,然后根据事件过滤节点的值(Discard?)来决定是否响应该事件或是否改变事件数据。 因此我们建议,在希望参与处理用户操作时使用过滤事件,因为过滤事件可以放弃事件或修改事件数据。如果仅需要知道并响应用户执行的某一特定操作,则应使用通知事件。 在本期节目中,我们着重介绍动态注册事件的用法。 静态和动态两种事件注册模式: 静态注册指定了事件结构的每个分支具体处理哪些事件。一旦VI开始运行,LabVIEW将自动注册这些事件,并且在VI运行的整个过程中无法改变事件结构所处理的事件。 而动态事件注册与VI服务器相结合,允许在程序运行时使用控件、VI或应用程序的引用来动态地指定和改变产生事件的对象。动态注册在控制LabVIEW产生何种事件和何时产生事件等方面更为灵活。 Demo 1和Demo 2帮助大家更好地理解动态注册事件编程方法。 Demo 1:动态注册事件_阿拉丁神灯.vi Demo概述: 在这个VI中,用严格自定义的方式将一个布尔类型的控件做出神灯的样子,并为这个布尔控件动态注册了”鼠标按下”的事件。这个事件执行的任务是显示神灯神仙,并弹出一个对话框。由于该事件采用的是动态注册的方式,所以可以通过一个按钮取消对该事件的注册。并通过另一个按钮再次注册该事件。这就是动态事件的使用效果,它可以在程序运行的过程中,动态地控制何时注册事件和注册什么样的事件。 程序实现:

labview事件结构浅析

https://www.360docs.net/doc/8d13098102.html,/forum.php?mod=viewthread&tid=207837 使用LabVIEW图形化语言开发的应用程序界面是图形化用户操作界面,也称为:GUI (graphical user interface),它的作用是与操作者实现人机对话形式的互动操作。这种对界面操作的互动响应在LabVIEW 6.1发布之前,只能是通过“轮询(polling)”的方式来实现。轮询的方式的缺点是:需占用一定的CPU资源(在没有事件发生时)和灵活性不好。在LabVIEW6.1引入事件结构(Event Structure)后,采用事件结构来设计、实现的GUI操作则变得更加灵活、方便,并且不占用CPU的资源,这与先前采用轮询的方式来查询事件的方式相比要合理的多。下面结合应用项目中的设计实例来介绍GUI设计中的事件驱动。 有关事件结构的一些基本概念、原理及使用方法在LabVIEW Help及许多中文书中都作了详细的讲解,这里我就不作更多地介绍了。 事件结构通常包括以下部分: 1、Event cases——包含有若干个注册的事件源及同等数目的Event case层,在每个Event case层中包含对该事件响应的处理程序。 2、While循环——用来检测连续不断产生的事件 事件结构中的While循环,是用来确保检测到连续不断发生的事件。如果没有这个While循环,无论有多少事件发生只能对第一个发生的事件进行处理,处理完后程序将退出事件结构。 菜单选项事件结构实例 2011-11-11 09:50 上传下载附件(8.79 KB) NI USB-9219是一款4通道通用C系列模块,专为多功能测试而设计。USB-9219能够测量传感器中的多种信号,如压力计、RTD、热电偶、测压元件和其他需要供电的传感器。由于通道接受单独选择,4条通道可以分别进行不同类型的测量。测量范围随测量类型而异,包括±60 V最大电压范围和±25 mA最大电流范围。 第1步、创建一个项目:综合参数测量仪 按照我的设计习惯,首先在桌面上创建一个新的文件夹,命名为《综合参数测量仪》。然后,打开、运行LabVIEW开发环境,并选择开发环境中的:新建》项目。 此后,在“项目浏览器”就可以看到一个新建的项目:"未命名项目1"。单击项目浏览器:文件》保存,并将该项目命名为:“综合参数测量仪”后,存放到桌面上的《综合参数测量仪》文件夹中。 此时,项目创建完毕。 第2步、创建一个主vi:综合参数测量仪.vi 2011-11-11 09:41 上传下载附件(14.71 KB) 打开刚刚新建的“综合参数测量仪”项目,然后用鼠标右击该项目中的”我的电脑“选择:新建》VI,即创建了一个新的vi。 用鼠标点击新vi的:文件》保存(命名为:综合参数测量仪.vi)。 主vi即宣告创建完毕。如例图所示。

LABVIEW 中的事件结构杂谈

LABVIEW中的事件结构杂谈 刚开始接触事件结构时觉得它很好用,所以很喜欢用,但也引起了一些问题,就是前面板很容易就被挂起来了,就是所前面板没有响应了,很郁闷。之后就不敢用了,很多可以用事件结构的地方都只用CASE结构麻烦的代替了~~ 今天被师兄那么一指点,觉得完全是委屈了事件结构啊,之前事件结构引起的问题可以很容易的解决。 方法就是设置“超时”(之前一直觉得这个东西没用的): 一般情况下,事件结构是会和while循环套用的,通过不断的循环来执行不同事件源激发的事件,但如果不设置超时,也没有事件源发生,那么while循环将一直等待事件的发生而不进行循环,这样就会使得事件结构外的其他程序也不能执行,可能造成的结果就是前面板本该有反应的地方(比如变量值的变化)没有了反应。 而如果设置了超时,比如设置为100(ms),意思就是每隔100ms如果没有事件发生就超时,进行一次循环,那么事件结构外的其他程序也就得到了执行。 总结一下: 如果事件结构在while循环中,而事件结构之外又有其他的程序需要执行(可能不依赖于事件的发生),那么就应该设置超时。 在事件处理过程内,如何响应前面板命令控件的命令? 我发现,在一个事件内的处理过程完成之前,系统不能响应前面板的其他命令。系统是在事件完成之后的等待时期才响应其他前面板命令事件。 编辑事件结构对话框的下边有一个: 锁定前面板在事件分支执行完毕前。你可这个默认选中的选项取消了,就可以实现你的“在一个事件过程处理中途响应前面板的其他命令"功能。 LabVIEW事件结构 使用LabVIEW图形化语言开发的应用程序界面是图形化用户操作界面,也称为:GUI (graphical user interface),它的作用是与操作者实现人机对话形式的互动操作。这种对界面操作的互动响应在LabVIEW 6.1发布之前,只能通过“轮询(polling)”的方式来实现。轮询的方式的缺点是:需占用一定的CPU资源(在没有事件发生时)和灵活性不好。在LabVIEW6.1引入事件结构(Event Structure)后,采用事件结构来设计、实现的GUI操作则变得更加灵活、方便,并且不占用CPU的资源,这与先前采用轮询的方式来查询事件的方式相比要合理的多。下面结合应用项目中的设计实例来介绍GUI设计中的事件驱动。 有关事件结构的一些基本概念、原理及使用方法在LabVIEW Help及许多书中都作了详

labview课程设计模拟计算器事件结构

河北工程大学 《虚拟仪器设计》课程设计报告 课题:计算器模拟 姓名:张振兴 学号: 090030301 班级:测控三班 完成日期:2012 年 6月19日

目录 一、设计思路 (2) 二、实现过程 (2) 1、面板键入感应 (2) 2、运算变量的初始化 (2) 3、无操作时的默认输出 (3) 4、数字的键入1-9的输入 (3) 5、数字0的输入 (4) 6、小数点的键入 (5) 7、结果去零操作 (5) 8、“+/-”键的设计 (7) 9、“+、-、*、/”四则运算 (7) 10、等号键 (8) 11、开方运算 (9) 12、取倒数倒数运算 (9) 13、退格键CE的设计 (10) 14、清零键C (11) 15、停止键OFF (12) 三、整体程序 (12) 四、前面板的设计排版 (12) 五、while循环中寄存器能 (13) 六、此计算器可以实现的功能 (13)

一、设计思路 完成标准型计算器的一般功能。 输入第一个数,进行存储并显示输入运算的类型并存储输入第二个数,存储并显示按“=”或则按其它运算符号“+、-、*、/”进行连续的运算,最后显示运算结果。 二、具体的实现过程 1、面板键入感应 在前面板上建立22个布尔量,其中包括0--9十个数字键,1个小数点键,4个“+、-、*、/”运算键,1个等号键,1个开方键,1个符号转换键,1个倒数键,1个清零键,1个退格键,1个退出键。如下图所示: 2、运算变量的初始化 在运行程序之前,首先对需要用到的变量进行初始化,如图所示

3、无操作时的默认输出 当键盘上的键没有任何一个按下时,系统仅执行顺序结构第一帧,系统处于初始化状态输出。 4、数字1--9的输入 以数字“1”为例,当按下数字“1”后,布尔量为值改变,进入时间结构结构,将1输出到显示中,布尔量再次改变时。(图1.4.1)若再次输入1,为避免出现01这样的字符串,先判断之前显示的数据是否为0,若为0,则直接输出1,(图1.4.2)若不为0,则将这两次输入的数据通过

labview事件结构

最近贴子比较少啊,发个贴子讨论一下基于事件结构的状态机吧,最近好像不少朋友都会有这方面的问题。 有些截图看不清文字的可以单击图片放大来看。 我感觉在LabVIEW中进行程序框架设计,似乎只见到过一种框架,那就是状态机,(并行的算不算?)还有“主/从设计模式”、“生产/消费模式”之类的,但好像也是建立在状态机的基础上的。如果真是这样的话,状态机就成了唯一的程序框架了?状态机简单一点说就是上一个运行状态决定下一个运行状态,在LabVIEW中有标准的状态机的模板,菜单中选择文件>>“新建…”(是第二个而不是第一个“新建”,注意“新建”二个字后面的省略号,表示会弹出界面来),在弹出来的对话框中的右边树形控件中选择“VI>>基于模板>>框架>>设计模式>>标准状态机。(还有其它一些设计模式也可以这样打开)新弹出的标准状态机如下图: 我一开始的时候看到这种结构不是很好用,感觉有点怪,完全不需要用户进行操作整个程序就运行完了,所以刚听到状态机时感觉这种结构的功能也没有宣传的那么强大,我一般在主程序中都没有使用这种结构,只是偶尔在一些比较底层的子VI里使用一下,因为这种结构跟顺序结构差不多,但在调试、查看时又没有顺序结构直观,要在不同的CASE进行切换比较麻烦,虽然这种结构在错误处理上有一定的优势。后来又发现,说到状态机的话,是说这样一种编程思想,好些类似的结构似乎都可以归到状态机范畴里面(难怪官方只说这种是标准状态机?)其它状态机如下: 第一种我是用得比较多一点——基于事件的状态机

这种结构充分发挥了用户与程序的互动,比如上图,用户在点击前面板的“开始采集”按钮后才会开始进行数据采集任务。我一般在主程序上是用这种结构,一些附加功能,比如用户设置、生成报表等功能都是利用事件结构处理前面板的按钮点击事件来实现的。 第二种跟标准状态机也差不多: 这种结构是利用循环结构里面的循环计数器来选择需要执行的下一个状态。也是不需要与用户进行互动而一直执行的,在一些固定测试顺序的测试中看到过这种结构。状态机中使用到了循环结构,而循环结构中另一个非常实用的东东就是移位寄存器(事实上状态机也是借助了移位寄存器才能更好地实现它的功能),将上一次(或几次)循环的数据“移到”本次循环中进行使用,刚开始学LabVIEW的时候不怎么敢用移位寄存器,但一旦开始使用后,就发现移位寄存器好处实在是不少,如果还不会使用的话写一二个小程序,立马就可以发现,其实移位寄存器也很简单:上面的程序中使用高亮执行的话就可以很清楚地了解移位寄存器的作用了。 有了移位寄器器,再回头看一下上面的基于事件的状态机,这种结构还不够完善,因为有时需要在用户没有点击按钮的动作的时候也要执行某些程序,比如如果用户多长时间没有动作就向串口发送一些信号之类的,或者用户触发某些事件后要将结果显示出来,

event提高:LabVIEW事件结构编程

LabVIEW事件结构编程 事件驱动的编程允许用户通过前面板的操作,或是其他的异步事件来驱动LabVIEW程序的运行。事件是一种异步的信号,告知PC有事情发生。用户界面、外部I/O或是程序的一部分代码都有可能导致事件的发生。使用事件结构可以实现仅当事件发生时,程序才需要响应,别的时候程序可以处理其他迚程或是其他的事件,事件结构相当于一种“中断”。相对的,如果不使用事件结构,程序会以“轮询”的方式来检测事件的发生,但这样会大大消耗CPU的使用时间,不利于处理复杂、多线程的程序。因此,事件结构允许将CPU的使用降低到最小,但又不牺牲与用户的交互性。用户界面事件:鼠标点击、键盘操作等等外部I/O 事件:硬件定时、硬件触发、或是硬件出错等等。其他程序事件:程序间的通讯等注:LabVIEW支持用户界面事件和程序事件而不支持外部I/O事件。 1. 事件结构 典型的事件结构如图1所示。事件结构包括一个或多个子程序框图,或事件分支,注意每当结构执行时,仅有一个子程序框图或分支在执行。事件结构的执行过程是,一直等待直至某一事件分支的事件发生,然后执行相应事件分支从而处理该事件。右键单击结构边框,可添加新的分支并配置需处理的事件。为事件结构边框左上角的“超时”接线端连接一个值,以指定事件结构等待某个事件发生的时间(以毫秒为单位)。默认为–1,即永不超时。 图 1事件结构

用户界面事件分为消息事件和过滤事件两种。 a.消息事件 消息事件指一个用户的行为已经发生,使用消息事件来反馈一个已经发生的事件,并且LabVIEW已经对它迚行了处理。例如,“鼠标按下”就是一个消息事件,图2中的事件结构的分支程序实现了用户用鼠标点击停止按钮,按下后停止程序的功能。这个事件是在用户释放鼠标以后LabVIEW迚行处理的。 图 2 消息事件 b.过滤事件 过滤事件在用户行为发生之后,LabVIEW处理该事件之前先告知用户,由用户来决定程序接下来如何处理事件,有可能处理的方式与默认的处理不同。过滤事件有什么好处?使用过滤事件以后,用户可以随时按需要修改程序对事件的处理,甚至可以完全放弃该事件,而对程序不产生影响。例如:“前面板关闭?”就是一个过滤事件(过滤事件后面都有一个?)。图3中的事件结构实现放弃对“前面板关闭?”这一事件的响应,从而将这一事件过滤。

labview深入探索xcontrol

labview深入探索----xcontrol control是LABVIEW8.x新增的功能,LV中的CONTROL我们是再熟悉不过了,这个"X"到底代表什么那,到NI网站上也没找到它的英文定义,可能相当与ACTIVEX中的"X"?虽然无法弄清楚它的定义,但是它的作用是清楚的,我个人理解它更象VC中MFC的控件自画,也具备了一些ACTIVEX的能力,与ACTIVEX的最大区别是ACTIVEX是独立于平台的,可用于各种编程环境,从这点来说,可以把它看做LV内部的activex,MFC中的控件自画是这样的,当我们要做一个特殊形状的控件时,可以设置它的一个属性是自画,own draw,也就是说,这个控件是用户自己画出来的,比如一个按钮,当鼠标进入它的控制区域,会自动显示凸起状态,还可以自动改变颜色,IE菜单就是这样,当鼠标移入的时候,背景色自动变成兰色,离开后,又自动恢复,实际上,它是在响应两个事件,MOUSE_ENTER 和MOUSE_LEAVE事件. 在xcontrol出现以前,我们也可以对一个控件通过属性节点和事件结构实现这种动态变化,但是有着本质的区别,xcontrol通过事件结构判断事件,利用属性节点改变其显示方式是完全在内部实现的,因此它是可以重用的,从使用方法上它和LV一般的控件没有任何区别,我们完全可以把它看成LV又给我们提供了新的控件,我的文章里多次提到AE的概念,有了XCONTROL,我们不但可以保存数据,而且有了显示的能力,所以说,对于基于组件编程的LV,能力有了很大的提高. 虽然xcontrol是一个新增的特性,但是它的制作方法实际上我们或多或少地都涉及到了,这就使得制作XCONTROL变得相对容易了.

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

LabVIEW程序设计模式(四)—状态机和事件结构的结合 上两节分别解决了基本状态机的第(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 所示为带参数的状态机结构,在消息队列的状态机模式中,加入了一个变体型的变

相关主题
相关文档
最新文档