首页 > 编程语言 >C#轻松实现Modbus通信

C#轻松实现Modbus通信

时间:2024-10-12 23:43:19浏览次数:6  
标签:封装 C# NModbus4 轻松 通信 Modbus master serialPort Transport

1、前言

大家好!我是付工。前面给大家介绍了一系列关于RS485与Modbus的知识。

终于有人把RS485说清楚了
终于有人把Modbus说明白了
通透!终于把ModbusRTU弄明白了
这样看来,ModbusTCP协议太简单了
今天跟大家聊聊关于C#如何实现Modbus通信。

2、开源通信库

通信库是对通信协议的封装,一般是以dll动态链接库的形式存在,对于编程者来说,只需要调用库的各种方法即可实现数据读写。

通信库有两种,一种是开源的,即使开源,也要注意看下开源许可证,开源并不一定免费,另外一种就是自己开发封装的,这个需要具备一定的开发能力。

Modbus通信有很多开源通信库,这其中使用较为广泛的是NModbus4,NModbus4是一个开源且免费的Modbus通信库,它的开源许可证是MIT,是一个相对宽松的软件授权条款,可以商用。

3、ModbusRTU通信

1、在项目解决方案资源管理器中,选择【引用】右击,在弹出的界面中,点击【管理NuGet程序包】选项,如下图所示:

 

2、在打开的选项卡中,选择【浏览】,然后输入NModbus4进行搜索,搜索到之后,选择最新稳定版2.1.0,点击【安装】即可:

 

3、在NModbus4基础上封装一个打开串口和关闭串口的方法:

private SerialPort serialPort;
private ModbusSerialMaster master;
public void Open(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
    if (this.serialPort != null && this.serialPort.IsOpen)
    {
        this.serialPort.Close();
    }
    this.serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
    this.serialPort.Open();
    this.master = ModbusSerialMaster.CreateRtu(this.serialPort);
    this.master.Transport.WriteTimeout = 2000;
    this.master.Transport.ReadTimeout = 2000;
    this.master.Transport.WaitToRetryMilliseconds = 500;
    this.master.Transport.Retries = 3;
}
 public void Close()
 {
     if (this.serialPort != null && this.serialPort.IsOpen)
     {
         this.serialPort.Close();
     }
     this.master = null;
 }

4、在NModbus4基础上封装各种读写的方法,这里以读取保持型寄存器为例,其他方法都是类似的:

public byte[] ReadHoldingRegisters(byte slaveId, ushort start, ushort length)
{
    try
    {
        ushort[] data = this.master.ReadHoldingRegisters(slaveId, start, length);
        List<byte> result = new List<byte>();
        foreach (var item in data)
        {
            result.AddRange(BitConverter.GetBytes(item).Reverse());
        }
        return result.ToArray();
    }
    catch (Exception ex)
    {
        throw new Exception("【读取保持寄存器】失败:" + ex.Message);
    }
}
基于NModbus4实现ModbusRTU通信,不需要关注协议及报文,只需要对NModbus4库二次封装即可。

4、ModbusTCP通信

NModbus4不仅支持ModbusRTU通信,也同样支持ModbusTCP通信,ModbusTCP与ModbusRTU的封装过程非常类似,主要是存在以下两个不同点:

  • ModbusRTU是基于串口通信,因此主要使用的是SerialPort类,而ModbusTCP是基于以太网通信,主要使用的是TcpClient类。

  • ModbusRTU的读取和写入方法中都必须包含从站地址,而ModbusTCP可以把SlaveAddress作为一个可选项。

ModbusTCP通信库封装过程如下:1、在NModbus4基础上封装一个TCP连接和断开的方法:
private TcpClient tcpClient;
private ModbusIpMaster master
public void Connect(string ip, int port)
{
    tcpClient = new TcpClient();
    tcpClient.Connect(IPAddress.Parse(ip), port);
    this.master = ModbusIpMaster.CreateIp(this.tcpClient);
    this.master.Transport.WriteTimeout = 2000;
    this.master.Transport.ReadTimeout = 2000;
    this.master.Transport.WaitToRetryMilliseconds = 500;
    this.master.Transport.Retries = 3;
}
 public void DisConnect()
 {
     if (this.tcpClient != null && this.tcpClient.Connected)
     {
         this.tcpClient.Close();
     }
     this.master = null;
 }
2、封装一个读取输出线圈的方法,其他读写方法都是类似的:
public bool[] ReadOutputCoils(ushort start, ushort length, byte slaveAddress = 1)
{
    try
    {
        return this.master.ReadCoils(slaveAddress, start, length);
    }
    catch (Exception ex)
    {
        throw new Exception("【读取输出线圈】失败:" + ex.Message);
    }
}
 

标签:封装,C#,NModbus4,轻松,通信,Modbus,master,serialPort,Transport
From: https://www.cnblogs.com/xiketangedu/p/18461727

相关文章

  • Hoverfly 任意文件读取漏洞(CVE-2024-45388)
    漏洞简介Hoverfly是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation​的POST处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而,这一功能可能被攻击者利用来读取Hoverfly服务器上的任意文件。尽管代码禁止指定绝......
  • C语言中指针在数组的使用--摘自Micro_Frank
    #include<stdio.h>#include<stdint.h>intmain(void){ //指针的算术运算 int32_tnumbers[]={10,20,30,40,50,60,70,80,90,100}; int32_t*ptr=numbers;//无取地址符,也无数组下标,表示&numbers[0] //数组在内存中是连续的 //0->00000000090 //所以......
  • 代码随想录Day24 | LeetCode 122. 买卖股票的最佳时机 II、LeetCode 55. 跳跃游戏、Le
    LeetCode122.买卖股票的最佳时机IIclassSolution:defmaxProfit(self,prices:List[int])->int:res=0foriinrange(1,len(prices)):res+=max(0,prices[i]-prices[i-1])returnresLeetCode55.跳跃游戏class......
  • Web前端开发入门学习笔记之CSS 39-40 --新手超级友好版- 文本颜色字体篇
       Foreword写在前面的话: 大家好,我是一名刚开始学习HTML的新手。这篇文章是我在学习html过程中的一些笔记和心得,希望能和同样在学习HTML的朋友们分享。由于我的知识有限,文章中可能存在错误或不准确的地方,欢迎大家在评论区提出建议和指正。我非常期待大家的反馈,以便我能......
  • C语言之printf的解析
    一、前言我们学习程序开发的第一个编程基本就是输出。下面我们学习一下的输出函数printf并学习。二、项目实践1.引入库文件#include<stdio.h>2.标准输出标准格式:printf(格式控制字符串,输出列表);#include<stdio.h>intmain(){ printf("helloworld\n"); return0;}执行程......
  • 《csp-j2024初赛真题》 解析
    温馨提醒,以下解析为个人观点,还是得请大佬多多指教(可以喷,但不能说我是复制粘贴!)这篇文章的背景故事:我的那些朋友去给另一个朋友过生日聚会,现在刚刚走回来。那你们知道我为啥不去吗给你们看张珍贵无比的图片: 当然,不止这两张。至于原因,我要回来赶(肝)(干)解析(哭脸)1.32位int......
  • YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点
    YOLOv9分割改进前训练结果:YOLOv9分割改进后训练结果:摘要卷积神经网络(ConvNets)通常在固定的资源预算下开发,然后在有更多资源时进行扩展以提高准确性。在本文中,我们系统地研究了模型扩展,并发现仔细平衡网络深度、宽度和分辨率可以带来更好的性能。基于这一观察,提出......
  • HTML+CSS 核心笔记 (四)
    选择器结构伪类选择器作用:根据元素的结构关系查找元素:nth-child(公式) 作用:根据元素的结构关系查找多个元素提示:公式中的n取值从0开始伪元素选择器作用:创建虚拟元素(伪元素),用来摆放装饰性的内容必须设置content:””属性,用来设置伪元素的......
  • AtCoder Beginner Contest 375
    省流版A.枚举所有子串判断即可B.模拟计算记录累加即可C.根据旋转的周期性对每个点旋转次数取模后暴力旋转即可D.枚举\(k\),考虑\(i,j\)的对数,写成数学表达式后维护个数和位置和即可E.背包问题,以前两个数组和为状态,考虑每个数移动到何处转移即可F.逆向,删边变加边,维护......
  • JavaScript中的流程控制(顺序结构、分支结构、循环结构)
    流程控制1.概念在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候要通过控制代码的执行顺序来实现我们完成的功能简单的理解:流程控制就是控制代码,按照一定的结构顺序来执行流程控制的分类:顺序结构分支结构循环结构2.顺序流程控......