LabVIEW做为一个编程开发渠道,和其它的文本编程环境相同,当咱们编写的程序变得很大时,为了能在调试的时分快速的定位问题,也为了能在终究用户运用时,关于突发的过错或许可预知的过错能够经过必定的处理进行纠正或封闭运用程序,防止过错的进一步发生。这就需求LabVIEW开发人员在开发运用程序时,能够合理的运用一种过错处理战略。这篇文章中,咱们将会给咱们介绍一些LabVIEW中的根本的和高阶的过错处理技巧,进步运用程序鲁棒性。
默许的,LabVIEW是会进行主动过错处理的。这体现在当程序履行过程中呈现过错时(如加载文件失利),程序会挂起,LabVIEW会主动弹出过错对话框,并高亮导致过错发生的子VI或函数模块。在LabVIEW中能够经过:1)东西>>选项>>程序框图>>过错处理:该分支下有两个选项能够决议是否使能主动过错处理;2)关于单个VI,文件>>VI特点>>履行:该分支下能够挑选是否对当时VI封闭主动过错处理。
假如期望程序在履行过程中呈现过错时能给出更有意义的提示信息,咱们能够运用自界说过错处理。首要评价一下该运用中,有或许会呈现哪些过错,并给这个过错赋特定的过错代码(error code)和描绘信息(description)。LabVIEW预留了以下过错代码供用户自界说过错运用:-8999到-8000,5000到9999,500000到599999。比方:在一个数据收集运用中,需求监测外部信号的幅值,当幅值大于8V时,咱们能够界说该过错码为6000,并经过General Error Handler函数弹出相应对话框。(参阅basic error handling.vi)
图1.通用过错处理
上述这种方法,假如程序很大时,为了不遗漏掉各部分或许发生的过错,咱们需求不断的放置General Error Handler函数,并给它不断的装备“用户自界说代码”和“用户自界说描绘信息”,时刻长了,就难于保护,而且很难八面玲珑,而且增大代码的体积和占用配图的空间。有没有一种大局的方法呢?答案是必定的,在LabVIEW中经过:东西>>高档>>修正过错代码,弹出过错代码修正对话窗口,能够新建或修正现有的文件。在过错修正窗口中能够增加自界说过错代码和相应的文本描绘信息。假如是新建的文件,点击Save按钮时会弹出对话框提示保存,文件名称有必要是xxx-errors.txt,xxx是用户能够自在命名部分。xxx-errors.txt文件的寄存目录有必要在:盘符:\Program Files\National Instruments\LabVIEW 2011\user.lib\errors目录下(这儿以LabVIEW 2011为例,其间盘符为LabVIEW地点的装置目录),假如没有errors目录,能够手动创立。xxx-errors.txt文件在LabVIEW封闭并重启后才收效。
图2. 过错代码修正对话窗口
到这儿的时分,假如仅仅一个人在孤单的写程序,那么经过xxx-errors.txt文件对自界说过错代码进行办理就根本上能满意一个LabVIEW开发者在同一台核算机上的要求了。可是在许多状况下,咱们开发的运用程序终究或许会在其它核算机上布置或运转,或许要同享给其他开发人员,那怎样使得xxx-errors.txt得以复用。
假如是把源代码同享给另一个开发人员,只需求从本来的核算机大将xxx-errors.txt文档仿制到对方核算机上的相应目录:盘符:\Program Files\National Instruments\LabVIEW 2011\user.lib\errors下即可。假如是生成Executable文件,那么在Executable的特点装备窗口的高档页面中,勾选上“仿制过错代码文件”,这样在生成Executable时,会主动将”盘符:\Program Files\National Instruments\LabVIEW 2011\user.lib\errors”下一切的xxx-errors.txt仿制到”C:\Program Files\National Instruments\Shared\LabVIEW Run-Time\2011\errors”目录下(这儿以LabVIEW 2011为例,该途径为LabVIEW Run-Time的目录)。
图3. Executable的特点装备窗口
但这仅仅在本来的核算机上做了一次仿制,要在方针核算机上运转,除了仿制Executable文件,有必要将xxx-errors.txt文件手动仿制到方针核算机的LabVIEW Run-time目录下。咱们或许会有疑问,要是这样的话,那图3中的勾选项还有什么用!的确,假如仅仅在方针机上运转Executable,是否勾选上都无所谓。可是当咱们勾选上之后,进一步生成装置文件时,在装置文件的特点装备窗口的附加装置页面中,勾选上LabVIEW Run-time Engine,这样装置文件中将会包括LabVIEW Run-time Engine,而xxx-errors.txt在之前生成Executable时现已仿制到LabVIEW Run-time Engine目录下了,也将包括在Installer中,所以在方针核算机上装置Installer时,就不再需求手动仿制xxx-errors.txt文件了。
好了,到这儿中止。基础知识咱们介绍完了,接下来咱们介绍关于可预见的过错,是否能够挑选直接疏忽,或许前几次测验疏忽直到该特定过错呈现许屡次后才告诉用户需求纠正该过错了;是否能够对重要的过错进行存档;当主VI中多个线程时,假如某一个线程犯错,怎么确保其它线程进行恰当的收尾后相同高雅的退出,防止一错再错。这儿我编写了一个参阅VI,咱们将具体介绍:
图4.项目文件概览
翻开Error Handling in LabVIEW.vi的程序框图,其包括三个循环,别离是Producer loop,Consumer loop,Display Loop。Producer loop用于响运用户事情,并经过行列告诉Consumer loop履行相应的操作;Display loop用于对前面板显现控件进行更新。
图5.项目原理图
Error Handling in LabVIEW.vi中关于过错处理部分最中心的VI是Error Module.vi。它其实是一个功用大局变量,包括Initialize,Handle Errors和Report Errors三个分支。Initialize分支中界说好哪些过错代码是直接被疏忽的,哪些过错代码是答应呈现若干次,而且为了实现在主VI Error Handling in LabVIEW.vi的任何一个循环呈现过错时,一切的其它循环也能够退出,在Initialize分支中将别离获取三个循环中的相应行列引证或用户事情引证。
图6.Error Module模块
图7. Initialize分支
先介绍一下Error Handling Info簇控件,它包括两个数组。数组Ignore中界说的Error Code即咱们期望Error Module.vi直接疏忽的;Retry是簇数组,每个簇中包括三个元素:Code即咱们期望犯错后重试的代码,Retry times为答应犯错的次数,Current Iteration记录了该特定过错现已发生的次数(在主VI中不要设置,让它为0)。咱们期望当Current Iteration < Retry times时,假如该过错呈现,咱们能够疏忽该过错,可是Current Iteration值加1。关于本次测验,主VI给Error Module.vi的传递的参数如下,咱们将在后边看到,5556的过错将被直接疏忽,而5557的过错第三次呈现时程序将弹出对话框提示犯错。
图8. Error Handling Info簇控件信息
Error Module.vi中最重要的是Handle Errors分支,简略的说,它其实是包括两层条件结构嵌套,三种处理状况。1)过错直接被疏忽;2)过错符号Retry的条件;3)过错不能被预处理,将过错存档。
图9. Handle Errors分支
当过错不能被预处理时,将过错存档后,咱们调用General Error Handler函数,这样就会弹出过错对话框,对话框中包括xxx-errors.txt文件中界说好的描绘信息。除了将过错存档,在程序中一起经过元素入行列、发生用户事情使得主VI中的Consumer loop,Display loop和Producer loop都能够高雅的退出。
接下来咱们来看一下程序的测验:
图10.主VI前面板
1.点击Acquire按钮,将获取波形;
2.点击Generate error for consumer,将使得Consumer loop发生error 5555,因为5555不包括在预处理的状况中,Error Module.vi的Handle Errors分支将该过错存档并弹出过错对话框,一起其它循环经过元素入行列,发生用户事情而退出,整个程序中止运转;
3.从头运转程序,点击Generate error for Ignore按钮,能够看到,程序将持续正常运转,彻底疏忽该过错;
4.点击Generate error for Retry按钮,当点击第三次时,才弹出过错对话框,程序中止运转。如下图所示:
图11. 过错代码5557重复呈现3次