【LabVIEW開發(fā)】基于LabVIEW的TCP通信進(jìn)階之?dāng)嗑€重連

春有百花秋有月,夏有涼風(fēng)冬有雪。若無閑事掛心頭,便是人間好時節(jié)。

一、 前言

??我之前寫過一篇帖子:【LabVIEW開發(fā)】如何使用LabVIEW進(jìn)行TCP通信?,里面比較詳細(xì)地介紹了在LabVIEW的開發(fā)環(huán)境下如何與第三方進(jìn)行TCP通信,內(nèi)容比較基礎(chǔ),感興趣的可以去看看。
??當(dāng)時寫完這篇帖子,我就樂呵呵的以為這是LabVIEW進(jìn)行TCP通信的終極形態(tài),直到現(xiàn)實給了我當(dāng)頭一棒。在后來的一次項目中,我用LabVIEW開發(fā)上位機,使用TCP協(xié)議與西門子S7-1200進(jìn)行數(shù)據(jù)通信,一開始在家做調(diào)試的時候上位機軟件沒啥問題,直到有一次在項目現(xiàn)場調(diào)試設(shè)備的時候,發(fā)現(xiàn)下位機上傳給上位機軟件的參數(shù)都沒了,一檢查發(fā)現(xiàn):與工控主機連接的PLC網(wǎng)口的網(wǎng)線松動,就把網(wǎng)線重新插好,但是軟件依然沒有接收硬件上傳的數(shù)據(jù),這時我才意識到自己寫的上位機軟件沒有斷線重連功能。
??這個問題雖然可以通過重啟軟件來解決,重啟軟件后通信恢復(fù)了,但依然說明我寫的TCP通信程序是由缺陷的。既然發(fā)現(xiàn)了問題,當(dāng)然要解決問題,不然跟咸魚有什么區(qū)別。在網(wǎng)上查閱了大量資料后,終于找到了一位大佬寫的程序完美的解決了這個問題,我覺得有必要把他貼出來:


??也許是LabVIEW版本不同或者操作系統(tǒng)不一樣的原因,這位大佬給的源程序在我的電腦上運行時會報一些小錯誤,而且程序面板里的連線縱橫交錯(估計是版本不同導(dǎo)致的),不利于基礎(chǔ)相對較差的人閱讀和修改。為此我在源程序的基礎(chǔ)上重新寫了一個相對精簡的程序,并成功實現(xiàn)了TCP通信的斷線重連功能。

二、 實戰(zhàn)練習(xí)

1、編程思路

??具體實現(xiàn)程序的編寫思路是:使用TCP客戶端/服務(wù)端單獨與網(wǎng)絡(luò)調(diào)試助手進(jìn)行通信,通信成功后,手動點擊網(wǎng)絡(luò)調(diào)試助手界面上的“斷開連接”按鈕,此時LabVIEW與網(wǎng)絡(luò)調(diào)試助手通信斷開,數(shù)據(jù)無法收發(fā);然后再手動點擊網(wǎng)絡(luò)調(diào)試助手界面的上“打開連接”按鈕,觀察之前斷開的TCP連接是否重新連接,收據(jù)是否可以收發(fā)。
??網(wǎng)絡(luò)調(diào)試助手主要是用來模擬第三方具備以太網(wǎng)通信功能的硬件設(shè)備,比如個人PC、PLC、單片機等。如果與網(wǎng)絡(luò)調(diào)試助手通信正常,那么與其他硬件進(jìn)行TCP通信也就不會有什么問題。后期有時間我會用LabVIEW與西門子PLC通信,然后重啟PLC,看TCP通信是否會斷線重連。

2、Client端斷線重連

??客戶端的前面板只有字符串顯示框,用來顯示網(wǎng)絡(luò)調(diào)試助手發(fā)過來的數(shù)據(jù);程序面板與我之前寫的如何使用LabVIEW進(jìn)行TCP通信?中所寫基本一樣,最大的區(qū)別是使用移位寄存器,然后為了讓網(wǎng)絡(luò)調(diào)試助手接收的每一幀數(shù)據(jù)是變化的,發(fā)送數(shù)據(jù)改用隨機數(shù)生成的數(shù)組轉(zhuǎn)化為字符串后進(jìn)行發(fā)送,而不是手動輸入。
??client端程序?qū)崿F(xiàn)斷線重連的核心原理是:通過判斷TCP模塊輸出的錯誤代碼是否等于66或63,如果通信異?;驍嚅_,條件為真進(jìn)入到條件結(jié)構(gòu)里的順序結(jié)構(gòu)部分,順序結(jié)構(gòu)依次為斷開TCP連接、延遲3秒、重新打開TCP連接。如果此時網(wǎng)絡(luò)調(diào)試助手server端恢復(fù)正常,那么client端的通信就恢復(fù)了,也就實現(xiàn)了斷線重連。
??如果第三方server端一直沒有打開監(jiān)聽,那么TCP模塊的錯誤代碼會一直是66或63,那么程序就會每隔3秒進(jìn)行重連操作,直到通信恢復(fù)正常。在多次重復(fù)測試中,我發(fā)現(xiàn)錯誤代碼一直都是66,一次也沒檢測到63,可能是測試次數(shù)不夠未能檢測到,建議兩個數(shù)字都用。至于TCP通信異常的錯誤代碼為啥是66或者63,說實話我也不知道,這可能要去問NI公司的軟件開發(fā)工程師了。
??具體的實現(xiàn)程序如下圖所示:

client端的前面板和程序面板

??下面再來看下程序運行的結(jié)果,將網(wǎng)絡(luò)調(diào)試助手設(shè)置為server型,IP和Port分別設(shè)置為127.0.0.1和6666。此時,不管是先運行LabVIEW的client端程序,還是先運行調(diào)試助手的server端程序,雙端之間都可以正常進(jìn)行TCP通信。由于我在client端的TCP read模塊設(shè)置的接收數(shù)據(jù)字節(jié)數(shù)為4,所以調(diào)試助手發(fā)送的數(shù)據(jù)是4個字節(jié),目前client端程序無法自動獲取接收數(shù)據(jù)的字節(jié)數(shù),需要手動設(shè)置。程序具體運行結(jié)果如下圖所示:

client端的運行結(jié)果

??此時點擊調(diào)試助手上的“斷開”按鈕,可以看到client端前面板的字符串顯示框中的數(shù)據(jù)消失了,說明此時軟件沒有接收到數(shù)據(jù),通信已中斷;然會再點擊調(diào)試助手界面上的“打開”按鈕,然后點擊發(fā)送數(shù)據(jù),雙端之間的通信自動恢復(fù)正常。同樣,保持server端運行,中斷client程序運行,然后重新運行client程序,TCP通信依舊可以自動恢復(fù)。

3、Server端斷線重連

??server端的前面板是一個字符串顯示框和一個停止按鈕,分別用來顯示調(diào)試助手發(fā)送的數(shù)據(jù)和關(guān)閉程序。程序面板編寫的核心原理是:
??首先設(shè)置"TCP Listen.vi"模塊的端口為6666,通信超時設(shè)置為0,然后判斷該模塊輸出的錯誤狀態(tài)碼,通信正常時狀態(tài)碼為0,通信異常時狀態(tài)碼為1。也就是說,當(dāng)client端通信中斷后,server端偵聽模塊的狀態(tài)碼就變?yōu)?,錯誤碼會變?yōu)?2或者66,而條件結(jié)構(gòu)“真”里面的代碼為空,此時程序開始執(zhí)行外部大循環(huán)里偵聽模塊的程序,與此同時,條件結(jié)構(gòu)中的小循環(huán)讀/寫程序被中止。
??經(jīng)過我多次測試,發(fā)現(xiàn)錯誤碼大部分時候是62,少數(shù)情況下會出現(xiàn)66,所以這兩個數(shù)必須要使用。具體的實現(xiàn)程序如下圖所示:


server端的前面板和程序面板

??如果client端打開連接,server端一旦偵聽到了該連接,通信恢復(fù)正常,狀態(tài)碼和錯誤碼會立刻轉(zhuǎn)變?yōu)?,數(shù)據(jù)就可以正常收發(fā)。與我之前寫的基本版通信程序相比,這個程序最大的改變就是client端通信中斷后,會不斷循環(huán)運行“TCP Listen.vi”這個模塊,進(jìn)行循環(huán)監(jiān)聽;而基本版的程序只進(jìn)行過一次監(jiān)聽,如果中途通信斷掉了,這個偵聽模塊不會再重新運行,也就不能實現(xiàn)斷線重連。
??程序運行的結(jié)果如下圖所示:


server端的運行結(jié)果

??先運行server端程序,然后將調(diào)試助手設(shè)置為Client模式,并設(shè)置好IP和Port,點擊面板上的“連接”按鈕,調(diào)試助手立馬顯示同行已連接,再點擊循環(huán)發(fā)送按鈕,數(shù)據(jù)就可以正常收發(fā)。為了方便觀察,我把調(diào)試助手的循環(huán)發(fā)送周期設(shè)置為1.5s。
??依次點擊調(diào)試助手面板上的“斷開”--“連接”--“發(fā)送”,模擬客戶端連接中斷(網(wǎng)線拔掉),重新連接(網(wǎng)線插上)的過程,可以看到與server端的通信馬上就恢復(fù)了,說明上述程序?qū)崿F(xiàn)了斷線重連功能。
??

三、 小結(jié)

??1、數(shù)據(jù)收發(fā)的周期一般是雙端匹配的,不管我上位機軟件收發(fā)周期設(shè)置為多少毫秒,下位機硬件的發(fā)送周期如果比上位機的接收周期長,就會以時間更長的一端為準(zhǔn)。這個在實際的項目中需要注意一下。
??2、軟件沒有自動識別接收數(shù)據(jù)字節(jié)數(shù)的功能,所以在read模塊需要設(shè)置好接收數(shù)據(jù)的字節(jié)數(shù),并與調(diào)試助手上發(fā)送的數(shù)據(jù)字節(jié)數(shù)保持一致。如果不一致,會導(dǎo)致數(shù)據(jù)無法接收揮著接收數(shù)據(jù)亂碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容