条件禁用结构 (Conditional Disable Structure)
系统预定义符号
条件禁用结构的许多特性与程序框图禁用结构类似:它也是在编辑时决定要运行哪一个分支的。两者的区别在于:条件禁用结构是根据用户设定的符号的值来判断决定执行哪个分支上的程序的。它有些类似 C 语言中的 #ifdef 宏。条件禁用结构通常被用在跨平台上的程序中。
如果一个项目需要支持多个操作系统,我们当然可以为每个操作系统都编写一套包含所有子 VI 的完整的程序,但采用这种方式,程序中每个 VI 都需要同时维护多个版本,经管很多 VI 在每个操作系统上都是一模一样的,这极大增加了维护工作量。使用条件禁用结构,我们可以把针对不同操作系统的代码分别写在条件禁用结构的不同分支内,LabVIEW 会根据 VI 运行的系统选择正确的分支运行。这样,一个程序就可以适应所有的操作系统,最大可能的降低了维护成本。
打开一个 VI,在其中放置一个条件禁用结构。此时,条件禁用结构仅包括一个“默认”分支。
鼠标右键点击结构的边框,在快捷菜单中选择“编辑本子程序框图的条件”,弹出“配置条件框”。
配置条件框上的“符号”可以是系统与定义好的一些符号,比如 TARGET_TYPE,TARGET_BITNESS 和 RUN_TIME_ENGINE。“值”则是“符号”对应的数值。配置条件框配置的是个条件可以选相等或不想等。比如 TARGET_TYPE 表示当前 VI 运行的操作系统,大多数读者使用的是 Windows 操作系统,如果配置条件框为条件禁用结构的某一分支配置了“TARGET_TYPE == Windows”,那么这个分支的条件就满足了,这个分支就会编程启动状态。笔者使用的操作系统是 Linux,LabVIEW 中对应 Linux 的 TARGET_TYPE 的值是 Unix,所以在笔者的电脑上,这一个分支是被启用的:
TARGET_BITNESS 用于判断计算机上安装的是 32 bit 还是 64 bit 的 LabVIEW; RUN_TIME_ENGINE 则用 True 来表示 VI 被制作成了一个 DLL 共享库; False 表示 VI 被制作成了一个 EXE 应用程序。
一个应用程序如果需要保存一些设置信息,在 Windows 操作系统下可以选择保存在注册表中;而在 Linux 系统下则通常保存在配置文件里。Linux 等系统是没有注册表的,如果只写一份使用注册表的程序,在 Linux 操作系统下就无法运行?
那么,是否可以使用条件结构来区分当前的操作系统,选择不同的代码运行呢?条件结构运行哪一分支是在程序运行时决定的。程序运行时的确可以判断当前操作系统是什么,但问题在于,使用条件结构,程序装载时会检查所有条件结构分支中的代码,任何一个分支内的代码有错误,整个 VI 都无法运行。程序在 Linux 操作系统那个分支中找不到这注册表操作函数,出错,于是 VI 无法运行。
为了使这个 VI 也能够在其它操作系统下顺利运行,必须把平台相关的代码都放置在条件禁用结构中。在 MacOS 或 Linux 操作系统中,LabVIEW 不会试图装载 "TARGET_TYPE == Windows" 分支中的代码,代码的错误会被忽略:
上图中的三个子 VI 均位于 "互连接口 ->Windows 注册表访问 VI" 函数子选板,依次为 "打开注册表项"、"读取注册表值" 和 "关闭注册表项"。
用户自定义符号
条件禁用结构还可以使用项目或项目运行的目标机器所定义的符号。
在项目浏览器的“我的电脑”项的鼠标右键菜单中选择“属性”,弹出“我的电脑属性”对话框:
我们可以在属性对话框中的“条件禁用符号”栏,添加了一个自定义的符号 "User",它的值是 "QizhenRuan"。这样就可以在该运行目标机器下的 VI 中使用这一符号了:
在程序中,有时可能需要为不同的用户定制某些不同的服务:发布给不同用户的软件,基本功能是相同的,但在个别地方需要使用不同的代码。这种情况可以考虑使用条件禁用结构,用它来处理各用户之间有差异的代码。程序发布给不同用户时,只需更改一下项目属性中条件禁用符号的值即可。
程序框图禁用结构中,只能有一个启用分支,但条件禁用结构不同,可以有多个满足了条件的启用分支。比如,一个分支的条件是 TARGET_TYPE == Windows,另一个分支的条件是 TARGET_BITNESS == 64,那么两个分支在 Windows 64 计算机上都满足。在这种情况下,只有排在前面的,第一个被启用的分支会被程序装载和执行。
调试时专用代码
有的时候,某种错误只在程序正常运行时出现,但试图暂停或使用断点、探针等调试工具时,错误却消失了。有的时候,程序运行必须关闭所有的调试信息,或者出错的代码部分不允许使用 LabVIEW 的调试环境(比如代码运行在 LabVIEW RT 设备上)。在不能使用 LabVIEW 调试工具的情况下,调试起来就麻烦多了。对于这一类程序,可以采用其它方法来观察程序运行过程中的数据。比如,让数据通过弹出对话框显示出来,或者把数据记录在文件中。通过观察被显示或记录下来的数据,判断程序是否有错。
上图是一个使用文件记录程序运行中临时产生的一些数据的例子。假设,由于某种原因这个 VI 不能使用 LabVIEW 调试工具,但它通过调用 "数据记录.vi" 就可以把程序运行中重要的数据了记录下来。待程序运行结束,便可以在记录的文件中查阅这些数据。记录数据 VI 是程序功能之外额外增加的逻辑,它会增加程序对资源的消耗,降低程序效率。所以在不需要调试的时候,还是希望将其关闭的。一个解决方案是,可以在程序的项目中自定义一个“DEBUG”符号,如果 DEBUG == 1 则启动数据记录,反之则禁用数据记录: