C#與西門子PLC通訊

PLC在工業(yè)自動(dòng)化領(lǐng)域是常用的控制器,一般在和上位機(jī)界面通訊時(shí),經(jīng)常使用組態(tài)軟件。以西門子PLC為例,上位機(jī)可以使用西門子的WINCC。但是,當(dāng)面對(duì)需求比較多樣化的需求時(shí),WINCC難以勝任。而且,作為量產(chǎn)的標(biāo)準(zhǔn)化產(chǎn)品,WINCC授權(quán)的費(fèi)用一筆不小的成本。S7.Net .dll 是應(yīng)用在 .NET平臺(tái)上和西門子PLC通訊的一個(gè)動(dòng)態(tài)庫。大家可以到GitHub中直接去下載,或者直接搜索“S7.Net .dll”也可以找到下載的鏈接。文章最后也會(huì)給出鏈接。


目前該動(dòng)態(tài)庫支持的西門子PLC類型有S7-200,S7-300,S7-400,S7-1200,S7-1500,基本涵蓋了西門子所有的PLC產(chǎn)品。該庫可以直接讀寫PLC中的全局DB塊,作為通訊的接口。下面對(duì)需要的一些函數(shù)以及數(shù)據(jù)類型做簡(jiǎn)單說明。

構(gòu)造函數(shù):cpu 為枚舉類型,代表PLC類型。ip 為PLC地址,需要和PLC組態(tài)的地址一致,同時(shí),和通訊的PC IP地址應(yīng)在同一局域網(wǎng)段。rack 為導(dǎo)軌號(hào),slot 為插槽號(hào),均可在TIA PLC 硬件組態(tài)處獲得。

如下圖,ip=“192.168.0.5”。

如下圖,rack為0,slot為1。

獲取是否連接成功:

連接PLC:

該類庫提供了兩個(gè)用于PLC連接的函數(shù),區(qū)別在于第二個(gè)為異步連接,在請(qǐng)求連接的過程中,不會(huì)導(dǎo)致線程阻塞。我個(gè)人比較喜歡第二種方式。

按位寫操作:參數(shù)db代表訪問的DB塊編號(hào),如下圖所示UISendInt編號(hào)為3,UIReadInt編號(hào)為4。

startByteAdr是在數(shù)據(jù)塊內(nèi)以字節(jié)為單位的起始地址,可以傳入0。bitAdr 為需要操作的位的偏移地址(以startByteAdr為基準(zhǔn)),value 為寫入的值。

dataType為枚舉類型,我們操作的是數(shù)據(jù)塊,傳入DataBlock。

按字節(jié)讀:count代表讀的字節(jié)數(shù)量。在進(jìn)行按字節(jié)讀寫時(shí),對(duì)于8位的單字節(jié)變量來說沒有任何問題。但是對(duì)于多字節(jié)比如在PLC中16位I的INT類型,需要注意大小端問題。在西門子PLC中以大端模式存儲(chǔ)數(shù)據(jù),但是在Intel的X86架構(gòu)的PC上,確是以小端模式。所以,在從PLC讀取一個(gè)INT類型的變量,需要將讀取回來的字節(jié)數(shù)組高低字節(jié)調(diào)換,后面C#程序中會(huì)有詳細(xì)的實(shí)現(xiàn)代碼。

按字節(jié)寫:value代表將要傳輸?shù)臄?shù)據(jù)轉(zhuǎn)換成的字節(jié)數(shù)組,如果要操作一個(gè)INT變量,需要提前將高低字節(jié)調(diào)換,后面C#程序中會(huì)有詳細(xì)的實(shí)現(xiàn)代碼。

PLC設(shè)置

實(shí)現(xiàn)外部程序可以訪問操作DB塊,需要對(duì)PLC部分做一些設(shè)置。首先對(duì)于要讀取或者訪問的DB塊,要將優(yōu)化的塊訪問取消,默認(rèn)為勾選的,選中塊右擊選擇屬性。

同時(shí)還要在硬件組態(tài)中,設(shè)置防護(hù)與安全中的連接機(jī)制。將“允許來自遠(yuǎn)程對(duì)象的PUT/GET訪問”勾選。如下圖:

C#程序

在C#上位機(jī)軟件中,對(duì)通訊類庫的函數(shù)做一個(gè)簡(jiǎn)單的包裝,以方便我們使用。首先新建一個(gè)類S7,在項(xiàng)目中需要引用S7.NET,并在該類中包含命名空間。

定義一個(gè)Plc類型變量plc,并定義該類的構(gòu)造函數(shù)和析構(gòu)函數(shù):

定義連接函數(shù)以及關(guān)閉函數(shù):

定義讀寫函數(shù):之所以加lock,是因?yàn)樵趹?yīng)用中數(shù)據(jù)通訊很有可能在不同的線程去操作,比如單獨(dú)開一個(gè)線程定時(shí)從PLC更新數(shù)據(jù)。

定義字節(jié)和Int16類型之間的轉(zhuǎn)換函數(shù)(需要進(jìn)行高低字節(jié)轉(zhuǎn)換):

文章來源:電氣系? (全網(wǎng)同名)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容