C#轻松实现ModbusTCP服务器接口
1.零基础学习Modbus通信协议2.RS485与ModbusRTU3.C#上位机与PLC通信心跳的实现方法4.ModbusRTU通信协议报文剖析5.ModbusTCP通信协议分析6.C#轻松实现Modbus通信7.不用PLC和板卡,一台电脑就可以控制伺服8.西门子PLC与上位机通信方案梳理9.C#委托的前世今生10.上位机与MES数据交互的常用方案11.上位机能不能替代PLC呢?12.【开源】C#上位机必备高效数据转换助手13.C#轻松实现条形码二维码生成及识别14.揭秘10种主流PLC在ModbusTCP通信中的速度表现!
15.C#轻松实现ModbusTCP服务器接口
16.基于C#实现多线程启动停止暂停继续大家好!我是付工。
前面给大家介绍了一系列关于Modbus和ModbusTCP的知识,主要针对的是ModbusTCP客户端。
在实际开发过程中,有可能会需要开放数据接口给PLC或第三方厂家。
今天给大家分享一下,如何基于C#来ModbusTCP服务器接口。
一、NModbus4
ModbusTCP服务器的本质就是TCP服务器,根据识别ModbusTCP请求报文,返回对应的ModbusTCP报文。
虽然原理很容易理解,但是自己开发还是需要一点时间的,当然我们也可以通过开源库来实现,我们这里采用的是NModbus4。
NModbus4是一个开放源码的Modbus库。
我们通过Nuget搜索NModbus4即可搜索安装。

二、ModbusTCPServer
安装好NModbus4后,我们进行封装一下,创建一个ModbusTCPServer类,对于进行封装,封装了以下几个方法:
方法一:开启服务
//ModbusTcpSlave对象
private ModbusTcpSlave modbusTcpSlave = null;
//TcpListener对象
private TcpListener tcpListener;
public void StartServer(string ip, int port)
{
tcpListener = new TcpListener(IPAddress.Parse(ip), port);
modbusTcpSlave = ModbusTcpSlave.CreateTcp(1, tcpListener);
modbusTcpSlave.Listen();
}
方法二:关闭服务
public void StopServer()
{
modbusTcpSlave?.Dispose();
}
方法三:向保持寄存器存储区中写入数据
public void SetHoldingRegisterFloatValue(int offset, float value)
{
byte[] buffer = BitConverter.GetBytes(value);
ushort highValue = BitConverter.ToUInt16(buffer, 0);
ushort lowValue = BitConverter.ToUInt16(buffer, 2);
//获取保持型寄存器存储区
ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
data[offset] = lowValue;
data[offset + 1] = highValue;
}
public void SetHoldingRegisteUShortValue(int offset, ushort value)
{
//获取保持型寄存器存储区
ModbusDataCollection<ushort> data = modbusTcpSlave.DataStore.HoldingRegisters;
data[offset] = value;
}
方法四:如果需要获取报文,可以添加一些事件
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);
}
三、案例应用
有了以上方法后,编写一个案例来进行功能测试。

开启服务和关闭服务代码很简单,就是调用ModbusTCPServer及其中的对应方法即可。
private ModbusTCPServer modbusTCPServer = new ModbusTCPServer();
private void btn_Start_Click(object sender, EventArgs e)
{
if (this.btn_Start.Text == "开启服务")
{
try
{
int port = Convert.ToInt32(this.txt_Port.Text);
modbusTCPServer.StartServer(this.txt_IP.Text, port);
AddLog("开启服务成功");
this.btn_Start.Text = "关闭服务";
}
catch (Exception ex)
{
AddLog("开启服务失败:" + ex.Message);
}
}
else
{
modbusTCPServer.StopServer();
this.btn_Start.Text = "开启服务";
}
}
服务开启后,可以通过按钮向指定寄存器中写入数据,这里已经封装好了方法,直接调用即可。
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("写入地址:" + address + " 浮点数:" + 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("写入地址:" + address + " 整数:" + value);
}
最终实现效果如下所示:

用Modbus Poll软件读取结如下:

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器