基于C#实现ModbusTCP服务器接口的方法
作者:上位机付工
ModbusTCP服务器的本质就是TCP服务器,根据识别ModbusTCP请求报文,返回对应的ModbusTCP报文,今天给大家分享一下,如何基于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软件读取结如下:
到此这篇关于基于C#实现ModbusTCP服务器接口的方法的文章就介绍到这了,更多相关C# ModbusTCP服务器接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!