原创 在Labview中实现窗口弹出以及数据的保存

2015-10-10 11:01 5693 11 18 分类: 软件与OS

在程序的设计中,遇到了一个需求,就是我的面板上需要有一个按钮,按下按钮后弹出一个窗口,在新窗口中有一个二维的表格,用户可编辑二维表格中的数据,最后可以通过保存按钮选择路径保存该组数据,保存的格式为*.csv,方便后续的读取操作。下面来给大家分享一下我的制作过程。

一.窗口vi的制作

首先,要实现弹窗,除了使用Labview自带的对话框函数外,都得先自己创建一个窗口,即有窗可弹。我们的任务是实现二维数组的保存,因此我们就创建一个新的vi,在其中添加二维数组的电子表格,实现数据的输入,接着再运用Write To Spreadsheet File.vi(图一)这个函数进行电子表格的写入操作。

20151010104828205001.png

图一

我们可以看到该函数有许多的参数需要我们设置,依次将这些参数根据需要设置好后,就完成了一个最简单的程序,运行后可以直接把电子表格写入固定预设好的路径。但是如果用该函数自带的路径对话框,出现的对话框可调范围比较窄,因此我们需要在文件路径前增加一个选择路径的文件对话框函数(图二),我们可以看到这个函数对于对话框的参数设置比较详细。

20151010104835960002.png

图二

在设置好相应参数后,再加一个循环,并且添加保存按钮后,就做成了简易的文件保存的小程序。如下图(图三):

20151010104844556003.png

图三

但是这个程序存在有如下问题:

1.     保存按钮按下后布尔值改变,出现无限循环保存的情况。

解决方法:将按钮的动作调成单击时触发,如下图(图四):

20151010104852710004.png

图四

这样就可以在系统读取按钮变化后返回初始状态。

2.弹出选择路径对话框后,如果按下取消按钮,则系统会报错。

    解决方法:开始的时候尝试了使用错误擦除函数,但是当针对文件对话框函数的错误被擦除后,因为Write To Spreadsheet File.vi函数的文件路径没有接收到参数,所以又弹出了一个选择路径的对话框,该对话框不是我们需要的,而且关闭后报错,所以擦出错误这条路是行不通的。第二种方法是巧用if else语句,因为当在选择路径的对话框下点取消后,必定会产生一个错误,所以我们就可以将情况分为有错误的情况(点击取消)和正常情况(保存确认),这种二分支的结构刚好可以使用if else语句,当正常情况下执行Write To Spreadsheet File.vi函数,而错误情况下不执行该函数,这样既消除了错误,也避免了Write To Spreadsheet File.vi函数带来的二次弹窗,改动后的程序如下图(图五):

20151010104858692005.png

图五

前面板如下图(图六):

20151010104909625006.png

图六

二.弹窗程序的实现

制作完窗口vi后,我们需要将窗口vi保存为一个子vi,在我们的主程序中通过一个按钮来调用,实现弹窗。

在引用中,我们也是通过if else语句判断按钮的状态来实现的。

首先,我们在前面板添加一个按钮,如图七:

20151010104920289007.png

图七

接着对按钮进行一些必要的设置,如图八:

20151010104926414008.png

图八

我们便可以通过一系列对vi调用的函数进行调用,包括vi路径的选择,vi前面板的打开以及vi的运行。最后可以通过一个while语句保持对按钮状态的实时读取。编好的程序如下图(图九):

20151010104934538009.png

图九

但是在程序的运行中,存在以下问题:

当弹出子vi并且执行完保存的步骤后,点击右上角的关闭按钮关闭该窗口,如果再次点击按钮调用该vi时,系统就会报错,如下图(图十)所示:

20151010104943133010.png

图十

错误代码为1198,错误的原因在于我们只是关闭了窗口,却没有中断这个vi的运行,它任然在后台继续运行,因此再去调用的时候就出现了错误。要解决这个问题,我们要做的就是在销毁窗口的时候同时结束这个vi的进程,但是如果让用户去主动点一下停止,然后再去关闭窗口的话,用户体验就会很差,而且有的用户会因为不知道流程二导致系统出错,因此需要解决的是关闭窗口必须和结束进程同步,二者的动作只能由一个按钮去控制。要解决这个问题,第一种方法是直接设置vi的属性,在vi属性设置栏里边有窗口外观的选项,在该选项卡里有一个自定义选项,可以自定义窗口外观,如图(图十一)所示,在自定义外观里选中调用时显示前面板和如之前未打开则在运行后关闭这两个选项,便可以实现。但是在实际运行中却因为某些原因这个功能失败了,因此我尝试了第二种方法。

20151010104951164011.png

图十一

    第二种方法是直接使用代码去实现,首先,对于窗口vi,我们禁用关闭按钮,使用户不能使用关闭按钮来直接关闭窗口,接着禁用程序的运行和终止按钮,使用户不能通过该按钮来直接终止程序,导致程序结束运行但是窗口还在显示这种错误。在禁用完这些按钮后,我们发现程序无法关闭了,这显然也是不行的,我们可以直接使用一段代码来实现程序的终止和窗口的关闭。我们还记得在写窗口vi的时候,我们使用了while语句来实现程序的持续运行以及对表格上二维数据的实时监测,而while语句通过布尔量来实现循环的跳出,若该循环跳出则程序结束,因此我们可以在此处动手,实现当布尔量发生变化时,既程序关闭时销毁窗口,在这里我们用到的同样是if else语句,以及vi服务器引用这个函数,在该函数上右键创建→vi类的方法前面板关闭,即可实现一个前面板的关闭功能,如图十二所示:

20151010105005476012.png

图十二

在有个这个功能后,我们需要将它和程序的结束按钮连接起来,实现同步动作,使用条件语句,当关闭按钮按下时,销毁窗口并且停止程序的运行。如下图(图十三)所示:

20151010105011614013.png

图十三

当关闭按钮没有动作时,其布尔值为假,直接传递给while循环,当关闭按钮按下,布尔值变为真,就先执行关闭前面板,然后停止程序运行,这样即可解决这个问题。

如果您想了解跟多虚拟仪器的信息,敬请登录www.hkaco.com或发邮件到hw@hkaco.com与我联系。

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

ltt_111629626 2015-10-10 12:03

很好的文章~收藏学习~~

用户1766950 2015-10-10 11:10

学习Labview的好文章啊,必须点赞

用户1649855 2015-10-10 11:07

赞!

用户377235 2015-10-10 11:06

It helps a lot.

用户377235 2015-10-10 11:06

哎呦,不错哟~

用户1842468 2015-10-10 11:04

评论是对思考最好的总结…

用户1702890 2015-10-10 11:04

好腻害~
相关推荐阅读
用户1855715 2016-01-11 10:48
如何识别钓鱼WIFI
“服务员,你们家WiFi是哪个?有密码么?” 现在人们每次去一个新的饭馆、酒吧,第一句话往往不是点菜,而是问服务员WiFi密码。 这些WiFi真的安全么? 不知道大家有没有这种经...
用户1855715 2016-01-08 11:49
Pickering的LXI高密度矩阵模块用于半导体封装中的开路短路测试
Pickering的LXI高密度矩阵模块用于半导体封装中的开路短路测试 客户: Amkor Technology公司是世界上最大的合约半导体组装与测试服务供应商之一。公司成立于1968年,Amkor公...
用户1855715 2016-01-07 16:17
使用Pickering的PXI和LXI开关产品进行三个并联PCB航空模块的自动化高加速应力筛选测试解决方案
使用Pickering的PXI和LXI开关产品进行三个并联PCB航空模块的自动化高加速应力筛选测试解决方案 客户: TBG solutions是一家从事测试测量以及控制的英国公司。TGB跟客户一起工...
用户1855715 2016-01-07 16:15
RF连接器的选择
RF连接器的选择 许多Pickering的产品都提供一个可供选择的射频连接器,用来应对不同的连接器类型以及提供其对PXI和LXI开关解决方案的连接。 SMB连接器 这个小小的连接器通常的带宽为4GH...
用户1855715 2016-01-07 16:13
故障注入在汽车ECU测试中的应用
故障注入在ECU中的应用 现有解决方案存在的问题 最终用户要求一个可以检测汽车ECU的可靠性的系统,该系统最主要的任务是替换现有的半实物仿真(应用于新品测试),使之更加灵活且降低成本。现有的系统是...
用户1855715 2016-01-07 16:10
矩阵的实现方法
矩阵的实现方法 对于矩阵的实现,有两种常用的方法,树状多路复用和交叉点。通过这两种方法的组合,我们可以实现多种不同功能的矩阵。但是通常情况下,几乎所有的功能图都是通过一个交叉点形式的矩阵图来简单的介...
EE直播间
更多
我要评论
7
11
关闭 站长推荐上一条 /3 下一条