0.引言
操作者框架适合于多并行任务的项目。在这样的项目中,多个并行任务之间往往需要相互通信,传统的解决办法是,每个任务一个队列,一个while循环,多任务项目需要在一个程序框图使用多个while,不好看。NI说使用Actor Framework能够避免锁死,竞争,增大代码重用度。NI官方论坛上有一个例子,写的很好。
如上图,这是一个反馈式蒸发器,通过不断向室内吹送水蒸气以达到降温目的。它主要由水位传感器,温度传感器,水箱,水阀,水泵,风扇,海绵组成。原理如下:读取水位,水位过低时,打开水阀向水箱中放水;水位过高时关闭水阀。同时,读取室内温度,温度过高时,打开水泵向海绵上抽水,等海绵吸满水后,打开风扇,向室内鼓风,干燥的风经过湿透的海绵,成为温度较低的湿润的风,以此来降低室内温度;温度过低时,关闭水泵。
项目需求:
- 控制水位。过低打开水阀,过高时关闭水阀。
- 控制温度。过高时,打开水泵,等一会,再打开风扇。过低时,关闭水泵。
- 在界面上显示温度,水泵,风扇状态。
- 允许在界面上改动温度限制。
- 系统中总共使用两个风扇,一个坏时另一个自动启用。
- 系统可以脱离界面运行。
有点小复杂。
解决方案:
系统需要4个模块:
UI(Cooler UI with Events.lvclass) ;
冷却模块(Cooler.lvclass);
水位控制模块(Water Level.lvclass);
风扇控制模块(Dual Fan.lvclass)。
其中冷却模块是主模块,与风扇控制模块和水位控制模块组合关系,和UI模块是关联关系。(PS:Cooler需要负责Dual Fan和Water Level的启动和释放,Cool通过动态事件和Cooler Panel交互),每个模块为一个Actor。
冷却模块(Cooler.lvclass)),水位控制模块(Water Level.lvclass),风扇控制模块(Dual Fan.lvclass)都需要轮询,Dual Fan轮询有没有风扇坏掉了,Water Level轮询水位,Cooler轮询温度。所以写个Timed Loop Controller.lvclass,哪个操作者需轮询要直接从它继承就可以了。继承使代码复用度提高了。
同理,水位控制模块(Water Level.lvclass),风扇控制模块(Dual Fan.lvclass)还有相似的逻辑——超过限位就打开或关闭。写个Level Controller.lvclass作为这两个操作者的父类,因为labview中一个孩子只能有一个父亲,所以Level Controller.lvclass需要继承自Timed Loop Controller.lvclass。
1.创建Timed Loop Controller.class
这个类只需要一个属性:轮询频率。使此类继承Actor.class。
1.1 Actor Core.vi
父类actor.class中的Actor Co