1 本文描述的的TCP通訊適用范圍
TCP通訊是眾多的S7-300/S7-400通訊方式之一,可以在:CPx43-1、集成PN口的CPU、調用套接字編寫的程序、第三方支持開發(fā)以太網(wǎng)通訊的設備之間相互通訊。
本文描述的TCP通訊,僅適用于CP343-1/CP443-1(支持TCP通訊的版本)之間,建立TCP connection,調用AG_Send / AG_Recv的情形。對于CPx43-1通過TCP連接接收其他設備發(fā)送的數(shù)據(jù),如果對方設備可以協(xié)調使用本文方法也可以使用。
CPx43-1的TCP通訊,在發(fā)送接收固定長度數(shù)據(jù)時沒有任何問題。但是在設備應用過程中,往往有不同長度的數(shù)據(jù)需要在兩個S7 PLC之間傳輸,如果不做處理,會出現(xiàn)接收數(shù)據(jù)錯位或接收數(shù)據(jù)延遲超出預期時間。
解決的方法有多種,如設置通訊中可能出現(xiàn)的zui長的數(shù)據(jù)長度作為接收區(qū)(AG_Recv的RCV參數(shù))的固定長度,其他小于該長度的數(shù)據(jù)發(fā)送,也按此zui大長度進行發(fā)送(接收將出現(xiàn)多余字節(jié))。這種方法是值得*的。又如,可以設置接收區(qū)長度為1字節(jié), 把對方發(fā)過來的數(shù)據(jù)逐字節(jié)逐字節(jié)的接收,也可以解決問題,但是這種方法是不*的,因為這種方式會使TCP接收變得極其緩慢,遠遠低于對方發(fā)送的速度。
本文示例介紹另外一種方式。
2 示例使用的主要PLC模塊
CPU315站(接收端) | ||
CPU315F-2DP | 6ES7315-6FF01-0AB0 | V2.6 |
CP343-1 | 6GK7343-1EX30-0XE0 | V2.4 |
CPU319站(發(fā)送端) | ||
CPU319-3PN/DP | 6ES7315-6FF01-0AB0 | V2.6 |
CP343-1 Adv | 6GK7343-1GX21-0XE0 | V1.1 |
軟件: STEP 7 V5.5 SP1
3 示例工作機制
示例假定發(fā)送方可以自由定制發(fā)送數(shù)據(jù)的內容及長度,且zui大數(shù)據(jù)發(fā)送量小于接收CPx43-1的zui大TCP數(shù)據(jù)包長度(如CP343-1的TCP數(shù)據(jù)包zui大為240字節(jié))。
實現(xiàn)的方法是,把一個數(shù)據(jù)包分割成2個部分接收,約定前部分為整包有效發(fā)送數(shù)據(jù)長度,后部分為有效數(shù)據(jù)。示例的*部分按1字節(jié)作為長度處理,發(fā)送方按此格式發(fā)送。
3.1 發(fā)送流程
發(fā)送方在發(fā)送之前,在AG_Send的Send參數(shù)*個字節(jié)加入數(shù)據(jù)長度,后跟待發(fā)送數(shù)據(jù)串,Len參數(shù)為數(shù)據(jù)長度加1個字節(jié), 然Act = True觸發(fā)發(fā)送。
3.2 接收流程
先把AG_Recv的RCV參數(shù)長度設置為一個字節(jié)接收,NDR = True后,把RCV的長度調整為接收到的字節(jié)所設定的長度,再次啟動接收,把有效數(shù)據(jù)完整的一次接收,這樣不會發(fā)生錯位。
4 相關參考
示例中所涉及的TCP組態(tài)及基本編程,請參考下載中心文檔“通過CP343-1實現(xiàn)S7-300之間的以太網(wǎng)通訊”編號為A0020 ;對于ANY 指針的格式,請參考請參考下載中心文檔“S7-300和S7-400尋址”,編號F0215 。