LabVIEWCompactRIO 開(kāi)發(fā)指南6
LabVIEWCompactRIO?開(kāi)發(fā)指南6
RTFIFO啟用共享變量
可以使用啟用了RT?FIFO的單進(jìn)程共享變量在兩個(gè)循環(huán)之間確定地傳輸數(shù)據(jù),也可以使用啟用了RT?FIFO的網(wǎng)絡(luò)發(fā)布共享變量在網(wǎng)絡(luò)之間確定地傳輸數(shù)據(jù)。圖3.14中的框圖與前面的例子類(lèi)似,但是它使用了支持RT?FIFO的共享變量而不是RT?FIFO函數(shù)來(lái)共享數(shù)據(jù)。優(yōu)先級(jí)為100的時(shí)間關(guān)鍵型循環(huán)使用啟用了實(shí)時(shí)FIFO的名為loop?Comm的共享變量與非確定性循環(huán)共享獲取的數(shù)據(jù)。非確定性循環(huán)將從共享變量loop?Comm讀取的獲取數(shù)據(jù)記錄到實(shí)時(shí)目標(biāo)的磁盤(pán)上。

圖3.14使用支持RT?FIFO的共享變量
要在共享變量上啟用RT?FIFO,請(qǐng)導(dǎo)航到共享變量屬性對(duì)話框的RT?FIFO頁(yè)面,并在啟用實(shí)時(shí)FIFO復(fù)選框中放置復(fù)選標(biāo)記。

圖3.15?啟用RT?FIFO,可以從多個(gè)并行循環(huán)中讀寫(xiě)共享變量而不會(huì)引起抖動(dòng)
使用單元素RT?FIFO來(lái)傳輸最新的值(標(biāo)簽或更新),并使用多元素RT?FIFO來(lái)傳輸緩沖的值(消息或流)。多元素FIFO的特點(diǎn)是每次寫(xiě)操作都向緩沖區(qū)中添加一個(gè)元素,每次讀操作都從緩沖區(qū)中刪除一個(gè)元素。只要消費(fèi)者循環(huán)經(jīng)常檢查FIFO,就可以將緩沖區(qū)保留為默認(rèn)的兩個(gè)元素,并且不會(huì)錯(cuò)過(guò)任何觸發(fā)器/命令。
為了檢查FIFO,消費(fèi)者任務(wù)必須讀取共享變量并檢查錯(cuò)誤狀態(tài)。如果FIFO為空,共享變量返回警告-2220。如果這個(gè)警告沒(méi)有返回,那么FIFO不是空的,并且返回的值是一個(gè)有效的命令。
每次讀取共享變量時(shí),都會(huì)從FIFO中刪除一個(gè)元素(假設(shè)FIFO不是空的)。因此,不能讓多個(gè)消費(fèi)者從同一個(gè)FIFO接收命令,但可以讓多個(gè)指揮員將命令放入FIFO。
LabVIEW實(shí)時(shí)設(shè)計(jì)模式
設(shè)計(jì)模式是軟件工程中常見(jiàn)問(wèn)題的可重用解決方案。通過(guò)在LabVIEW實(shí)時(shí)應(yīng)用程序中使用設(shè)計(jì)模式,可以利用軟件工程社區(qū)積累的經(jīng)驗(yàn)。設(shè)計(jì)模式的好處包括:
■更快的開(kāi)發(fā)時(shí)間
■更高的可靠性
■更好的代碼可重用性
■更容易調(diào)試
■增強(qiáng)可維護(hù)性
在查看一些常見(jiàn)的設(shè)計(jì)模式之前,需要了解在LabVIEW?Real-Time中同步循環(huán)的選項(xiàng)。同步是任何設(shè)計(jì)模式的基礎(chǔ)。
同步和定時(shí)
在LabVIEW?Real-Time中實(shí)現(xiàn)設(shè)計(jì)模式時(shí),最重要的考慮因素之一是循環(huán)的同步。幾乎所有的LabVIEW實(shí)時(shí)應(yīng)用程序都由兩個(gè)或多個(gè)具有不同同步需求的循環(huán)組成。例如,第1節(jié)介紹的渦輪機(jī)測(cè)試應(yīng)用程序。渦輪測(cè)試應(yīng)用程序由具有多種同步類(lèi)型的多個(gè)回路組成。每個(gè)循環(huán)必須只有一個(gè)同步源(狀態(tài)機(jī)是個(gè)例外)。例如,如果有一個(gè)需要連續(xù)運(yùn)行的任務(wù)和一個(gè)正在等待消息的任務(wù),那么在同一個(gè)循環(huán)中實(shí)現(xiàn)它們可能會(huì)有問(wèn)題。
周期環(huán)路A
周期循環(huán)在規(guī)定的周期內(nèi)連續(xù)運(yùn)行。渦輪PWM特性環(huán)在渦輪測(cè)試應(yīng)用中是周期性的。這個(gè)循環(huán)如圖3.16所示,以100毫秒或10赫茲的周期執(zhí)行。它使用變量進(jìn)行通信。在設(shè)計(jì)周期循環(huán)時(shí),請(qǐng)注意不要添加任何會(huì)引入阻塞或其他類(lèi)型同步的函數(shù)(例如,沒(méi)有超時(shí)的隊(duì)列)。

圖3.16?渦輪測(cè)試應(yīng)用程序中的渦輪PWM特性回路周期性地執(zhí)行。
還可以通過(guò)使用與數(shù)據(jù)采集和分析循環(huán)類(lèi)似的定時(shí)循環(huán),為更高優(yōu)先級(jí)的任務(wù)實(shí)現(xiàn)周期性循環(huán)。通常只有在實(shí)現(xiàn)周期性任務(wù)時(shí)才應(yīng)該使用定時(shí)循環(huán),因?yàn)槿魏晤?lèi)型的阻塞都會(huì)引入抖動(dòng)。
事件驅(qū)動(dòng)的循環(huán)
事件驅(qū)動(dòng)的循環(huán)僅在事件發(fā)生時(shí)執(zhí)行。事件通常是從另一個(gè)進(jìn)程接收消息。渦輪機(jī)測(cè)試應(yīng)用程序中的消息循環(huán)是事件驅(qū)動(dòng)的。在命令解析器示例中,同步源是Dequeue?Element函數(shù)。超時(shí)設(shè)置為default(-1),這意味著函數(shù)永遠(yuǎn)不會(huì)超時(shí),并且只有在從主機(jī)接收到命令時(shí)才執(zhí)行循環(huán)。事件驅(qū)動(dòng)架構(gòu)的其他常用功能包括:
■隊(duì)列
■通知
■RT?FIFO
■用戶(hù)事件(事件結(jié)構(gòu))
■網(wǎng)絡(luò)流

圖3.17帶有事件驅(qū)動(dòng)同步的循環(huán)示例
當(dāng)使用事件驅(qū)動(dòng)的設(shè)計(jì)模式時(shí),可以阻塞,直到收到消息或發(fā)生超時(shí)。當(dāng)阻塞沒(méi)有超時(shí),程序有效地使用CPU,但也阻止任何后臺(tái)任務(wù)的運(yùn)行。如果在這些函數(shù)中添加一個(gè)超時(shí),可以有一個(gè)“超時(shí)”狀態(tài),在此期間可以在等待消息的同時(shí)執(zhí)行后臺(tái)任務(wù)。
計(jì)劃循環(huán)
計(jì)劃循環(huán)在一個(gè)絕對(duì)時(shí)間執(zhí)行。例如每天午夜執(zhí)行的維護(hù)例程。這種類(lèi)型的同步不太常見(jiàn)。
設(shè)計(jì)模式
LabVIEW實(shí)時(shí)應(yīng)用程序中常見(jiàn)的設(shè)計(jì)模式與Windows應(yīng)用程序中使用的設(shè)計(jì)模式相似。本節(jié)研究?jī)煞N設(shè)計(jì)模式:狀態(tài)機(jī)和生產(chǎn)者-消費(fèi)者。
狀態(tài)機(jī)
狀態(tài)機(jī)是一種常見(jiàn)且有用的設(shè)計(jì)模式??梢允褂脿顟B(tài)機(jī)來(lái)實(shí)現(xiàn)任何可以通過(guò)狀態(tài)圖或流程圖顯式描述的算法。狀態(tài)機(jī)通常說(shuō)明一個(gè)中等復(fù)雜的決策算法,例如診斷例程或進(jìn)程監(jiān)視器。
生產(chǎn)者消費(fèi)者
生產(chǎn)者-消費(fèi)者設(shè)計(jì)模式用于在以不同速率產(chǎn)生和消費(fèi)數(shù)據(jù)的進(jìn)程之間傳輸數(shù)據(jù)。在Windows操作系統(tǒng)上,生產(chǎn)者消費(fèi)者通常使用Queue函數(shù)實(shí)現(xiàn)。在LabVIEW?Real-Time中,它可以通過(guò)隊(duì)列或RT?FIFO來(lái)實(shí)現(xiàn)??梢詫?shí)現(xiàn)生產(chǎn)者-消費(fèi)者設(shè)計(jì)模式,以便在兩個(gè)循環(huán)之間共享數(shù)據(jù)或共享事件。
數(shù)據(jù)共享生產(chǎn)者和消費(fèi)者
當(dāng)需要執(zhí)行一個(gè)流程(如數(shù)據(jù)分析),當(dāng)數(shù)據(jù)源(如觸發(fā)獲取)以不均勻的速率生成數(shù)據(jù),并且需要在數(shù)據(jù)可用時(shí)執(zhí)行該流程時(shí),請(qǐng)使用數(shù)據(jù)共享生產(chǎn)者消費(fèi)者設(shè)計(jì)模式。
事件共享生產(chǎn)者-消費(fèi)者
當(dāng)希望異步執(zhí)行代碼以響應(yīng)事件而不減慢用戶(hù)界面響應(yīng)速度時(shí),請(qǐng)使用事件共享生產(chǎn)者消費(fèi)者設(shè)計(jì)模式。
一個(gè)生產(chǎn)者消費(fèi)者事件共享設(shè)計(jì)模式的例子是渦輪機(jī)測(cè)試應(yīng)用程序中包含的HMI,如圖3.18所示。這個(gè)應(yīng)用程序有一個(gè)循環(huán)專(zhuān)門(mén)用于從用戶(hù)界面接收事件,另一個(gè)循環(huán)處理命令并通過(guò)網(wǎng)絡(luò)將它們發(fā)送到CompactRIO控制器。由于網(wǎng)絡(luò)通信功能依賴(lài)于外部資源,即網(wǎng)絡(luò),因此如果將它們置于UI?Event?Handler循環(huán)中,它們可能會(huì)影響用戶(hù)界面的響應(yīng)性。
由于此應(yīng)用程序在Windows主機(jī)PC上運(yùn)行,因此可以使用隊(duì)列在兩個(gè)循環(huán)之間共享數(shù)據(jù)。實(shí)時(shí)應(yīng)用程序可以使用隊(duì)列或RT?FIFO來(lái)共享數(shù)據(jù),具體取決于是否涉及時(shí)間關(guān)鍵循環(huán)。

圖3.18帶有事件的生產(chǎn)者消費(fèi)者的例子
?
需要說(shuō)明的是,上述的例程和文檔,都是可以下載的,雙擊即可打開(kāi),其中壓縮文件是可以采用粘貼復(fù)制的方式,拷貝到硬盤(pán)上。這不是圖片,各位小伙伴看到后嘗試一下,這個(gè)問(wèn)題就不用加微信咨詢(xún)了。有關(guān)LabVIEW編程、LabVIEW開(kāi)發(fā)等相關(guān)項(xiàng)目,可聯(lián)系們。附件中的資料這里無(wú)法上傳,可去公司網(wǎng)站搜索下載。