基於HslCommunication公開PLC讀寫給第三方程式 C#,Java,Python分散式讀寫PLC資料,包括三菱,西門子,歐姆龍,modbus,ab plc,臺達,橫河,信捷,松下,匯川,基恩士,富士,LS等等PLC
本文介紹在一些特殊的場景和需求下,使用HslCommunication的可以實現一些比較有意思的功能。例行介紹HSL的安裝
github地址:https://github.com/dathlin/HslCommunication如果喜歡可以star或是fork,還可以打賞支援,打賞請認準原始碼專案。
聯絡作者及加群方式:http://www.hslcommunication.cn/Cooperation
在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制檯輸入下面的指令安裝:
Install-Package HslCommunication
如果需要教程:Nuget安裝教程:
元件的完整資訊和API介紹參照:http://api.hslcommunication.cn 元件的使用限制,更新日誌,都在該頁面裡面。
本篇文章對應的github的原始碼:https://github.com/dathlin/HslMRpcLearn
我們來看看這種系統的架構設計模式。
我們有一個主的後臺伺服器來連線現場的各種PLC裝置,然後進行資料互動。這個沒有問題,很好實現,但是現在有需求,我們在遠端客戶端介面,或是手機端階段,等等,需要對遠端的PLC進行讀寫一些資料操作,這時候怎麼實現是最簡單方便的?
在HSL裡,提供了一種簡單的可能性。可以輔助你快速實現需要的操作資訊。
那就是HSL提供的MRPC註冊機制的功能,即使你的客戶端是C#語言的,python語言,java語言,(雖然HSL也提供了java語言和python語言的讀寫PLC功能,但是僅僅是部分的實現,如果java語言和python也想和C#語言一樣的功能的話,也可以用當前的方式實現。)
我們開始寫程式碼,我們先假設有1個PLC需要不停的採集,分析資料,做處理。我們新建一個控制檯程式,安裝HslCommunication元件。為了方便起見,我們假設這個PLC是西門子PLC,實際上無論什麼牌子的都是一樣的。
static void Main( string[] args ) { SiemensS7Net plc = new SiemensS7Net( SiemensPLCS.S1200, "127.0.0.1" ); // 此處拿了本地虛擬的PLC測試 plc.SetPersistentConnection( ); // 設定了長連線 while (true) { Thread.Sleep( 1000 ); // 每秒讀取一次 OperateResult<short> read = plc.ReadInt16( "M100" ); if (read.IsSuccess) { // 讀取成功後,進行業務處理,存入資料庫,或是其他的分析 } else { // 讀取失敗之後,顯示下狀態 Console.WriteLine( "讀取PLC失敗,原因:" + read.Message ); } } }
此處就簡化了一些操作資訊,反正是要執行一些業務操作的。現在我們需要在客戶端的程式裡,增加一個按鈕,比如功能是鎖定機臺。這個功能的實現是寫入M300.1為True。如果解鎖,就是寫false
因為我們的客戶端是部署在其他電腦的,當然是需要新建一個winform的專案了,如果是WPF也是一樣的。也是弄兩個按鈕出來,然後寫事件。
有了事件之後,我們怎麼來寫程式碼呢?
一般的解決方法是,百度看看有沒有遠端通訊,遠端RPC的功能實現,比如ZBUS,Thrift都是可選的方案,但是太麻煩了,還需要學習。所以此處推薦HSL的實現,程式碼非常精簡。我們改造下伺服器端的實現:
我們看20,21,22這三行程式碼,含義就是例項化,註冊RPC服務,啟動。非常的精簡。這就已經實現功能了。當前的伺服器提供了什麼RPC的介面呢?,我們執行起來。然後用HslCommunication的DEMO程式開啟瞧瞧就可以了。
伺服器端啟動之後,就是一直在列印讀取成功了。沒有其他的內容
我們在開啟demo看看
因為我這都是本地測試,所以是直接的127.0.0.1的IP地址資訊,點選連線之後,左邊就出現了很多的API介面資訊。
那麼我們就來試試看,選擇一個WriteInt16的介面,改變一下M100的值看看
然後我們點選讀取後,沒有顯示錯誤資訊,說明已經成功了。
然後我們在回去看看伺服器的控制檯我們發現值已經更改了,這時候,可以嘗試下其他API介面,這時候我們就發現一個超級強的功能,對於客戶端來說,相當於是無縫讀寫PLC資料了,可以實現任何自定義的功能,本質上任意的多個遠端客戶端都通過伺服器端的那個plc的物件來讀寫plc的。
我們再嘗試下讀取M100的介面
上面填好資料資訊之後,點選讀取,我們就讀取到了123的資訊。
好了,我們現在來看看在客戶端裡應該怎麼進行操作。
裡面第一步和第二步是需要注意的,提前定義好了一個變數資訊,然後再來實現鎖定解鎖的操作。
然後我們在介面上操作鎖定的按鈕,這時候,M300.1 應該是為true了。
我們去demo上看看
果然是這樣的。解鎖的操作也是一樣的。
所以,我們這裡不僅僅是寫入一個bool資料,讀寫任何的資料都是可以,甚至做業務邏輯都是可以的。當然了,如果你想要安全起見,MQTTServer是可以設定使用者名稱和密碼的,防止不安全的連線。
上面演示了第三方程式用C#來做介面請求的示例。下面演示用java來鎖定,解鎖的操作,開啟IDEA,新建一個java專案,這裡使用社群版來建立專案
現在mevan安裝HslCommunication元件。
在Project Settings裡面,選擇Libraries選單,然後點選新增,from maven,然後搜尋HslCommunication,選擇最新版。
都勾選了先。
新增成功了。
我們來看看如何鎖定裝置
然後我們來執行一下:看到顯示鎖定成功,我們回到demo檢視資訊
可以看到,已經成功修改,那麼解鎖的功能也是類似的。所以此處不再贅述了,我們往深入想一想,現在的java程式碼是不是具有讀寫西門子PLC的功能了?現在C#伺服器端註冊的是西門子PLC,如果是註冊別的PLC,比如基於串列埠的三菱PLC,基於串列埠的modbus-rtu協議,在java層面實現串列埠,實現那麼多裝置是不容易的。現在的這種方式就相當於實現了java對各種各樣PLC的讀寫操作了。
我們再來看看如果我們用的是python語言呢?現在我們來使用VS code來開發
還是先安裝pip的依賴
我這裡設定了阿里雲的映象,所以安裝會比較快一點。
然後我們開始寫程式碼
嗯,沒幾行程式碼,所以執行一下看看
然後我們驗證一下:
寫false也是一樣的。
如果是讀取呢?
執行之後,我們得到了true的值。
到這裡我們發現,python也可以讀寫任意的PLC了,在C#端還可以進行許可權控制,還能執行其他的業務功能。
如果是我還需要建立自己的API的介面呢?
參考這篇文章,已經說的很詳細了:https://www.cnblogs.com/dathlin/p/13864866.html
本頁面的原始碼地址在文章的開頭,在github開源。