郝慶偉



摘要:近年來隨著以太網與工業網絡交互與融合,越來越多的工業產品需要通過TCP協議與PLC系統進行通訊,本文以西門子S7-300/400 PLC為例詳細闡述其TCP通訊機理及具體的通訊實現方法。
關鍵詞:PLC;通訊;TCP
中圖分類號:TP273.5 文獻標識碼:A 文章編號:1007-9416(2019)10-0031-02
0 引言
隨著工業以太網的發展,目前大多數工業控制系統中要實現自動化功能需要將PLC、HMI服務器、二級服務器、編程器、其他智能設備等進行聯網以實現通訊交互。西門子的PLC產品在工控領域有很高的占有率,而隨著多元化的發展,一條產線可能存在不同廠家的工控產品,西門子PLC與其他廠家的數據交換無法使用自家的S7協議,開放式的以太網TCP協議是一個很好的選擇。
1 TCP通訊協議的特點
TCP協議位于ISO/OSI參考模型的傳輸層,是一種面向連接的通信,即發送方與接收方通信時,必須首先建立連接,主動方為客戶端,被動方為服務器。TCP協議對發送的數據進行排序,為每個發送字節關聯一個序列號,接收方根據接收到的數據序列號,對接收數據排序,從而保證了數據的順序。TCP數據接收方利用滑動窗口提供流量控制,告知對方它能夠接收數據的字節數。其傳輸的形式是數據流,沒有傳輸長度及信息幀的起始、結束信息,最大報文段長度MSS=1460bytes,適合傳輸中等到大量的數據。其報文格式參考表1。
TCP通信傳送數據前,雙方必須對通信進行初始化,并得到對方的認可,即建立連接。此過程通過三次握手實現,如圖1所示。
TCP通信的任意一方都可以主動關閉這個連接,發送FIN報文段,FIN置1。一個FIN報文段被確認后,這個方向的連接被關閉。只有兩個方向的連接都被關閉,該TCP連接才被完全釋放。如圖2所示。
2 西門子S7-300/400 PLC TCP通訊方式
SIMATIC S7-300/400 PN CPU包含一個集成的 PROFINET接口,該接口除了具有PROFINET I/O功能外還具有開放式用戶通信功能,支持TCP等協議。要通過該集成PROFINET 接口實現開放的TCP通信,不能在硬件組態中完成,必須在一個數據塊中指定每個連接的參數。使用“Open Communication Wizard”工具可以簡單明了地指定連接參數,該工具可將一個包含所有參數的UDT導出到STEP項目中。使用該UDT可建立含有連接描述的數據塊。隨后,需使用STEP7的標準庫中的下列通信功能塊編寫用戶程序,即可與符合以太網標準的通訊伙伴進行數據交換:
(1)用于建立連接的FB 65-"TCON";(2)用于終止連接的FB 66-"TDISCON";(3)用于發送數據的FB 63-"TSEND";(4)用于接收數據的FB 64-"TRCV"。
其數據交換機理如圖3所示,數據發送方調用FB63,脈沖方式觸發REQ管腳,則生成發送緩沖區,即SEND BUFFER,隨后數據被壓入接口堆棧,即INTERFACE BUFFER,數據通過硬件接口發送至數據接收方的接口堆棧,接收方調用FB64,并使能EN_R管腳,生成接收緩沖區,即RCV BUFFER,隨后數據被傳送到接收方的實際地址區,如DB區。該過程中的緩沖區及堆棧最大為8192字節,所以西門子S7-300/400 CPU TCP通信一次發送/接收的最大數據量為32K字節。
3 數據一致性
始終被一致性的同時修改的數據區被稱為一致數據區。也就是說一個數據區如果不被一致性的同時修改則會造成數據不一致。打個比方,有100個字節的數據,在第一個掃描周期內修改了50個字節,在第二個掃描周期內修改了剩下的50個字節,則這100個字節在同一個掃描周期內是不一致的。FB63,FB64是異步功能塊,其執行時間可能持續若干個CPU掃描周期,為了保證其數據一致性,對于發送方,FB63的發送完成位“DONE”參數置1之前,必須保證發送數據區內的數據不變,對于接收方,FC64的接收完成位“NDR”置1之后,再使用接收數據區內的數據。否則對于數據一致性要求較高的場合有可能會造成意想不到的后果。
4 常見問題
4.1 接收功能塊FB64無法接收數據,顯示故障代碼80A1
通信雙方未完成三次握手,通信連接未成功建立,使用“Open Communication Wizard”工具檢查CPU型號、IP地址、端口號、是主動方還是被動方等參數,再檢查通訊伙伴的相關參數設置。然后執行FB66斷開連接,然后再次調用FB65重新建立連接。
4.2 接收功能塊FB64可以收到數據,但順序錯亂
如前面所述,TCP通信的傳輸的形式是數據流,所以接收方無法檢測數據流中的某條消息在何處結束以及下一條消息在何處開始,即接收方無法知道發送方一次發送多少個字節。因此,當通訊伙伴接收方的數據接收長度與發送方的數據發送長度不匹配時,就會發生數據錯亂的現象。要解決此問題,需要發送方和接收方將通信數據區長度保持一致。但有時往往發送方發送的數據長度是變化的無法固定在一個值,如掃碼設備掃描不同類型的條碼,其長度不是固定的,發送給CPU時會出問題,針對這種情況可將接收功能塊FB64的LEN參數設置為0,以啟用內部Ad-hoc模式,即以報文段為單位進行接收,每接收一個報文段則認為接收完成并計算接收長度,由于TCP最大報文段長度MSS=1460bytes,則如果單次發送長度不大于1460字節,使用此方法可以完美解決變長接收問題。但如果單次發送長度大于1460字節,則需要進一步編程處理,如發送方在報文段內加入長度信息,接收方再對該信息進行解析,從而確定數據長度。
4.3 建立連接功能塊FB65的DONE為什么一直為0
連接建立后,FB65的DONE參數會置1,但只是維持一個掃描周期,然后復位到0,所以直接監控是看到的狀態是0。可以通過采集它的上升沿信號查看是否置1,以查看通信是否已經建立。例如,可以接一個計數器。
5 結語
TCP通信協議有著通用性強,可靠高效的特點,應用非常廣泛,西門子PLC與PLC之間,PLC與第三方以太網設備的通信均可采用此種方式,由于其數據流的特性,使用時要注意一些問題,與S7通信還是有一定的區別。目前TCP通訊像S7通信一樣,已成為西門子PLC以太網通信的重要連接方式。
參考文獻
[1] 廖常初.S7—300/400 PLC應用技術[M].北京:機械工業出版社,2005:280-305.
[2] 崔堅.西門子工業網絡通訊指南(下冊)[M].北京:機械工業出版社,2006:1-149.