LabVIEW編程實例:如何基於TCP協議發送參數命令包

在上篇文章中,已經講了LabVIEW中基於TCP協議進行數據通信的基本方法,詳細請參考:

可能有的小夥伴就問了,那個太簡單了,而且發送的是最簡單的字符串信息,對於實際的儀器硬件控制,一般發送的多是參數命令包的形式,在參數命令包中會包含多個參數,且每個參數數據類型可能不同,佔用的字節長度也不同,那麼,在LabVIEW中如何將這些參數打包為字節流數據進行發送呢?

下面通過一個具體的例子,演示在LabVIEW中如何通過網口基於TCP協議發送包含多個參數的命令包信息。

實例說明

在LabVIEW中基於TCP協議編寫VI程序,實現通過網口對某個硬件設備發送參數命令包進行控制。其中,硬件設備為服務器端,假設命令包的格式要求如下:

(1)整個包大小為32Byte,中間不足部分補0;

(2)包頭、包尾各佔4個字節,分別為0X“12 34 56 78”和0X“87 65 43 21”;

(3)包頭後面緊跟著各個參數值,為簡單起見,這兒僅給出了3個有符號整型的參數,且每個參數的初始值、佔用字節數定義如下:

LabVIEW編程實例:如何基於TCP協議發送參數命令包


編程思路

由於硬件設備是服務器,所以我們寫的VI程序是作為客戶端的角色存在的,當客戶端根據主機的IP地址和端口號發出連接請求併成功建立起連接後,需要將32個字節的內容發送到服務器端。

所以,問題的核心是如何將發送的參數信息打包為包含包頭、包尾且符合要求的字節流數據。這兒需要用到一個LabVIEW平臺提供的關鍵函數“平化至字符串”,該函數可將任意數據轉換為二進制值組成的字節流數據(LabVIEW中表現為字符串類型),其參數信息如下圖所示:

LabVIEW編程實例:如何基於TCP協議發送參數命令包

該函數參數中,除了待轉換的數據參數外,還包括一個“預置數組或字符串大小?”參數,這個參數是隻有輸入數組或字符串類型的數據時才有效,對於這個例子設置為假即可。

字節順序也是一個比較重要的參數,用以設置返回的平化字符串中數據的endian形式。字節順序表明在內存中整數是否按照從最高有效字節到最低有效字節的形式表示,或者相反。它是一個枚舉類型的參數,可取的值及每個值的意義如下圖所示:

LabVIEW編程實例:如何基於TCP協議發送參數命令包

使用這個函數將所有的內容打包為字節流數據後,就可以使用“寫入TCP”函數發送到服務器端也就是硬件端了。

前面板設計

針對這個例子,設計前面板如下圖所示:

LabVIEW編程實例:如何基於TCP協議發送參數命令包

在前面板上可以設置待連接的服務器端的IP地址、端口號,待發送的內容及字節順序等信息。

程序框圖設計

程序框圖主框架採用包含三幀的順序結構,第一幀和第三幀分別實現打開TCP連接和關閉TCP連接。第二幀為代碼的主要處理部分,採用while循環與事件結構的方式,當用戶點擊前面板上的“發送參數包”按鈕時,將參數、包頭、包尾等信息打包為字節流數據發送到硬件端。

第一幀代碼如下圖所示,根據IP地址和端口號使用“打開TCP連接”函數向服務器端申請連接,連接建立成功後返回一個連接ID,該參數通過順序結構的局部變量傳遞到後面幀以作進一步的處理。

LabVIEW編程實例:如何基於TCP協議發送參數命令包

第三幀框圖程序較為簡單,當程序退出時關閉TCP連接,如下圖所示:

LabVIEW編程實例:如何基於TCP協議發送參數命令包

第二幀代碼如下圖所示:

LabVIEW編程實例:如何基於TCP協議發送參數命令包

該幀在“發送參數包”按鈕“值改變”事件中時,將參數、包頭、包尾等信息打包為字節流數據發送到硬件端,下面對代碼進行詳細解釋。

首先使用“創建數組”函數創建包含32個元素的一維數組,數組元素的類型為“I8”類型,其中前4個字節和後4個字節分別為包頭和包尾,中間的24個字節為全0。將這個包含32個元素的一維數組使用“平化至字符串”函數轉換為字節流數據(字符串類型)。

然後將待發送的具體參數信息(簇類型)也使用“平化至字符串”函數轉換為字節流數據(字符串類型),使用“替換子字符串”函數,將上面產生的一維數組從第5個元素(前4個為包頭信息)開始替換即可。

最後將替換後的字符串數據使用“寫入TCP數據”發送至服務器端(硬件)就完成了我們的任務。

其中“平化至字符串”函數需要的字節順序參數可通過前面板上控件進行設置。

程序運行結果

下面藉助於網口調試助手來模擬某硬件設備,看一下這個程序的運行情況。

先設置網口助手參數,將網口助手設置為服務器端,IP地址和端口號分別設置為192.168.0.109和1080,打開服務器。

然後運行我們的程序,IP地址和端口號同樣設置為192.168.0.109和1080,點擊前面板上的“發送參數包”按鈕,字節順序分別選擇“little-endian”和“big-endian”,可以看到結果如下:

LabVIEW編程實例:如何基於TCP協議發送參數命令包

在上圖網絡數據接收區,第一行顯示的字節順序是“little-endian”,數據確實是按小端存放的,如“參數b”其值為20,其16進製表示為0x0014,其接收順序為“14 00”,數據的低位存放在低內存地址位置。第二行顯示的字節順序是“big-endian”,剛好相反。其它參數b、c的字節順序情況也是相同。

同時,向硬件端發送的內容正確的包含了包頭、包尾信息且共32個字節,完全達到了我們的要求。

總結

從這個例子可以看出,在LabVIEW中將待發送參數包打包為字節流數據,通過TCP協議發送至硬件端進行儀器的控制,也是非常簡單的。

如果你覺得這篇文章對你有用的話,收藏+點贊吧。


分享到:


相關文章: