本文是西門子開放式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對象來進行數據解析,這里可以將實時更新單獨封裝成一個方法,多線程中直接進行調用,完成上述步驟后,可以直接運行上位機軟件,進行讀取功能測試,先在博途中創建一個監控表,填入一些隨機數,然后通過上位機進行讀取對比,監控表如下圖所示:

上位機運行讀取數據如下圖所示:
