本節簡單講解隊列在Labview中的使用,隊列你可以認為就是一組先進先出的數據列表,在Labview中常用來緩存和傳遞數據。用了這么久的隊列,個人認為有個方便的地方在於數據傳遞的把控,不管是局部變量還是全部變量,免不了要考慮到數據先后沖突的問題,但隊列可以很好地解決這個問題。其中狀態機的生產者消費者模式傳遞數據的方式大多采用隊列,生產者邏輯產生的數據通過隊列一一傳遞到消費者邏輯中,消費者讀取隊列后,將隊列的數據一一處理。在labview中,隊列還有一個很方便的地方就是VI之間傳遞數據,VI之間傳遞數據可通過接口,全局變量,引用屬性節點,還可以通過隊列。下面簡單講一下隊列在Labview中的用法。
1、右鍵 編程->同步->隊列操作->獲取隊列引用(隊列的相關函數接口都在這)。獲取隊列引用相當於新建一個隊列引用,后續所有函數通過該引用進行數據操作。在Labview中,我們直接在該函數左側最上方的"名稱"接口右鍵新建一個常量,命名為testque,就新建了一個名為testque的一個隊列引用。左側第二個接口為數據類型,我們可以放一個數值,字符串,數組和簇等,表示該隊列傳輸的數據類型。具體操作和說明可查看函數的幫助。
再 添加“函數入隊列”的函數。
下面就是一個基本的隊列輸入輸出的邏輯,具體操作流程看程序中的注釋,寫完后高亮顯示執行看下運行效果。(上面的注釋是鼠標左鍵雙擊空白處即可添加備注,其他語言一般是雙斜杠//,或者是#號進行注釋。labview雙擊空白寫入注釋后,可通過右下角的箭頭指向對應的函數或變量上進行說明)。其中最后的釋放隊列引用很重要,如果創建隊列引用后沒有釋放掉的話,每新建一次隊列引用,都會增加運行內存,不過要傳遞的數據量大的時候才能看得出來,如果一個Labview程序運行時間越長,labview占用的內存越大,那很可能是沒有釋放隊列,文件等引用導致。
數據入隊列左側的一個“-1”輸入到超時毫秒的接口,表示永不超時。也就是如果其他地方想將該隊列的數據讀取出來,但是隊列中沒有隊列數據,則該讀取函數就一直等待。這個在下面的VI之間傳遞數據的例子可以演示一下。如果輸入1000,則表示如果在1000ms后還沒有讀取該隊列的該數據,則放棄本次讀取繼續執行。
2、VI間傳遞數據。例子如下,程序未命名1為寫入隊列數據,程序未命名2為讀出隊列數據。只要隊列名一樣,便可創建相同的引用,該引用允許數據在VI間傳遞數據。現在超時毫秒用的是-1,永不超時,也就是如果運行了程序2,不運行程序1的話,程序2會一直等待,無法執行后面的邏輯,無法退出程序。大家可以高亮顯示看一下效果。
先運行程序2。
程序2運行后一直等待。
運行程序1后,程序2執行完成。
3、下面來一個簡單的生產者消費者邏輯,上面的while循環寫入數據到隊列(生產者),下面的while循環讀取數據並處理(消費者)。大家一樣可以高亮顯示查看邏輯
執行效果。
以上就是labview隊列的簡單運用,一般我常用於vi間,以及多線程傳遞數據,全局變量存在搶占情況(當然也可以通過信號量鎖住變量的方式,不過隊列,它香啊!)。
原創不易,一鍵三連拉!









