




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章虛擬信號(hào)發(fā)生器的設(shè)計(jì)3.1For循環(huán)3.2While循環(huán)3.3信號(hào)生成、處理和分析3.4虛擬信號(hào)發(fā)生器的設(shè)計(jì)3.5局部變量和全局變量3.6移位寄存器3.7反饋節(jié)點(diǎn)
3.8實(shí)現(xiàn)階乘運(yùn)算的程序設(shè)計(jì)3.9實(shí)現(xiàn)測(cè)量結(jié)果算術(shù)平均值的程序設(shè)計(jì)本章小結(jié)思考與練習(xí)
3.1For循環(huán)
For循環(huán)將按照設(shè)定的次數(shù)執(zhí)行子程序框圖(即結(jié)構(gòu)邊框中的程序框圖部分)。本節(jié)將介紹如何使用For循環(huán)來(lái)控制程序運(yùn)行。3.1.1創(chuàng)建For循環(huán)
右擊程序框圖空白處,彈出函數(shù)選板,單擊【編程】/【結(jié)構(gòu)】/【For循環(huán)】,如圖3.1所示。將其拖放在程序框圖中,此時(shí)按住鼠標(biāo)左鍵拖動(dòng)鼠標(biāo)調(diào)整確定For循環(huán)框的大小。For循環(huán)圖標(biāo)如圖3.2所示。圖3.1For循環(huán)在函數(shù)選板上的位置圖3.2For循環(huán)
For循環(huán)具有兩個(gè)接線端,說(shuō)明如下:
①:總數(shù)接線端(輸入端子)。它的值表示重復(fù)執(zhí)行子程序框圖的次數(shù)。
②:計(jì)數(shù)接線端(輸出端子)。它的值表示已完成的循環(huán)次數(shù)。
說(shuō)明:這兩個(gè)端子都是0~231-1范圍內(nèi)的長(zhǎng)整數(shù)。
【練習(xí)3-1】學(xué)習(xí)使用For循環(huán)。
目標(biāo):使用For循環(huán)顯示隨機(jī)數(shù)。
設(shè)計(jì):ForLoopVI。
(1)打開(kāi)一個(gè)新的VI。
(2)創(chuàng)建前面板。
①右擊前面板空白處,彈出控件選板。
②在控件選板上單擊【Express】/【數(shù)值顯示控件】/【數(shù)值顯示控件】,將其拖放在前面板上。
③使用標(biāo)簽工具將其命名為隨機(jī)數(shù)。
④依據(jù)此方法創(chuàng)建并命名一個(gè)循環(huán)計(jì)數(shù)顯示控件,如圖3.3所示。圖3.3ForLoop前面板
(3)切換到VI的程序框圖。
(4)創(chuàng)建程序框圖。
①右擊程序框圖空白處,彈出函數(shù)選板。
②在函數(shù)選板上單擊【編程】/【結(jié)構(gòu)】/【For循環(huán)】,將其拖放在程序框圖中。同時(shí),將隨機(jī)數(shù)和循環(huán)計(jì)數(shù)兩個(gè)節(jié)點(diǎn)置于For循環(huán)框中。
③在函數(shù)選板上單擊【編程】/【數(shù)值】/【隨機(jī)數(shù)
(0-1)】,將其拖放在程序框圖中。
④右擊For循環(huán)的總數(shù)接線端,在彈出的快捷菜單中選擇【創(chuàng)建常量】,并設(shè)置數(shù)值為100(默認(rèn)值為0),如圖3.4所示。圖3.4設(shè)置總數(shù)接線端值為100說(shuō)明:總數(shù)接線端值為100,就意味著子程序框圖將被循環(huán)執(zhí)行100次。
⑤使用連線工具,連線各個(gè)節(jié)點(diǎn),如圖3.5所示。
(5)保存VI,并且命名為ForLoop。
(6)返回前面板,運(yùn)行VI。
說(shuō)明:程序運(yùn)行時(shí)注意觀察循環(huán)計(jì)數(shù)控件的值,顯示是0~99,而不是1~100。計(jì)數(shù)接線端總是從0開(kāi)始計(jì)數(shù)。第一次循環(huán)時(shí),計(jì)數(shù)接線端返回值0。這一點(diǎn)需要讀者注意。圖3.5ForLoop程序框圖下面介紹帶有條件接線端的For循環(huán)。
可為For循環(huán)添加一個(gè)條件接線端,從而在出現(xiàn)布爾條件或發(fā)生錯(cuò)誤時(shí)循環(huán)停止。帶有條件接線端的For循環(huán)在條件發(fā)生時(shí)或所有循環(huán)完成時(shí)才停止執(zhí)行,以先實(shí)現(xiàn)的條件為準(zhǔn)。
右擊For循環(huán)的邊框,在快捷菜單中選擇【條件接線端】。此時(shí)循環(huán)中將出現(xiàn)一個(gè)條件接線端,總數(shù)接線端的外觀由變?yōu)椋鐖D3.6所示。
對(duì)于具有條件接線端的For循環(huán),必須為條件接線端連線,或?yàn)橛?jì)數(shù)接線端或自動(dòng)索引輸入數(shù)組連接一個(gè)數(shù)值。圖3.6帶有條件接線端的For循環(huán)
說(shuō)明:默認(rèn)狀態(tài)下,條件接線端設(shè)置為【真(T)時(shí)停止】,即循環(huán)一直執(zhí)行到接線端接收到TURE值為止。右擊接線端,在快捷菜單中選擇【真(T)時(shí)繼續(xù)】。在條件接線端為真(T)時(shí)繼續(xù)時(shí),循環(huán)將一直執(zhí)行直到接線端接收到FALSE值為止。
圖3.7所示的For循環(huán)為每1000?ms產(chǎn)生一個(gè)隨機(jī)數(shù),當(dāng)產(chǎn)生100個(gè)隨機(jī)數(shù)或單擊停止按鈕時(shí)循環(huán)中止執(zhí)行。圖3.7帶有條件的For循環(huán)3.1.2For循環(huán)的自動(dòng)索引
自動(dòng)索引是指使For循環(huán)或While循環(huán)在循環(huán)邊框上對(duì)數(shù)組自動(dòng)建立索引的功能。
啟用數(shù)組輸入隧道的自動(dòng)索引可以讀取和處理連接到For循環(huán)的數(shù)組中的各個(gè)元素,如圖3.8所示。圖3.8啟用自動(dòng)索引輸入數(shù)組到For循環(huán)說(shuō)明:①?gòu)慕Y(jié)構(gòu)外接收數(shù)據(jù)和將數(shù)據(jù)輸出結(jié)構(gòu)的接線端稱(chēng)為隧道。隧道是結(jié)構(gòu)邊框上的連接點(diǎn)。
②For循環(huán)在默認(rèn)狀態(tài)下是啟用自動(dòng)索引的。自動(dòng)索引時(shí),隧道圖標(biāo)是;禁用索引時(shí),隧道圖標(biāo)是。
如果不希望啟用自動(dòng)索引,右擊循環(huán)邊框上的隧道,在快捷菜單中選擇【禁用索引】,如圖3.9所示。圖3.9禁用索引
說(shuō)明:如果禁用輸入隧道自動(dòng)索引,整個(gè)數(shù)組將一次性全部傳遞到循環(huán)中。
啟用數(shù)組輸出隧道的自動(dòng)索引后,輸出數(shù)組從每次循環(huán)中接收一個(gè)新元素。因此,數(shù)組的大小與循環(huán)的次數(shù)相等。圖3.10中循環(huán)次數(shù)為5次,那么輸出數(shù)組中含有5個(gè)元素。圖3.10啟用自動(dòng)索引到輸出數(shù)組
說(shuō)明:如果禁用輸出隧道上的自動(dòng)索引,僅有最后一次循環(huán)的元素被傳遞到程序框圖上的下一個(gè)節(jié)點(diǎn)。
如果有多個(gè)隧道啟用自動(dòng)索引或?qū)τ?jì)數(shù)接線端進(jìn)行連線,實(shí)際的循環(huán)次數(shù)將取其中較小的值。如圖3.11所示,F(xiàn)or循環(huán)將執(zhí)行4次,因?yàn)閿?shù)組元素中有4個(gè)元素。圖3.11啟用自動(dòng)索引到輸出數(shù)組
3.2While循環(huán)
While循環(huán)類(lèi)似于文本編程語(yǔ)言中的Do循環(huán)或Repeat-Until循環(huán),While循環(huán)執(zhí)行子程序框圖直到滿(mǎn)足某個(gè)條件或出現(xiàn)錯(cuò)誤。本節(jié)將介紹如何使用While循環(huán)。3.2.1創(chuàng)建While循環(huán)
右擊程序框圖空白處,彈出函數(shù)選板,單擊【編程】/【結(jié)構(gòu)】/【W(wǎng)hile循環(huán)】,如圖3.12所示。將其拖放在程序框圖中,此時(shí)按住鼠標(biāo)左鍵拖動(dòng)鼠標(biāo)調(diào)整確定While循環(huán)框的大小。While循環(huán)圖標(biāo)如圖3.13所示。圖3.12While循環(huán)在函數(shù)選板上的位置圖3.13While循環(huán)
While循環(huán)具有兩個(gè)端子,說(shuō)明如下:
①:條件接線端(輸入端子),與For循環(huán)的條件接線端操作相同。
②:計(jì)數(shù)接線端(輸出端子),與For循環(huán)的計(jì)數(shù)接線端相同。
說(shuō)明:程序在每次循環(huán)結(jié)束時(shí)檢查條件接線端,因此不管條件接線端的條件是否滿(mǎn)足,While循環(huán)至少要執(zhí)行一次。
【練習(xí)3-2】學(xué)習(xí)使用While循環(huán)。
目標(biāo):使用While循環(huán)顯示隨機(jī)數(shù)。
設(shè)計(jì):WhileLoopVI。
(1)打開(kāi)一個(gè)新的VI。
(2)創(chuàng)建前面板。
①右擊前面板空白處,彈出控件選板。
②在控件選板上單擊【Express】/【按鈕與開(kāi)關(guān)】/【滑動(dòng)開(kāi)關(guān)】,將其拖放在前面板上。
③在控件選板上單擊【Express】/【數(shù)值顯示控件】/【數(shù)值顯示控件】,將其拖放在前面板上。④使用標(biāo)簽工具將其命名為隨機(jī)數(shù)。
⑤依據(jù)此方法創(chuàng)建并命名一個(gè)循環(huán)計(jì)數(shù)顯示控件,如圖3.14所示。圖3.14WhileLoop前面板
(3)切換到VI的程序框圖。
(4)創(chuàng)建程序框圖。
①右擊程序框圖空白處,彈出函數(shù)選板。
②在函數(shù)選板上單擊【編程】/【結(jié)構(gòu)】/【W(wǎng)hile循環(huán)】,將其拖放在程序框圖中。同時(shí),將隨機(jī)數(shù)和循環(huán)計(jì)數(shù)的兩個(gè)節(jié)點(diǎn)置于While循環(huán)框中。
③在函數(shù)選板上單擊【編程】/【數(shù)值】/【隨機(jī)數(shù)(0-1)】,將其拖放在程序框圖中。
④使用連線工具,連線各個(gè)節(jié)點(diǎn),如圖3.15所示。圖3.15WhileLoop程序框圖
(5)保存VI,并且命名為WhileLoop。
(6)返回前面板,運(yùn)行VI,觀察到循環(huán)計(jì)數(shù)控件的值在不斷增加,將布爾開(kāi)關(guān)置于關(guān)位置,循環(huán)將停止。
思考:①如圖3.16所示,如果將布爾開(kāi)關(guān)置于While循環(huán)框外面,While循環(huán)如何執(zhí)行?(提示:由于LabVIEW是數(shù)據(jù)流編程,因此布爾開(kāi)關(guān)的值只在循環(huán)開(kāi)始前被讀取一次。)
②如圖3.17所示,如果將隨機(jī)數(shù)顯示控件置于While循環(huán)框外面,While循環(huán)如何執(zhí)行?(提示:隨機(jī)數(shù)顯示控件的值僅在循環(huán)執(zhí)行完以后更新一次。)圖3.16布爾開(kāi)關(guān)置于While循環(huán)框外面圖3.17隨機(jī)數(shù)顯示控件置于While循環(huán)框外面3.2.2While循環(huán)的自動(dòng)索引
若對(duì)進(jìn)入While循環(huán)的數(shù)組啟用自動(dòng)索引,則對(duì)該數(shù)組建立索引的方式與For循環(huán)一樣,具體可以參考3.1.2小節(jié)。但是While循環(huán)只有在滿(mǎn)足特定條件時(shí)才會(huì)停止執(zhí)行,因此While循環(huán)的執(zhí)行次數(shù)不受該數(shù)組大小的限制。
關(guān)于使用“While循環(huán)”的范例見(jiàn)labview\examples\general
\structs.llb中的GenerateRandomSignalVI。
說(shuō)明:While循環(huán)默認(rèn)狀態(tài)下為禁用自動(dòng)索引。當(dāng)While循環(huán)索引超過(guò)輸入數(shù)組的大小時(shí),LabVIEW會(huì)將該數(shù)組元素類(lèi)型的默認(rèn)值輸入循環(huán)。數(shù)值型數(shù)組默認(rèn)值為0;布爾型數(shù)組默認(rèn)值為FALSE。通過(guò)使用“數(shù)組大小”函數(shù)可以防止將數(shù)組默認(rèn)值傳遞到While循環(huán)中?!皵?shù)組大小”函數(shù)顯示數(shù)組中元素的個(gè)數(shù)??稍O(shè)置While循環(huán)在循環(huán)次數(shù)等于數(shù)組大小時(shí)停止執(zhí)行。3.2.3While循環(huán)的定時(shí)時(shí)間控制
LabVIEW在執(zhí)行While循環(huán)時(shí),用戶(hù)需要給它設(shè)定循環(huán)時(shí)間間隔,否則它將以CPU的極限速度運(yùn)行,這樣循環(huán)外的所有其他VI不能運(yùn)行,甚至?xí)蓴_用戶(hù)界面的響應(yīng),因此在While循環(huán)中要放入一個(gè)定時(shí)器。
下面介紹兩種最常用的定時(shí)函數(shù)【等待】和【等待下一個(gè)整數(shù)倍毫秒】,這兩個(gè)函數(shù)位于函數(shù)選板上的【編程】/【定時(shí)】中。絕大多數(shù)情況下,這兩個(gè)函數(shù)可以相互使用。
【等待】函數(shù)功能是等待用戶(hù)指定的時(shí)間量,并返回毫秒計(jì)時(shí)器的值,如圖3.18所示。圖3.18等待函數(shù)①等待時(shí)間:指定要等待的時(shí)間,以毫秒為單位。與絕對(duì)時(shí)間無(wú)關(guān)。
②毫秒計(jì)時(shí)值:返回毫秒計(jì)時(shí)器的值。
說(shuō)明:LabVIEW中提供了定時(shí)執(zhí)行的快速VI,位于【函數(shù)】選板下的【編程】/【定時(shí)】/【時(shí)間延遲】,該VI的功能和Wait(ms)類(lèi)似,惟一的例外是它的輸入是以秒為單位,而不是毫秒。
【等待下一個(gè)整數(shù)倍毫秒】函數(shù)是LabVIEW通過(guò)一個(gè)毫秒計(jì)時(shí)器來(lái)監(jiān)測(cè)等待的時(shí)間量,等待會(huì)一直持續(xù),直到您所指定的整數(shù)倍毫秒時(shí)間量??稍谘h(huán)中調(diào)用該函數(shù),控制循環(huán)執(zhí)行的速率,如圖3.19所示。第一次的循環(huán)等待時(shí)間也許會(huì)相當(dāng)短,無(wú)法保證運(yùn)行的時(shí)間是設(shè)定值。這是因?yàn)橄到y(tǒng)時(shí)鐘在開(kāi)始等待前已經(jīng)開(kāi)始計(jì)時(shí)了。圖3.19等待下一個(gè)整數(shù)倍毫秒函數(shù)①毫秒倍數(shù):指定VI運(yùn)行的時(shí)間間隔,以毫秒為單位。
②毫秒計(jì)時(shí)值:返回毫秒計(jì)時(shí)器的值。
說(shuō)明:【等待下一個(gè)整數(shù)倍毫秒】函數(shù)通常用來(lái)同步多個(gè)并行循環(huán)的執(zhí)行,因?yàn)樗牡却龝r(shí)間是周期性的。圖3.20中兩個(gè)獨(dú)立的While循環(huán)會(huì)以200ms的時(shí)間間隔同步運(yùn)行。圖3.20同步兩個(gè)While循環(huán)執(zhí)行
【練習(xí)3-3】控制While循環(huán)的時(shí)間。
目標(biāo):學(xué)習(xí)使用While循環(huán)的定時(shí)時(shí)間控制。
設(shè)計(jì):WhileLoopwithDelayVI。
(1)打開(kāi)WhileLoopVI,見(jiàn)3.2.2小節(jié)練習(xí)3-2。
(2)在練習(xí)3-2前面板的基礎(chǔ)上添加時(shí)間控件。
①在控件選板上單擊【Express】/【數(shù)值輸入控件】/【數(shù)值輸入控件】,將其拖放在前面板上。
②使用標(biāo)簽工具將其命名為毫秒倍數(shù),并設(shè)置數(shù)值為100,如圖3.21所示。圖3.21WhileLoopwithDelay前面板
(3)在練習(xí)3-2程序框圖的基礎(chǔ)上添加循環(huán)定時(shí)函數(shù)。
①在函數(shù)選板上單擊【編程】/【定時(shí)】/【等待下一個(gè)整數(shù)倍毫秒】,將其拖放在程序框圖中。
②使用連線工具,連接各個(gè)節(jié)點(diǎn),如圖3.22所示。
(4)保存VI,并且命名為WhileLoopwithDelay。
(5)返回前面板,運(yùn)行VI。
(6)把毫秒倍數(shù)的值改為200,觀察程序運(yùn)行的速度有什么變化。圖3.22WhileLoopwithDelay程序框圖3.2.4布爾開(kāi)關(guān)的機(jī)械動(dòng)作
布爾開(kāi)關(guān)的一個(gè)非常重要的屬性就是機(jī)械動(dòng)作,使用該屬性可以模擬真實(shí)布爾開(kāi)關(guān)的動(dòng)作特性。右擊布爾開(kāi)關(guān),在彈出快捷菜單中選擇【機(jī)械動(dòng)作】。LabVIEW為布爾開(kāi)關(guān)提供了6種機(jī)械動(dòng)作,如圖3.23所示。右擊布爾開(kāi)關(guān),在彈出的快捷菜單中選擇【屬性】,單擊【操作】標(biāo)簽,在【操作】選項(xiàng)卡中可以設(shè)置機(jī)械動(dòng)作,而且還有詳細(xì)的動(dòng)作解釋和開(kāi)關(guān)動(dòng)作預(yù)覽。圖3.23布爾開(kāi)關(guān)的機(jī)械動(dòng)作選擇不同的機(jī)械動(dòng)作會(huì)引起布爾開(kāi)關(guān)的值的輸出方式不同。表3-1所示為各個(gè)機(jī)械動(dòng)作的詳細(xì)說(shuō)明。
注:在機(jī)械動(dòng)作圖標(biāo)中,M表示操作控件時(shí)鼠標(biāo)鍵的動(dòng)作,V表示控件的輸出值,RD表示VI讀取控件的時(shí)間點(diǎn)??梢詤⒖糒abVIEW自帶的范例,名稱(chēng)為MechanicalActionofBoolean.vi,位于labview\examples\general\controls
\booleans.llb。3.2.5強(qiáng)制轉(zhuǎn)換點(diǎn)
將兩個(gè)不同的數(shù)值數(shù)據(jù)類(lèi)型連接在一起時(shí),程序框圖節(jié)點(diǎn)上會(huì)出現(xiàn)強(qiáng)制轉(zhuǎn)換點(diǎn)以示警告。強(qiáng)制轉(zhuǎn)換點(diǎn)表示LabVIEW已經(jīng)將傳遞給節(jié)點(diǎn)的數(shù)值轉(zhuǎn)換成了不同的數(shù)據(jù)類(lèi)型。例如,加函數(shù)需要兩個(gè)雙精度浮點(diǎn)數(shù)輸入。如需其中一個(gè)輸入為整數(shù),“加”函數(shù)上就會(huì)出現(xiàn)一個(gè)強(qiáng)制轉(zhuǎn)換點(diǎn),如圖3.24所示。圖3.24強(qiáng)制轉(zhuǎn)換點(diǎn)程序框圖將在發(fā)生強(qiáng)制轉(zhuǎn)換的接線端邊框上放置一個(gè)強(qiáng)制轉(zhuǎn)換點(diǎn),表示該接線端發(fā)生了自動(dòng)數(shù)據(jù)類(lèi)型轉(zhuǎn)換。由于VI和函數(shù)可含有多個(gè)接線端,故將一個(gè)接線端連接到另一個(gè)接線端時(shí),圖標(biāo)內(nèi)部將出現(xiàn)強(qiáng)制轉(zhuǎn)換點(diǎn)。
強(qiáng)制轉(zhuǎn)換點(diǎn)會(huì)使VI消耗更多的內(nèi)存,并增加其運(yùn)行時(shí)間。因此,創(chuàng)建VI時(shí)應(yīng)盡量保持?jǐn)?shù)據(jù)類(lèi)型一致。
3.3信號(hào)生成、處理和分析
由于數(shù)字信號(hào)具有高保真、低噪聲和處理靈活等優(yōu)點(diǎn),因此得到了廣泛的應(yīng)用。例如,電話公司使用數(shù)字信號(hào)傳輸語(yǔ)音,無(wú)線電廣播、電視等也都在逐漸數(shù)字化,遙遠(yuǎn)星球和外部空間拍攝的照片也采用數(shù)字方法處理,去除干擾,獲得有用的信息。通過(guò)分析和處理數(shù)字信號(hào),可以從噪聲中分離出有用的信息。本節(jié)將重點(diǎn)介紹LabVIEW中信號(hào)處理與分析功能的應(yīng)用。3.3.1信號(hào)生成
當(dāng)日常生活中無(wú)法獲得實(shí)際信號(hào)時(shí)(例如沒(méi)有數(shù)據(jù)采集板卡來(lái)獲得實(shí)際信號(hào)或者受限制無(wú)法訪問(wèn)實(shí)際信號(hào)),用戶(hù)可以考慮使用LabVIEW生成信號(hào)用于測(cè)試或者其它目的。在測(cè)量應(yīng)用中常用的測(cè)試信號(hào)包括正弦波、方波、三角波等。本節(jié)將介紹怎么使用LabVIEW產(chǎn)生各種類(lèi)型的信號(hào)。
LabVIEW中許多信號(hào)生成VI通常使用數(shù)字頻率,或稱(chēng)為歸一化頻率(NormalizedFrequency)。它定義為:數(shù)字頻率=模擬頻率/采樣頻率,單位是周期數(shù)/每采樣。歸一化頻率的倒數(shù)就是每周期采樣信號(hào)的次數(shù)。模擬頻率通常用Hz或者每秒周期數(shù)為單位。采樣頻率的單位是每秒采樣數(shù)。
LabVIEW中有兩個(gè)信號(hào)發(fā)生函數(shù)的選板。右擊程序框圖空白處,單擊【信號(hào)處理】,此時(shí)出現(xiàn)【信號(hào)生成】選板和【波形生成】?jī)蓚€(gè)選板,如圖3.25所示。這兩個(gè)選板都可以用來(lái)生成波形信號(hào)?!拘盘?hào)生成】選板中的VI用于產(chǎn)生一維數(shù)組表示的波形信號(hào),而【波形生成】選板中的VI用于產(chǎn)生波形數(shù)據(jù)類(lèi)型的波形信號(hào)。實(shí)際上波形數(shù)據(jù)的Y分量就是一維數(shù)組,所以?xún)蓚€(gè)選板生成信號(hào)的方式在本質(zhì)上是一樣的。圖3.25【信號(hào)生成】和【波形生成】選板下面以正弦波信號(hào)為例,介紹信號(hào)的生成方法。
右擊LabVIEW程序框圖空白處,彈出函數(shù)選板,單擊【信號(hào)處理】/【信號(hào)生成】/【正弦波】?!菊也ā亢瘮?shù)圖標(biāo)如圖3.26所示。
【正弦波】函數(shù)的功能是生成正弦波數(shù)組。它的輸入?yún)?shù)有采樣、幅值、頻率等,說(shuō)明如下:
①采樣:正弦波的采樣數(shù)。默認(rèn)值為128。
②幅值:正弦波的幅值,默認(rèn)值為1.0。圖3.26【正弦波】函數(shù)③頻率:正弦波的頻率,單位為周期/采樣的歸一化單位,默認(rèn)值為1周期/128采樣或7.8125×10–3周期/采樣。
④相位輸入:重置相位的值為T(mén)RUE時(shí)正弦波的初始相位,以度為單位。
⑤正弦波:輸出的正弦波。
⑥相位輸出:正弦波下一個(gè)采樣的相位,以度為單位。
說(shuō)明:使用歸一化頻率的VI有正弦波、方波、鋸齒波、三角波、任意波形發(fā)生器和Chirp信號(hào)。使用這些VI時(shí),需要將給定問(wèn)題中的頻率單位轉(zhuǎn)換為歸一化頻率單位。
【練習(xí)3-4】創(chuàng)建一個(gè)指定頻率的正弦波。
目標(biāo):創(chuàng)建一個(gè)VI,該VI生成正弦波信號(hào)。
設(shè)計(jì):SineWaveVI。
(1)打開(kāi)一個(gè)新的VI。
(2)創(chuàng)建前面板。
①右擊前面板空白處,彈出控件選板。
②在控件選板上單擊【數(shù)值輸入控件】/【數(shù)值輸入控件】,將其拖放在前面板上。
③使用標(biāo)簽工具將其命名為采樣,并設(shè)置數(shù)值為51。
④依據(jù)此方法依次命名幅值、信號(hào)頻率、采樣頻率和相位輸入四個(gè)控件,數(shù)值分別設(shè)置為1.00,2,50,0.00,如圖3.27所示。
注:以上各參數(shù)數(shù)值讀者可以根據(jù)需要自行設(shè)定。圖3.27SineWave前面板⑤在控件選板上單擊【圖形顯示控件】/【波形圖】,將其拖放在前面板上。
⑥使用標(biāo)簽工具將其命名為正弦波。
(3)切換到VI的程序框圖。
(4)創(chuàng)建程序框圖。
①右擊程序框圖空白處,彈出函數(shù)選板。
②在函數(shù)選板上單擊【信號(hào)處理】/【信號(hào)生成】/【正弦波】,將其拖放在程序框圖中。
③在函數(shù)選板上單擊【編程】/【數(shù)值】/【除】,將其拖放在程序框圖中。
④同上,將倒數(shù)節(jié)點(diǎn)放置在程序框圖中。⑤在函數(shù)選板上單擊【編程】/【簇、類(lèi)與變體】/【捆綁】,將其拖放在程序框圖中。捆綁節(jié)點(diǎn)左側(cè)只有兩個(gè)輸入端口,可以使用定位工具向下拖動(dòng)節(jié)點(diǎn),或在節(jié)點(diǎn)左側(cè)輸入端處右擊彈出快捷菜單選擇【添加輸入】來(lái)增加輸入接線端的數(shù)量。本練習(xí)中輸入接線端有3個(gè)。
⑥使用連線工具,連接各個(gè)節(jié)點(diǎn),如圖3.28所示。
注意:查看圖3.28所示的程序框圖,可以看到在連接到【正弦波】VI之前,信號(hào)頻率已經(jīng)被采樣頻率相除。也就是說(shuō),正弦波函數(shù)需要輸入信號(hào)的數(shù)字頻率。讀者需仔細(xì)體會(huì)數(shù)字頻率的概念。圖3.28SineWave程序框圖
(5)保存VI并命名為SineWave。
(6)返回前面板,運(yùn)行VI,此時(shí)生成2?Hz的正弦波信號(hào)。數(shù)字頻率為2/50(=1/25),即表示在一個(gè)信號(hào)周期采樣25點(diǎn),由于采樣點(diǎn)數(shù)設(shè)置為51,所以顯示兩個(gè)完整周期的正弦波形。
(7)改變相位輸入的值,分別為45,90,180,360,反復(fù)運(yùn)行VI,觀察每次顯示波形初始狀態(tài)的變化。3.3.2時(shí)域分析
由測(cè)試所得的信號(hào)一般都是時(shí)域信號(hào),直接對(duì)其進(jìn)行在時(shí)域內(nèi)的分析,稱(chēng)為信號(hào)的時(shí)域分析。信號(hào)的時(shí)域描述是以時(shí)間t為橫坐標(biāo)變量來(lái)描述信號(hào)隨時(shí)間的變化規(guī)律。時(shí)域分析具有直觀感強(qiáng)、物理概念明確等特點(diǎn)。
LabVIEW中用于時(shí)域分析的函數(shù),位于函數(shù)選板上的【信號(hào)處理】/【信號(hào)運(yùn)算】中,如圖3.29所示。【信號(hào)運(yùn)算】提供的分析函數(shù)有卷積、反卷積、自相關(guān)、互相關(guān)等。圖3.29信號(hào)運(yùn)算選板
【例3-1】周期信號(hào)檢測(cè)。
自相關(guān)函數(shù)常被用來(lái)檢測(cè)信號(hào)中有無(wú)周期成分。如果信號(hào)中含有周期成分,則其自相關(guān)函數(shù)衰減很慢而且具有明顯的周期性。如圖3.30所示,設(shè)信號(hào)由一個(gè)正弦波和噪聲疊加而成,當(dāng)噪聲幅值與正弦波幅值一樣時(shí),可以看到自相關(guān)函數(shù)衰減很慢而且具有明顯的周期性,如圖3.30(a)所示。如果增大噪聲幅值,使其遠(yuǎn)大于正弦波幅值時(shí),從自相關(guān)函數(shù)圖中就很難看到周期成分了,因?yàn)檎抑芷谛盘?hào)已經(jīng)被噪聲淹沒(méi)了,如圖3.30(b)所示。圖3.30自相關(guān)函數(shù)舉例3.3.3頻域分析
頻域分析是數(shù)字信號(hào)處理中最常用、最重要的方法。由測(cè)試所得的信號(hào)一般都是時(shí)域信號(hào),如果用戶(hù)更想了解信號(hào)的頻率成分,這時(shí)就要對(duì)信號(hào)進(jìn)行頻域分析。信號(hào)的時(shí)域分析和頻域分析是對(duì)同一個(gè)信號(hào)的兩種描述,兩者是惟一對(duì)應(yīng)的。
LabVIEW中用于頻域分析的函數(shù)有兩個(gè)選板,一個(gè)是【變換】選板,另一個(gè)是【譜分析】選板,都位于函數(shù)選板下的【信號(hào)處理】中,如圖3.31所示。
【變換】選板實(shí)現(xiàn)的函數(shù)功能有FFT、Hilbert變換、小波變換、拉普拉斯變換等。【譜分析】選板實(shí)現(xiàn)的函數(shù)功能有功率譜分析、STFT時(shí)頻圖等。此外,函數(shù)選板上的【信號(hào)處理】/【波形測(cè)量】中提供了波形數(shù)據(jù)類(lèi)型的頻域分析函數(shù)。圖3.31頻域分析函數(shù)選板傅立葉變換是數(shù)字信號(hào)處理中的一個(gè)重要的分析工具,其意義在于將時(shí)域與頻域信號(hào)聯(lián)系了起來(lái)。頻域分析將復(fù)雜的信號(hào)分解為各個(gè)單一頻率成分,因此一些在時(shí)域中難以分析的信號(hào),在頻域中它的特點(diǎn)一目了然。例如我們要檢測(cè)吵鬧的機(jī)器聲中軸承損傷時(shí)早期的影響,這時(shí)利用示波器觀察波形就很難看出來(lái),如果使用頻域分析,就可以把淹沒(méi)在大信號(hào)中很小的諧波分量顯現(xiàn)出來(lái)。頻域分析提供了分析微弱而又有重要作用信號(hào)的工具。
將信號(hào)由時(shí)域變換到頻域的一種通用算法是離散傅立葉變換(DFT)。DFT建立了時(shí)域中的信號(hào)采樣與其頻域表示法之間的聯(lián)系。但由于DFT運(yùn)算量太大,耗時(shí)長(zhǎng),在許多應(yīng)用場(chǎng)合,普遍采用快速傅立葉變換(FFT)。FFT是DFT的一種有效簡(jiǎn)化的快速算法。
【例3-2】雙邊傅立葉變換。
通過(guò)正弦信號(hào)生成函數(shù)生成一個(gè)正弦信號(hào),并將其進(jìn)行雙邊傅立葉變換。前面板上方顯示的是信號(hào)的時(shí)域波形,其橫軸顯示的是采樣點(diǎn)數(shù)。下方為信號(hào)的頻域顯示,橫軸為頻率軸,如圖3.32(a)所示。
(1)設(shè)置采樣點(diǎn)數(shù)為128,信號(hào)頻率為5?Hz,采樣頻率為100?Hz,運(yùn)行VI,觀察信號(hào)頻譜。圖3.32(a)中顯示的是頻率為5?Hz時(shí)的信號(hào)頻譜。從圖上可以看出,頻譜在5?Hz和95?Hz處各有一個(gè)峰,這是因?yàn)橛?jì)算得到的結(jié)果是采樣信號(hào)頻譜在0到100?Hz(采樣頻率)上,它不僅含有正頻率成分,而且含有與之對(duì)稱(chēng)的負(fù)頻率成分。信號(hào)頻率等于5?Hz時(shí),在95?Hz處出現(xiàn)的譜峰實(shí)際上對(duì)應(yīng)的頻率是?-5?Hz。這種既有正頻率又有負(fù)頻率的圖形,稱(chēng)為雙邊FFT。
(2)分別改變信號(hào)頻率為20?Hz和40?Hz,運(yùn)行VI,觀察譜峰情況。這時(shí)讀者會(huì)發(fā)現(xiàn),隨著不斷地增大信號(hào)頻率,正負(fù)頻率對(duì)應(yīng)的頻譜逐漸靠近。
(3)改變信號(hào)頻率為52?Hz,觀察此時(shí)的頻譜與(2)的結(jié)果有何不同?圖3.32雙邊傅立葉變換舉例由于采樣頻率fs為100?Hz,那么奈奎斯特頻率為fs
/2=50?Hz,因此只能對(duì)頻率小于50?Hz的信號(hào)進(jìn)行正確采樣。因?yàn)?2?Hz>50?Hz,所以會(huì)出現(xiàn)頻譜混疊現(xiàn)象,52?Hz對(duì)應(yīng)的混疊頻率為|100-52|?=?48?Hz,那么52?Hz信號(hào)頻率的譜峰在48?Hz處可看到。這就是采樣定理所限制的結(jié)果,因此為了能夠獲得正確的頻譜,采樣時(shí)必須滿(mǎn)足采樣定理。
(4)改變信號(hào)頻率為36?Hz和64?Hz,運(yùn)行VI,觀察兩種頻譜顯示結(jié)果是否相同,解釋為什么。
通過(guò)對(duì)此例的分析可知,F(xiàn)FT的輸出結(jié)果是雙邊頻譜,即包含正、負(fù)頻率成分。實(shí)際上,頻譜中絕對(duì)值相同的正、負(fù)頻率對(duì)應(yīng)的信號(hào)頻率是相同的,負(fù)頻率只是由于數(shù)學(xué)變換才出現(xiàn)的。因此,通過(guò)編程可將雙邊頻譜轉(zhuǎn)換為單邊頻譜,即去掉負(fù)頻率對(duì)應(yīng)的頻譜,只顯示FFT的一半信息(只有正頻率成分),但是必須將正頻率對(duì)應(yīng)幅值加倍,才能獲得正確的幅值信息,零頻率(直流成分)對(duì)應(yīng)的頻譜無(wú)需進(jìn)行擴(kuò)展。這種方法稱(chēng)為單邊FFT。
【例3-3】單邊傅立葉變換。
(1)前面板對(duì)象同例3-2。
(2)按圖3.33(b)所示對(duì)例3-2的程序框圖進(jìn)行修改。
(3)設(shè)置采樣點(diǎn)數(shù)為100,信號(hào)頻率為5?Hz,采樣頻率為100?Hz,運(yùn)行VI,顯示結(jié)果如圖3.33(a)所示,僅在信號(hào)頻率5?Hz處顯示譜線。
(4)改變信號(hào)頻率為35?Hz,運(yùn)行VI,觀察其結(jié)果。
(5)改變信號(hào)頻率為70?Hz,運(yùn)行VI,觀察其結(jié)果并與例3-2比較有什么不同,為什么?圖3.33單邊傅立葉變換舉例3.3.4數(shù)字濾波器
濾波是信號(hào)處理中的一項(xiàng)基本而重要的技術(shù)。利用濾波技術(shù)可以從各種信號(hào)中提取出所需要的信號(hào),濾除不需要的干擾信號(hào)。按處理信號(hào)的不同,濾波器分為模擬濾波器與數(shù)字濾波器兩大類(lèi)。模擬濾波器用來(lái)處理模擬信號(hào)或連續(xù)時(shí)間信號(hào),數(shù)字濾波器用來(lái)處理離散的數(shù)字信號(hào)。本節(jié)將重點(diǎn)介紹數(shù)字濾波器。
數(shù)字濾波器與模擬濾波器相比,具有以下優(yōu)點(diǎn):
①是軟件編程的;
②精度高;③具有較高的性能價(jià)格比;
④可靠性高,不會(huì)隨外界環(huán)境的變化而漂移。
數(shù)字濾波是用數(shù)值計(jì)算的方法來(lái)實(shí)現(xiàn)對(duì)離散化信號(hào)的處理,以減少干擾信號(hào)在有用信號(hào)中所占的比例,從而改變信號(hào)的質(zhì)量,達(dá)到濾波的目的。
濾波器理論在此不做深入探討,本節(jié)只討論數(shù)字濾波器在LabVIEW中的實(shí)現(xiàn)。
右擊程序框圖空白處,彈出函數(shù)選板,單擊【信號(hào)處理】/【濾波器】,如圖3.34所示。LabVIEW提供了14種常用的數(shù)字濾波器,使用起來(lái)非常方便,只需要輸入相應(yīng)的參數(shù)即可。此外,LabVIEW還提供了高級(jí)IIR和FIR濾波器子選板。圖3.34濾波器函數(shù)選板
【練習(xí)3-5】學(xué)習(xí)使用低通濾波器。
目標(biāo):創(chuàng)建一個(gè)低通濾波器VI,該VI從含有高頻噪聲的信號(hào)中提取出正弦波信號(hào)。
設(shè)計(jì):DigitalFilterVI。本練習(xí)中,輸入信號(hào)為一個(gè)正弦波,并加入一個(gè)白噪聲,以模擬信號(hào)傳輸中的隨機(jī)干擾信號(hào),設(shè)計(jì)一個(gè)低通Butterworth濾波器,來(lái)濾除信號(hào)中的噪聲分量。
(1)打開(kāi)一個(gè)新的VI。
(2)創(chuàng)建前面板。
①右擊前面板空白處,彈出控件選板。②在控件選板上單擊【Express】/【數(shù)值輸入控件】/【數(shù)值輸入控件】,將其拖放在前面板上。
③使用標(biāo)簽工具將其命名為信號(hào)頻率,并設(shè)置數(shù)值為10?Hz。
④依據(jù)此方法創(chuàng)建并命名采樣、采樣頻率兩個(gè)數(shù)值輸入控件,數(shù)值分別設(shè)置為500和500。
⑤在控件選板上單擊【Express】/【圖形顯示控件】/【波形圖】,將其拖放在前面板上。
⑥使用標(biāo)簽工具將其命名為輸入信號(hào)。
⑦依據(jù)此方法創(chuàng)建并命名濾波后的信號(hào)、輸入信號(hào)頻譜和濾波后的信號(hào)頻譜三個(gè)波形圖控件。⑧在控件選板上單擊【Express】/【數(shù)值輸入控件】/【垂直指針滑動(dòng)桿】,將其拖放在前面板上。
⑨使用標(biāo)簽工具將其命名為截止頻率。
⑩依據(jù)此方法創(chuàng)建并命名濾波器階數(shù)的垂直指針滑動(dòng)桿控件。
在控件選板上單擊【Express】/【按鈕與開(kāi)關(guān)】/【停止按鈕】,將其拖放在前面板上。
前面板如圖3.35所示。圖3.35DigitalFilter前面板
(3)切換到VI的程序框圖。
(4)創(chuàng)建程序框圖。
首先程序生成一個(gè)正弦波信號(hào),同時(shí)由均勻白噪聲VI生成一個(gè)噪聲信號(hào),使其通過(guò)一個(gè)Butterworth高通濾波器(該濾波器的截止頻率設(shè)為100?Hz,即濾掉頻率小于100?Hz的低頻噪聲),生成高頻噪聲并與正弦波疊加,用以模擬含有高頻噪聲的信號(hào)。將該信號(hào)通過(guò)一個(gè)Butterworth低通濾波器(該濾波器截止頻率的值由前面板截止頻率控件設(shè)置,本練習(xí)中設(shè)為20Hz,即濾掉頻率大于20?Hz的噪聲)后輸出顯示。本練習(xí)中還設(shè)計(jì)了信號(hào)在濾波前后的頻域顯示。①右擊程序框圖空白處,彈出函數(shù)選板。
②在函數(shù)選板上單擊【信號(hào)處理】/【信號(hào)生成】/【正弦波】,將其拖放在程序框圖中。
③在函數(shù)選板上單擊【編程】/【結(jié)構(gòu)】/【W(wǎng)hile循環(huán)】,將其拖放在程序框圖中。
④在函數(shù)選板上單擊【編程】/【數(shù)值】/【除】,將其拖放在程序框圖中。
⑤在函數(shù)選板上單擊【信號(hào)處理】/【信號(hào)生成】/【均勻白噪聲】,將其拖放在程序框圖中。
⑥在函數(shù)選板上單擊【信號(hào)處理】/【濾波器】/【Butterworth濾波器】,將其拖放在程序框圖中。濾波器階數(shù)設(shè)置為5。
⑦在函數(shù)選板上單擊【編程】/【數(shù)值】/【加】,將其拖放在程序框圖中。
⑧在函數(shù)選板上單擊【編程】/【簇、類(lèi)與變體】/【捆綁】,將其拖放在程序框圖中。
⑨在函數(shù)選板上單擊【編程】/【數(shù)值】/【倒數(shù)】,將其拖放在程序框圖中。
⑩在函數(shù)選板上單擊【信號(hào)處理】/【變換】/【FFT】,將其拖放在程序框圖中。在函數(shù)選板上單擊【編程】/【數(shù)組】/【數(shù)組大小】,將其拖放在程序框圖中。
在函數(shù)選板上單擊【編程】/【數(shù)組】/【數(shù)組子集】,將其拖放在程序框圖中。
在函數(shù)選板上單擊【編程】/【數(shù)值】/【復(fù)數(shù)】/【復(fù)數(shù)至極坐標(biāo)轉(zhuǎn)換】,將其拖放在程序框圖中。
在函數(shù)選板上單擊【編程】/【定時(shí)】/【等待】,將其拖放在程序框圖中。
使用連線工具,連接各個(gè)節(jié)點(diǎn)。
程序框圖如圖3.36所示。圖3.36DigitalFilter程序框圖
(5)保存VI并命名為DigitalFilter。
(6)返回前面板,運(yùn)行VI。
(7)改變前面板上濾波器階數(shù),觀察濾波后的信號(hào)波形的變化。
(8)改變截止頻率,觀察程序運(yùn)行的結(jié)果。
3.4虛擬信號(hào)發(fā)生器的設(shè)計(jì)
3.4.1問(wèn)題描述
創(chuàng)建一個(gè)VI,該VI可以產(chǎn)生正弦波、方波(占空比可調(diào))、三角波和鋸齒波的信號(hào)發(fā)生器。3.4.2設(shè)計(jì)
(1)打開(kāi)一個(gè)新的VI。
(2)創(chuàng)建前面板。
①右擊前面板空白處,彈出控件選板。
②在控件選板上單擊【新式】/【下拉列表與枚舉】/【枚舉】,將其拖放在前面板上。
③使用標(biāo)簽工具將其命名為信號(hào)源。
④右擊信號(hào)源控件,在彈出的快捷菜單中選擇【編輯項(xiàng)】,在【編輯項(xiàng)】選項(xiàng)卡中單擊“插入”,輸入“正弦波”,對(duì)應(yīng)的數(shù)字顯示為0。同樣的方法輸入“三角波”、“方波”、“鋸齒波”,對(duì)應(yīng)的數(shù)字顯示分別為1、2、3,如圖3.37所示。圖3.37信號(hào)源編輯項(xiàng)選項(xiàng)卡⑤依據(jù)上述方法分別創(chuàng)建命名信號(hào)頻率、采樣頻率、采樣、占空比四個(gè)數(shù)值輸入控件。
⑥在控件選板上單擊【Express】/【按鈕與開(kāi)關(guān)】/【停止按鈕】,將其拖放在前面板上,同時(shí)隱藏其標(biāo)簽。
⑦在控件選板上單擊【Express】/【圖形顯示控件】/【波形圖】,將其拖放在前面板上,同時(shí)隱藏其標(biāo)簽和圖例。
前面板如圖3.38所示。圖3.38虛擬信號(hào)發(fā)生器前面板
(3)切換到VI的程序框圖。
(4)創(chuàng)建程序框圖。
①右擊程序框圖空白處,彈出函數(shù)選板。
②在函數(shù)選板上單擊【編程】/【結(jié)構(gòu)】/【W(wǎng)hile循環(huán)】,將其拖放在程序框圖中,并包圍前面板上所有控件的對(duì)應(yīng)節(jié)點(diǎn)。
③在函數(shù)選板上單擊【編程】/【結(jié)構(gòu)】/【條件結(jié)構(gòu)】,將其拖放在While循環(huán)結(jié)構(gòu)中。
④使用連線工具將信號(hào)源節(jié)點(diǎn)(枚舉型)連接到條件結(jié)構(gòu)的選擇器接線端,此時(shí)選擇器標(biāo)簽值由“真”、“假”變?yōu)椤罢也?,默認(rèn)”、“三角波”。⑤右擊條件結(jié)構(gòu)邊框,在彈出的快捷菜單中選擇【在后面添加分支】。同樣的方法重復(fù)操作一次。此時(shí)條件結(jié)構(gòu)添加了兩個(gè)分支,其標(biāo)簽值分別為“方波”、“鋸齒波”。
⑥在函數(shù)選板上單擊【信號(hào)處理】/【信號(hào)生成】/【正弦波】,將其拖放在標(biāo)簽值為“正弦波,默認(rèn)”的條件結(jié)構(gòu)中。依據(jù)此方法放置三角波、方波和鋸齒波函數(shù)到對(duì)應(yīng)條件結(jié)構(gòu)子程序框圖中。
⑦在函數(shù)選板上單擊【編程】/【數(shù)值】/【除】,將其拖放在程序框圖中。⑧在函數(shù)選板上單擊【編程】/【數(shù)值】/【倒數(shù)】,將其拖放在程序框圖中。采樣頻率作為此節(jié)點(diǎn)的輸入。
⑨在函數(shù)選板上單擊【編程】/【簇、類(lèi)與變體】/【捆綁】,將其拖放在程序框圖中。
⑩在函數(shù)選板上單擊【編程】/【定時(shí)】/【等待】,將其拖放在程序框圖中并輸入數(shù)值200。
程序框圖如圖3.39所示。圖3.39虛擬信號(hào)發(fā)生器程序框圖(5)保存VI并命名為虛擬信號(hào)發(fā)生器。
(6)前面板控件參數(shù)設(shè)置為:
①信號(hào)類(lèi)型:正弦波;
②幅值:2;
③信號(hào)頻率:30;
④采樣頻率:1000;
⑤采樣:100;
⑥占空比:50;
⑦相位輸入(度):45;
⑧重置相位:開(kāi)。運(yùn)行VI,觀察波形。
(7)改變采樣值,觀察曲線有何變化。為什么?
(8)重置相位改變?yōu)殛P(guān),觀察曲線,是否有所不同?
(9)選擇信號(hào)源為方波,改變占空比的值,注意觀察曲線有何變化。讀者要深刻理解方波占空比的概念。
(10)選擇不同的信號(hào)源,運(yùn)行VI。
3.5局部變量和全局變量
在LabVIEW中,通過(guò)前面板對(duì)象的程序框圖接線端進(jìn)行數(shù)據(jù)訪問(wèn)。每個(gè)前面板對(duì)象只有一個(gè)對(duì)應(yīng)的程序框圖接線端,但有時(shí)應(yīng)用程序可能需要從多個(gè)不同位置訪問(wèn)該接線端中的數(shù)據(jù),這時(shí)就需要用到局部變量和全局變量。局部變量和全局變量用于應(yīng)用程序中無(wú)法連線的位置間的信息傳遞。
局部變量和全局變量位于函數(shù)選板上的【編程】/【結(jié)構(gòu)】(或【數(shù)據(jù)通信】)中,如圖3.40所示。圖3.40局部變量和全局變量節(jié)點(diǎn)3.5.1局部變量
局部變量可從一個(gè)VI的不同位置訪問(wèn)前面板對(duì)象,在單個(gè)VI中傳輸數(shù)據(jù)。局部變量可對(duì)前面板上的輸入控件或顯示件進(jìn)行數(shù)據(jù)讀寫(xiě)。寫(xiě)入一個(gè)局部變量相當(dāng)于將數(shù)據(jù)傳遞給其它接線端。但是,局部變量還可向輸入控件寫(xiě)入數(shù)據(jù)和從顯示控件讀取數(shù)據(jù)。事實(shí)上,通過(guò)局部變量,前面板對(duì)象既可作為輸入訪問(wèn),也可作為輸出訪問(wèn)。
1.創(chuàng)建局部變量
創(chuàng)建局部變量有兩種方法:
(1)直接為前面板對(duì)象創(chuàng)建局部變量。右擊前面板對(duì)象或程序框圖接線端,并從彈出的快捷菜單中選擇【創(chuàng)建】/【局部變量】來(lái)創(chuàng)建一個(gè)局部變量。該對(duì)象的局部變量的圖標(biāo)將出現(xiàn)在程序框圖上。如圖3.41所示,左面為一個(gè)數(shù)值輸入控件創(chuàng)建局部變量,右面是控件對(duì)應(yīng)在程序框圖的局部變量圖標(biāo)。圖3.41創(chuàng)建局部變量方法一
(2)通過(guò)函數(shù)選板創(chuàng)建局部變量。從函數(shù)選板上選擇一個(gè)局部變量,將其放置在程序框圖上,如圖3.42所示。此時(shí)局部變量節(jié)點(diǎn)尚未與一個(gè)輸入控件或顯示控件相關(guān)聯(lián),如圖3.43所示。
如果需要使局部變量與輸入控件或顯示控件相關(guān)聯(lián),可右擊該局部變量節(jié)點(diǎn),從快捷菜單中選擇【選擇項(xiàng)】。展開(kāi)的快捷菜單將列出所有帶有自帶標(biāo)簽的前面板對(duì)象。LabVIEW通過(guò)自帶標(biāo)簽將局部變量和前面板對(duì)象相關(guān)聯(lián),因此必須用描述性的自帶標(biāo)簽對(duì)前面板控件和顯示件進(jìn)行標(biāo)注。圖3.42創(chuàng)建局部變量方法二圖3.43局部變量節(jié)點(diǎn)
2.局部變量的屬性
局部變量具有讀取、寫(xiě)入兩種屬性。默認(rèn)狀態(tài)下,局部變量為寫(xiě)入變量,其邊框較細(xì)??梢酝ㄟ^(guò)右擊局部變量,從快捷菜單中選擇【轉(zhuǎn)換為讀取】,將該局部變量配置為讀取變量。局部變量變?yōu)樽x取變量,邊框較粗。寫(xiě)入變量意味著要改變局部變量的值,類(lèi)似顯示控件。讀取變量意味著改變局部變量的值,類(lèi)似于輸入控件。
【例3-4】使用局部變量訪問(wèn)同一個(gè)控件。
對(duì)前面板名為溫度的輸入控件創(chuàng)建兩個(gè)局部變量,設(shè)置其中一個(gè)變量屬性為寫(xiě)入(默認(rèn)狀態(tài)),另一個(gè)變量屬性為讀取。將溫度輸入控件的值寫(xiě)入溫度局部變量,然后再?gòu)臏囟染植孔兞孔x取溫度值,如圖3.44所示。圖3.44局部變量使用舉例
【例3-5】使用布爾開(kāi)關(guān)控制兩個(gè)并行的While循環(huán)同時(shí)停止運(yùn)行,并使開(kāi)關(guān)復(fù)位。
如圖3.45所示,在前面板上放置一個(gè)停止布爾開(kāi)關(guān),該開(kāi)關(guān)的機(jī)械動(dòng)作為釋放時(shí)轉(zhuǎn)換。在程序框圖中使用了兩個(gè)While循環(huán)分別產(chǎn)生正弦波和三角波,同時(shí)為布爾開(kāi)關(guān)創(chuàng)建了兩個(gè)局部變量,一個(gè)變量屬性為寫(xiě)入,一個(gè)變量屬性為讀取。程序中將布爾開(kāi)關(guān)的端口連接到While循環(huán)的條件接線端,將布爾開(kāi)關(guān)的局部變量連接到另一個(gè)While循環(huán)的條件接線端子上。這樣只用一個(gè)布爾開(kāi)關(guān)就可同時(shí)控制兩個(gè)While循環(huán)。布爾開(kāi)關(guān)的初始值設(shè)為真,程序運(yùn)行中操作該開(kāi)關(guān),使其狀態(tài)由真值變?yōu)榧贂r(shí),循環(huán)結(jié)束。由于開(kāi)關(guān)值與其局部變量值相同,因此退出循環(huán)后二者的狀態(tài)值都是假,這時(shí)可以通過(guò)或非節(jié)點(diǎn)使其變?yōu)檎?,?xiě)入開(kāi)關(guān)局部變量,從而使開(kāi)關(guān)返回到初始真值。
說(shuō)明:不可在含有局部變量的對(duì)象中使用觸發(fā)機(jī)械動(dòng)作,因?yàn)榈谝粋€(gè)讀取帶有觸發(fā)動(dòng)作的布爾控件的本地變量將重設(shè)為其默認(rèn)值。圖3.45使用局部變量控制兩個(gè)并行的While循環(huán)3.5.2全局變量
由上一節(jié)可知,局部變量可以在一個(gè)VI范圍內(nèi)共享數(shù)據(jù)。而全局變量可在同時(shí)運(yùn)行的多個(gè)VI之間訪問(wèn)和傳遞數(shù)據(jù),這些VI可以是并行的,也可以是不便于通過(guò)接口傳遞數(shù)據(jù)的主程序和子程序。
例如:假設(shè)現(xiàn)有2個(gè)同時(shí)運(yùn)行的VI,每個(gè)VI含有一個(gè)While循環(huán)并將數(shù)據(jù)點(diǎn)寫(xiě)入一個(gè)波形圖表,第一個(gè)VI含有一個(gè)布爾控件來(lái)終止這兩個(gè)VI。此時(shí)須用全局變量通過(guò)一個(gè)布爾控件將這兩個(gè)循環(huán)終止。如這兩個(gè)循環(huán)在同一個(gè)VI的同一張程序框圖上,可用一個(gè)局部變量來(lái)終止這兩個(gè)循環(huán)。
1.創(chuàng)建全局變量
可創(chuàng)建多個(gè)僅含有一個(gè)前面板對(duì)象的全局VI,也可創(chuàng)建一個(gè)含有多個(gè)前面板對(duì)象的全局VI將相似的變量歸為一組,后者效率更高。
下面舉例說(shuō)明如何創(chuàng)建局部變量。
①?gòu)暮瘮?shù)選板上選擇一個(gè)全局變量,將其放置在程序框圖上,如圖3.46所示。此時(shí)程序框圖出現(xiàn)一個(gè)帶問(wèn)號(hào)的全局變量節(jié)點(diǎn),如圖3.47所示。圖3.46創(chuàng)建全局變量圖3.47全局變量圖標(biāo)②用操作工具或定位工具雙擊該全局變量節(jié)點(diǎn),或在全局變量節(jié)點(diǎn)上右擊彈出快捷菜單選擇【打開(kāi)前面板】,如圖3.48所示,打開(kāi)全局VI的前面板。該前面板與標(biāo)準(zhǔn)前面板一樣,可放置一個(gè)或多個(gè)輸入控件和顯示控件。圖3.48右擊打開(kāi)全局變量前面板
說(shuō)明:全局變量VI很特殊,只有前面板而沒(méi)有程序框圖。全局變量?jī)H是作為前面板對(duì)象的存儲(chǔ)器,存盤(pán)后才能在VI中使用。
③在前面板窗口添加一個(gè)溫度數(shù)值輸入控件和一個(gè)停止布爾開(kāi)關(guān),如圖3.49所示。每一個(gè)控件都是一個(gè)全局變量。圖3.49全局變量VI前面板
說(shuō)明:LabVIEW使用自帶標(biāo)簽表示全局變量,因此應(yīng)為前面板輸入控件和顯示控件使用描述性的自帶標(biāo)簽進(jìn)行標(biāo)注。
④保存全局VI并命名為“全局變量”。關(guān)閉全局VI。
⑤回到原VI的程序框圖,右擊該全局變量節(jié)點(diǎn)并從快捷菜單【選擇項(xiàng)】中選擇一個(gè)前面板對(duì)象。該快捷菜單列出了前面板上有自帶標(biāo)簽的對(duì)象。也可用操作工具或標(biāo)簽工具單擊全局變量節(jié)點(diǎn),從快捷菜單上選擇【前面板對(duì)象】來(lái)完成這一步,如圖3.50所示。圖3.50選擇前面板停止布爾開(kāi)關(guān)作為全局變量
2.全局變量的屬性
與局部變量一樣,全局變量也具有讀取、寫(xiě)入兩種屬性。默認(rèn)狀態(tài)下,全局變量是寫(xiě)入變量,其邊框較細(xì)??梢酝ㄟ^(guò)右擊全局變量,從快捷菜單中選擇【轉(zhuǎn)換為讀取】,將該全局變量配置為讀取變量。全局變量變?yōu)樽x取變量,邊框較粗。再次右鍵單擊全局變量節(jié)點(diǎn),從快捷菜單中選擇【轉(zhuǎn)換為寫(xiě)入】,將該變量變?yōu)閷?xiě)入全局變量。
3.全局變量的使用方法
在VI程序框圖中單擊【函數(shù)】/【選擇VI…】,在彈出的對(duì)話框中選擇需要打開(kāi)的全局VI(如上文已存盤(pán)的“全局變量”VI),在程序框圖上放置一個(gè)全局變量,該全局變量與前面板對(duì)象相關(guān),如圖3.51所示。單擊全局變量節(jié)點(diǎn),選擇所需的前面板對(duì)象,如圖3.52所示。圖3.51在程序框圖中放置全局變量圖3.52選擇全局變量對(duì)應(yīng)的前面板對(duì)象
【例3-6】使用全局變量傳遞波形數(shù)據(jù)。
創(chuàng)建1個(gè)全局變量和2個(gè)VI,第1個(gè)VI產(chǎn)生正弦波數(shù)據(jù)(如圖3.53所示),并寫(xiě)入“正弦波形數(shù)據(jù)”全局變量(如圖3.54所示)中。第2個(gè)VI從全局變量中將波形數(shù)據(jù)讀出,并顯示在前面板上,如圖3.55所示。圖3.53第1個(gè)VI圖3.54全局變量前面板圖3.55第2個(gè)VI前面板和程序框圖3.5.3局部變量和全局變量的使用提示
局部變量和全局變量的使用是LabVIEW編程的難點(diǎn)。LabVIEW程序最大的特點(diǎn)是數(shù)據(jù)流編程模式,而局部變量和全局變量不是數(shù)據(jù)流的組成部分。使用局部變量和全局變量,使程序變得難以讀懂,因此需謹(jǐn)慎使用。
(1)局部變量和全局變量的初始化。在使用局部變量和全局變量的VI運(yùn)行前,局部變量和全局變量的值是相應(yīng)的前面板對(duì)象的默認(rèn)值。如果不能確保這些值符合VI運(yùn)行的要求,就需要對(duì)它們進(jìn)行初始化,否則變量可能導(dǎo)致VI運(yùn)行錯(cuò)誤。
(2)使用局部變量和全局變量應(yīng)考慮計(jì)算機(jī)的內(nèi)存。局部變量是其相應(yīng)前面板對(duì)象拷貝的一個(gè)數(shù)據(jù)副本,要占用一定的內(nèi)存。在程序中要控制局部變量的數(shù)量,特別是那些包含大量數(shù)據(jù)的數(shù)組,若在程序中使用很多,就會(huì)占用大量的內(nèi)存,使程序的執(zhí)行變得緩慢,從而降低程序運(yùn)行的效率。
從一個(gè)全局變量讀取數(shù)據(jù)時(shí),LabVIEW也創(chuàng)建一份該全局變量的數(shù)據(jù)副本。這樣當(dāng)操作大型數(shù)組和字符串時(shí),將占用相當(dāng)多的時(shí)間和內(nèi)存來(lái)操作全局變量。從程序中幾個(gè)不同的位置讀取全局變量時(shí),就會(huì)建立幾個(gè)數(shù)據(jù)緩沖區(qū),從而導(dǎo)致執(zhí)行效率和性能降低。
3.6移?位?寄?存?器
移位寄存器可用于將上一次循環(huán)的值傳遞至下一次循環(huán),本節(jié)將介紹如何使用移位寄存器在循環(huán)結(jié)構(gòu)中傳遞數(shù)據(jù)。
3.6.1移位寄存器的概念
移位寄存器相當(dāng)于循環(huán)結(jié)構(gòu)中的一個(gè)本地變量,移位寄存器以一對(duì)接線端的形式出現(xiàn),分別位于循環(huán)結(jié)構(gòu)(While循
環(huán)或For循環(huán))兩側(cè)的邊框上,位置相對(duì)。其圖標(biāo)分別為
?和?。移位寄存器的工作過(guò)程如圖3.56所示。右側(cè)接線端含有一個(gè)向上的箭頭,用于存儲(chǔ)每次循環(huán)結(jié)束時(shí)的數(shù)據(jù)。這些數(shù)據(jù)在這次循環(huán)結(jié)束之后將被轉(zhuǎn)移到左邊的端子,循環(huán)將使用左側(cè)接線端的數(shù)據(jù)作為下一次循環(huán)的初始值。該過(guò)程在所有循環(huán)執(zhí)行完畢后結(jié)束。循環(huán)結(jié)束后,右側(cè)接線端保存的是最后一次循環(huán)中程序產(chǎn)生的數(shù)據(jù)值;左側(cè)接線端則保存的是倒數(shù)第二次循環(huán)中程序所產(chǎn)生的數(shù)據(jù)值。
移位寄存器可以傳遞任何數(shù)據(jù)類(lèi)型,并和與其連接的第一個(gè)對(duì)象的數(shù)據(jù)類(lèi)型自動(dòng)保持一致。連接到各個(gè)移位寄存器接線端的數(shù)據(jù)必須屬于同一種數(shù)據(jù)類(lèi)型。圖3.56移位寄存器的工作過(guò)程3.6.2創(chuàng)建移位寄存器
創(chuàng)建一個(gè)移位寄存器的方法是:右擊循環(huán)的邊框,單擊快捷菜單中的【添加移位寄存器】,如圖3.57所示。
循環(huán)中可添加多個(gè)移位寄存器。如循環(huán)中的多個(gè)操作都需使用上一次循環(huán)的值,可以通過(guò)多個(gè)移位寄存器保存結(jié)構(gòu)中不同操作的數(shù)據(jù)值。創(chuàng)建多個(gè)移位寄存器的方法是:重復(fù)右擊循環(huán)邊框,單擊快捷菜單中的【添加移位寄存器】。有幾個(gè)操作需要使用上次的值,就需要重復(fù)圖3.57中的操作。
圖3.58所示程序中有兩個(gè)移位寄存器,分別用于存儲(chǔ)每次程序中的加法和乘法運(yùn)算的結(jié)果。圖3.57創(chuàng)建一個(gè)移位寄存器圖3.58兩個(gè)移位寄存器的程序
說(shuō)明:圖3.58所示的程序中,右上角的移位寄存器接線端將2,即第一次循環(huán)中0和2之和傳遞到左上角的移位寄存器接線端,作為加運(yùn)算第二次循環(huán)的初始值。右下角的移位寄存器接線端將2,即第一次循環(huán)中1和2之積傳遞到左下角的移位寄存器接線端,作為乘運(yùn)算第二次循環(huán)的初始值。第二次循環(huán)將2和2相加并將結(jié)果4傳遞到左上角的移位寄存器接線端,以用于加運(yùn)算第三次循環(huán)。第二次循環(huán)將2和2相加并將結(jié)果4與2相乘傳遞到左下角的移位寄存器接線端,以用于乘運(yùn)算第三次循環(huán)。十次循環(huán)后,右上角的接線端將加運(yùn)算的最終結(jié)果傳遞到數(shù)值1顯示控件,右下角的接線端將乘運(yùn)算的最終結(jié)果傳遞到數(shù)值2顯示控件。3.6.3初始化移位寄存器
初始化移位寄存器,即設(shè)置VI運(yùn)行時(shí)移位寄存器傳遞給第一次循環(huán)的值。移位寄存器的初始化是通過(guò)從循環(huán)的外部將常數(shù)或控件連接到移位寄存器的左側(cè)接線端子上來(lái)實(shí)現(xiàn)的。如圖3.59所示,在首次執(zhí)行代碼時(shí),移位寄存器的初始值為0,最終值為10;在第二次執(zhí)代碼時(shí),移位寄存器的初始值仍為0,最終值也是10。圖3.59初始化移位寄存器的兩次運(yùn)行VI結(jié)果
說(shuō)明:在圖3.59所示的程序中,F(xiàn)or循環(huán)將執(zhí)行5次,每次循環(huán)后,移位寄存器的值都增加比循環(huán)次數(shù)少一的值。For循環(huán)完成5次循環(huán)后,移位寄存器會(huì)將最終值10傳遞給顯示控件并結(jié)束VI運(yùn)行。每次執(zhí)行該VI,移位寄存器的初始值均為0。
如果未初始化移位寄存器,循環(huán)將使用最后一次執(zhí)行時(shí)寫(xiě)入該寄存器的值,在循環(huán)未執(zhí)行過(guò)的情況下使用該數(shù)據(jù)類(lèi)型的默認(rèn)值。使用未初始化的移位寄存器還可以保留VI多次執(zhí)行之間的狀態(tài)信息。圖3.60所示程序框圖是未初始化的移位寄存器的兩次工作情況。在首次執(zhí)行代碼時(shí),移位寄存器的初始值默認(rèn)為0,最終值為10;在第二次執(zhí)代碼時(shí),移位寄存器的初始值為第一次的執(zhí)行結(jié)果10,最終值是20。圖3.60未初始化移位寄存器的兩次運(yùn)行結(jié)果
說(shuō)明:在圖3.60所示的程序中,F(xiàn)or循環(huán)將執(zhí)行5次,每次循環(huán)后,移位寄存器的值都增加比循環(huán)次數(shù)少一的值。第一次運(yùn)行VI時(shí),移位寄存器的初始值為0,即32位整型數(shù)據(jù)的默認(rèn)值。For循環(huán)完成5次循環(huán)后,移位寄存器會(huì)將最終值10傳遞給顯示控件并結(jié)束VI運(yùn)行。第二次運(yùn)行該VI時(shí),移位寄存器的初始值是上一次循環(huán)所保存的最終值10。For循環(huán)執(zhí)行5次后,移位寄存器會(huì)將最終值20傳遞給顯示控件。如果再次執(zhí)行該VI,移位寄存器的初始值為20,依此類(lèi)推。關(guān)閉VI之前,未初始化的移位寄存器將保留上一次循環(huán)的值。
通過(guò)上面的學(xué)習(xí),現(xiàn)在來(lái)分析一下如圖3.61所示程序框圖中的數(shù)組輸出值是什么。圖3.61沒(méi)有初始化的移位寄存器應(yīng)用圖中程序使用了一個(gè)While循環(huán)結(jié)構(gòu),一個(gè)一維數(shù)組在循環(huán)結(jié)構(gòu)的左邊框利用自動(dòng)索引功能將數(shù)組轉(zhuǎn)換為單個(gè)數(shù)據(jù)值,將該數(shù)據(jù)值與數(shù)組送給創(chuàng)建數(shù)組函數(shù)形成一個(gè)新的數(shù)組輸出。因此在這個(gè)程序中,即使輸入不變,每運(yùn)行一次程序,數(shù)組輸出的結(jié)果都是不一樣的,它的長(zhǎng)度一直在增加。數(shù)組輸出為(1,2,3,4,1,2,3),原因在于沒(méi)有給程序中的移位寄存器一個(gè)初始值。
沒(méi)有初始化的移位寄存器,總是保存上次運(yùn)行結(jié)束時(shí)的數(shù)據(jù)。這個(gè)特點(diǎn)在某些情況下可以被程序員利用,比如用它當(dāng)作全局變量,隨時(shí)把數(shù)據(jù)存入或取出。但多數(shù)情況下移位寄存器還是被用作循環(huán)內(nèi)部的局部變量,這時(shí)就一定要對(duì)它初始化,以防止?jié)撛诘腻e(cuò)誤。
注:數(shù)組是相同類(lèi)型數(shù)據(jù)的集合,具體將在第5章詳細(xì)介紹。
【例3-7】求n!。
板和程序框圖如圖3.62所示。
程序中n=4時(shí),F(xiàn)or循環(huán)共循環(huán)4次,表3-2中列出了通過(guò)高亮執(zhí)行得到的每次循環(huán)時(shí)從For循環(huán)的計(jì)數(shù)端i輸出的數(shù)據(jù)、從左側(cè)移位寄存器輸出的數(shù)據(jù)和從右側(cè)移位寄存器輸出的數(shù)據(jù)。圖3.62n!運(yùn)算的前面板和程序框圖3.6.4創(chuàng)建層疊移位寄存器
層疊移位寄存器保存以前多次循環(huán)的值,并將值傳遞到下一次循環(huán)中。如需創(chuàng)建層疊移位寄存器,右擊左側(cè)的接線端并單擊快捷菜單中的【添加元素】,如圖3.63所示;或者通過(guò)鼠標(biāo)拖曳左側(cè)的接線端,具體方法是:將鼠標(biāo)放到循環(huán)結(jié)構(gòu)的左邊框、移位寄存器的下方,待鼠標(biāo)變?yōu)樯舷码p箭頭時(shí),按住鼠標(biāo)左鍵拖動(dòng)鼠標(biāo)則會(huì)形成虛線框,根據(jù)需要記錄以前數(shù)據(jù)的個(gè)數(shù)來(lái)確定層疊移位寄存器的個(gè)數(shù),松開(kāi)鼠標(biāo)左鍵則形成層疊移位寄存器,如圖3.64所示。圖3.63使用快捷菜單創(chuàng)建層疊移位寄存器圖3.64使用鼠標(biāo)拖曳創(chuàng)建層疊移位寄存器
注:層疊移位寄存器只能位于循環(huán)左側(cè),右側(cè)的接線端僅用于把當(dāng)前循環(huán)的數(shù)據(jù)傳遞給下一次循環(huán)。
圖3.65程序中,左側(cè)接線端有兩個(gè)元素,則其可以保存循環(huán)前兩次運(yùn)行的結(jié)果。程序運(yùn)行結(jié)束后,左側(cè)接線端上面的元素保存最近一次循環(huán)的值1,下面的元素保存上一次循環(huán)傳遞給寄存器的值0。圖3.65層疊移位寄存器的應(yīng)用下面介紹移位寄存器和隧道的互換。
(1)將移位寄存器替換為隧道。當(dāng)不再需要將循環(huán)中的值傳遞到下一次循環(huán)時(shí),右擊移位寄存器并從快捷菜單中選擇【替換為隧道】,將移位寄存器替換為隧道。
如果將For循環(huán)上的輸出移位寄存器替換為隧道,因?yàn)槟J(rèn)情況下For循環(huán)已啟用自動(dòng)索引功能,所以連接到循環(huán)外部任何節(jié)點(diǎn)的連線都將斷開(kāi)。右擊隧道并從快捷菜單中選擇【在源處禁用索引】,自動(dòng)索引被禁用,并且自動(dòng)糾正斷線。如需啟用索引,必須刪除斷線和顯示控件接線端,右擊隧道并從快捷菜單中選擇【創(chuàng)建顯示控件】。
(2)將隧道替換為移位寄存器。如需將循環(huán)中的值傳遞到下一個(gè)循環(huán)中,右擊隧道并從快捷菜單中選擇【替換為移位寄存器】,將隧道替換為移位寄存器。如右擊的隧道的相對(duì)邊框上沒(méi)有隧道,則LabVIEW會(huì)自動(dòng)創(chuàng)建一對(duì)移位寄存器;如與右擊的隧道相對(duì)的邊框上也有一個(gè)隧道,則LabVIEW會(huì)將右擊的隧道替換為移位寄存器,而且光標(biāo)也會(huì)變成移位寄存器圖標(biāo)??。單擊循環(huán)相對(duì)邊框上的隧道,將其替換為移位寄存器,或者單擊程序框圖,直接將移位寄存器放置在循環(huán)邊框的相應(yīng)位置上。如該移位寄存器接線端出現(xiàn)在隧道之后,則該移位寄存器為未連線。
如果將While循環(huán)中已啟用索引的隧道替換為移位寄存器,因?yàn)橐莆患拇嫫鞑荒茏詣?dòng)索引,所以連接到循環(huán)外部任何節(jié)點(diǎn)的連線都將斷開(kāi)。刪除斷線,將位于移位寄存器右側(cè)的輸出連線連接到另一個(gè)隧道,右擊該隧道,從快捷菜單中選擇【啟用索引】并將隧道連接到節(jié)點(diǎn)。
3.7反饋節(jié)點(diǎn)
反饋節(jié)點(diǎn)將一次VI或循環(huán)運(yùn)行所得的數(shù)據(jù)值保存到下一次。本節(jié)主要介紹反饋節(jié)點(diǎn)的創(chuàng)建、初始化及其應(yīng)用。
3.7.1創(chuàng)建反饋節(jié)點(diǎn)
右擊程序框圖空白處,選擇【函數(shù)】/【編程】【結(jié)構(gòu)】/【反饋節(jié)點(diǎn)】,如圖3.66所示。將其拖放到程序框圖中,如圖3.67所示。圖3.66函數(shù)選板上的反饋節(jié)點(diǎn)圖3.67程序框圖中未連線的反饋節(jié)點(diǎn)創(chuàng)建反饋節(jié)點(diǎn)有兩種方法:
(1)程序自動(dòng)創(chuàng)建。在程序框圖中,將子VI、函數(shù)或一組子VI及函數(shù)的輸出連接至同一個(gè)VI或函數(shù)的輸入時(shí),連線中會(huì)自動(dòng)插入一個(gè)反饋節(jié)點(diǎn),同時(shí)自動(dòng)創(chuàng)建一個(gè)初始化接線端,如圖3.68所示。
(2)使用快捷菜單創(chuàng)建。右擊循環(huán)結(jié)構(gòu)的邊框,在快捷菜單中選擇【結(jié)構(gòu)選板】/【反饋節(jié)點(diǎn)】,并將其拖放到循環(huán)結(jié)構(gòu)內(nèi)部,如圖3.69所示。圖3.68程序自動(dòng)創(chuàng)建反饋節(jié)點(diǎn)圖3.69使用循環(huán)結(jié)構(gòu)快捷菜單創(chuàng)建反饋節(jié)點(diǎn)當(dāng)一個(gè)程序中需要將多個(gè)節(jié)點(diǎn)的輸入和輸出連接起來(lái),或者循環(huán)結(jié)構(gòu)中需要保存多個(gè)以前的值時(shí),可以在程序中自動(dòng)創(chuàng)建多個(gè)反饋節(jié)點(diǎn),或者多次單擊快捷菜單【反饋節(jié)點(diǎn)】并將其拖放到程序框圖中。
說(shuō)明:反饋節(jié)點(diǎn)箭頭的方向表示數(shù)據(jù)流的方向。反饋節(jié)點(diǎn)有兩個(gè)端口,輸入端口在每次循環(huán)結(jié)束時(shí)將當(dāng)前值存入,輸出端口在每次循環(huán)開(kāi)始時(shí)把上一次循環(huán)存入的值輸出。反饋節(jié)點(diǎn)將連接到初始化接線端的值作為第一次循環(huán)或運(yùn)行的初始值,然后將上一次循環(huán)的結(jié)果保存以用于此后的循環(huán)。如初始化接線端未連接任何值,則反饋節(jié)點(diǎn)將使用數(shù)據(jù)類(lèi)型的默認(rèn)值,并在此后的運(yùn)行中不斷在之前所得結(jié)果的基礎(chǔ)上產(chǎn)生值。3.7.2初始化反饋節(jié)點(diǎn)
初始化反饋節(jié)點(diǎn),即設(shè)置VI運(yùn)行時(shí)反饋節(jié)點(diǎn)傳遞給第一次循環(huán)或節(jié)點(diǎn)(VI或函數(shù))的值。反饋節(jié)點(diǎn)的初始化分為兩種情況:在循環(huán)執(zhí)行時(shí)初始化反饋節(jié)點(diǎn)和全局初始化反饋節(jié)點(diǎn)。
(1)在循環(huán)執(zhí)行時(shí)初始化反饋節(jié)點(diǎn)。如需在循環(huán)執(zhí)行時(shí)初始化一個(gè)反饋節(jié)點(diǎn),可將接線端拖曳到包含了反饋節(jié)點(diǎn)循環(huán)的左側(cè),或拖曳到一組包含了反饋節(jié)點(diǎn)的嵌入結(jié)構(gòu)中某個(gè)循環(huán)的左側(cè),于是,反饋節(jié)點(diǎn)將在循環(huán)的第一次執(zhí)行前被初始化;也可右擊初始化接線端并從快捷菜單中選擇【將初始化器移出一個(gè)循環(huán)】或【將初始化器移入一個(gè)循環(huán)】以移動(dòng)初始化接線端,如圖3.70所示。如將初始化接線端移動(dòng)到循環(huán)的左側(cè),則必須為其連接一個(gè)初始值。圖3.70在多個(gè)循環(huán)結(jié)構(gòu)中移動(dòng)初始化接線端
(2)全局初始化反饋節(jié)點(diǎn)。如不將初始化接線端移動(dòng)到循環(huán)的左側(cè),則反饋節(jié)點(diǎn)被全局初始化。全局初始化的反饋節(jié)點(diǎn)可用于程序框圖上的任何地方。如反饋節(jié)點(diǎn)被全局初始化且已設(shè)置初始值,則反饋節(jié)點(diǎn)將在VI的第一次執(zhí)行中被初始化為該值。如未給初始化接線端連接初始值,則反饋節(jié)點(diǎn)第一次執(zhí)行的初始輸入為適于其數(shù)據(jù)類(lèi)型的默認(rèn)值。第一次運(yùn)行后,VI每次運(yùn)行時(shí)上次運(yùn)行所得的值即是下次運(yùn)行的初始值。圖3.71顯示了一個(gè)初始化接線端已連線的反饋節(jié)點(diǎn)的程序,以及一個(gè)初始化接線端未連線的反饋節(jié)點(diǎn)程序。圖3.71初始化與未初始化的反饋節(jié)點(diǎn)的程序程序循環(huán)運(yùn)行5次,每次循環(huán)實(shí)現(xiàn)加1的迭代運(yùn)算,所有循環(huán)結(jié)束后輸出程序的最終值到x+1顯示控件顯示,并且輸出For循環(huán)的循環(huán)計(jì)數(shù)值i。初始化接線端已連線的程序,在每次執(zhí)行程序運(yùn)行第一次循環(huán)時(shí),均是將初始化接線端的值2送給反饋節(jié)點(diǎn)輸出。初始化接線端未連線的程序,在第一次執(zhí)行程序運(yùn)行第一次循環(huán)時(shí),將默認(rèn)的浮點(diǎn)型數(shù)據(jù)值0作為反饋節(jié)點(diǎn)的輸出;在第二次執(zhí)行程序運(yùn)行第一次循環(huán)時(shí),反饋節(jié)點(diǎn)的輸出值為上次執(zhí)行程序的結(jié)束值。通過(guò)高亮執(zhí)行可以得到兩次執(zhí)行程序時(shí)每次循環(huán)時(shí)程序的運(yùn)行結(jié)果,如表3-3所示。說(shuō)明:雖然在循環(huán)和嵌套循環(huán)中可將節(jié)點(diǎn)和初始化接線端隔開(kāi),但不可將初始化接線端移到含有節(jié)點(diǎn)的嵌套結(jié)構(gòu)的外部。創(chuàng)建子VI時(shí)也不能將節(jié)點(diǎn)與初始化接線端隔開(kāi)。如從只含有節(jié)點(diǎn)或只含有初始化接線端的一部分程序框圖創(chuàng)建一個(gè)子VI,LabVIEW將返回一個(gè)錯(cuò)誤。反饋節(jié)點(diǎn)在循環(huán)中的操作與移位寄存器類(lèi)似,當(dāng)循環(huán)框比較大時(shí),使用移位寄存器會(huì)造成過(guò)長(zhǎng)的連線,使用反饋節(jié)點(diǎn)可以減少連線。LabVIEW提供了反饋節(jié)點(diǎn)和移位寄存器的互換操作。在循環(huán)中如需要將移位寄存器轉(zhuǎn)換為反饋節(jié)點(diǎn),在移位寄存器上右擊鼠標(biāo),在快捷菜單中選擇【替換為反饋節(jié)點(diǎn)】;如需要將反饋節(jié)點(diǎn)轉(zhuǎn)換為移位寄存器,在反饋節(jié)點(diǎn)上右擊鼠標(biāo),在快捷菜單中選擇【替換為移位寄存器】,如圖3.72所示。圖3.72將反饋節(jié)點(diǎn)轉(zhuǎn)換為移位寄存器在將反饋節(jié)點(diǎn)轉(zhuǎn)換為移位寄存器時(shí)要注意:如果反饋節(jié)點(diǎn)的初始化接線端有連接,則替換為移位寄存器時(shí),要將斷開(kāi)的反饋節(jié)點(diǎn)中初始化接線端連接的數(shù)據(jù)作為移位寄存器的初始值,否則,替換后的程序運(yùn)行結(jié)果將與替換前的程序運(yùn)行結(jié)果不同。
3.8實(shí)現(xiàn)階乘運(yùn)算的程序設(shè)計(jì)
3.8.1問(wèn)題描述
設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)n!?運(yùn)算。在前面已經(jīng)使用移位寄存器實(shí)現(xiàn)了該功能,此處要求使用反饋節(jié)點(diǎn)實(shí)現(xiàn)階乘運(yùn)算功能。
階乘運(yùn)算公式:n!?=?1?×?2?×?…?×?n。3.8.2設(shè)計(jì)
(1)打開(kāi)一個(gè)新的VI。
(2)創(chuàng)建前面板。
①右擊前面板空白處,彈出控件選板。
②在控件選板上單擊【數(shù)值輸入控件】/【數(shù)值輸入控件】,將其拖放在前面板上。
③使用標(biāo)簽工具將其命名為n。
④在控件選板上單擊【數(shù)值顯示控件】/【數(shù)值顯示控件】,將其拖放在前面板上。
⑤使用標(biāo)簽工具將其命名為n!。
⑥裝飾前面板。
前面板如圖3.73所示。圖3.73n!?運(yùn)算的前面板
(3)切換到VI的程序框圖。
(4)創(chuàng)建程序框圖。
①右擊程序框圖空白處,選擇【函數(shù)】/【編程】/【結(jié)構(gòu)】中的For循環(huán),將其拖放到程序框圖中。
②右擊For循環(huán)的邊框,在快捷菜單中選擇【結(jié)構(gòu)】/【反饋節(jié)點(diǎn)】,并將其放置到For循環(huán)結(jié)構(gòu)中。移動(dòng)反饋節(jié)點(diǎn)中的初始化接線端到For循環(huán)結(jié)構(gòu)的左邊框上。③設(shè)置反饋節(jié)點(diǎn)中的初始化接線端的值為1,將前面板中的數(shù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 木制容器設(shè)計(jì)與制造的綠色工藝考核試卷
- 服裝零售店鋪經(jīng)營(yíng)績(jī)效評(píng)估與改進(jìn)措施考核試卷
- 機(jī)器人智能識(shí)別與追蹤技術(shù)考核試卷
- 制糖業(yè)的市場(chǎng)滲透與渠道拓展考核試卷
- 期刊出版商業(yè)模式考核試卷
- 批發(fā)業(yè)務(wù)中的國(guó)際物流考核試卷
- 醫(yī)院護(hù)士就業(yè)合同范本
- 蘇州新版裝修合同范本
- 人工智能智能城市規(guī)劃與設(shè)計(jì)協(xié)議
- 餐廚廢棄物處理合同
- 人工智能對(duì)輿情管理的價(jià)值
- 地理-河南省部分重點(diǎn)高中九師聯(lián)盟2024-2025學(xué)年高三下學(xué)期2月開(kāi)學(xué)考試試題和答案
- 老年護(hù)理相關(guān)法律法規(guī)
- 《陶瓷工藝技術(shù)》課件
- 變更強(qiáng)制措施的申請(qǐng)書(shū)
- 供電所安全演講
- 供應(yīng)鏈韌性提升與風(fēng)險(xiǎn)防范-深度研究
- 化工原理完整(天大版)課件
- 《淞滬會(huì)戰(zhàn)》課件
- 《智能制造技術(shù)基礎(chǔ)》課件-第4章 加工過(guò)程的智能監(jiān)測(cè)與控制
- 罪犯正常死亡報(bào)告范文
評(píng)論
0/150
提交評(píng)論