西門子plc之S7-200SMART的TCP通信 (上)
200SMART的開放式通信(Open User Communication)包括TCP通信,UDP通信以及ISO-on-TCP通信,支持CPU固件版本V2.2以上,常用于與第三方支持相同協(xié)議的設備通信。
開放式通信(OUC)編程可以通過指令或者調用OUC的指令庫,通信雙方均要調用指令,通信數據量可以達到1024個字節(jié),這次我們將介紹OUC通信中的TCP通信。
TCP通信是一種面向連接的通信協(xié)議,通信之前需要先建立連接,是一種數據流的服務,不傳輸開始消息和結束消息,是一種可靠,安全的數據傳輸。所謂數據流,舉一個簡單的例子來說,發(fā)送方第一次發(fā)送10個數據,然后第二次再發(fā)送10個數據,然后接收方啟用接受會一下子接收到20個數據。
TCP通信的編程可以通過通信指令或者開放式用戶通信庫指令,如圖:
圖一:通信指令
圖二: 開放式用戶通信庫指令
這里建議使用開放式用戶通信庫指令,編程和填寫參數都能簡單一點。
下面開始介紹一下TCP通信的流程:
①:建立連接(關鍵!必須!)TCP_CONNECT和TCP_SEND、TCP_RECV指令用法
②:交換數據(發(fā)送/接收)
③:斷開連接(一般不用)
④:分配庫存儲器(必須!建議選擇較大的地址避免沖突)
接下來介紹一下各個指令的每個引腳的含義,
首先介紹TCP_CONNECT指令
參數 |
數據類型 |
描述 |
EN |
BOOL |
使能輸入 |
Req |
BOOL |
如果Req=TRUE,CPU啟動連接操作。如果 Req = FALSE,則輸出顯示連接的當前狀態(tài)。 |
Active |
BOOL |
設置本地CPU在通信中的角色 Active= TRUE為主動連接(一般用于客戶端) Active= FALSE為被動連接(一般用于服務器) |
ConnID |
WORD |
CPU使用連接 ID (ConnID) 為其它指令標識該連接。可能的ConnID范圍為0到65534。 |
IPadd IPaddr4 |
BYTE |
這些是IP地址的四個八位字節(jié)。IPaddr1到IPaddr4 填寫通信伙伴的IP地址 |
RemPort |
WORD |
RemPort 是遠程設備上的端口號。遠程端口號范圍為 1 到 49151。對于被動連接,使用零。 |
LocPort |
WORD |
LocPort 是本地設備上的端口號。本地端口號范圍為 1 到 49151,但存在一些限制。 |
Done |
BOOL |
完成標志位,建立通信連接之后一直保持1。 |
Busy |
BOOL |
當連接操作正在進行時,指令置位 Busy 輸出。 |
Error |
BOOL |
當連接操作完成但發(fā)生錯誤時,指令置位 Error 輸出。 |
Status |
BYTE |
如果指令置位 Error 輸出,Status 輸出會顯示錯誤代碼。如果指令置位 Busy 或 Done 輸出,Status 為零(無錯誤)。 |
這里我們再對一些參數進行一些補充解釋:
-
ConnID:ConnID用于標識通信連接,不同的ConnID不能重復,且占用開放式通信資源最多16個,客戶端的ConnID與服務器的ConnID無關。
-
IPaddr:填寫通信伙伴的IP地址,客戶端填寫服務器的IP,服務器填寫客戶端的IP。主動連接不能填0.0.0.0,被動連接可以填0.0.0.0,表示接受任意遠程IP地址的連接。
-
RemPort 和LocPort:端口號設置,建議采用2000~5000,主動方和被動方的RemPort 和LocPort交叉對應;對于被動連接,本地端口號必須唯一(不重復),且可以忽略遠程端口號,RemPort可以填0。
-
Req & Active:CPU作為客戶端:Active設置為TURE,然后再觸發(fā)Req,主動發(fā)送報文,請求建立連接。如圖Active設置SM0.0。
CPU作為服務器先就緒,客戶端發(fā)送請求報文后,才可建立連接,否則被拒絕。
例如我設置本地客戶端IP為192.168.0.100,ConnID為10,端口號為2000;
遠程服務器IP為192.168.0.101,ConnID為20,端口號為2001;如圖
這次關于200SMART的TCP通信就暫時介紹到這里,下一篇將繼續(xù)為大家介紹TCP的發(fā)送和接收指令,以及TCP程序編寫。
西門子plc之S7-200SMART的TCP通信 (下)
上次為大家介紹了200SMART的TCP_CONNECT指令,這次繼續(xù)介紹TCP_SEND指令和TCP_RECV指令。
TCP_SEND指令和TCP_RECV這兩個指令比較簡單,就放在一起介紹。
EN:使能,對于接收指令,建議常1觸發(fā)。
Req:發(fā)送指令觸發(fā)發(fā)送指令,建議使用上升沿觸發(fā)。
ConnID:連接標識,與各自的TCP_CONNECT的ConnID相同。
DataLen發(fā)送數據的長度,最多1024個字節(jié)。
MaxLen:接收數據的最大長度,最多1024個字節(jié)。
Length:實際接收數據的長度。
DataPtr:發(fā)送數據的地址指針,發(fā)送數據的首地址。
其他的Done,Busy等與TCP_CONNECT指令相同。
接下來對這些參數進行一個詳細的解釋:
如圖,是TCP_SEND的調用時序圖,藍色為Req上升沿觸發(fā),紅色為Req電平觸發(fā)。
使用Req上升沿觸發(fā)→Busy=1→完成后DONE=1(一個掃描周期)→Error=1且Status=24,然后等待下一次上升沿觸發(fā)信號進行循環(huán),這里Status=24表示指令調用但是未觸發(fā)操作,并不代表錯誤。
使用Req電平觸發(fā)→Busy=1→完成后DONE=1(一個掃描周期),然后不停循環(huán)Busy和Done。
這里建議使用上升沿觸發(fā)TCP_SEND指令。
如圖,是TCP_RECV的調用時序圖,藍色為EN上升沿觸發(fā),紅色為EN電平觸發(fā)。
EN上升沿觸發(fā),需要兩次觸發(fā)才可以接收數據,DONE保持為1,直至下次上升沿的到來;而EN電平觸發(fā),有數據就接收,大部分時間處于Busy,Done為1一個周期,所以建議EN使用電平觸發(fā)TCP_RECV指令。
對于TCP_RECV的MaxLen,當MaxLen<發(fā)送方數據的長度時,按照MaxLen設置的長度進行接收,多余部分舍棄,Done不置位,同時Error=1,Status=25。
所以建議MaxLen=發(fā)送方數據的長度,如果發(fā)送方的長度是變化的,則MaxLen按照最大長度進行填寫。
最后以下題為例:本地客戶端IP為192.168.0.100,ConnID為10,端口號為2000;遠程服務器IP為192.168.0.101,ConnID為20,端口號為2001,將本地站從VB200開始的10個字節(jié)發(fā)送到遠程站的VB100開始的10個字節(jié)。
首先我們在系統(tǒng)塊中設置本地站和遠程站的IP地址
然后設置TCP_CONNECT參數,如圖
接著分別設置TCP_SEND和TCP_RECV
按下I0.4,啟動客戶端TCP_CONNECT的連接,SM0.5不斷觸發(fā)SEND的Req,
如圖所示,數據成功發(fā)送,通訊成功。