1. 程式人生 > 其它 >C#與西門子PLC通訊完整例項

C#與西門子PLC通訊完整例項

參考網址:https://zhuanlan.zhihu.com/p/221840154?ivk_sa=1024320u

據某份資料不完全統計,目前中國市場十大國際PLC品牌如下(避免爭議,排名不分先後):

西門子、施耐德、歐姆龍、三菱、羅克韋爾、松下、ABB、倍福、艾默生、GE

再盤點一下中國市場十大國內PLC品牌:

和利時、臺達、匯川、信捷、永巨集、豐煒、南大傲拓、廈門海為、黃石科威、上海正航

當代電氣工程師之所以這麼厲害(Ku Bi),很大一部分原因就是PLC品牌太多了,終其一生,可能學不完所有。

以上均為有感而發,不作為今天的主題,今天的主題主要是跟大家介紹一下,如何站在電氣工程師的角度上,實現C#/.NET與西門子PLC之間的通訊。

1、準備工作

如果想實現C#/.NET與西門子PLC之間的通訊,首先要對西門子PLC有一定的瞭解,西門子PLC目前市場上主要使用的PLC型號包括:S7-200、S7-200Smart、S7-300、S7-400、S7-1200、S7-1500,西門子PLC的主要儲存區包括V區(在通訊協議裡V區即DB1)、M區、I區、Q區、DB區,其他的C區和T區,由於用得比較少,而且可以通過程式中轉,暫不涉及。

對於西門子PLC,如果手頭沒有PLC,可以通過模擬的方式搭建環境,參考下方連結:

基於S7-PLCSIM Advanced搭建S7通訊模擬環境​mp.weixin.qq.com/s?__biz=MzI4OTQyMzY3MQ==&mid=2247484940&idx=1&sn=325931d41e2c7000552d972ee5c49b66&chksm=ec2e2e54db59a742ef1d8a8f9e487666d2ae048be5c5bd8cad65e9973305fe073064da2e0194&token=27472573&lang=zh_CN#rd

需要注意以下幾個地方:

(1)PLC配置中,必須勾選允許來自遠端物件的PUT/GET通訊訪問。

允許Put Get訪問

(2)如果需要訪問DB塊,必須將DB塊屬性中的優化的塊訪問勾選去除。

DB塊去優化訪問

(3)如果是通過PLCSIM-Advanced搭建的模擬環境,必須將整個解決方案的屬性中,保護欄裡的塊編譯時支援模擬勾選上。

塊編譯支援模擬

(4)對於讀取的地址,一定要是PLC中存在的地址:

以M儲存區為例,一般M區最大位元組是8192個,所以如果你讀取MD9000,一定是讀不到的。

以DB儲存區為例,如果你尚未建立DB1,你讀取DB1.DBD0,一定也是讀不到的。

以DB儲存區為例,如果你DB1只有200個位元組範圍,你讀取DB1.DBD200,也是讀不到的。

只要遵從以上四個原則,西門子PLC通訊基本上就不存在硬體或者配置上的問題了。

2、PLC基礎通訊

本節中提到的基礎通訊,主要是指標對PLC的地址進行單個或者多個連續的進行讀取及寫入,下面直接利用剛剛搭建好的模擬環境來做測試,當然,使用實際PLC也是完全沒問題的。前提先將博途中的DB1.DBD0、DB1.DBD4、DB1.DBD8、DB1.DBD12分別改成1.2、3.4、5.6、7.8:

DB1變數數值DB1字串資料

  1. 單個變數的讀取

通過C#呼叫通訊庫xktComm.dll(Nuget搜尋xktComm下載安裝),實現對PLC單個變數的讀取,結果如下圖所示:

說明:西門子PLC通訊只需要IP地址和CPU型別即可,不需要埠號,因為S7協議的埠號是固定值102,之所以要選擇CPU型別,是因為不同型號的CPU,握手報文是不一樣的。

PLC單個讀取PLC單個字串讀取

(2)單個變數的寫入:

對於單個變數的寫入,也非常方便,直接輸入地址、型別及寫入值即可,下面分別將這4個地址寫入1.0、2.0、3.0、4.0,結果如下圖所示:

PLC單個寫入PLC單個字串寫入

(3)多個變數的讀取:

對於多個變數的讀取,需要填寫讀取長度,下面通過將讀取長度改成4,一次性將DB1.DB0-DB1.DBD12讀取出來,結果如下圖所示:

PLC多個讀取

(4)多個變數的寫入:

對於多個變數的寫入,則不需要填寫讀取長度,直接在寫入數值中,用空格分隔,寫入相應的數值,下面以將DB1.DBD0-DB1.DBD12改成1.2、3.4、5.6、7.8為例,將寫入數值改成1.2 3.4 5.6 7.8,結果如下圖所示:

PLC多個寫入

3、PLC高階通訊

如果PLC基礎通訊就能滿足大家的專案需求的話,那麼PLC高階通訊一定可以讓大家喜出望外。

PLC高階通訊主要應用場合是對於多個不連續的儲存區或者多個不連續的變數進行一次性讀取和寫入,這一點,似乎只有西門子S7協議支援,其他品牌PLC均不支援。

  1. 多個不連續變數讀取

在下圖中,連線上PLC後,通過輸入變數地址及變數型別,然後點選新增至讀取區,會將想要讀取的變數載入到右邊的讀取區中,讀取區以JSON形式進行顯示,右側顯示耗時時間,新增完成後,通過點選讀取資料,會將想要讀取的資料展示在日誌框中,這些變數是可以不連續的變數。

下面以讀取MD10、MD100、MD200、DB1.DBD0、DB1.DBD8為例,進行測試,測試結果如下圖所示:

PLC多變數同時讀取PLC監控表

(2)寫入個不連續變數讀取

在上圖讀取的基礎上,分別將MD10、MD100、MD200、DB1.DBD0、DB1.DBD8寫入1.0 2.0 3.0 4.0 5.0,仍然採用同樣的方式,填寫寫入的變數地址、變數型別及寫入值,點選新增至寫入區,最後點選寫入資料,判斷是否可以將這些資料同時寫入,測試結果如下圖所示:

PLC多變數同時寫入PLC多變數寫入結果對比

通過寫入反饋及PLC資料對比,實測可以一次將多個變數同時寫入PLC,通過判斷耗時僅11ms,說明是一次報文寫入的,PLC高階通訊的合理應用會大大提高上位機的通訊效率。

4、整體總結

本文主要針對C#與西門子PLC通訊做了較為詳細的描述,相信對於很多電氣工程師,尤其是以西門子PLC為主的電氣工程師來說,會有很大幫助。近幾年隨著人工智慧、物聯網的流程,工控行業發生了很大的變化,每一位電氣工程師都應該及時作出調整,至少學習一門高階程式語言,未雨綢繆,以更好的姿態來應對即將到來的智慧製造2025。