安裝nuget包:Wesky.Net.OpenTools
使用 1.0.8或以上版本。支持.net framework 4.6以上,以及所有.net core以及以上所有.net環(huán)境項目引用。
開發(fā)一個簡單的Winform界面,用來測試使用。如需該winform的demo,可以在公眾號【Dotnet Dancer】后臺,回復 modbus 即可獲取。
通信連接之前,可能存在多個客戶端??梢詫懸粋€modbus客戶端的靜態(tài)數組存儲。例如有五個客戶端:
連接操作解析:假設有5個連接,此處都使用同一個服務端地址,實際情況請根據自己需要進行調整。連接后的客戶端,存儲到靜態(tài)變量里面?zhèn)溆?,這樣可以自己根據modbus連接序號,來操作不同連接進行通信。
讀取測試。
例如連接的第一個客戶端讀取bool類型的值。說明:IModbusReadWriteService接口如果你是使用依賴注入的形式,可以把它注入進來使用。此處沒有使用依賴注入,則直接實例化出來使用。
IModbusReadWriteService接口一共提供了以下幾種方法。其中,讀取類型除了字符串以外,默認都是支持讀取批量數據,而不是只讀取一個。寫入除了bool類型(線圈)和字符串,其他都支持批量寫入。
例如第二個連接客戶端,用來讀取short類型數據(C# 的short類型,而不是PLC的short類型,某些plc對short的定義不太一樣,請?zhí)崆白隽私?
其他以此類推,都是實例化后的讀寫對象,使用讀取不同的函數來實現不同的寫入數據類型的效果。例如下面示例:ReadInt32代表讀取Int32類型的數據。參數里面,address是設備地址,或者PLC的寄存器地址等;length是讀取的長度,長度單位為byte的長度,而不是地址個數。第三個參數,里面包括了modbus客戶端信息,包括socket客戶端、連接配置信息等。
IModbusReadWriteService rwService = new ModbusReadWriteService();
var result = rwService.ReadInt32(address, length, modbusTcpClients[2]);
客戶端參數實體類如下。MessageCode是消息碼頭部,如果是同一個PLC或者服務端,客戶端連接該服務端進行讀寫消息時候,必須不一樣,否則會導致modbus服務端不知道是誰請求的。這個也可以當做是唯一標識符,modbus服務端用來識別是哪個客戶端發(fā)的消息的。
如果想了解modbus的一些細節(jié),可以參考我之前的文章《Modbus TCP協議解析、仿真環(huán)境以及基于.NET實現基礎通信》,該文章講解了協議規(guī)則、通信上的避坑說明、仿真環(huán)境使用,以及bool線圈的讀寫操作。鏈接地址:
https://mp.weixin.qq.com/s/VLlwYCaxwqyhv2Os0hPS5g
寫入操作。寫入線圈操作:
寫入操作,方法為Write開頭,后面接寫入什么類型的值。第一個參數是寫入地址,第二個參數是寫入的值,第三個參數代表傳入連接的客戶端。
例如寫入,寫入支持批量寫入,傳入對應類型的數組,地址提供第一個地址即可,批量寫入會自動在后面的地址累計寫入。以下是簡單參考,例如循環(huán)里面寫入數據每次累加1,然后傳入方法里面進行寫入。
如果只寫入一個,那就傳一個數組元素即可:
使用以上方式,測試一款使用modbus協議的某品牌系列PLC期間的讀寫效率日志,供參考: