Labview通过RS422通讯接口PC与下位机通信
前言:最近做的一個關于串口通信的小項目;具體功能就是實現PC發送指令控制下位機的轉動,下位機收到指令并返回響應指令給上位機,完成一問一答式串口通信。之前處理的是電腦發送數據的格式問題,這次解決的是另外一部分問題,即顯示下位機返回的16進制指令,以及對VISCA協議的理解和云臺不能轉動和及時響應指令的問題,一一在這篇文章得到解答。
?
1. 由于Labview中VISA Read/Write函數都是只能讀取/寫入字符串數據類型,但有時候需要寫入非字符串類型的數據,比如16進制和10進制數據類型等等。導致剛開始接觸時候確實有些困惑。
2. 進行數據轉換的時候,只要記住計算機中所有數據都是以二進制保存這個原則就容易解決問題了。串口線上傳輸的也是高低,串口接收到的也是二進制數據,只是到了Labview后被轉換成了字符串格式。下面以具體例子解釋。
3.1? Labview從串口接收數據
假設上位機軟件從串口接收到的數據是“12”(正常顯示模式下),那么這個數據在串口底層的時候其實是這樣的二進制數據:
00110001 ? ?00110010
只是在Labview中,這些二進制數據是以字符串形式顯示出來的,他們實質上還是二進制數據,這幾個二進制數據轉換成16進制分別是“0x31,0x32”,即十進制的“49,50”,由于字符串都是以ASC碼的形式保存在計算機里面的,那么49,50這幾個數在ASC表中就表示字符串“1,2”.所以這幾個數據在Labview中就顯示為字符串1,2了。
明白了這層關系,那么進行數據轉換就容易很多了。在上面的例子中,如果Labview軟件中收到的字符串是“12”,而原本下位機傳輸的是數值型數據,只需要將12字符轉換成對于的ASC碼值就是實際上下位機傳過來的數據了,就是“49,50”(十進制表示)或者“0x31,0x32”(十六進制表示)
?
?
???????? Labview軟件中將字符串轉換為對應的ASC碼的函數是“字符串至字節轉換”這個函數:上面針對的是下位機發送的是數值類型的數據,使用“字符串至字節數據轉換”這個函數。如果下位機發送的是字符串類型的話,那么在Labview中已經直接轉換好了。
???????? 上面的是在互聯網找到的解決方案,我暫時沒有采用,我用的是一個網上下載的已經做好的ASC轉HEX小程序模塊,直接加入到原來的程序里面,測試之后發現可以實時顯示下位機響應指令,只不過程序比上面的方案要稍微復雜一些。
???????? 無論下位機發送的是何種類型的數據,Labview從串口接收的時候,總是將8位二進制數作為字符的ASC碼解讀。
?
4 其他問題的解決
?
4.1新的問題;
Labview程序VI的存儲路徑要放在:labview軟件的相關例程存儲的默認路徑,如果單獨移出來的話會出現控件不能加載的情況。這是因為目前測試成功的程序是在原有例程上修改的,而原有例程使用的一些控件的路徑是在軟件的安裝路徑里面,所以單獨移出程序的時候,這些控件失去作用,程序無效。
解決方案:在原來的程序上直接修改,備份好原有例程。路徑不變,默認放在系統路徑下,生成一個快捷方式放在自己的文件路徑里面。
C:\Program Files\NationalInstruments\examples\Instrument IO\Serial;
?
4.2 數據格式問題:
由于sony攝像機云臺與PC通信是按照VISCA協議來的,而這個協議的通信又是基于16進制傳輸的,所以需要在關鍵步驟對數據格式進行轉換。
解決方案:在原有的 “連續串口寫入和讀取”基礎上修改程序,在VISAWRITE函數的輸入緩沖區加一個常量顯示控件;加入十六進制顯示輸入的指令即可,去掉大的WHILE循環,測試通過,電腦可以通過串口發送指令控制云臺的復位;
?
4.3 云臺部分指令無效問題:
之前出現的除了復位和原點指令其他指令無效;只有復位和原點2個指令有用,與廠家的技術支持溝通之后,發現沒有考慮到串口協議的問題。之前是用的是RS485半雙工通信,但是本次的小項目需要看到下位機實時發過來的16進制指令,以確定sony云臺的具體運行狀態,比如是否收到指令,動作是否已經完成等等。然后換成RS422全雙工通信,可以在串口通信助手看到響應指令,
還有一個原因:設置速度過慢,之前設置的都是0.3度每秒(03 03),非常慢。提高速度之后可以看到云臺的轉動。因為VV WW這幾個位是輸入16進制速度指令,在參考的技術EXCEL文件里面有速度對應表,一開始沒注意速度的影響,換成高速檔(0C )之后,問題瞬間得到解決。但是垂直速度也不能設置過快,以免損壞機器。
?
5. RS485設置的是半雙工模式,只能從上位機發送指令給下位機,下位機的響應指令并不能在上位機收到并顯示。換成RS422全雙工模式之后,可以看到實時的下位機響應指令。
?
6.知識點補充:
???????? 在labview中使用串口的情況:目前串口的應用一般有2種類型;一種是儀器控制類型的,一般是上位機發送一個指令,然后下位機作出響應,返回數據給上位機,上位機再讀取出來,完成一次通信,即一問一答;另一類是被動接收形的,即下位機會一直發送數據上來。這二種類型的串口通信在處理上會不太一樣。
6.1儀器控制類型
由于在儀器控制時一般都是這種一問一答的方式,所以叫它儀器控制類型。以儀器控制為例來說一下需要注意的事項。
首先是要確認儀器選擇的通信模式是串口通信模式。現在的儀器一般都至少有二種通信模式,一種是RS232,一種是GPIB,如果儀器是設置為GPIB通信的話,RS232是不可能通信上的,所以要先確認一下,方法一般是在儀器面板上選擇設置>>遠程控制>>GPIB/RS232,各個儀器稍微不同,可以查儀器手冊看一下。然后就是確認串口的通信參數的配置,包括波特率、數據長度、校驗方法等,有些儀器的某些參數是固定的,比如校驗方法固定為奇校驗,不能修改,只能在電腦上跟儀器設置為一樣的。波特率一般是可以修改的。這些參數的配置一定要根據儀器手冊上的來設置。如果參數設置不正確,也能收到一些數據,但一般是亂碼,如果收到的數據都是亂碼的話,就要先檢查一下串口參數設置是否正確了。只有電腦和儀器邊的串口參數完全一致時才能收到正確的數據。
接著是要注意發送指令和讀回數據之間要有一定的延時,即VISA WRITE和VISA READ之間要有一定的延時,一般200毫秒即可,因為串口是底層硬件,數據從軟件到串口上要一點點時間,然后儀器對指令作出響應也要一點點時間,這些時間加起來肯定比軟件運行二個節點的時間要短,所以延時是一定要加的。在調試時如果發現正常運行時不能收到數據,但高亮運行就能收到數據,就很有可能是沒有加延時的原因!或者是發一個查詢指令,但返回的是上一條查詢指令的結果,也可能是因為沒有延時或延時不夠。
?
?
總結
以上是生活随笔為你收集整理的Labview通过RS422通讯接口PC与下位机通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: labview如何进行串口通讯
- 下一篇: RS232串口交叉直连