如何把LabVIEW前面板控件当前值通过程序设为下次打开时的默认值?
回答=在LabVIEW 7.1下,有如下方法:
方法1. 如果手动操作,可如下设置前面板控件当前值为默认值:对控件点击鼠标右键>>Data Operations>>Make Current Value Default。
方法2. 通过通过文件或注册表等方式先把控件当前值存下来,在下次打开时再从文件或注册表把值读回来。 方法3. 使用VI Server技术在保存控件当前值为默认值,但这种方法只能处于编辑状态的时候使用,在生成可执行文件后不能使用,主要需要如下操作:
(1)使用VI Server技术,调用Invoke Noke设VI的Edit Mode值为TRUE, (2)调用Invoke Noke设VI为Make Current Values Default,
(3)调用Invoke Noke设Save Instrument的Path to saved file为需要设置默认值的VI路径。
6.1 属性节点和调用(方法)节点
属性是VI、对象或应用程序的特性。属性节点被用于获取及设置VI、对象或应用程序的属性。
方法是VI、对象或应用程序的操作。调用节点被用于在VI、对象或应用程序上执行操作(方法)。
6.1.1 创建属性节点和调用节点
创建属性节点和调用节点的方法很简单。在程序框图中,鼠标右键单击空白处,在弹出的快捷菜单中选择: 》函数 》编程
》应用程序控制
将属性节点或调用节点拖拽到程序框图中即可,结果参见下图。
图 6-2 放置在程序框图上的属性节点和调用节点
此时放置在程序框图上的属性节点和调用节点是默认状态下隶属于应用程序(App)的节点。上图中这些节点没选择属性和方法还不能正常使用(程序运行箭头断裂——标志编译没有通过)。
在实际的使用中,属性节点和调用节点往往还需要配置引用(后面将介绍)和错误簇的连接。实际应用情况参见下图。
图 6-3 带有引用和错误簇的属性节点和调用节点
利用引用和错误簇的连接,使得属性节点和调用节点都具备了支持数据流运行机制的能力。所以我们在编程时应该尽量利用这点,满足图形化语言数据流编程和运行的要求。
还需要注意的是:对于不同类别的使用(App、VI或控件等),其引用是不同的。
事实上,这两个节点都属于公用节点函数(默认状态App)。如果选择类别设置可以用于多种地方,比如DAQmx、VISA等等。
若要选择其它类别,可以用鼠标右击属性节点,在弹出的对话框中可查看到: 》选择类(可选择多个类别) 》VI服务器 》应用程序
所以在上图中可以看到App的标识,但具体属性还未确定。参见下图。
图 6-4 为属性节点选择其它的类别
同理,用鼠标右击调用节点,在弹出的对话框中可查看到: 》选择类 》VI服务器
》应用程序
所以在上图中可以看到App的标识,但具体方法还未确定。参见下图。
图 6-5 为调用节点选择其它的类别
下面简要介绍不同类别的属性节点和方法节点。
6.1.2 应用程序(App)的属性和方法
应用程序属性被用于获取及设置应用程序的一些特性。
当前我们可以直接选择应用程序的属性,因为当前的属性类别就是应用程序。鼠标右键单击属性节点,在所弹出的对话框中选择:
》选择属性(即可选择多个应用程序的属性) 》操作系统(下图所显示的样式)
》版本号
其实可以有多种选择,这里只是演示属性节点选择的方法,参见下图。
图 6-6 应用程序(App)的多种属性
当前我们还可以直接选择应用程序的方法,因为当前的类别就是应用程序。鼠标右键单击调用节点,在所弹出的对话框中选择: 》选择方法
》置于最前
其实可以有多种选择,这里只是演示调用节点选择的方法,参见下图。
图 6-7 应用程序(App)的多种方法节点
如此众多的应用程序属性和方法,我们在实际应用中使用过那些呢?实在的讲,我本人几乎没有使用过这些节点。主要是没有理解这些属性和方法的内涵和用途。
其实,图形化语言的学习主要靠阅读他人的例程,但是真的我们很难看到使用这些节点的程序例程。如果期待对此有更多的了解,请参考[1 p203]。
当然,如果你真的理解这些节点的应用,会对程序设计提供很大的帮助。
6.1.3 VI的属性和方法
或许在我们的程序设计中,使用更多的是VI的属性和方法。获得VI的属性和方法需要首先确定类别。鼠标右键单击属性节点,在弹出的快捷菜单中选择: 》选择类别 》VI服务器
》VI
》VI,此时我们可以看到原来属性节点中的App已经被VI所代替,参见下图。
图 6-8 VI的属性节点(还没有确定属性)
这是还没有确定属性的VI属性节点。选择属性的方法是:鼠标右键点击该节点在弹出的快捷菜单中选择: 》选择属性
就可以看到VI所有属性的内容,参见下图。
图 6-9 VI属性的全部内容
VI的方法选择与属性的选择相类似,这里就不重复了。现在只给出VI方法的全部内容,参见下图。
图 6-10 VI方法的全部内容
例6-1 最实用的方法之一:默认值:全部控件重新初始化为默认值
如果我们的程序框图中有许多数值控件或图形控件,我们希望在程序运行前将这些控件值全部初始化为默认值。我们可以使用VI方法中:默认值:全部控件重新初始化为默认值的方法。
坦率的讲,我此前是一个控件一个控件的进行初始化(在初始化状态下)。在看到《天下会》论坛中[12]ExpiredCLAD的点评后,才发现这个方法更简单有效。参见下图。
图 6-11 VI方法,默认值:全部控件重新初始化为默认值
例6-2 如何设定控件的默认值
上面谈到了控件的默认值,现在谈谈如何设定控件的默认值。具体操作如下:在前面板或程序框图上选择工具栏中选择: 》编辑
》当前值设置为默认值(M)
然后可千万别忘了保存这个VI。保存后当再次打开这个VI时,控件的当前值值即为默认值。
6.1.4 对象的属性和方法
我们认识了应用程序的属性和方法,也认识了VI的属性和方法。现在来介绍对象的属性和方法。所谓对象这里所指的是控件,关于LabVIEW对象更深入的探索参见[1 p168]。
如果在程序框图中已经放置的基本属性节点,创建控件的属性就很容易。鼠标右键单击属性节点选择: 》连接至 》窗格
》选择具体控件名即可,参见下图。
图 6-12 关联控件的属性
控件的属性还可以用鼠标右键直接点击控件,在弹出的快捷菜单中选择: 》创建
》属性节点
这两种方法创建的控件属性参见下图所示。
图 6-13 控件属性(没有确定的属性,但已经包括数据类型)
具体属性选择,鼠标右键单击属性节点在弹出的快捷菜单中选择: 》选择属性
即可以查看到数值控件的所有属性,参见下图。
图 6-14 数值控件常用属性(截图不全)
对象的方法创建与属性节点相同,这里仅给出数值控件的一些方法,参见下图。
图 6-15 数值控件的全部方法
关于对象的属性节点和方法节点就基本介绍这些。下面我们针对对象的属性节点的一些特性做更深入的探索。
6.1.5 对象的属性的一些深入探索 获得对象的值
我们知道,数值控件被用来纪录、存放数据,通过创建局部变量可以获得数值控件中的数据。现在,通过数值控件的属性:值;也可以获得数值控件的数据。
也就是说:我们有两种方法:局部变量、属性节点都可以获得数值控件的数据。它们之间有区别吗?
首先,我们要说明的是:无论局部变量的创建还是属性节点的创建,都必须通过特定的控件(关联到具体对象)来实现,参见下图。
图 6-16 数值控件、数值控件的属性和局部变量
下面在比较它们之间的其它特点,参见表一。 表1
局部变量
1)内存
局部变量实质就是对“输入控件、显示控件”中数据进行复制(copy),所以要占用内存。
当为数组建立多个局部变量时,会占用大量的内存。
而对局部变量的操作行为是:读数据(Read)或写数据(Write)
属性节点
1)内存
属性节点实质上是对“输入控件、显示控件”中数据进行查询或置入,不会占用内存。
因为在部件创建时已经为此参数分配好了内存。
而对属性节点的操作行为是:查询(Query)数据或置入(Set)数据。
2)执行速度
由于局部变量是对内存进行直接读、2)执行速度
写操作,所以它的执行速度很快(约快 相对于局部变量而言,属性节点的执
行效率是很低的,或者说更占用CPU的1000倍以上)。
资源。
3)数据竞争
局部变量容易导致数据竞争,很多LabVIEW的书籍都介绍了这方面的例子。原因是局部变量破坏了数据流的工作方式。这也正是LabVIEW及许多书籍中强调的“慎用”本地变量的原因。
3)数据竞争
属性节点可以通过“错误簇”来引导数据流,所以避免了发生数据竞争现象。注意,当属性节点的错误簇没有使用(与其它vi相互连接),同样可能会导致数据竞争现象发生。
通过上面的比较,现在我们能够理解控件类似一个容器的比喻。使用属性节点要不断的打开这个容器并为它赋值,所耗费的时间较多。而使用局部变量则是对内存中数据的直接读或写,所以执行速度很快完成。 关于对象执行速度的另一种说法是:执行线程。
关于执行线程
LabVIEW的执行系统可参见下图。
图 6-17 LabVIEW执行系统示意图
LabVIEW的执行系统就是对已编译后的VI的程序代码,按运行处理需要进行作业区的管理和调度分配。 LabVIEW 2010共设有7个执行系统,分别是:
? ? ? ? ? ? ?
用户界面 标准 仪器I/O 数据采集 其它1 其它2 与调用方相同
有资料将定时循环也列为一个执行系统。
对于每个VI我们都可以通过VI的属性设置,将不同的VI分配到不同的执行系统中去执行。具体操作是: 》文件 》VI属性
》执行
》设置首选执行系统,参见下图。
图 6-18 VI的执行系统选择
通常所创建的VI其默认执行系统是:与调用方相同。
现在我们将做试验的“属性和变量.vi”的执行系统选择为:用户界面。
此时属性节点的执行时间与表1对比,其执行时间仅仅减少了约1%(而其它执行系统的执行时间都与表1相同,并没有任何改善)。
可见执行系统的设置的改变并没有显著的解决问题。至少我们没有发现修改线程所带来的更大影响。
看另一项试验,对属性节点写入常数,测试结果得到明显的改善,执行时间仅为原来的25%,参见下图。
图 6-19 仅写入常数改善了执行速度(仅为原来的25%)
我个人理解可能还是在读“循环计数端N”的数值时,花费了更多的时间。下面的试验结果证明了这个观点是对的,参见下图。
图 6-20 控件值直接传递给属性(相当于常数)改善执行速度
最后我们再看一个试验,利用属性节点将控件的值读出后再重新写入。
图 6-21 属性节点的读出再写入
对比不同的试验结果,不难发现,控件值的读出和写入时间是基本相同的。从“循环计数”端读值要花费更多的时间。