当前位置: 首页 > article >正文

C#轻松实现ModbusTCP服务器接口

大家好!我是付工。

通透!终于把ModbusRTU弄明白了

这样看来,ModbusTCP协议太简单了

太简单了!C#轻松实现Modbus通信

前面给大家介绍了一系列关于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软件读取结如下:


http://www.kler.cn/a/504605.html

相关文章:

  • C++并发编程之std::partial_sum的并行版本
  • api开发及运用小红书笔记详情api如何获取笔记详情信息
  • 【C++】多线程
  • 解决 VSCode 调试时 Python 文件出现相对路径报错问题‘FileNotFoundError’
  • FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg
  • 接口测试Day09-数据库工具类封装
  • 高性能、低成本立体声音频模数转换器—— GC1808,支持掉电和时钟检测低功耗模式
  • Go语言的数据竞争 (Data Race) 和 竞态条件 (Race Condition)
  • Centos 离线安装杀毒软件
  • 基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
  • HarmonyOS鸿蒙-@State@Prop装饰器限制条件
  • kalilinux - 目录扫描之dirsearch
  • Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件
  • linux通过web向mac远程传输字符串,mac收到后在终端中直接打印。
  • 微信小程序wx.showToast在真机显示时时间设置无效,显示时间很短问题
  • 传统架构下应用部署
  • 匿名管道通信
  • 深入浅出 Vue.js 渐进式加载图片组件开发
  • CSS 元素的显示模式(块元素,行内元素,行内块元素)
  • Nacos: 一个动态服务发现与配置管理平台
  • 【论文阅读】MAMBA+diffusion系列学习
  • 多线程锁
  • 00_专栏《Redis 7.x企业级开发实战教程》介绍
  • PostgreSQL 超级管理员详解
  • 青少年编程与数学 02-006 前端开发框架VUE 26课题、数据交互
  • 541. 反转字符串 II【力扣】