网站首页 > 编程文章 正文
前面给大家介绍了一系列关于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软件读取结如下:
猜你喜欢
- 2025-05-02 汇川技术|汇川PLC中ModbusTCP的应用(H3U、AM600)
- 2025-05-02 西门子1200与施耐德M241PLC的Modbus TCP通讯教程
- 2025-05-02 [西门子] S7-1200和汇川521PLC——modbus-tcp/ip通讯
- 2025-05-02 欧姆龙PLC分别做modbus tcp客户端和服务器的通讯案例
- 2025-05-02 分分钟教会你PLC 与 Modbus/TCP 通信,赶紧收藏!
- 2025-05-02 【畅学技术】全网都在找 S7-200 SMART Modbus TCP 客户端编程实现秘籍
- 2025-05-02 新手教程:在西门子 S7-1200 PLC 中配置 TCP/IP 通信的步骤
- 2025-05-02 [西门子PLC] 两个S7-1200之间实现Modbus TCP客户端和服务器通信
- 2025-05-02 C# Modbus库推荐:轻松实现Modbus通信的利器
- 2025-05-02 S7-1200 PLC 与ATV340 Modbus TCP 通讯设置(含部分程序)
你 发表评论:
欢迎- 最近发表
-
- 数据不丢失 从Windows 11的DEV版降级到正式版
- Win11学院:在Windows11 25905预览版中如何启用Dev Drive
- DEVC++的卸载(devcon卸载驱动)
- win11 dev 开发版 升级攻略完整版
- 最新Windows11+Windows10系统各种版本永久激活密钥以及下载链接
- 想学Python,却还记不住语法?神仙书籍 python背记手册双手奉上
- 如何用Python语言开发大型服务器程序
- 30天Python 入门到精通(python零基础入门到精通)
- 入门扫盲:9本自学Python PDF书籍,让你避免踩坑,轻松变大神!
- 学好Python需要看的4本书推荐(学python好用的书)
- 标签列表
-
- spire.doc (59)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)