新聞中心

labview深入探索----xcontrol

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

這和一般的事件結(jié)構(gòu)使用方法完全不同,一旦循環(huán)退出,整個(gè)事件檢測(cè)就結(jié)束了,不會(huì)再響應(yīng)其他事件了。而在XCONTROL中,這顯然是不能這樣做的,因?yàn)閄CONTROL肯定要不斷響應(yīng)事件,按常規(guī)想法,它應(yīng)該連接的是-1,循環(huán)永遠(yuǎn)不退出。即使永遠(yuǎn)不退出,持續(xù)檢測(cè)事件,這樣也是有問(wèn)題的,如果有大量的XCONTROL,這將導(dǎo)致數(shù)量龐大的事件結(jié)構(gòu)循環(huán),這樣會(huì)極大地影響程序性能。

仔細(xì)分析后,我得出結(jié)論,上面的事件結(jié)構(gòu)實(shí)際上是個(gè)回調(diào)函數(shù)。

CVI的回調(diào)函數(shù)是這樣定義的:

int CVICALLBACK PlotData (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2);

VC也是類(lèi)似的。

它的目的是,如果面板或者面板上某個(gè)控件發(fā)生的事件,比如鼠標(biāo)按下,值改變等等,將自動(dòng)調(diào)用這個(gè)函數(shù),注意是操作系統(tǒng)自動(dòng)調(diào)用這個(gè)函數(shù),不是用戶(hù)調(diào)用的。

FACADE.VI正是這個(gè)功能,一旦XCONTROL發(fā)生任何事件,LABVIEW將自動(dòng)調(diào)用這個(gè)回調(diào)函數(shù),回調(diào)函數(shù)響應(yīng)事件后,因?yàn)闆](méi)有其它事件發(fā)生,會(huì)立即觸發(fā)超時(shí),導(dǎo)致循環(huán)結(jié)束,回調(diào)函數(shù)退出。具體過(guò)程是這樣的:

XCONTROL 發(fā)生事件----》labview調(diào)用FACADE.vi--->響應(yīng)事件---》超時(shí)退出

下次發(fā)生事件時(shí)重復(fù)上面的過(guò)程。

LABVIEW除了超時(shí)事件外,還自動(dòng)生成了其它幾個(gè)事件,可以把它們稱(chēng)做系統(tǒng)事件,對(duì)于任何的XCONTROL,這幾個(gè)事件都是必須存在的。

2:Data Change事件


Data Change 事件是指前面自定義數(shù)據(jù)類(lèi)型DATA的值改變了所發(fā)生的事件。

事件是如何發(fā)生的那,當(dāng)你用數(shù)據(jù)流,或者局部變量以及VALUE屬性節(jié)點(diǎn)改變了XCONTROL的值,則觸發(fā)該事件。

這一點(diǎn)和一般的事件結(jié)構(gòu)也是不同的,對(duì)于一般地控件,用局部變量或者Value屬性節(jié)點(diǎn)是不會(huì)產(chǎn)生事件的,如果改變了同時(shí)需要觸發(fā)事件,我們不得不用VALUE(SIGNAL)事件來(lái)人為觸發(fā)。

當(dāng)我們?cè)谇懊姘迳蛇@個(gè)控件時(shí),DATA CHANGE事件自動(dòng)觸發(fā),盡管我們此時(shí)并未改變它的值。

3:DISPLAY STATE CHANGE----顯示狀態(tài)改變事件。

當(dāng)你在前面板拖入(生成)這個(gè)XCONTROL的實(shí)例時(shí),或者復(fù)制控件,以及用自定義的屬節(jié)點(diǎn)改變控件時(shí)觸發(fā)這個(gè)事件。我們可以利用這個(gè)事件來(lái)改變XCONTROL的外觀特性。

4:方向改變事件

當(dāng)一個(gè)XCONTROL從控制器改變成指示器或者從指示器改變成控制器時(shí)產(chǎn)生該事件。

利用這個(gè)結(jié)構(gòu),我們可以把指示器和控制器顯示成完全不同的形狀。

對(duì)于常規(guī)的控件,我們可以用鼠標(biāo)右鍵的CAHNGE TO CONTROL和CHANGE TO INDICATOR來(lái)改變,XCONTROL也是如此。

5:Exec State Change-----執(zhí)行狀態(tài)改變

左側(cè)傳入的RUN MODE?為真表示運(yùn)行狀態(tài),為假表示編輯狀態(tài),這個(gè)事件的基本做用是,指示器在編輯狀態(tài)下是可以更改它的值的,而在運(yùn)行狀態(tài)下是不允許用戶(hù)直接修改的,只能通過(guò)數(shù)據(jù)流或者局部變量來(lái)修改,這樣,我們必須知道當(dāng)前是運(yùn)行還是編輯狀態(tài)。

另外經(jīng)過(guò)實(shí)際測(cè)試,當(dāng)一個(gè)XCONTROL被拖入前面板(生成控件實(shí)例)的時(shí)候,將按照下面的次序產(chǎn)生事件:

調(diào)用INIT.VI---->DATA CHANGE EVENT--->STATE CHANDE EVENT

需要注意的是左側(cè)共有四個(gè)嚴(yán)格類(lèi)型的數(shù)據(jù)傳入循環(huán):

DATA IN---它是上面定義的DATA.CTL

DISPLAY STATE IN----它是上面定義的STATE.CTL

Container state-----包容器狀態(tài)

Action--------------動(dòng)作

我們看看Container State 和Action的定義



Container State 是一個(gè)嚴(yán)格類(lèi)型定義的簇,有三個(gè)元素組成:

.Indicator ? ,boolean 用來(lái)表示當(dāng)前的XCONTROL是控制器還是指示器

.Run Mode? boolean 用來(lái)表示當(dāng)前的XCONTROL是處于運(yùn)行狀態(tài)還是編輯狀態(tài).

.RefNum refnumxcontrol自身的控件參考.

Action 也是一個(gè)嚴(yán)格類(lèi)型的簇,有三個(gè)元素組成:

.Data Changed boolean 如果該項(xiàng)給定TRUE,則觸發(fā)DATA CHANGE事件

.State Changed boolean 如果該項(xiàng)給定為T(mén)RUE,則觸發(fā)Display StateCHANGE事件.

.Action Name 用戶(hù)可以自己定義的字符串信息,比如我們可以指明是哪個(gè)要求觸發(fā)DATA CHANGE事件的 .

接下來(lái),我們來(lái)制作這個(gè)XCONTROL的屬性和方法

我們?cè)跔顟B(tài)中已經(jīng)定義了四個(gè)屬性:1.進(jìn)入標(biāo)題,2.離開(kāi)標(biāo)題 3.進(jìn)入顏色 4.離開(kāi)顏色

這四個(gè)屬性是子定義的屬性,完成后,LV自動(dòng)在屬性節(jié)點(diǎn)中增加四個(gè)項(xiàng)目.屬性節(jié)點(diǎn)一般都定義成可讀可寫(xiě)的,根據(jù)需要,也可以定義成單向的.


當(dāng)我們打開(kāi)一個(gè)VI,包含XCONTROL時(shí),XCONTROL是不允許編輯的,在調(diào)試XCONTROL的過(guò)程我們需要頻繁切換XCONTROL的設(shè)計(jì)窗口和使用窗口,用上面的UNLOCK LIBARAY FOR EDITING,可以暫時(shí)啟動(dòng)XCONTROL的編輯,這是使用XCONTROL的窗口處于錯(cuò)誤中斷狀態(tài).



關(guān)鍵詞: labviewxcontro

評(píng)論


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

關(guān)閉