【精講版】上位機(jī)C#/.NET與西門子PLC通信


據(jù)某份數(shù)據(jù)不完全統(tǒng)計(jì),目前中國(guó)市場(chǎng)十大國(guó)際PLC品牌如下(避免爭(zhēng)議,排名不分先后):
西門子、施耐德、歐姆龍、三菱、羅克韋爾、松下、ABB、倍福、艾默生、GE
再盤點(diǎn)一下中國(guó)市場(chǎng)十大國(guó)內(nèi)PLC品牌:
和利時(shí)、臺(tái)達(dá)、匯川、信捷、永宏、豐煒、南大傲拓、廈門海為、黃石科威、上海正航
當(dāng)代電氣工程師之所以這么厲害(Ku Bi),一部分原因大概就是PLC品牌太多了,終其一生,可能都學(xué)不完!
以上均為有感而發(fā),不作為今天的主題,今天的主題主要是跟大家介紹一下,如何站在電氣工程師的角度上,實(shí)現(xiàn)C#/.NET與西門子PLC之間的通信。
N0.01??準(zhǔn)備工作
如果想實(shí)現(xiàn)C#/.NET與西門子PLC之間的通信,首先要對(duì)西門子PLC有一定的了解,西門子PLC目前市場(chǎng)上主要使用的PLC型號(hào)包括:S7-200、S7-200Smart、S7-300、S7-400、S7-1200、S7-1500,西門子PLC的主要存儲(chǔ)區(qū)包括V區(qū)(在通信協(xié)議里V區(qū)即DB1)、M區(qū)、I區(qū)、Q區(qū)、DB區(qū),其他的C區(qū)和T區(qū),由于用得比較少,而且可以通過程序中轉(zhuǎn),暫不涉及。
當(dāng)然,如果我們手頭有PLC實(shí)際硬件,當(dāng)然非常方便,可以直接測(cè)試,但是對(duì)于如果沒有PLC的同學(xué)來說,我們也給大家提前準(zhǔn)備好了解決方案:戳↓
基于S7-PLCSIMAdvanced搭建S7通信仿真環(huán)境????搭建好仿真環(huán)境后,只需要注意以下幾個(gè)地方:???
?? 一、PLC配置中,必須勾選允許來自遠(yuǎn)程對(duì)象的PUT/GET通信訪問。

????二、如果需要訪問DB塊,必須將DB塊屬性中的優(yōu)化的塊訪問勾選去除。

三、如果是通過PLCSIM-Advanced搭建的仿真環(huán)境,必須將整個(gè)解決方案的屬性中,保護(hù)欄里的塊編譯時(shí)支持仿真勾選上。

?四、對(duì)于讀取的地址,一定要是PLC中存在的地址:
????以M存儲(chǔ)區(qū)為例,一般M區(qū)最大字節(jié)是8192個(gè),如果你讀取MD9000,一定是讀不到的。
????以DB存儲(chǔ)區(qū)為例,如果你尚未創(chuàng)建DB1,你讀取DB1.DBD0,一定也是讀不到的。
????以DB存儲(chǔ)區(qū)為例,如果你DB1只有200個(gè)字節(jié)范圍,你讀取DB1.DBD200,也是讀不到的。
只要遵從以上四個(gè)原則,西門子PLC通信基本上就不存在硬件或者配置上的問題了。
?
N0.02??PLC基礎(chǔ)通信
本節(jié)中提到的基礎(chǔ)通信,主要是指針對(duì)PLC的地址進(jìn)行單個(gè)或者多個(gè)連續(xù)的進(jìn)行讀取及寫入,下面直接利用剛剛搭建好的仿真環(huán)境來做測(cè)試,當(dāng)然,使用實(shí)際PLC也是完全沒問題的。前提先將博途中的DB1.DBD0、DB1.DBD4、DB1.DBD8、DB1.DBD12分別改成1.2、3.4、5.6、7.8,并將DB.DBS344開始的100個(gè)字節(jié)字符串改成“今晚有上位機(jī)免費(fèi)公開課”,用于測(cè)試讀取:


第一步:?jiǎn)蝹€(gè)變量的讀取
通過C#調(diào)用通信庫xktComm.dll(Nuget搜索xktComm下載安裝),實(shí)現(xiàn)對(duì)PLC單個(gè)變量的讀取,結(jié)果如下圖所示:
說明:西門子PLC通信只需要IP地址和CPU類型即可,不需要端口號(hào),因?yàn)镾7協(xié)議的端口號(hào)是固定值102,之所以要選擇CPU類型,是因?yàn)椴煌吞?hào)的CPU,握手報(bào)文是不一樣的,對(duì)于西門子PLC的報(bào)文抓取及剖析,之前也寫過一篇專門的文章進(jìn)行了說明:戳↓
西門子S7通信協(xié)議底層原理及抓包分析


第二步:?jiǎn)蝹€(gè)變量的寫入
對(duì)于單個(gè)變量的寫入,也非常方便,直接輸入地址、類型及寫入值即可,下面分別將這4個(gè)地址寫入1.0、2.0、3.0、4.0,結(jié)果如下圖所示:


第三步:多個(gè)變量的讀取
對(duì)于多個(gè)變量的讀取,需要填寫讀取長(zhǎng)度,下面通過將讀取長(zhǎng)度改成4,一次性將DB1.DB0-DB1.DBD12讀取出來,結(jié)果如下圖所示:

第四步:多個(gè)變量的寫入
對(duì)于多個(gè)變量的寫入,則不需要填寫讀取長(zhǎng)度,直接在寫入數(shù)值中,用空格分隔,寫入相應(yīng)的數(shù)值,下面以將DB1.DBD0-DB1.DBD12改成1.2、3.4、5.6、7.8為例,將寫入數(shù)值改成1.2 ?3.4 ?5.6 ?7.8,結(jié)果如下圖所示:

N0.03? PLC高級(jí)通信
如果PLC基礎(chǔ)通信就能滿足大家的項(xiàng)目需求的話,那么PLC高級(jí)通信一定可以讓大家喜出望外。
PLC高級(jí)通信主要應(yīng)用場(chǎng)合是對(duì)于多個(gè)不連續(xù)的存儲(chǔ)區(qū)或者多個(gè)不連續(xù)的變量進(jìn)行一次性讀取和寫入,這一點(diǎn),似乎只有西門子S7協(xié)議支持,其他品牌PLC均不支持。第一步:多個(gè)不連續(xù)變量讀取
在下圖中,連接上PLC后,通過輸入變量地址及變量類型,然后點(diǎn)擊添加至讀取區(qū),會(huì)將想要讀取的變量加載到右邊的讀取區(qū)中,讀取區(qū)以JSON形式進(jìn)行顯示,右側(cè)顯示耗時(shí)時(shí)間,添加完成后,通過點(diǎn)擊讀取數(shù)據(jù),會(huì)將想要讀取的數(shù)據(jù)展示在日志框中,這些變量是可以不連續(xù)的變量。
下面以讀取MD10、MD100、MD200、DB1.DBD0、DB1.DBD8為例,進(jìn)行測(cè)試,測(cè)試結(jié)果如下圖所示:


第二步:寫入個(gè)不連續(xù)變量讀取
在上一步讀取的基礎(chǔ)上,分別將MD10、MD100、MD200、DB1.DBD0、DB1.DBD8寫入1.0、2.0、3.0、4.0、5.0,仍然采用同樣的方式,填寫變量地址、變量類型及寫入值,點(diǎn)擊添加至寫入?yún)^(qū),最后點(diǎn)擊寫入數(shù)據(jù),判斷是否可以將這些數(shù)據(jù)同時(shí)寫入,測(cè)試結(jié)果如下圖所示:


通過反饋結(jié)果及PLC數(shù)據(jù)對(duì)比,實(shí)測(cè)證明可以一次將多個(gè)變量同時(shí)寫入PLC,并且通過判斷耗時(shí)僅11ms,說明報(bào)文是一次性寫入的??偠灾?,PLC高級(jí)通信的合理應(yīng)用會(huì)大大提高上位機(jī)的通信效率。
N0.04??整體總結(jié)
本文主要針對(duì)C#與西門子PLC通信做了較為詳細(xì)的描述,相信對(duì)于很多電氣工程師,尤其是以西門子PLC為主的電氣工程師來說,會(huì)有很大幫助。近幾年隨著人工智能、物聯(lián)網(wǎng)的流程,工控行業(yè)發(fā)生了很大的變化,每一位電氣工程師都應(yīng)該及時(shí)作出調(diào)整,至少學(xué)習(xí)一門高級(jí)編程語言,未雨綢繆,以更好的姿態(tài)來應(yīng)對(duì)即將到來的智能制造2025。
今日直播課
課程內(nèi)容:基于GDI+開發(fā)工業(yè)LED指示燈控件
課程時(shí)間:今日14:30
主講人:付老師
長(zhǎng)按掃碼進(jìn)入直播↓
