新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > LabVIEW程序設計模式(五)—生產者/消費者模式(4)

        LabVIEW程序設計模式(五)—生產者/消費者模式(4)

        作者: 時間:2017-01-09 來源:網絡 收藏
        本節將使用“多循環”來解決程序并行運行的問題,那么程序中的兩個循環如何進行數據交互和共享呢?最普通的方式是采用全局變量或局域變量,但是當兩個循環執行的速率不相等時,必然會造成數據的丟失或重復。如前所述,LabVIEW提供了隊列操作函數,允許數據的發送者和接受者之間建立一條緩沖通道,這樣就避免了循環不同步帶來的影響。
        如圖 37所示,將整個過程與供水系統進行類比,在數據產生/采集端(供水局)產生數據后,并不直接向終端用戶供水,因為前者產生水的速率與后者消耗水的速率并不相同。此時需要建造蓄水池將供水局產生的水放入到蓄水池中,同理獲取的數據也放入該緩沖區中。當終端用戶需要用水時,直接從蓄水池中獲取就可以了,同理在進行數據顯示和分析時直接從數據緩沖區中獲取就可以了。


        圖 37 生產者/消費者模型
        當然,上面的模型也會存在一個問題:數據緩沖區/蓄水池的容量?假定供水局不停地產生自來水,而終端用戶卻不消耗水,這樣便會導致蓄水池裝滿而溢出。反之當終端用戶耗水量太大時,導致沒有水可用。LabVIEW中的隊列函數提供了一種很好的方式規避了這個問題,由于隊列中的元素是“先進先出”的,因此確保了接收到的數據是有序的。在LabVIEW的隊列操作中(入列和出列函數),提供了timeout選項以處理數據緩沖區的溢出或不足。當數據溢出時,入列函數(數據進入隊列)將停止發送數據(處于等待狀態),直到緩沖區存在數據空間或者達到了timeout設置的時間;而當數據不足時,出列函數(數據流出隊列)將停止接收數據(處于等到狀態),直到緩沖區進入了新的數據或者達到了timeout設置的時間。
        【應用6】
        本例將演示生產者/消費者循環的一些基本特性和隊列操作的特點。如圖 38所示,生產者與消費者之間傳遞的數據是一個連續的sine波形,二者靠大小為20個點的緩沖區連接。右下角是“停止”按鈕,用戶控制程序的停止執行。例程提供了操作方式控件控制生產者和消費者的數據傳遞速率,包含五種狀態:不生產,只消費、生成快于消費、生成速率等于消費速率、生成慢于消費、只生產,不消費。


        圖 38 生產者/消費者例程的前面板
        圖 39所示為生產者/消費者例程的背面板,代碼由3個循環組成,依上而下分別是生產者循環(產生sine數據)、消費者循環(獲取sine數據)和狀態循環(獲得緩存區中數據的數據量)。例程假定正常的數據發送和接收的速率是延時50ms,當需要某一段的速率減慢時需要將循環的延時設置為100ms。
        例程將入列和出列函數的timeout設置為-1,表示如果沒有滿足條件進行入列和出列操作,循環將處于持續等待狀態。在新建隊列時,設置了緩沖區的大小是20個元素(圖中的紅色圓圈內)。最下面的循環是為了實時查看隊列緩沖區中存儲的元素數量。


        圖 39 生產者/消費者例程的背面板
        運行該VI,默認的操作方式是“生產速率等于消費速率”,從圖 40中可以看出生產者循環和消費者循環的數據是同步的,此時緩沖區內沒有數據,也就是說產生的數據都被實時地消耗了。


        圖 40 生產速率等于消費速率
        如果再將操作方式設置為“生成快于消費”,可以看出數據緩沖區內將逐漸變滿并保持為20個元素。此時生產者的波形將會比消費者多20個數據點(這些點保存在數據緩沖區中),如圖 41所示。

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 都江堰市| 十堰市| 富裕县| 留坝县| 丹东市| 安康市| 金秀| 治多县| 衡阳县| 屏南县| 阜康市| 资溪县| 崇信县| 合肥市| 新乡县| 如东县| 霞浦县| 云安县| 永福县| 神农架林区| 南和县| 康平县| 孟州市| 杨浦区| 昌乐县| 岳阳市| 保德县| 阿克陶县| 天全县| 缙云县| 登封市| 托里县| 醴陵市| 敦煌市| 桐柏县| 瑞丽市| 土默特左旗| 延长县| 大洼县| 大余县| 喜德县|