此后如竟沒有炬火,我便是唯一的光
一、 前言
??此前我寫了的兩篇關于LabVIEW進行TCP通信的文章,主體的編寫思路是LabVEIW在同一臺主機上與網絡調試助手進行TCP通信,看數據能否順利收發。然而在實際的項目開發中,我們往往是用LabVIEW開發上位機軟件,并與PLC或者單片機等下位機進行數據通信,進而采集數據并下發控制命令,形成一個完備的測控系統。
??剛好我之前完成了一個測控項目,主要結構就是:LabVIEW開發上位機,西門子S7-1200作為下位機硬件,二者之間通過TCP協議進行數據收發。這個項目的主要難點是1200PLC通信程序的編寫,玩過西門子PLC的都知道,與西門子自家的觸摸屏HMI或者組態王進行通信都比較簡單,而與其他平臺的軟件進行通信特別是LabVIEW就比較困難。
??為此我在西門子官網還有其他網站查詢了很多資料,然后自己歸納總結,并不斷進行試驗驗證,最后解決了1200與LabVIEW進行TCP通信的問題。順便提一下,主流的通用協議,像是UDP、Modbus等都可以用于S7-1200與LabVIEW通信。
二、 西門子S7-1200實戰
1、開發環境
??軟件:Windows10(64位)、LabVIEW2017(32位)、博圖V14
??硬件:西門子S7-1200、網線
2、開發思路
??本文的重點是講上位機與下位機進行TCP通信,至于不知道如何使用博圖進行硬件組態及梯形圖程序編寫的萌新請自行百度。
??主體思路就是用博圖編寫Client程序并下載到S7-1200中,上位機用LabVIEW編寫Server端程序,通過一根網線連接PC和PLC,雙端設置好IP和端口,就可以進行數據的收發。
??上位機程序此次就不費筆墨了,直接用我之間寫過的文章基于LabVIEW的TCP通信進階之斷線重連中所用到的程序,感興趣的可以去翻翻。今天我重點介紹PLC通信程序的編寫,之前項目上用的PLC已經交付給甲方,我手頭只剩一塊調試用的1211C,就是下面這塊:
??后面的程序都將在這塊PLC上進行演示,并通過PLC的監視功能驗證其與上位機之間的數據收發是否正常。
3、實現過程
??①打開博圖V14軟件,首先進行硬件組態,選中1211C AC/DC/RLY,版本選4.1,使用PLC默認的IP地址,也可以自己設置自己想要的IP地址,如下圖所示:
??②在main中添加TCP通信指令,首先添加發送部分的模塊“TSEND_C”,如下圖所示:
??添加完“TSEND_C”模塊后,暫時先不設置該模塊的參數,直接點擊上圖中數字標簽3指向的圖標,進入到到該函數模塊的連接參數設置界面,如下圖所示,圖中給出了詳細的設置說明:下圖左側主要設置PLC作為Client的參數,連接數據直接選新建;右側部分設置的是遠程Server端的參數,伙伴選未指定,需要注意一點的是,設置完Server端的IP后,要將運行Server軟件的主機IP設置為同一數值。還有,能使用默認設置的,就盡量使用默認設置。
??
??③在mian中添加TCP的接收模塊“TRCV”,暫不設置該模塊的參數,如下圖所示:
??④為方便后期收發數據的觀察,新建兩個DB塊,均取消優化塊的訪問,這兩個DB塊分別用于發送和接收數據,所有數據都使用簡單的byte型數據,方便后面在Server端觀察數據,發送DB塊設置一下起始值,如下圖所示:
??
??⑤設置“TSEND_C”模塊和“TRCV”模塊的參數,如下圖所示,參數設置好以后,就可以下載到PLC硬件中了。
??⑥Server端則是我之前TCP斷線重連文章中用到的用LabVIEW開發的上位機軟件,經過稍微改造就可以直接用了,上位機界面如下圖所示:
??
4、運行結果
??①用網線將PLC與電腦連接起來,然后給PLC上電;
??②打開電腦上的Server端程序,點擊運行按鈕;這個時候可以在博圖上看到通信已經連接,如下圖所示:
??然后在上位機軟件前面板的字符串輸入框中輸入16進制字符串,由于PLC的接收數據DB塊只有6個字節,所以在字符串輸入框中輸入6個字節的16進制字符串:1122 3344 5566;博圖軟件中發送DB塊的起始值有7個字節:01 02 03 04 05 ab cd。
??③在博圖上監視接收DB塊中的數據,可以看到接收DB塊中的數據與上位機中發送的字符串一致;同時上位機軟件前面板的字符串顯示框中顯示的數據與PLC數據發送DB塊的起始值一致,如下圖所示:
三、小結
??1、細心的人可能已經發現,PLC只發送了7個字節的數據,而上位機前面板字符串顯示框中接收到的數據卻是8個字節,在數據的末尾多了一個字節的“00”。經過多次試驗,我發現S7-1200PLC在進行TCP通信的時候,只能發送偶數個字節的字符串,如果發送的DB塊只有奇數個字節的數據,PLC會自動的在數據末尾添加一個字節的0。
??也就是說,你以為PLC發送了7個字節的數據,實際上它發送了8個字節,這一點在上位機解析數據的時候要注意一下,防止解析數據的時候出現數據錯位問題。如果我把上位機中讀取TCP數據模塊的讀取的字節由8改為7,如下圖所示:
??那么接收的數據就會不停地滾動,進而無法對數據進行解析。這一點需要特別注意。
??2、當S7-1200作為Client端時,調用并下載TSEND_C模塊后CPU會自動周期性地發送TCP連接請求直到被服務器偵聽到從而建立TCP連接,連接建立后開始收發數據,周期大概在100ms左右。
??3、S7-1200PLC同樣可以作為Server端來使用,用法與作為Client端有一點參數設置上的區別,感興趣的可以自己嘗試一下。
??
??
??本人已開通VX公號,后期寫的關于LabVIEW的文章會第一時間發布在該號上,感興趣的可以關注一下!
VX搜索: 智疑
??本文為原創文章,轉載請注明出處!!!