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