天天看點

php讀取西門子plc_C#與西門子PLC通信完整執行個體

php讀取西門子plc_C#與西門子PLC通信完整執行個體

據某份資料不完全統計,目前中國市場十大國際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

需要注意以下幾個地方:

(1)PLC配置中,必須勾選允許來自遠端對象的PUT/GET通信通路。

php讀取西門子plc_C#與西門子PLC通信完整執行個體

允許Put Get通路

(2)如果需要通路DB塊,必須将DB塊屬性中的優化的塊通路勾選去除。

php讀取西門子plc_C#與西門子PLC通信完整執行個體

DB塊去優化通路

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

php讀取西門子plc_C#與西門子PLC通信完整執行個體

塊編譯支援仿真

(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:

php讀取西門子plc_C#與西門子PLC通信完整執行個體

DB1變量數值

php讀取西門子plc_C#與西門子PLC通信完整執行個體

DB1字元串資料

  1. 單個變量的讀取

通過C#調用通信庫xktComm.dll(Nuget搜尋xktComm下載下傳安裝),實作對PLC單個變量的讀取,結果如下圖所示:

說明:西門子PLC通信隻需要IP位址和CPU類型即可,不需要端口号,因為S7協定的端口号是固定值102,之是以要選擇CPU類型,是因為不同型号的CPU,握手封包是不一樣的。

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC單個讀取

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC單個字元串讀取

(2)單個變量的寫入:

對于單個變量的寫入,也非常友善,直接輸入位址、類型及寫入值即可,下面分别将這4個位址寫入1.0、2.0、3.0、4.0,結果如下圖所示:

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC單個寫入

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC單個字元串寫入

(3)多個變量的讀取:

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

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC多個讀取

(4)多個變量的寫入:

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

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC多個寫入

3、PLC進階通信

如果PLC基礎通信就能滿足大家的項目需求的話,那麼PLC進階通信一定可以讓大家喜出望外。

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

  1. 多個不連續變量讀取

在下圖中,連接配接上PLC後,通過輸入變量位址及變量類型,然後點選添加至讀取區,會将想要讀取的變量加載到右邊的讀取區中,讀取區以JSON形式進行顯示,右側顯示耗時時間,添加完成後,通過點選讀取資料,會将想要讀取的資料展示在日志框中,這些變量是可以不連續的變量。

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

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC多變量同時讀取

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC監控表

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

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

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC多變量同時寫入

php讀取西門子plc_C#與西門子PLC通信完整執行個體

PLC多變量寫入結果對比

通過寫入回報及PLC資料對比,實測可以一次将多個變量同時寫入PLC,通過判斷耗時僅11ms,說明是一次封包寫入的,PLC進階通信的合理應用會大大提高上位機的通信效率。

4、整體總結

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