通过labview事件结构贩卖机对事件结构讨论
时间:10-02
整理:3721RD
点击:
A。使用“Reinitialize To Default”恢复控件的默认值
第一个图中的 “Reinitialize To Default Method”不是必须的,可以通过将 “Stop”
按钮的机械动作(Mechanical Action)设置为“Latch when released”,即第五个
机械动作即可,这种机械动作在程序读取“Stop”后会将它的值复位为 F,即弹
回去。具体可以见帮助文件:
Latch when released—Changes the control value only after you release the mouse button within the graphical boundary of the control. When the VI reads it once, th
control reverts to its default value. This behavior works in the same manner as dialog bo
buttons and system buttons. You cannot select this behavior for a radio buttons control.
第二个图中也是使用了这样的节点,而且使用这个节点恢复默认值后再用局
部变量来初始化移位寄存器。使用“Reinitialize To Default Method”来恢复所
有控件的值,这种做法比较少见,更常见的做法是只对有需要的控件显件进行初
始化,比如这次的程序中,只有部分显件需要初始化,而对于按钮型控件,如果
像上面所说一样,每次读取值后自动弹回默认值,就不需要再使用这个节点来进
行初始化了。
使用“恢复至默认值”这个属性节点最大的问题是从代码上看不到控件的默
认值是什么,可读性极差。对于按钮类控件,可以通过机械动作来解决是最好的
了,如果机械动作有冲突,宁愿选择用局部变量。其它控件也一样。
右下边那部分程序使用局部变量为初始化移位寄存器的做法就比较奇怪了,
可能是作者认为之前这些控件已经恢复为默认值了,所以就用它们的局部变量
了。但因为这里是在恢复为默认值后再读取这些控件的值,显然这时候它们的输
出是已知的,就是各自的默认值,所以这里更好的做法是直接用常量为初始化移
位寄存器而不是读局部变量。
B 将vi设置为 RUN WHEN OPENED
这次的程序中有几个作品的主程序是设置为“Run when opened”,如果是单这样设置倒不会有什么太大的问题,但是有一个程序同时还设置为不显示停止
按钮,对前面板的关闭动作又没有过滤掉,造成在打开程序后就没办法停止下来,
关闭后就直接退出了。只能将它先拉到另一个 VI 中再进行打开。
比较奇怪的设置,因为生成 EXE 后就自动是打开后就运行的了。
C 事件源对应的按钮没有在对应的事件分支里面
将事件源对应的按钮放到事件结构外,这种做法应该也是不推荐的,像左
边那个图还好,每次循环时都会读取这些控件,如果按钮的机械动作都设置为
“Latch when released”的话,也能达到每次按下后都弹回来的效果,但弹回来
的效果是在事件分支处理完后才会出现的,而且同时也读取了其它非事件源的控
件的值;右边那个图的做法就不能自动复位了,只能将机械动作设置为第一种
“Switch when pressed”,然后在程序里面通过写它的局部变量的方法来将控件
“弹”回来,这样就需要额外的编程了。
NI 推荐的对于按钮的事件分支应该是将按钮的机械动作设置为 “Latch when
released”,并且将这个按钮放到对应的事件分支里面,使事件触发后程序读取一
次控件的值,自动恢复控件的默认值。具体可以找一些资料来看一下,帮助里面
也有。
The following example shows the recommended way to handle a latched stop
Boolean control in the Event structure. The Event structure is inside a While Loop and one
case of the Event structure is configured with a Value Change event for the stop Boolean control. When the value of the stop Boolean control changes to TRUE, the Event
structure executes that event case, which reads the front panel terminal to reset the stop
button. The stop Boolean control is wired to the While Loop conditional terminal, which
stops the loop.
D 循环中存在不必要的连线或节点
上图中,输入的字符串直接进行输出,将主 VI 的信息传递到子 VI 中来,二
个字符串的值在每次循环时都完全一样,所以可以将这二个字符串放到循环外面
去,如下图所示:
有时候显件“String”也可以不要的,直接用“String 2”来显示主 VI 传递
过来的信息。
E 将同类控件设置为簇
比如上图中,将货物的数量一起打包成一个簇,然后再解开来进行操作。
有些公司会在这方面的要求,即要设计数据结构,但个人认为,就这次比赛
而言,所涉及到的控件不多,用不用簇都说得过去,如果使用簇的话,还需要对
簇元素进行搜索、解捆、捆绑,这些操作都会带来额外的内存分配,一定程度上
降低了程序的性能,好处就是减少了外部的连线,程序的扩展性也稍微好一点。
在这次竞赛中,感觉用簇应该是利弊各半吧。
另外,建议所有使用到的簇都自定义为 “自定义类型”或“严格自定义类型”,
这样以后要修改这个簇时可以很方便修改,有利于程序的扩展。
资料上提到,如果是控件比较多时最好还是使用簇,能够减少连线,提高程
序的整洁性,另外,经常一起使用到的控件也建议组成簇来使用,比如在仪器驱
动中的串口初始化程序,一般都会把串口初始化的参数,包括波特率、数据位、
校验位这些;还有在数据判断时的上下限,一般这二个参数都是同时出现、同时
使用的,虽然参数只有二个,但也建议组成簇。
相同数据类型多个数据尽量用数组,簇一般用于不同逻辑含义的多个数据。
F 尽量使用平铺的程序而不是层叠的程序
图 图图 图 32 层叠的程序与平铺的程序
像上图中,左右二边的程序功能是一样的,都是在判断条件为 T 时启用控
件,F 时禁用控件,一般建议使用右边的方法,因为左边的方法使用了 CASE
结构,CASE 是一种层叠的结构,会隐藏部分代码,在查看时只知道一种条件下
的代码,如果要查看另外一种条件下的代码就得切换 CASE,这样显然没有右边
的方法来得直观。
了解更多labview事件结构请进入:http://bbs.elecfans.com/topic-labviewevent.html
感谢分享
不错啊,谢谢小编
不错学习了