深度剖析西門子PLC的開放式TCP通訊
對於自控或電氣工程師來說,西門子PLC是每個人都非常熟悉的一款PLC品牌;而對於上位機開發工程師來說,Socket通訊或TCP/IP協議也是必須要掌握的一種通訊方式。剛好手頭有一款西門子的200Smart PLC,可以利用它來跟大家聊聊Socket通訊的那些事兒。
相比較而言,西門子PLC對Socket通訊的支援性是很不錯的。如果你在使用西門子軟體或者逛西門子論壇時,發現一個詞叫做Open User Communication或開放式通訊,沒錯,那其實就是我們說的Socket通訊方式。關於這一點,我們可以從以下兩張圖中看出,分別為S7-200Smart程式設計軟體Micro/Win Smart V2.5及博途TIA V15.1程式設計軟體中關於通訊庫的部分截圖:
我們可以看到無論是西門子的中高階PLC還是低端PLC,都是支援開放式TCP/UDP通訊的,既然都支援,我們來看下如何實現。
眾所周知,對於Socket通訊來說,是可以支援TCP、UDP等多種通訊方式,但是今天在這裡,我們主要針對TCP這種通訊方式。除此以外,大家都知道,Socket會存在伺服器和客戶端的說法,也就意味著,同樣是使用Socket通訊,我們仍然需要確定到底PLC是作為伺服器還是作為客戶端,因為不管對於PLC程式設計或者上位機開發來說,這兩種方式都是完全不同的,下面做具體介紹。
一、PLC作為TCP伺服器的實戰應用
(1)PLC程式設計
1.1 建立一個TCPServer的子程式,拖拽一個TCP_CONNECT的庫指令,對於該指令的每個引腳對應的含義,大家可以按下F1直接獲取線上幫助,程式段1編寫如下圖所示:
1.2 拖拽一個TCP_SEND的庫指令,對於該指令的每個引腳填寫,ConnID為1,Req為觸發條件,必須為沿訊號,這裡為了方便,直接使用1秒的脈衝訊號,DataLen及DataPtr為傳送的起始位元組指標及傳送的位元組長度,程式段2如下圖所示:
1.3 拖拽一個TCP_RECV的庫指令,對於該指令的每個引腳填寫,ConnID統一為1,MaxLen為接收的最大程度,DataPtr表示接收位元組存放的起始位置,程式段3如下圖所示:
1.4 最後需要編譯,編譯會提示需要給庫分配地址,點選檔案下的儲存器,給該庫分配地址即可,然後在MAIN主程式中呼叫TCPServer這個子程式,並下載到PLC中,PLC程式設計部分結束。
(2)TCP除錯助手測試
如果PLC程式編寫沒問題,開啟一個網路除錯助手,輸入對應的IP地址及埠號,即可連線上伺服器。
連線伺服器後,PLC端會自動每隔一秒傳送200個位元組資料過來,這200個位元組即對應VB100-VB299的值。
(3)上位機客戶端軟體開發
通過與程式設計軟體的狀態圖表進行對照,可以實時讀取PLC資料,並隨時設定相應的數值。
二、PLC作為TCP客戶端的實戰應用
(1) PLC程式設計
1.1 建立一個TCPClient的子程式,拖拽一個TCP_CONNECT的庫指令,與伺服器程式不同的是,這裡需要把Active設定為ON,同時IP地址和埠號需要根據上位機實際情況填寫,程式段1編寫如下圖所示:
1.2 拖拽一個TCP_SEND的庫指令,對於該指令的每個引腳填寫,ConnID為2,Req為觸發條件,必須為沿訊號,這裡為了方便,直接使用1秒的脈衝訊號,DataLen及DataPtr為傳送的起始位元組指標及傳送的位元組長度,程式段2如下圖所示:
1.3 拖拽一個TCP_RECV的庫指令,對於該指令的每個引腳填寫,ConnID統一為2,MaxLen為接收的最大程度,DataPtr表示接收位元組存放的起始位置,程式段3如下圖所示:
1.4 最後需要編譯,如果已經編寫過伺服器程式,這裡就不需要分配地址了,直接在MAIN主程式中呼叫TCPClient這個子程式,並下載到PLC中,PLC程式設計部分結束。
(2)TCP除錯助手測試
如果PLC程式編寫沒問題,開啟一個網路除錯助手,設定模式為TCP Server,輸入埠號為2000,即可開啟伺服器。
伺服器開啟後,PLC端會自動連線伺服器,並且每隔一秒傳送100個位元組資料過來,這100個位元組即對應VB500-VB599的值。
(3) 上位機伺服器軟體開發
通過與狀態圖表進行對比,驗證可以正常讀取和寫入PLC資料。
三、整體總結
後續通過進一步測試,驗證PLC可以同時作為伺服器和客戶端與上位機進行通訊。
本次主要針對西門子PLC的開放式TCP通訊作了較為詳細地闡述,由於篇幅有限,無法將上位機部分的具體程式設計程式碼進行分析。