调试技巧
- 更新时间2025-08-27
- 阅读时长13分钟
如在VI未断开状态下得到了非预期数据,可通过调试发现和纠正VI或程序框图数据流的问题。如无法使用下列方法调试VI,VI可能产生了竞争状态。
错误簇
大多数内置VI和函数有错误输入和错误输出参数。这些参数能找到程序框图上每个节点产生的错误,并显示是否有错误产生和错误的位置。也可将这些参数用于用户创建的VI中。
连接VI和函数的错误参数时,错误输入和错误输出簇提供下列信息:
- 状态是一个布尔值,错误产生时报告TRUE。
- 错误码,是一个32位带符号整数,报告错误的数字代码。一个非零错误代码和FALSE状态相结合可表示警告但不是错误。
- 错误源是用于识别错误发生位置的字符串。
警告
警告不会中止VI的运行,可是会引起非预期操作。调试VI时,应该打开警告。如VI产生一个警告,可使用错误列表窗口确定警告产生的原因并做相应的修改。
高亮显示执行过程
单击高亮显示执行过程按钮可查看程序框图的动态执行过程。如下图所示。
高亮显示执行过程通过沿连线移动的圆点显示数据在程序框图上从一个节点移动到另一个节点的过程。使用高亮显示执行的同时,结合单步执行,可查看VI中的数据从一个节点移动到另一个节点的全过程。
|
注:执行过程高亮显示会明显降低VI运行速度。如VI运行速度低于预期,请确认已关闭子VI的高亮显示执行过程功能 |
如错误输出簇报告错误,则在错误输出输出端旁将出现错误值,且外围有一个红色边框。如没有错误发生,则错误输出输出端旁将出现确定按钮,其边框为绿色。
单步执行
单步执行VI时可查看运行时程序框图上的每个执行步骤。单步执行按钮仅在单步执行模式下影响VI或子VI的运行。如下图所示。
单击程序框图工具栏上的单步步入或单步步过按钮可进入单步执行模式。将鼠标移动到单步步入、单步步过或单步步出按钮时,可看到一个提示框,该提示框描述了单击该按钮后的下一步执行情况。单步执行一个VI时,该VI的各个子VI既可单步执行,也可正常运行。
在单步执行VI时,如某些节点发生闪烁,表示这些节点已准备就绪,可以执行。如单步执行VI同时高亮显示执行过程,则执行符号将出现在当前运行的子VI的图标上。如下图所示。
探针工具
探针工具用于检查VI运行时连线上的值。如下图所示。
如程序框图较复杂且包含一系列每步执行都可能返回错误值的操作,可使用探针工具。利用探针并结合高亮显示执行过程、单步执行和断点,可确认数据是否有误并找出错误数据。如有流经数据,高亮显示执行过程、单步调试或在断点位置暂停时,探针会在调试窗口立即更新和显示数据。当执行过程由于单步执行或断点而在某一节点处暂停,可用探针探测刚才执行的连线,查看流经该连线的数值。
探针类型
VI运行时,可用通用探针、控件选板上的显示控件,以及内置探针、自定义内置探针或创建一个新探针来查看连线上的值。
通用
通用探针可查看流经连线的数据。如需使用通用探针,可右键单击连线,从快捷菜单中选择自定义探针»通用探针。
通用探针可显示数据。但无法配置通用探针,使其对数据作出响应。
除非已为数据类型指定了一个自定义的或内置的探针,否则右键单击连线并选择探针时LabVIEW将显示通用探针。
自定义探针可像VI一样进行调试。但自定义探针不能探测自身的程序框图,也不能探测其子VI的程序框图。调试自定义探针时应使用通用探针。
使用显示控件查看数据
使用显示控件也可查看流经连线的数据。查看数值数据时,可在探针中使用一张图表来查看数据。右键单击连线,从快捷菜单中选择自定义探针»控件,从中选择显示控件。也可单击控件选板上的选择控件图标,从计算机或服务器的共享目录中选择任何已保存的自定义控件或自定义类型。使用自定义类型查看被探测数据时,LabVIEW将自定义类型视作自定义控件。
如所选显示控件的数据类型与右键单击选中的连线的数据类型不匹配,LabVIEW将不把显示控件放置在连线上。
内置
内置探针是显示连线中传输数据的综合信息的VI。例如,VI引用句柄探针可返回VI名、VI路径和引用的十六进制值等信息。内置探针可根据流经连线的数据作出响应。例如,错误簇中的错误探针可接收状态、代码、错误源和错误描述,并指定在出错或报警时是否需要设置一个条件断点。
内置探针位于自定义探针快捷菜单的最上方。右键单击连线,从快捷菜单中选择自定义探针可选择内置探针。只有与右键单击的连线的数据类型相匹配的探针才会出现在快捷菜单上。
自定义
创建新探针对话框用于创建一个基于已有探针的探针或创建一个新探针。右键单击连线,从快捷菜单中选择自定义探针»新建,打开自定义探针对话框。如需更好地控制LabVIEW对流经连线数据的探测方式,可创建一个探针。新建探针的数据类型与右键单击的连线的数据类型相匹配。如需编辑已创建的探针,须先从保存探针的目录打开探针。
从自定义探针快捷菜单中选择一个探针,用控件选板中的选择控件选项找到VI作为探针,或通过创建新探针对话框创建一个新探针。该探针将变为该数据类型的默认探针,用右键单击连线并从快捷菜单中选择探针时,LabVIEW会加载该探针。LabVIEW只加载与右键单击的连线的数据类型完全匹配的探针。即一个双精度浮点数探针不能探测一个32位无符号整数的连线,即使LabVIEW可转换该数据。
采样探针
(FPGA模块)在主控VI或FPGA VI中使用采样探针,查看VI运行时连线上的即时值和查看信号数据随时间的变化。例如,需要在单周期定时循环内调试信号。
在主控VI中使用采样探针时,必须使用用于探针的采样源。采样源是LabVIEW读取、采样相关探针数据时的判定信号。可使用While循环、For循环或FPGA仿真时间作为采样源,具体取决在主控VI或FPGA VI中使用采样探针。
断点
断点工具可在程序框图上的VI、节点或连线上放置一个断点,程序运行到该处时暂停执行。
在连线上设置断点后,数据流经该连线且暂停按钮为红色时程序将暂停执行。在程序框图上放置一个断点,使程序框图在所有节点执行后暂停执行。此时程序框图边框变为红色,断点不断闪烁以提示断点所在位置。
VI在某个断点处暂停时,LabVIEW将把程序框图置于顶层显示,同时一个选取框将高亮显示含有断点的节点、连线或脚本。光标移动到断点上时,“断点”工具光标的黑色区域变为白色。
程序执行到一个断点时,VI将暂停执行,同时暂停按钮显示为红色。VI的背景和边框开始闪烁。可进行下列操作:
- 用单步执行按钮单步执行程序。
- 查看连线上在VI运行前事先放置的探针的实时值。
- 如启用了保存连线值选项,则可在VI运行结束后,查看连线上探针的实时值。
- 改变前面板控件的值。
- 检查调用列表下拉菜单,查看停止在断点处调用该VI的VI列表。
- 单击暂停按钮可继续运行到下一个断点处或直到VI运行结束。
LabVIEW将断点与VI一起保存,但断点只在VI运行时有效。与其反复移除和创建断点,不如保存断点以反复使用。运行VI时,可能不需所有断点均处于活动状态。禁用断点后,运行VI时执行就不会在断点处停止。也可使用调试窗口禁用、启用、清除或定位现有断点。直接选择查看»调试窗口,或右键单击程序框图上的对象,从快捷菜单中选择断点,即可打开调试窗口。
可逐个或在VI层次结构中删除断点。
LabVIEW高亮显示断点的原理
LabVIEW高亮显示断点的方式和停止执行的条件根据断点放置位置的不同而有所差异。断点可放置在结构、节点和连线上。
结构断点
下图显示了带有断点的For循环。整个For循环结束执行前,VI就暂停运行。程序框图周围的红色边框高亮显示断点。如程序框图在结构内,则结构包括红色边框。程序框图上的所有节点结束运行时,才发生执行暂停。如断点在循环结构内,每次循环结束后才发生暂停。
节点断点
下图显示了“加1”节点上的一个断点。“加1”函数运行之前,VI将暂停。连线上也可有断点。“乘”函数执行完毕后,VI再次暂停。节点周围的红色边框高亮显示断点。节点执行前,发生执行暂停。可在所有节点内的输入信号上使用探针工具。
连线断点
下图显示了连线上的断点及探针。如选择了保留连线值,然后将游标放在连线上,将会出现如图所示的提示框,提示框中显示的是连线中的数据。数据通过连线传递至探针,探针显示当前循环的数据后,才发生运行暂停。连线中间的红色圆圈高亮显示断点。如将探针放置在连线上,探针周围也将出现红色边框。
禁用断点
下图显示了For循环和递增节点上的断点。所有断点均被禁用。VI不在任何断点处暂停。程序框图对象周围的红色边框较细,表示断点已被禁用。如启用断点,红色边框会便粗,如上个图例所示。
执行挂起
中断子VI的执行多发生于需编辑输入控件和显示控件的值、控制子VI在返回调用程序之前运行的次数,以及返回到子VI执行起点的情况。既可挂起子VI的所有调用,也可挂起子VI的某个特定调用。
如需中断子VI的所有调用,打开子VI并选择操作»调用时挂起。当另一个VI调用该子VI时,子VI会自动挂起。单步运行时,子VI不会立即中断。只有在子VI被调用时才会挂起。
如需中断子VI的一个特定调用,右键单击程序框图中该子VI的节点,并从快捷菜单中选择子VI节点设置。选中调用时挂起复选框,则仅在该子VI的实例中中断执行。
选择查看»VI层次结构可显示VI层次结构窗口,该窗口表明是否有一个VI被暂停或中断。箭头符号表示该VI正在正常运行或单步执行。如下图所示。
暂停符号表示该VI被暂停或中断。如下图所示。
绿色暂停符号或黑白的中空符号表示该VI被调用时会暂停。红色暂停符号或黑白的实心符号表示该VI当前暂停。感叹点符号表示子VI已被中断。如下图所示。
VI可同时被中断和暂停。
确定子VI的当前实例
子VI暂停时,工具栏上的调用列表下拉菜单将列出从顶层VI到子VI的一个调用链。调用列表与选择浏览»本VI的调用方时所见到的列表不同,后者列出了所有调用方VI,无论这些VI是否为运行中的VI。如程序框图包含的实例多于一个,则通过调用列表菜单可确认子VI的当前实例。选中调用列表菜单中的某个VI时,LabVIEW将打开该VI的程序框图并高亮显示子VI的当前实例。
也可使用调用链函数查看当前VI至订层VI的调用链。
调试部分程序框图
VI可在程序框图的某些部分被禁用的情况下继续运行,禁用部分程序框图类似于文本编程语言中对代码添加注释。禁用部分程序框图可确定在没有该部分程序代码的情况下VI执行是否更佳。要禁用的那部分程序代码应放置在框图禁用结构中。
调试部分代码可隔离产生问题的原因,便于更快找到和解决问题。要调试部分代码,将要调试的代码放置在条件禁用结构中。
仪器
如探针、断点或执行高亮显示的调试时间较长,可创建一个仪器VI。使用仪器VI观察VI的执行和调试。
仪器VI将从待调试VI从读取数据,并将结果生成一个报告。在仪器VI中,指定要调试的代码部分,待调试的VI路径和计时步骤。
仪器VI与Desktop Execution Trace工具包类似,因为两种工具都具有跟踪程序框图执行顺序的功能。
验证对象的行为
除了使用调试工具,可以使用下列方法检查VI和程序框图数据流:
- 检查输入控件和显示控件的表示法,查看是否出现数据溢出。因为将浮点数转换为整数,或将整数转换为更小的整数时,可能会发生溢出。例如,将16位整数连接至只接收8位整数的函数,函数将16位整数转换为8位整数时,会造成数据丢失。更多信息,见防止未定义数据。
- 确定某个函数或子VI传递的数据是否为未定义。通常发生在数值型数据中。例如,在VI中的某个点上,可能会出现一个数除以零的运算,返回无穷,但是其后的函数或子VI需数值输入。
- 确定是否有For循环无意中执行了零次循环,产生了空数组。更多信息参考高亮显示执行过程和防止未定义数据。
- 确认移位寄存器已初始化,除非只把移位寄存器用于保存上一次循环执行的数据,并将数据传递至下一个循环。
- 在源和目标点检查簇元素顺序。LabVIEW在编辑时能检查到数据类型和簇大小不匹配,但是不能检查到同种类型元素的不匹配。
- 检查以确认VI不包含隐藏子VI。将一个节点置于另一个节点之上或缩小结构使子VI不在视线范围之内,都在无意中隐藏了子VI。检查VI使用的子VI,与查看»浏览关系»本VI的子VI和查看»浏览关系»未打开的子VI比较,以确定是否存在子VI。
- 选择查看»VI层次结构,可查找未连线的子VI。与未连线的函数不同,除非将输入设置为必需,否则未连线VI不一定会产生错误。如将未连线的子VI误置于程序框图上,程序框图执行时,子VI也同时执行。所以,VI可能进行了多余的操作。
- 使用即时帮助窗口检查程序框图上各个函数和子VI的默认值。如推荐和可选输入端没有连线,VI和函数就传递默认值。例如,未连线的布尔输入端为TRUE。