
此后如竟沒有炬火,我便是唯一的光
一、 前言
??此前我寫了的兩篇關(guān)于LabVIEW進行TCP通信的文章,主體的編寫思路是LabVEIW在同一臺主機上與網(wǎng)絡(luò)調(diào)試助手進行TCP通信,看數(shù)據(jù)能否順利收發(fā)。然而在實際的項目開發(fā)中,我們往往是用LabVIEW開發(fā)上位機軟件,并與PLC或者單片機等下位機進行數(shù)據(jù)通信,進而采集數(shù)據(jù)并下發(fā)控制命令,形成一個完備的測控系統(tǒng)。
??剛好我之前完成了一個測控項目,主要結(jié)構(gòu)就是:LabVIEW開發(fā)上位機,西門子S7-1200作為下位機硬件,二者之間通過TCP協(xié)議進行數(shù)據(jù)收發(fā)。這個項目的主要難點是1200PLC通信程序的編寫,玩過西門子PLC的都知道,與西門子自家的觸摸屏HMI或者組態(tài)王進行通信都比較簡單,而與其他平臺的軟件進行通信特別是LabVIEW就比較困難。
??為此我在西門子官網(wǎng)還有其他網(wǎng)站查詢了很多資料,然后自己歸納總結(jié),并不斷進行試驗驗證,最后解決了1200與LabVIEW進行TCP通信的問題。順便提一下,主流的通用協(xié)議,像是UDP、Modbus等都可以用于S7-1200與LabVIEW通信。
二、 西門子S7-1200實戰(zhàn)
1、開發(fā)環(huán)境
??軟件:Windows10(64位)、LabVIEW2017(32位)、博圖V14
??硬件:西門子S7-1200、網(wǎng)線
2、開發(fā)思路
??本文的重點是講上位機與下位機進行TCP通信,至于不知道如何使用博圖進行硬件組態(tài)及梯形圖程序編寫的萌新請自行百度。
??主體思路就是用博圖編寫Client程序并下載到S7-1200中,上位機用LabVIEW編寫Server端程序,通過一根網(wǎng)線連接PC和PLC,雙端設(shè)置好IP和端口,就可以進行數(shù)據(jù)的收發(fā)。
??上位機程序此次就不費筆墨了,直接用我之間寫過的文章基于LabVIEW的TCP通信進階之?dāng)嗑€重連中所用到的程序,感興趣的可以去翻翻。今天我重點介紹PLC通信程序的編寫,之前項目上用的PLC已經(jīng)交付給甲方,我手頭只剩一塊調(diào)試用的1211C,就是下面這塊:

??后面的程序都將在這塊PLC上進行演示,并通過PLC的監(jiān)視功能驗證其與上位機之間的數(shù)據(jù)收發(fā)是否正常。
3、實現(xiàn)過程
??①打開博圖V14軟件,首先進行硬件組態(tài),選中1211C AC/DC/RLY,版本選4.1,使用PLC默認的IP地址,也可以自己設(shè)置自己想要的IP地址,如下圖所示:

??②在main中添加TCP通信指令,首先添加發(fā)送部分的模塊“TSEND_C”,如下圖所示:

??添加完“TSEND_C”模塊后,暫時先不設(shè)置該模塊的參數(shù),直接點擊上圖中數(shù)字標(biāo)簽3指向的圖標(biāo),進入到到該函數(shù)模塊的連接參數(shù)設(shè)置界面,如下圖所示,圖中給出了詳細的設(shè)置說明:下圖左側(cè)主要設(shè)置PLC作為Client的參數(shù),連接數(shù)據(jù)直接選新建;右側(cè)部分設(shè)置的是遠程Server端的參數(shù),伙伴選未指定,需要注意一點的是,設(shè)置完Server端的IP后,要將運行Server軟件的主機IP設(shè)置為同一數(shù)值。還有,能使用默認設(shè)置的,就盡量使用默認設(shè)置。
??

??③在mian中添加TCP的接收模塊“TRCV”,暫不設(shè)置該模塊的參數(shù),如下圖所示:

??④為方便后期收發(fā)數(shù)據(jù)的觀察,新建兩個DB塊,均取消優(yōu)化塊的訪問,這兩個DB塊分別用于發(fā)送和接收數(shù)據(jù),所有數(shù)據(jù)都使用簡單的byte型數(shù)據(jù),方便后面在Server端觀察數(shù)據(jù),發(fā)送DB塊設(shè)置一下起始值,如下圖所示:
??

??⑤設(shè)置“TSEND_C”模塊和“TRCV”模塊的參數(shù),如下圖所示,參數(shù)設(shè)置好以后,就可以下載到PLC硬件中了。

??⑥Server端則是我之前TCP斷線重連文章中用到的用LabVIEW開發(fā)的上位機軟件,經(jīng)過稍微改造就可以直接用了,上位機界面如下圖所示:
??

4、運行結(jié)果
??①用網(wǎng)線將PLC與電腦連接起來,然后給PLC上電;
??②打開電腦上的Server端程序,點擊運行按鈕;這個時候可以在博圖上看到通信已經(jīng)連接,如下圖所示:

??然后在上位機軟件前面板的字符串輸入框中輸入16進制字符串,由于PLC的接收數(shù)據(jù)DB塊只有6個字節(jié),所以在字符串輸入框中輸入6個字節(jié)的16進制字符串:1122 3344 5566;博圖軟件中發(fā)送DB塊的起始值有7個字節(jié):01 02 03 04 05 ab cd。
??③在博圖上監(jiān)視接收DB塊中的數(shù)據(jù),可以看到接收DB塊中的數(shù)據(jù)與上位機中發(fā)送的字符串一致;同時上位機軟件前面板的字符串顯示框中顯示的數(shù)據(jù)與PLC數(shù)據(jù)發(fā)送DB塊的起始值一致,如下圖所示:

三、小結(jié)
??1、細心的人可能已經(jīng)發(fā)現(xiàn),PLC只發(fā)送了7個字節(jié)的數(shù)據(jù),而上位機前面板字符串顯示框中接收到的數(shù)據(jù)卻是8個字節(jié),在數(shù)據(jù)的末尾多了一個字節(jié)的“00”。經(jīng)過多次試驗,我發(fā)現(xiàn)S7-1200PLC在進行TCP通信的時候,只能發(fā)送偶數(shù)個字節(jié)的字符串,如果發(fā)送的DB塊只有奇數(shù)個字節(jié)的數(shù)據(jù),PLC會自動的在數(shù)據(jù)末尾添加一個字節(jié)的0。
??也就是說,你以為PLC發(fā)送了7個字節(jié)的數(shù)據(jù),實際上它發(fā)送了8個字節(jié),這一點在上位機解析數(shù)據(jù)的時候要注意一下,防止解析數(shù)據(jù)的時候出現(xiàn)數(shù)據(jù)錯位問題。如果我把上位機中讀取TCP數(shù)據(jù)模塊的讀取的字節(jié)由8改為7,如下圖所示:

??那么接收的數(shù)據(jù)就會不停地滾動,進而無法對數(shù)據(jù)進行解析。這一點需要特別注意。
??2、當(dāng)S7-1200作為Client端時,調(diào)用并下載TSEND_C模塊后CPU會自動周期性地發(fā)送TCP連接請求直到被服務(wù)器偵聽到從而建立TCP連接,連接建立后開始收發(fā)數(shù)據(jù),周期大概在100ms左右。
??3、S7-1200PLC同樣可以作為Server端來使用,用法與作為Client端有一點參數(shù)設(shè)置上的區(qū)別,感興趣的可以自己嘗試一下。
??
??
??本人已開通VX公號,后期寫的關(guān)于LabVIEW的文章會第一時間發(fā)布在該號上,感興趣的可以關(guān)注一下!
VX搜索: 智疑
??本文為原創(chuàng)文章,轉(zhuǎn)載請注明出處?。?!