基于C#實(shí)現(xiàn)ModbusTCP服務(wù)器接口的方法
一、NModbus4
ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識(shí)別ModbusTCP請(qǐng)求報(bào)文,返回對(duì)應(yīng)的ModbusTCP報(bào)文。
雖然原理很容易理解,但是自己開(kāi)發(fā)還是需要一點(diǎn)時(shí)間的,當(dāng)然我們也可以通過(guò)開(kāi)源庫(kù)來(lái)實(shí)現(xiàn),我們這里采用的是NModbus4。
NModbus4是一個(gè)開(kāi)放源碼的Modbus庫(kù)。
我們通過(guò)Nuget搜索NModbus4即可搜索安裝。

二、ModbusTCPServer
安裝好NModbus4后,我們進(jìn)行封裝一下,創(chuàng)建一個(gè)ModbusTCPServer類,對(duì)于進(jìn)行封裝,封裝了以下幾個(gè)方法:
方法一:開(kāi)啟服務(wù)
//ModbusTcpSlave對(duì)象
private ModbusTcpSlave modbusTcpSlave = null;
//TcpListener對(duì)象
private TcpListener tcpListener;
public void StartServer(string ip, int port)
{
tcpListener = new TcpListener(IPAddress.Parse(ip), port);
modbusTcpSlave = ModbusTcpSlave.CreateTcp(1, tcpListener);
modbusTcpSlave.Listen();
}方法二:關(guān)閉服務(wù)
public void StopServer()
{
modbusTcpSlave?.Dispose();
}方法三:向保持寄存器存儲(chǔ)區(qū)中寫(xiě)入數(shù)據(jù)
public void SetHoldingRegisterFloatValue(int offset, float value)
{
byte[] buffer = BitConverter.GetBytes(value);
ushort highValue = BitConverter.ToUInt16(buffer, 0);
ushort lowValue = BitConverter.ToUInt16(buffer, 2);
//獲取保持型寄存器存儲(chǔ)區(qū)
ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
data[offset] = lowValue;
data[offset + 1] = highValue;
}
public void SetHoldingRegisteUShortValue(int offset, ushort value)
{
//獲取保持型寄存器存儲(chǔ)區(qū)
ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
data[offset] = value;
}方法四:如果需要獲取報(bào)文,可以添加一些事件
public event Action<object, ModbusSlaveRequestEventArgs> ModbusSlaveRequestReceived;
private void ModbusTcpSlave_ModbusSlaveRequestReceived(object sender, ModbusSlaveRequestEventArgs e)
{
ModbusSlaveRequestReceived?.Invoke(sender,e);
}
public event Action<object, ModbusSlaveRequestEventArgs> ModbusSlaveWriteComplete;
private void ModbusTcpSlave_WriteComplete(object sender, ModbusSlaveRequestEventArgs e)
{
ModbusSlaveWriteComplete?.Invoke(sender, e);
}三、案例應(yīng)用
有了以上方法后,編寫(xiě)一個(gè)案例來(lái)進(jìn)行功能測(cè)試。

開(kāi)啟服務(wù)和關(guān)閉服務(wù)代碼很簡(jiǎn)單,就是調(diào)用ModbusTCPServer及其中的對(duì)應(yīng)方法即可。
private ModbusTCPServer modbusTCPServer = new ModbusTCPServer();
private void btn_Start_Click(object sender, EventArgs e)
{
if (this.btn_Start.Text == "開(kāi)啟服務(wù)")
{
try
{
int port = Convert.ToInt32(this.txt_Port.Text);
modbusTCPServer.StartServer(this.txt_IP.Text, port);
AddLog("開(kāi)啟服務(wù)成功");
this.btn_Start.Text = "關(guān)閉服務(wù)";
}
catch (Exception ex)
{
AddLog("開(kāi)啟服務(wù)失敗:" + ex.Message);
}
}
else
{
modbusTCPServer.StopServer();
this.btn_Start.Text = "開(kāi)啟服務(wù)";
}
}服務(wù)開(kāi)啟后,可以通過(guò)按鈕向指定寄存器中寫(xiě)入數(shù)據(jù),這里已經(jīng)封裝好了方法,直接調(diào)用即可。
private void btn_WriteFloat_Click(object sender, EventArgs e)
{
int address = Convert.ToInt32(this.txt_Address.Text);
float value = Convert.ToSingle(this.txt_Value.Text);
modbusTCPServer.SetHoldingRegisterFloatValue(address, value);
AddLog("寫(xiě)入地址:" + address + " 浮點(diǎn)數(shù):" + value);
}
private void btn_WriteUShort_Click(object sender, EventArgs e)
{
int address = Convert.ToInt32(this.txt_Address.Text);
ushort value = Convert.ToUInt16(this.txt_Value.Text);
modbusTCPServer.SetHoldingRegisteUShortValue(address, value);
AddLog("寫(xiě)入地址:" + address + " 整數(shù):" + value);
}最終實(shí)現(xiàn)效果如下所示:

用Modbus Poll軟件讀取結(jié)如下:

到此這篇關(guān)于基于C#實(shí)現(xiàn)ModbusTCP服務(wù)器接口的方法的文章就介紹到這了,更多相關(guān)C# ModbusTCP服務(wù)器接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#使用nsoup解析html亂碼解決方法分享 nsoup教程
NSoup是JSoup的Net移植版本。使用方法基本一致。如果項(xiàng)目涉及HTML的處理,強(qiáng)烈推薦NSoup。但是遺憾的是NSoup默認(rèn)的編碼是UTF-8,處理中文有亂碼,下面給出二種解決方法2014-01-01
C#實(shí)現(xiàn)給PDF文檔設(shè)置過(guò)期時(shí)間
我們可以給一些重要文檔或者臨時(shí)文件設(shè)置過(guò)期時(shí)間和過(guò)期信息提示來(lái)提醒讀者或管理者文檔的時(shí)效性,并及時(shí)對(duì)文檔進(jìn)行調(diào)整、更新等。下面本文將介紹如何通過(guò)C#來(lái)給PDF文檔設(shè)置過(guò)期時(shí)間的方法。需要的可以參考一下2022-01-01
C#使用DateTime獲取日期和時(shí)間的實(shí)現(xiàn)
在C#中,DateTime類是用來(lái)處理日期和時(shí)間的類,它具有許多屬性和方法,用于操作和獲取日期和時(shí)間的不同部分,本文就來(lái)介紹一下C#使用DateTime獲取,感興趣的可以了解一下2023-11-11
C#程序中session的基本設(shè)置示例及清除session的方法
這篇文章主要介紹了C#程序中session的基本設(shè)置示例及清除session的方法,是C#入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-04-04
使用C#實(shí)現(xiàn)高效刪除Word文檔中的指定頁(yè)或空白頁(yè)
在處理?Word?文檔時(shí),我們經(jīng)常會(huì)遇到不需要的頁(yè)面,本文將介紹如何使用?C#?刪除?Word?文檔中的空白頁(yè)和指定頁(yè)面,并提供實(shí)用的代碼示例,有需要的小伙伴可以了解下2026-01-01
解析從源碼分析常見(jiàn)的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制的詳解
本篇文章是對(duì)從源碼分析常見(jiàn)的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

