C#实现Modbus通信的详细教程(支持TCP和RTU)

 更新时间:2025年01月20日 10:03:41   作者:威哥说编程  
Modbus 协议是一种广泛应用于工业自动化中的通信协议,用于在设备之间进行数据交换,它基于主/从架构,并支持多种传输方式,如 Modbus TCP 和 Modbus RTU,在本文中,我们将使用 C# 编程语言和开源库 NModbus,展示如何轻松实现 Modbus 通信,需要的朋友可以参考下

引言

Modbus 协议是一种广泛应用于工业自动化中的通信协议,用于在设备之间进行数据交换。它基于主/从架构,并支持多种传输方式,如 Modbus TCP 和 Modbus RTU。由于其简洁、可靠和开放性,Modbus 被广泛应用于 SCADA 系统、PLC(可编程逻辑控制器)、传感器以及其他嵌入式系统。

在本文中,我们将使用 C# 编程语言和开源库 NModbus,展示如何轻松实现 Modbus 通信,支持 Modbus TCP 和 Modbus RTU 两种通信方式。

1. 准备工作

在开始编写代码之前,你需要做一些准备工作:

  • NModbus 库:NModbus 是一个用 C# 实现的开源 Modbus 协议库,支持 Modbus RTU 和 Modbus TCP。我们将利用这个库来简化 Modbus 协议的实现。
  • 安装 NModbus 库:你可以通过 NuGet 包管理器或者 .NET CLI 安装 NModbus。

打开 Visual Studio 中的 NuGet 包管理器控制台,运行以下命令来安装 NModbus:

Install-Package NModbus

或者,使用 .NET CLI:

dotnet add package NModbus

2. Modbus TCP 客户端实现

Modbus TCP 是基于以太网的协议,通信速度较快,适用于大多数现代设备。如果你有一个支持 Modbus TCP 协议的设备或服务器,以下是如何在 C# 中实现一个简单的 Modbus TCP 客户端。

代码示例:Modbus TCP 客户端

using System;
using System.Net.Sockets;
using Modbus.Device;  // 引入 NModbus 库
 
class Program
{
    static void Main(string[] args)
    {
        // 1. 连接到 Modbus 服务器(Modbus TCP)
        string ipAddress = "192.168.0.100"; // 设备的 IP 地址
        int port = 502; // Modbus TCP 默认端口
        var client = new TcpClient(ipAddress, port);
 
        // 2. 获取 Modbus TCP 设备的协议客户端
        var modbusTcpMaster = ModbusTcpMaster.CreateIp(client);
 
        // 3. 读取从站设备的寄存器
        ushort startAddress = 0;  // 寄存器起始地址
        ushort numRegisters = 10; // 读取 10 个寄存器
 
        try
        {
            // 读取保持寄存器
            ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
            
            // 输出结果
            Console.WriteLine("读取到的寄存器值:");
            foreach (var register in registers)
            {
                Console.WriteLine(register);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取错误: {ex.Message}");
        }
 
        // 4. 关闭连接
        client.Close();
    }
}

代码解析:

  1. 连接到 Modbus 服务器:使用 TcpClient 与 Modbus 设备建立 TCP 连接。指定设备的 IP 地址和端口(默认为 502)。
  2. 创建 Modbus 客户端:通过 ModbusTcpMaster.CreateIp(client) 创建一个 Modbus 客户端,支持读写数据。
  3. 读取保持寄存器:通过 ReadHoldingRegisters 方法从设备读取指定地址的多个寄存器的值。
  4. 关闭连接:通信完成后,关闭与设备的连接。

常用 Modbus 操作:

  • 读取寄存器ReadHoldingRegisters()ReadInputRegisters()
  • 写入寄存器WriteSingleRegister()WriteMultipleRegisters()

3. Modbus RTU 客户端实现

Modbus RTU(Remote Terminal Unit)是基于串口通信的协议,常用于嵌入式设备和远程设备的通信。Modbus RTU 适用于较为简单的设备,尤其是需要通过串口(如 RS232 或 RS485)通信的情况。

代码示例:Modbus RTU 客户端

using System;
using System.IO.Ports;
using Modbus.Device;  // 引入 NModbus 库
 
class Program
{
    static void Main(string[] args)
    {
        // 1. 通过串口连接到 Modbus 设备
        string portName = "COM1";  // 串口名称
        int baudRate = 9600;       // 波特率
        int parity = 0;            // 校验位,0: 无校验,1: 偶校验,2: 奇校验
        int dataBits = 8;          // 数据位
        int stopBits = 1;          // 停止位
 
        var serialPort = new SerialPort(portName, baudRate, (Parity)parity, dataBits, (StopBits)stopBits);
        serialPort.Open();
 
        // 2. 创建 Modbus RTU 主机对象
        var modbusRtuMaster = ModbusSerialMaster.CreateRtu(serialPort);
 
        // 3. 读取从站设备的寄存器
        ushort startAddress = 0;   // 寄存器起始地址
        ushort numRegisters = 10;  // 读取 10 个寄存器
 
        try
        {
            // 读取保持寄存器(从站地址为 1)
            ushort[] registers = modbusRtuMaster.ReadHoldingRegisters(1, startAddress, numRegisters);
 
            // 输出结果
            Console.WriteLine("读取到的寄存器值:");
            foreach (var register in registers)
            {
                Console.WriteLine(register);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取错误: {ex.Message}");
        }
 
        // 4. 关闭串口连接
        serialPort.Close();
    }
}

代码解析:

  1. 配置串口连接:使用 SerialPort 类设置串口连接,包括端口号、波特率、校验位等。
  2. 创建 Modbus RTU 客户端:通过 ModbusSerialMaster.CreateRtu() 创建 Modbus RTU 客户端。
  3. 读取寄存器:通过 ReadHoldingRegisters 方法读取指定从站地址和寄存器范围的数据。
  4. 关闭串口连接:通信完成后,关闭串口。

常见 Modbus RTU 操作:

  • 读取数据ReadCoils()ReadDiscreteInputs()ReadHoldingRegisters()ReadInputRegisters()
  • 写入数据WriteSingleCoil()WriteSingleRegister()WriteMultipleCoils()WriteMultipleRegisters()

4. 错误处理和调试

在实际使用 Modbus 协议进行通信时,错误处理和调试至关重要。常见的错误包括连接超时、通信中断、数据格式错误等。

错误处理示例:

try
{
    // 读取寄存器
    ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
}
catch (SocketException ex)
{
    Console.WriteLine($"网络错误:{ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine($"I/O 错误:{ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"未知错误:{ex.Message}");
}

通过捕获不同类型的异常,你可以更精确地定位问题所在,便于调试和修复。

5. 小结

在 C# 中实现 Modbus 通信非常简单,通过使用 NModbus 库,我们能够轻松地构建 Modbus TCP 和 Modbus RTU 客户端。无论是与工业设备、传感器,还是 PLC 通信,Modbus 都是一个可靠且高效的选择。

本教程展示了如何在 C# 中使用 NModbus 库实现 Modbus TCP 和 Modbus RTU 通信。通过这些示例,你可以快速入门并根据自己的需求进一步扩展和优化代码。希望本教程能帮助你实现与各种 Modbus 设备的高效通信。

以上就是C#实现Modbus通信的详细教程(支持TCP和RTU)的详细内容,更多关于C# Modbus通信的资料请关注脚本之家其它相关文章!

相关文章

  • C#从命令行读取参数的方法

    C#从命令行读取参数的方法

    这篇文章主要介绍了C#从命令行读取参数的方法,实例分析了C#命令行读取参数的实现技巧与操作流程,需要的朋友可以参考下
    2015-04-04
  • C# winform 窗体控件跨线程访问的实现

    C# winform 窗体控件跨线程访问的实现

    在做winform开发时,如果在子线程中去设置主线程中UI控件的属性,会出现“跨线程调用异常”,本文就来介绍一下C# winform 窗体控件跨线程访问的实现,感兴趣的可以了解一下
    2023-12-12
  • C#多线程编程中导致死锁的常见陷阱和避免方法

    C#多线程编程中导致死锁的常见陷阱和避免方法

    在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形成一个循环依赖,造成程序无法继续执行,本文将深入探讨C#多线程编程中导致死锁的常见陷阱,并帮助你避免这些坑
    2025-02-02
  • C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

    C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

    本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepSeek R1模型,客户端 ChatBox AI 接入 DeepSeek 的步骤,以及 C# 调用 DeepSeek API 的示例代码,并总结了其在实际项目中的应用价值,需要的朋友可以参考下
    2025-03-03
  • c#对象反序列化与对象序列化示例详解

    c#对象反序列化与对象序列化示例详解

    这篇文章主要介绍了c#对象反序列化与对象序列化示例,需要的朋友可以参考下
    2014-03-03
  • C# Helper开发一个简单的端口监控工具

    C# Helper开发一个简单的端口监控工具

    C# 端口监控 Helper 是一款基于C#语言的工具,这个意义在于帮助开发者快速实现对指定端口的监控,以保障(观察)网络服务的正常运行,下面我们就来看看具体实现方法吧
    2025-09-09
  • C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    紧耦合和松耦合是描述模块或组件之间耦合程度的两个概念,本文主要介绍了C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • c# rsa注册实现加密文字

    c# rsa注册实现加密文字

    这篇文章主要介绍了c# rsa注册实现加密文字,需要的朋友可以参考下
    2014-04-04
  • 深入c# GDI+简单绘图的具体操作步骤(二)

    深入c# GDI+简单绘图的具体操作步骤(二)

    本篇文章是对GDI+简单绘图的绘图知识进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#实现读取写入Json文件

    C#实现读取写入Json文件

    这篇文章主要介绍了C#实现读取写入Json文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论