1. 程式人生 > 其它 >基於Socket訪問西門子PLC系列教程(二)

基於Socket訪問西門子PLC系列教程(二)

轉載自基於Socket訪問西門子PLC系列教程(二) - 常哥說程式設計 - 部落格園 (cnblogs.com)

本文是西門子開放式TCP通訊的第2篇,上一篇我們講了使用西門子1200PLC作為TCP伺服器的程式編寫,可以點選下方連結閱讀:【公眾號dotNet工控上位機:thinger_swj】

基於Socket訪問西門子PLC系列教程(一)

在完成上述步驟後,接下來就是編寫上位機軟體與PLC之間進行通訊。上位機UI介面設計如下圖所示:

 


從上圖可以看出,上位機需要完成以下功能:

  • TCP建立連線與斷開連線
  • 多執行緒接收伺服器資料
  • 各種資料型別通用資料解析
  • 各種資料型別的通用寫入接下來我們將按照功能順序來逐個完成,具體如下:

(1)TCP的建立連線與斷開連線:TCP連線與斷開主要是呼叫Socket的API函式來實現,程式碼如下所示:

 

 

(2)開啟多執行緒持續接收伺服器資料:上位機連線上PLC後,PLC會定時向上位機發送資料,上位機需要持續接收資料,因此在連線成功後,開啟一個執行緒來接收伺服器資料。

(3)各種資料型別通用資料解析:當已經獲取到所有的資料(位元組陣列)時,如果想任意一種資料型別的解析,通過分析發現,至少需要三個元素,分別為起始位元組、資料型別、偏移(針對布林是位偏移,針對字串是長度),因此我們首先針對這三個元素,建立了一個實體類,如下所示:

 

通過控制元件顯示資料,因此需要給控制元件做下繫結,這裡是通過Tag屬性來做,按照DataType;Start.Offset的格式,DataType按照列舉型別填寫資料,Start填寫一個整數,對於Offset,如果不是布林型別或者字串,該項可以不填,填寫格式如下所示:

 

Tag繫結方式如下所示:【公眾號dotNet工控上位機:thinger_swj】

 

獲取到控制元件繫結的Tag之後,需要編寫一個方法,實現Tag和實體物件BindVariable之間的轉換。

通用資料更新實現思路:遍歷所有的控制元件,首先判斷其Tag屬性是否滿足要求,如果滿足要求,將Tag轉換為BindVariable物件,再根據BindVariable物件來進行資料解析,這裡可以將實時更新單獨封裝成一個方法,多執行緒中直接進行呼叫,完成上述步驟後,可以直接執行上位機軟體,進行讀取功能測試,先在博途中建立一個監控表,填入一些隨機數,然後通過上位機進行讀取對比,監控表如下圖所示:

 

上位機執行讀取資料如下圖所示:

  分類: C#工控上位機程式設計