新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > LabVIEW程序設(shè)計(jì)模式(二)—基本狀態(tài)機(jī)模式

LabVIEW程序設(shè)計(jì)模式(二)—基本狀態(tài)機(jī)模式

作者: 時(shí)間:2017-01-09 來(lái)源:網(wǎng)絡(luò) 收藏



圖 2 Enum型和Ring型控件
  1. enum型代表的值只能夠?yàn)閁8、U16和U32型,而ring型代表的值允許為I8、I16、I32、I64、U8、U16、U32、U64、EXT、SGL、DBL和FXP型;
  2. ring型實(shí)質(zhì)上是一種numeric型,而enum型是一種獨(dú)立于numeric之外的數(shù)據(jù)類(lèi)型;
  3. 當(dāng)把ring或enum型控件分別連接到case時(shí),對(duì)ring型而言,case結(jié)構(gòu)的選擇端子只能夠顯示數(shù)值;而對(duì)enum型而言,case結(jié)構(gòu)的選擇端子能夠顯示具體的枚舉值;
  4. ring的strings[]屬性可以在程序運(yùn)行時(shí)被修改,而enum的strings[]屬性在程序運(yùn)行時(shí)卻無(wú)法被修改;
  5. 當(dāng)把ring型和enum型控件分別制作成自定義類(lèi)型控件(Type Def.)時(shí),ring的控件實(shí)例可以任意設(shè)置其strings[]屬性的值,而enum的控件實(shí)例卻無(wú)法設(shè)置strings[]屬性的值,如圖 3所示;
  6. 當(dāng)把ring型和enum型控件分別制作成自定義類(lèi)型控件(Type Def.)時(shí),改變r(jià)ing的Type Def中控件的strings[]屬性的值,但是其對(duì)應(yīng)的實(shí)例的strings[]屬性卻不會(huì)改變;而改變enum的Type Def中控件的strings[]屬性的值,其對(duì)應(yīng)的實(shí)例的strings[]屬性會(huì)隨之發(fā)生變化。
  7. ring型控件對(duì)應(yīng)的各個(gè)狀態(tài)可以表示任何值(在控件的property>>Edit Items對(duì)話框中),而enum控件對(duì)應(yīng)的各個(gè)狀態(tài)只能夠從0開(kāi)始順序表示(在控件的property>>Edit Items對(duì)話框中)。
由于應(yīng)用程序的各個(gè)狀態(tài)在設(shè)計(jì)時(shí)就是相對(duì)固定的,不會(huì)在應(yīng)用程序中進(jìn)行修改。對(duì)比以上ring型和enum型的區(qū)別,可以看出在基本狀態(tài)機(jī)中,enum更適合來(lái)標(biāo)記狀態(tài)。首先當(dāng)把enum直接與case相連時(shí),case的選擇端會(huì)立刻顯示enum的各個(gè)狀態(tài)值,有利于程序的理解和維護(hù);其次,當(dāng)把enum制作成一個(gè)Type Def型自定義控件時(shí),日后如果需要增加新的狀態(tài)則只需要修改Type Def型的strings[]屬性,此時(shí)其各個(gè)實(shí)例的strings[]屬性會(huì)隨之改變。

圖 3 Enum型和Ring型控件對(duì)比
反觀我們?cè)诒菊麻_(kāi)頭提到的10個(gè)問(wèn)題,使用LabVIEW狀態(tài)機(jī)模式是否能夠回答上述問(wèn)題呢?也就是說(shuō)基本狀態(tài)機(jī)模式有什么樣的缺點(diǎn)呢?
  1. 狀態(tài)的分類(lèi)不清晰。試想,如果有幾十個(gè)狀態(tài),那么case結(jié)構(gòu)的選擇端會(huì)顯得沒(méi)有條理。事實(shí)上,我們是可以對(duì)狀態(tài)進(jìn)行分類(lèi)的,如數(shù)據(jù)采集、數(shù)據(jù)分析狀態(tài)可以均屬于對(duì)數(shù)據(jù)的操作。其實(shí)并沒(méi)有統(tǒng)一的規(guī)定如何對(duì)狀態(tài)進(jìn)行分類(lèi),其目的在于使程序能夠清晰明了。
  2. 缺乏數(shù)據(jù)共享和錯(cuò)誤處理機(jī)制。例如在數(shù)據(jù)采集之后還需要增加一個(gè)數(shù)據(jù)分析的狀態(tài),那么如何將采集得到的數(shù)據(jù)提供給數(shù)據(jù)分析模塊呢(使用局域變量、全局變量、共享變量或其它)?這一點(diǎn)并不能稱(chēng)為基本狀態(tài)機(jī)的缺點(diǎn),只是在上面的例程中沒(méi)有實(shí)現(xiàn),所以單獨(dú)列出。
  3. 每一個(gè)狀態(tài)分支只能夠決定后面的一個(gè)狀態(tài),而無(wú)法決定一個(gè)狀態(tài)序列(多個(gè)狀態(tài))。假如狀態(tài)機(jī)有三個(gè)狀態(tài)A、B、C,前面板上有三個(gè)按鈕依次為B1、B2和B3。如果單擊B1時(shí)需要使得三個(gè)狀態(tài)按照A→B→C的順序執(zhí)行,當(dāng)單擊B2時(shí)需要使得三個(gè)狀態(tài)按照B→A→C的順序執(zhí)行,當(dāng)單擊B3時(shí)需要使得三個(gè)狀態(tài)按照C→A→B的順序執(zhí)行。這種情況是無(wú)法使用基本狀態(tài)機(jī)模式解決的。
  4. 程序一直在占用CPU資源。即使在Idle狀態(tài)下,仍然需要對(duì)前面板的控件值進(jìn)行監(jiān)控以確定對(duì)哪一個(gè)狀態(tài)進(jìn)行響應(yīng)。
  5. 無(wú)法響應(yīng)更多的前面板事件。如當(dāng)單擊窗口右上角的×時(shí),彈出一個(gè)確認(rèn)退出的對(duì)話框。當(dāng)鼠標(biāo)在前面板拖曳時(shí),捕獲這個(gè)事件。這種情況是無(wú)法使用基本狀態(tài)機(jī)模式解決的。
  6. 任何時(shí)刻只能有一個(gè)狀態(tài)在運(yùn)行。如果用戶需要在數(shù)據(jù)采集過(guò)程(acquire狀態(tài))中查看“關(guān)于&幫助”對(duì)話框(about狀態(tài)),那么基本狀態(tài)機(jī)模式只能暫停數(shù)據(jù)采集而顯示對(duì)話框,卻無(wú)法實(shí)現(xiàn)在查看“關(guān)于&幫助”對(duì)話框的同時(shí)仍然進(jìn)行數(shù)據(jù)采集。

上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉