4.2.1 错误机制和错误簇
对于任何一种编程语言或编程环境来讲,建立或具有自行发现错误的机制都是非常必要的,关于这点LabVIEW图形化语言也不会例外。
特别是LabVIEW图形化语言,面对更多的应用是复杂的测试、测量,在这方面,发生任何错误都是及其可怕的事情,程序的设计者更应引起对错误机制的足够重视。
LabVIEW图形化语言提供了以下提示和排查错误的方法:
1、LabVIEW图形化语言编译器
LabVIEW图形化语言编译器是发现程序设计错误的第一道关卡。与其它编程语言不一样,LabVIEW图形化语言编译器是嵌入在LabVIEW开发环境中的即时编译器,我们根本无法察觉到它的运行时间或运行速度。因为它是在编程的每一步都进行实时的编译,当程序编制过程中出现错误或必要的参数还没有设定时,在LabVIEW开发环境中的“运行”按钮呈现出折断形式。此时双击该按钮会弹出一个“Error List”的对话框,指出错误的数量、位置及可能产生的原因。用鼠标双击任何的一条灰化错误提示,将在程序框图上找到错误的发生地,并用虚线将产生错误的部件提示出。比如:我们在一个空白的程序框图上放置一个“DAQmx Write.vi”就会看到我们上述的现象发生。当我们将相关参数配置完成时,“运行”按钮恢复正常。
由于LabVIEW图形化语言编译器可以即时发现错误,所以大大的减少了纠正错误的时间提高了编程效率(不必错误成堆才去处理)。
2、错误簇(Error Cluster)
LabVIEW图形化语言编译器是针对程序代码的错误给出纠错的提示,这是一种内在的错误机制。并不能保证程序运行时不出现错误。
LabVIEW图形化语言还提供了另一种在程序运行时发现错误,通报错误的内部错误机制,那就是错误簇 (Error Cluster)。
错误簇(Error Cluster)中包含了三种不同数据类型的元素:
Status——布尔型,True表示有错误
Code ——整数型(32位),给出LabVIEW 定义的错误代码
Source——字符串类型,用来解释、说明错误(可能的)原因。
使用者也可以定义自己的错误代码和错误说明。
错误簇是LabVIEW图形化语言中非常好的一个机制,与其它语言编制的应用程序不同,LabVIEW图形化语言要面对重多的硬件模块来设计应用程序,不可预见的事情太多,它要照顾到的面极为广泛,没有一个好的错误机制是绝对不行的。
错误簇的另一个作用就是引导数据流,它是一个很好的公共线程。我们知道LabVIEW图形化语言的编程及程序运行都基于数据流的,使用错误簇会提供更加清晰的程序运行流程。
假如:我们的程序中使用了5个vi,同时将它们的错误簇依次串联,如果第一个vi出现错误,那么其它4个vi将都不会运行,错误将从第一个vi(Error Out)开始沿着错误簇按数据流的关系依次传递到最终的Error Out。这就是错误簇的运行机理。显然,错误的传递也遵循数据流的原则。
3、汇总“错误”函数
使用Merge Errors.vi可以实现并行任务(多线程、多核)的“错误”汇总。
应该欣喜的是:在《实用教程》中,我第1次建立了这样的概念,该vi对错误处理有优先级,这在此前我是没有这个概念的。现将书中的描述摘录如下:
“Merge Errors.vi汇总不同函数的错误簇。该vi首先在error in 1、error in 2和error in 3中寻找,然后在error array in中寻找,报告最先找到的错误。如果vi没有找到错误,就开始寻找警告并返回最先找到的警告,如果 vi没有找到警告,就返回没有错误。“
在有些人看来,错误簇似乎在编程中不是需要特别考虑的问题,其实不然,错误簇在程序框图中肩负着多重任务的重任。
一是,提供错误排查机制,可提供错误发生的原因和地点;
二是,起到了公共线程的作用。关于公共线程,这一点已在数据流编程中做了基本介绍。
三是,使用汇总错误可以提供错误处理的优先级。
为了养成良好的编程习惯,以下是我的建议和忠告:
a、最好使用带错误簇的子VI模版,该模版在“基于模版的VI“ 栏目下可以找到
其实,最好的办法是将这个VI作为一个标准子VI模版,包括设计好该子VI的图标的基础底样后,并将其在项目中保存。以后该项目中子VI的设计都来自此模版。
这是一个比较好的习惯,我在项目开发准备的过程中,通常是首先要作的一个工作。
例图是这个子vi模版的程序框图,显然图标也都设计了初样,使用时按子VI的功能、用途在适当更改。
程序代码放在“无错误”case,当外部发生错误时,错误直接从入到出(通过错误 case)。否则,错误会按数据流的方式沿着subvi的内部按错误线传递到erroe out。
b、错误处理最终使用Simple Error Handler.vi结束
在这个vi中,将“type of dialog ”参数设定为:“continue/stop + warning”或“continue or stop message”。见例图中Simple Error Handler.vi的用法。
使用这个用法可以确保在打包后的程序运行时,出现错误时,按stop键就可以使程序停下来。否则,程序有可能处于死循环状态。
c、Express VI “Time Delay.vi”慎用错误簇直接连接
当外部已经发生错误后,传递到“Time Delay.vi”,但它也不会马上从延迟中跳出来,一定要等到延迟结束才会将错误传递出去。这在测试、测量中使用时可能会导致某些异常发生,应该避免这种情况出现。
通过例图的这个试验可以很清楚的看到这个现象。
首先,将错误簇中的布尔变量设为:F,运行该程序,在探针[1]看到5000毫秒的显示,而探针[2]中的状态指示为正常:绿色的“对号”。
然后,将错误簇中的布尔变量设为:T,运行该程序,在探针[1]看到5005毫秒的显示,而探针[2]中的状态指示为错误:红色的“X号”。见例图。
解决的办法,用带错误簇控制的case结构来避免这样的事情发生。如同带错误簇的子VI的用法一样。