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

本文是西門子開放式TCP通信的第2篇,上一篇我們講了使用西門子1200PLC作為TCP服務(wù)器的程序編寫,可以點擊下方鏈接閱讀:【公眾號dotNet工控上位機:thinger_swj】
在完成上述步驟后,接下來就是編寫上位機軟件與PLC之間進行通信。上位機UI界面設(shè)計如下圖所示:

從上圖可以看出,上位機需要完成以下功能:
TCP建立連接與斷開連接
多線程接收服務(wù)器數(shù)據(jù)
各種數(shù)據(jù)類型通用數(shù)據(jù)解析
各種數(shù)據(jù)類型的通用寫入接下來我們將按照功能順序來逐個完成,具體如下:
(1)TCP的建立連接與斷開連接:TCP連接與斷開主要是調(diào)用Socket的API函數(shù)來實現(xiàn),代碼如下所示:


(2)開啟多線程持續(xù)接收服務(wù)器數(shù)據(jù):上位機連接上PLC后,PLC會定時向上位機發(fā)送數(shù)據(jù),上位機需要持續(xù)接收數(shù)據(jù),因此在連接成功后,開啟一個線程來接收服務(wù)器數(shù)據(jù)。
(3)各種數(shù)據(jù)類型通用數(shù)據(jù)解析:當已經(jīng)獲取到所有的數(shù)據(jù)(字節(jié)數(shù)組)時,如果想任意一種數(shù)據(jù)類型的解析,通過分析發(fā)現(xiàn),至少需要三個元素,分別為起始字節(jié)、數(shù)據(jù)類型、偏移(針對布爾是位偏移,針對字符串是長度),因此我們首先針對這三個元素,創(chuàng)建了一個實體類,如下所示:

通過控件顯示數(shù)據(jù),因此需要給控件做下綁定,這里是通過Tag屬性來做,按照DataType;Start.Offset的格式,DataType按照枚舉類型填寫數(shù)據(jù),Start填寫一個整數(shù),對于Offset,如果不是布爾類型或者字符串,該項可以不填,填寫格式如下所示:

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

獲取到控件綁定的Tag之后,需要編寫一個方法,實現(xiàn)Tag和實體對象BindVariable之間的轉(zhuǎn)換。
通用數(shù)據(jù)更新實現(xiàn)思路:遍歷所有的控件,首先判斷其Tag屬性是否滿足要求,如果滿足要求,將Tag轉(zhuǎn)換為BindVariable對象,再根據(jù)BindVariable對象來進行數(shù)據(jù)解析,這里可以將實時更新單獨封裝成一個方法,多線程中直接進行調(diào)用,完成上述步驟后,可以直接運行上位機軟件,進行讀取功能測試,先在博途中創(chuàng)建一個監(jiān)控表,填入一些隨機數(shù),然后通過上位機進行讀取對比,監(jiān)控表如下圖所示:

上位機運行讀取數(shù)據(jù)如下圖所示:
