1.问题背景
在Labview编程过程中,有时候会使用多while循环同时运行,以获得更好的实时性,尤其是做数据采集的时候。笔者在一个应用实例中出现Stop变量无法同步的问题,经过调试找出解决方案,记录一下并作为学友们的参考。
以下是为这个问题设计的一个demo程序。其功能是在两个同时运行的while中,定时更新计数值i,并且可以使用同一个stop按键停止。
这里边使用“局部变量”来做变量同步,要注意的是,Labview的局部变量作用域是当前vi,C的局部变量作用域是当前函数。局部变量在vi里边相当于一个游离的X,非常方便对数据进行操作,同时,副作用是可能破坏程序逻辑。
2.现象分析
图1是初步设计的程序。注意这个时候是不能正常运行的,因为stop按键的动作属性属性(图2,按键时改变并反弹)不匹配。
图1 初步设计的程序
修改为图3的按键动作属性,即可正常运行。
图3 采样局部变量时按键属性需要设置为“按键时值改变”
但是,这样的改变带来的问题就是,当程序停止后,无法再重新运行,因为stop被保持为true。
改进的方法是在初始化的时候,同样通过局部变量操作将stop设为false。图4
图4 加入初始化操作
图5 加入对stop初始化后的运行结果
到此,并不是完美的。因为在一个比较复杂的程序中,程序的初始化阶段可能有很多操作,也可能导致一些延时。图6模拟了我的程序的初始化的情况。
图7为这种情况下所出现的问题:一个循环不工作了!!
图6 对复杂程序变量初始化的模拟
图7 根据图6对复杂情况初始化的模拟,结果发现,一个循环不工作了!
出现这个问题的原因是:
如图6的初始化方法,当初始化时延较大的时候,第一个循环在stop变量还没有被初始化情况下,就开始运行了,结果就是直接退出。而第二个循环是可以正常运行的。
图8是推荐的正确初始化方法,通过顺序结构,确保初始化完整地完成以后,再进入各个循环的执行环节。
图8 正确的初始化方法,通过顺序结构进行执行顺序控制,确保初始化完整执行
图9 正确的运行结果
图9 为正确初始化的运行结果。
一个简单的问题的分析,希望对大家有所帮助。