1、Labview 初学者常见问题以及解答1、Labview 如何实现由一个事件引发其他三个事件的顺序发生,且这三次事件间的时间间隔为 50ms?回答:可以引用状态机来设计程序,将触发事件作为状态机的状态控制参数,后面发生的三个事件依次作为状态机的三个顺序状态,设置状态切换时间间隔为 500ms. 2、labview 在主程序通过局部变量不能实时看子 vi 的参数回答:通过局部变量只能得到子 vi 运行完之后的结果。可以用 control reference 方式,在子 vi 加一个属性节点引出一个 reference。主程序里把需要显示的控件创建一个 reference 连到子 vi 的 ref
2、erence 输入端口。另外也可以用 vi server 方式实现。 3、如何在一个 graph 或 chart 显示多个 Y 轴刻度,并且使每个通道对应每个刻度?回答:在前面板上,右键点击刻度,然后选择 duplicate scales,就会创建一个新的刻度。然后再点击右键,选择 swap sides,就可以让刻度显示在图的左边或右边。然后右键右上角的 plot legend 上的曲线 plot,选择 Y scales 然后就可以选择与该曲线相应的 Y 轴 SCALES。多条曲线对应多条 Y 轴的刻度时,是同样的方法。 4、如何从 labview 中打开一个 pdf 文件?回答:最简单的方法
3、:用 system exec.vi 实现,在 system exec.vi 的command line 端口创建一个常量,输入 adobe reader 的路径,再加上文件名等几个参数就可以实现上述要求。举例如下:如果要拉开位于 c 盘的1234.pdf 文件可以这样写“C:Program filesAcrobt 7.0AcrobatAcrobat.exe”/t “C:1234.pdf” “username”其中C:Program filesAdobeAcrobt 7.0AcrobatAcrobat.exe 是 Adobe Reader 的安装路径,/t 是命令参数,C:1234.pdf 则是
4、要打开的文件名,最后的 username 是用户的名字 5、采集数据在 graph 如何显示系统时间,并且随着采集点数时间不断刷新。回答:有两种方式,一种是采集波形数据然后输出给 graph,在 graph 上选择显示绝对时间,并且去掉 ignore time stamp 选项。第二种是采集数据文件,然后用获取时间的 vi 获取当前时间,然后把采集的数据文件和当前 vibuild成波形文件再给 graph.graph 的设置和前种方法一样。这样就可以显示出时间虽采集点不断刷新的效果。 6、report generation 里的 standard 和 HTML 究竟是什么意思?回答:STAND
5、ARD 和 HTML 是 LV 本身就有的报表类型,无须安装其他的文本编辑工具就可以打印。STANDARD 是 LV 内建的一种报表格式,可以打印但不能存盘,也就是说我们的报表没有电子版。HTML 是网页格式的文件,可以用浏览器打开,其实相当于 LV 帮我们编写 HTML 代码,这种格式是不能直接打印的,需要先指定网页路径才能打印出来。还要注意,如果是一段程序是用了report generation 的 vi,在打包成 exe 文件或 llb 文件时,需要加入两个动态 vi:_excel dynamic vi 和 _word dynamic vi。如果生成的报表采样了模板需要自支持文件里添加相
6、应模板。 7、如果要将 channel 名字,测的是什么信号,采样率是多少这样的数据和采得数据一起存入文件应该用什么方式比较好?回答:推荐一种以前基本被忽略的文件结构TDM FILE 格式来存,这种文件格式基于二进制的方式,而在存储过程中可以加入很多的外部信息进去,例如 free text;free interger 等等,所以存这样的应用还是挺合适的。 8、vi property 下 execution 中选项 reetrant execution,选用和不选用有什么区别?回答:如果主程序执行同一个子 vi,是同时两次或多次执行时,在不选用时,就会依次使用这个子 vi;如果选用,则这个子 v
7、i 就会并行执行,提高程序运行速度。 9、为什么把 LABVIEW 程序框图解密以后,就可以一直打开程序框图,如何才能实现每次打开 vi 都是加密的?回答:如果在 LABVIEW 解开程序的框图的密码,关闭以后该程序,不退出labview,这个程序如果再次被打开会一直可以查看他的框图程序,原因是 lv没有关闭,所以密码会一直存在内存当中,所以再次打开会依然看到程序框图,如果要实现每次打开都是加密的,只要在一次打开后,把 labview 也关掉,下次再想要查看程序框图就需要输入密码。 10、使用 vi server 技术,如何实现从一个 vi 打开运行并读取另一个 vi 中控件的值?回答:1)
8、调用 Open vi reference.vi ,输入子 VI 的路径到其 VI PATH 的端口;2) 调用 Ivoke Node.vi 并设为 Open FP;3) 调用 Ivoke Node.vi 并设为 Run VI;4) 调用 Ivoke Node.vi 并设为 Get control ValueVariant;对 Control Name 端口填入子 VI 循环的停止按钮控件名称;Get Control Value Variant输入端的值通过 Variant To Data .vi 设为控件相对应的控件类型后,输出到前面板,这就可实现取 VI 控件的值;5) 最后调用 Close
9、 Reference.vi 关闭 VI Server。 11、连续采集程序分成配置 task 状态和采集状态两大部分。在配置状态中得配置出有效的 task。根据需要在适当的时候进入采集状态。在采集状态中使用 start task 和 read 两个 vi 并且循环执行。当程序开始后立刻报错。回答:因为采集状态中使用 start task 和 read 两个 vi 并且循环执行,当采集已经开始后再使用 start task 就会重复开始相同的资源,导致资源冲突产生错误。建议 start 部分单独作为一个状态,在循环执行的状态中只使用read.vi。 12、LV7.1 在前面板突然找不到 Scro
10、llbar 了,现在想看或者操作屏幕之外的控件显示件非常麻烦,怎么能够找到 Scrollbar?回答:在 FileVI PropertyWindow AppearanceCustomize 里有 Show scrollbar 的选项。 13、LV7.1 如何实现将 Chart 的时间坐标与计算机系统时间一致?回答:Chart 属性 Format And Precision 选 Absolute Time,显示方式改System Time Format 和 System Data Format。程序框图里 Get Data/Time In Seconds 获取当前时间,转换为双精度浮点型后输入到
11、 Waveform Chart 的属性节点 Xscale. Offset。属性节点 Xscale. Format 设为模式 7。 14、LV7.1 如何设计时间输出格式为小时:分:秒.毫秒?回答:用 Get Data/Time In Seconds 用来获得当前时间,另一个是 Format Data/Time String 函数,这个函数用来定义输出时间的格式,再 time format string 端口上输入字符串%H:%M:%S%.3u,然后 time stamp 连接 Get Data/Time In Seconds 的时间输出即可。关于时间格式的定义可以在 help 里看到。 15、
12、为什么用子程序调用时 pop up 前面板,前面板总是自主程序后面?回答:在 window appearance 里面选择 default floating 和 modal 这三项,将主程序的选项设在较低的优先级而子程序设得高一点应该可以了。 16、如何读出 excel 里的数据来作分析?回答:使用 Excel Get Data.vi 并在参数 data type 上使用二维字符数组可把 Excel 内数据以字符串的方式读出。 17、如何对 Excel 文件作数据续存?回答:使用 Excel Get Last Row.vi 先将 Excel 内已有数据的最后一行的行数得出,再于该行开始续存数据
13、。 18、如何将文件保存为 Excel 格式1) 用 ActiveX 技术,将 LV 作为一个 ActiveX 服务器。可以参考 National InstrumentsLabview 7.1examplesappsfreqresp.llb VI 库里面的Frequency Response.vi 例子程序。2)使用 Report Generation 工具包,它屏蔽了底层的 ActiveX,使用比较简单,不过需要购买。3)保存为文本方式,后缀为.xls,这样子也可以用 Excel 打开,不过不能用 Excel 修改保存,要不然会自动修改为 Excel 文档,以后也不能用 LV 对其进行操作。
14、 19、如何在 table 中既显示小数又显示整数回答:table 中显示的是字符串,显示小数还是整数是在转换成字符串而未放入 table 之前的过程中完成的,因此可以将整数小数分别转换成字符串后再合并输出到 table 中即可。 20、如何制作一个边框是透明的 string 控件回答:选择一个 classic simple string 控件,使用工具模板的染色工具,在弹出的对话框中选择右上角“T”;一样的 transparent,然后给这个控件染色就可以了。 21、循环采集并对采集的结果判断,前面板放置一个布尔报警灯,只保存报警的数据,并可回放,怎么实现?回答:存储 vi 外加一个 cas
15、e 结构,并以布尔报警灯作为判断,如果为真值,存储,为 false,不存。回放有两种形式,即:可以把试验数据存储,然后回调。也可以把 graph 存为图片。 22、怎样把 While loop 的循环次数 i 写入 Table 的行头 ColHdrs呢?回答:创建 Table 的属性节点,属性 ColHdrVis=T 显示行头,ColHdrs连接一个字符串数组,需要将循环次数 i 加 1,然后通过 Number To Fractional String 转化为字符类型,精度为 0。添加移位寄存器,赋初值为空字符串数组,build array 上端输入接移位寄存器,下端接数字,右端接 ColHd
16、rs和移位寄存器另外一端。 23、串口程序打包安装到一台没有 LV 环境的机器下,串口不可用,为什么?回答:LV7.1 的版本,在 Application Builder 中 Installer 页面选择:Advanced/Serial Port Support。 24、使用 CLF 节点调用 DLL 中的函数,如果原函数中指定的数据类型为结构,那么在 CLF 配置过程中该如何指定数据类型?回答:可以选择数据类型(TYPE)为 Adapt To Type,然后在输出或输入端口连接一个 Cluster,这个 Cluster 的定义和原函数中结构的定义一样。选择Adapt To Type 后,连接
17、到端口的数据类型是什么,与函数接口的数据类型就是什么。 25、在子 vi 运行过程中,如何将数据实时传递到调用它的主 vi 中,而不是等待子 VI 运行结束后才在主 VI 中获得子 Vi 的输出数据?回答:使用带控制参量的属性节点可以实现在子 VI 中修改主 VI 属性的目的,由于控件的值(Value)也是控件的属性之一,因此可以使用控制参量是新以上要求。在子 VI 中,使用带有控制参量的属性节点,将要传递到主 VI 的数据写入这个属性(Value)中,将控制参量要设置为 Control,并且在子 VI 的连接器中进行定义;在主 VI 中,为接收子 VIshuju 的控件建立一个控制参量,将这
18、个控制参量连接到子 VI,即可达到在主 VI 中实时获取子 VI 数据的要求。26、事件结构中两种事件类型,一个是通知事件(Notify),另一个是过滤事件(Filter),这两种事件的区别是什么?回答:对于通知事件,程序可以感知事件的发生并且响应该事件,然后再处理在事件结构中定义的任务;对于过滤事件,程序感知事件发生后首先处理在事件结构中定义的任务,然后根据时间结构中的设定(Discard?)决定是否响应该事件。举例来说,时间为 Panel Close,在事件发生时弹出一个对话框。如果是通知事件,首先响应事件关闭了前面板,因此没有办法处理“弹出对话框”的任务;如果是过滤事件,首先处理“弹出对
19、话框”的任务,然后根据事件结构中的 Discard 的值判断是否关闭前面板,若 Discard 为 T,则不关闭,若为 F,则关闭。 27、LV7.1 主程序已经完成,想在主程序运行之前,先执行一个别的界面,当退出该界面的时候,再显示主界面,如何实现?回答:可以在主程序框图之前,将主程序前面板隐藏,调用子程序,推出子程序后,再显示主程序前面板。这可以通过 VI 属性节点来实现,先调用一个属性节点,右键选择 Select Class/VI Server/VI,然后在属性中选择 Front Pannel Window/State 属性,分为设为 Hide 和 Standard。Demo 程序见项目
20、进程管理中 AE-01labview 编程技术讨论的“主界面隐藏”。 28、将 LV7.1 前面板控件(graph)的内容保存成图像文件,在 LV 中如何编程实现?回答:右键控件创建 Invoke Node,选择方法为“Get Panel Image”;另外,调用 Graphics &Sound/Graphics Formats 下面的 VI,将第二步获得的图像写入相应格式文件中。 29、在 LV 程序中使用 matlab,生成 exe 文件以后,发现文件可以运行但是无法弹出运行界面。回答:在 lv 中如果使用了 MATLAB 的话,生成 EXE 文件的时候需要加一个名为马特 script.d
21、ll 的文件作为支持文件,此外在目标 PC 上必须安装 MATLAB软件。 30、LV7.1 使用 VI Server 的方式,在一台机器上调用另一台机器上的 VI 并运行,需要做哪些设置?(两台机器在同一个网络中)回答:1)在 Tools/Options/VI Server:Configurtion 下选择 Protocols 为TCP/IP,这样才能在网络中使用 VI Server,否则只是在本机上使用 VI Server。 2)在 Tools/Options/VI Server:TCP/IP Access 下设置可以访问的 VI Server 的主机 IP。如果不进行设置,远程机器将无法
22、调用需要的 VI。 31、在 LV7.1 中如何在运行程序后,前面板上去掉 windows 的关闭按钮回答:可以在 LV 的前面板 FILE/VI properties/windows appearance/customize,去掉 allow user to close window 对钩,保存设置,运行后可以实现效果。 32、LV7.1 中如何清除前面板的 Graph,即在每次运行时,让 Graph 重新显示数据而不显示历史数据。回答:在 Graph 里面可以通过创建 Local Varible 并对其赋空来解决。而在Chart 里可以通过创建 History Data 属性节点并对其赋空
23、来解决。 33、LV7.1 中怎样将一个数组中所有满足条件的元素的索引值提取出来,保存成一个新的数组?回答:使用移位寄存器、Build Array 和 Select 函数就可以做到,具体方法:1)使用 FOR 循环,在循环边框上添加一个移位寄存器,并初始化为一维空数组,类型为 I32;2)在循环内部使用 Select 函数,每次循环都判断数组中的一个元素,并将判断结果(布尔量类型)送入 Select 的“s”输入端;3)每次循环都使用 Build Array 函数将左端的移位寄存器直接连接到 Select 函数的“f”输入端,这样 Select 函数的输入端就是所有满足条件的元素的索引值;4)
24、将 Select 函数的输出端连到右端的移位寄存器上。这样程序结束后,For 循环的右端移位寄存器的数据就是需要的索引值。 35 移位寄存器和反馈节点的区别?回答:反馈节点箭头的起始端相当于移位寄存器的右端,箭头的末端相当于寄存器的左端。区别在于移位寄存器的左端元素可以通过下拉下拉方式增加,而反馈节点的端口是无法增加的。 36、如何让子 VI 的前面板也显示出来?回答:右键点击子 VI,选择 SUBVI NODE然后再选择第 2 项 SHOW就是当子 VI 被调用时,显示前面板。 37、弹出窗口无法进行任何操作,并且被主界面挡住,如何解决?回答:主界面 VI properties 中 wind
25、ows appearance 里 customs 设定windows behavior 为 normal 了,因此主界面保持在最前端,应该设为default。 38、在程序中实现按对应键弹出窗口,在窗口已打开情况下继续可打开其他窗口?回答:在程序框图内使用并行循环。每一个可能要运行的子 VI(打开其窗口)及其运行条件(按键)各占一个循环。各个循环相互独立,互不干扰。在考虑同时关闭各个窗口时,需要使用全局变量。 39、在调度 Vi 的时候,经常无意地把面板上的一些控件移动了位置。还要花很大功夫去重新布置这些面板控件。有没有办法让已经设计好的控件的位置固定不动?回答:首先我们可以通过 Operat
26、e 菜单中的 Change To Run/Edit Mode 命令,设置 VI 为运行或编辑模式。面板控件的移动只在编辑模式下有效。在运行模式下是不能移动任何控制的位置的。第二种方法是,选择指定的控件(可多选),然后在菜单的 Reorder 下拉菜单下,选择 LOCK 命令,来锁住指定的控件。这样,除非使用 Unlock 命令解锁。否则是无法移动指定控件的位置。 40、为什么子 VI 节点的输出端口没有数据传递出来?回答:这类问题的主要原因是子 VI 中存在着循环。如果子 VI 中的循环不能推出,子 VI 节点就一直在运行。对于 LV 的数据流编程机制来讲,一个节点没有执行完,它的所有输出端口
27、就不会有有效数据输出。解决方法:一是把子 VI 中的循环提出到主 VI 里来。二是使用全局变量,并在主 VI 中使用并行循环来控制子 VI 的结束。 41、怎样在 LABVIEW 中实现全屏显示?回答:1)要全屏显示,在 File/VI Properties/Window Size/Size the front panel to the width and height of the entire screen 打上钩,就可以了。2)是否控件显示方法,第一,要完全不显示时,可以把控件放在界面看不见的地方他就不显示了;第二种方法,你可以使用控件的属性进行控制控件的Visible,具体方法是在程序
28、框图里点击鼠标右键/Create/Properties Node,选择 Visible,并将其改为 Change to Read,对 Visble 设置为 True或 False 就可以控制控件是否显示了 42、。LV 如何对 Excel 文件作数据续存?回答:使用 Excel Get Last Row.vi 先将 Excel 内已有数据的最后一行的行数得出,再于该行开始续存数据。 43、LV 当用鼠标点击 Graph 时,该 Graph 的大小变化了,当鼠标离去后Graph 的大小恢复到原来情况?回答:可以应用一个 Event Structure 来做,添加两个事件(一个是鼠标点击,另一个是
29、鼠标离去)。通过在这两个事件中分别赋给 Graph 的PlotArearSize 属性节点不同的值,来改变 Graph 的大小。 44、如何用 LABVIEW 编程检测 U 盘?回答:需要调用 Windows API 函数 GetDriveTypeA,其函数返回值盘符类型的数据类型为长整形,输入参数为检测盘符。调用 CLFN.vi 选择windowssystem32kernel32.dll,选择 GetDriveTypeA,设置 Return Type为 Numeric Signed 32-bit Integer;再添加参数 nDrive,设置参数类型为STRING 和格式为 C String Pointer。运行时在输入端填上要检测的 U 盘盘符,返回结果为时表示为 DRIVE_REMOVABLE 即为可移动的 U 盘