1. 程式人生 > 實用技巧 >基於HslCommunication公開PLC讀寫給第三方程式 C#,Java,Python分散式讀寫PLC資料,包括三菱,西門子,歐姆龍,modbus,ab plc,臺達,橫河,信捷,松下,匯川,基恩士,富士,LS等等PLC

基於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安裝教程:

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

本頁面的原始碼地址在文章的開頭,在github開源。