LabVIEW程序设计模式—消息队列型状态机模式_第1页
LabVIEW程序设计模式—消息队列型状态机模式_第2页
LabVIEW程序设计模式—消息队列型状态机模式_第3页
LabVIEW程序设计模式—消息队列型状态机模式_第4页
LabVIEW程序设计模式—消息队列型状态机模式_第5页
免费预览已结束,剩余1页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LabVIEW程序设计模式(三)一消息队列型状态机模式LabVIEW 程序设计 2009-04-28 08:55:30 阅读673评论0 字号:大中小 订 阅针对基本状态机模式的第(13)个问题,需要对模式进行改进。本节将一 一分析这些问题对应的解决方案,并最终形成一种新的状态机模式一一消息队列 型状态机模式。(1)状态的分类不清晰。这是一个涉及各个状态分类管理的问题,是一个组织问题。我们可以做一个 类比,在一个书桌上有许多种类的书籍(通信、计算机、机械、法律等),这些 书都摆放在书桌上很整齐。但是我们在寻找一本书时并不会觉得很迅速和随意, 因为书籍的摆放是无序的,每次寻找书籍我们不得不从第一

2、本开始浏览直至找到 我们想要的书籍。或许可以做一些改变,我们设置一些书立,将不同种类的书使 用书立分开。并且在书立上标明这些书籍表示的种类。这样我们在寻找某一种书 籍时就不需要从第一本书开始寻找了,只需要找到对应的书立,在这些书立中寻 找即可。让我们回到程序,并给程序的状态设置一些“书立”。如图 4所示,系统 共有 9 个有效状态(UI In itial、Data In itial、In str In itial、Temperature Power、 FFT、JTFA、Data Clean Exit)。如果把这些状态混在一起,我们需要找到某 一个状态时会比较困惑和麻烦。如同上面所述,将这些状态

3、分为4类并设置了 4个“书立” (Initial、Acquire、Analyse、System)分隔这些状态。在实际的状态 控制中,需要确保程序只会进入实际的状态中运行而不会进入到“书立”分支 中,因此对每个“书立”加入了“ ”以示区别。图4状态分类尽管我们只是进行了少量的修改,但是这的确有利于程序状态的组织和阅 读,尤其是当程序具有很多个状态的时候。(2)缺乏数据共享和错误处理机制。在层叠式的顺序结构中,数据在帧之间的传递是靠“顺序局域变量”实现 的。那么如果在case结构中如何传递不同分支的数据呢?这个问题似乎很容易 解决,使用局域变量,全局变量或共享变量都能够解决,但是这些并不是最优的

4、解决方案。因为上述的方式会明显系统运行的内存空间和时间。由于状态机的基 本组成元素除了 case结构之外还有循环,因此可以使用移位寄存器来传递数据 如图5所示。图5状态机中的数据传递图5使用移位寄存器进行数据共享和传递,将所有的数据封装在一个簇中 并对每个数据命名,这样在使用数据时就可以使用“ Unbundle by name或“ bun die by name。需要说明的是,即使使用一个数据需要共享,仍然希望采 用簇的封装形式,这样当后续需要增加扩展数据的时候并不会影响现有的数据引 用。(3)每一个状态分支只能够决定后面的一个状态,而无法决定一个状态序列(多个状态)。在基本状态机中之所以存在

5、这个问题是因为状态的传递使用的是Scalar (标量)形式,如果需要传递一个状态序列,很明显可以使用队列或数组进行状态的 传递。在LabVIEW程序设计模式中将这种具备处理状态序列的状态机称为“消 息队列型状态机”,它是在基本状态机基础上的改进。顾名思义,这种模式就像银行办理业务时排队一样采用队列的方式。当储户 进入银行时,首先到叫号机处领取号码进行排队(进入队列)并等待。然后,当 前面的储户办理完业务后就可以到相应的窗口办理业务(退出队列)。事实上,这种方式在现代生活中随处可见。在LabVIEW中至少有两种实现消息队列的方法。如图 6所示。前者使用数 组函数实现队列元素的入列和出列;后者使用

6、队列函数实现队列元素的入列和出 列。二者都能够实现队列的有序操作和状态的序列变化。图6消息队列型状态机模式本节解决了基本状态机模式中的(1) (3)个问题,为了更好地比较和使 用这些特点,特使用一个实例说明消息队列型状态机的使用过程。【应用2】本例要模拟一个自动贩卖机的工作过程。它的一次正常交易过程为:投币- 选择需要购买的商品一找币,当币值不足或商品已经销售完毕时则无法购买。程序的前面板如图7所示。在贩卖机的左上侧有4个按钮。(1) 1USD:单击时表示投入1美元的货币,2USD和5USD类同;(2) Change Back表示找零,也就是将目前剩余的货币退还给用户。程序的右侧是5个按钮,表

7、示5种不同类别的可乐(这里均使用了可口可乐 的图标),每种可乐的价格均是1美元。可乐的下面数字表示贩卖机中剩余的该 商品的数量,初始为每种20瓶。Current money显示贩卖机中剩余的货币数,你 可以继续购买可乐或者选择退回。单击 Stop按钮将退出应用程序。本例将使用本节介绍的消息队列状态机模式解决这个应用(也可以使用其它 的设计模式)。系统的功能并不复杂,关键是要判断贩卖机中的剩余钱数和剩余 的货物数以决定交易是否成功。图7自动贩卖机前面板程序背面板如图8所示。系统分为5个状态,并分为2大类第一类:Initiala) UI Initial :前面板界面的初始化。b) Data Ini

8、tial :数据的初始化。(2)第二类:Systema) Idle (Default):空闲状态。b) CheckMoney:贩卖机中的剩余钱数和剩余的货物数以决定交易是否成功。c) Exit :退出程序。程序开始运行时进入UI Initial和Data Initial状态,完成初始化操作。从图 中可以看出系统采用数组函数处理消息队列。图8自动贩卖机背面板在UI Initial中,系统给标题栏和说明栏赋值,并将前面板的商品设置为不可购买状态,因为在初始化时还没有完成投币动作。如图9所示图 9 UI Initial 分支在Data Initial中包含两个共享的数据:Money和GState前者表示贩卖机中 剩余的币值,初始化值为0;而后者表示贩卖机中各个商品剩余的数量,初始化 值为20数据使用移位寄存器传递以便于在各个 case分支中共享和使用,如图10 所示。CheckM oney分支主要是为了防止不合法的交易(如投入的币值不足或商品当程序运行到Exit分支时,将停止循环并退出程序,如图12所示图12 Exit分支Idle分支用来监控前面板各个按钮控件的变化并执行相应的状态。该分支比 较复杂,当检测到第0个按钮被按下时(即1USD按钮),贩卖机中的货币值应该加一,同时需要判断是否达到了交易条件(即进入CheckMo ney状态

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论