本文介紹在一些特殊的場景和需求下,使用HslCommunication的可以實現一些比較有意思的功能。例行介紹HSL的安裝
github地址:https://github.com/dathlin/HslCommunication 如果喜歡可以star或是fork,還可以打賞支持,打賞請認准源代碼項目。
聯系作者及加群方式:http://www.hslcommunication.cn/Cooperation
在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:
Install-Package HslCommunication
如果需要教程:Nuget安裝教程:http://www.cnblogs.com/dathlin/p/7705014.html
組件的完整信息和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