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