C#使用EasyModbus进行通讯的实现示例

 更新时间:2026年01月04日 09:50:17   作者:*Major*-莙工科技有限公司  
EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信,本文就来介绍一下C#使用EasyModbus进行通讯的实现示例,感兴趣的可以了解一下

EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信。

一 安装EasyModbus

二 ModbusRTU-串口连接

// 创建Modbus RTU客户端
ModbusClient modbusClient = new ModbusClient("COM10"); // 串口号
modbusClient.Baudrate = 9600; // 波特率
modbusClient.Parity = System.IO.Ports.Parity.None; // 校验位
modbusClient.StopBits = System.IO.Ports.StopBits.One; // 停止位

modbusClient.Connect();

三 ModbusTCP-网口连接

// 创建Modbus客户端实例
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502); // IP地址和端口
// 连接到Modbus服务器
modbusClient.Connect();

四 读取多个输出线圈

    // 读取线圈状态 (功能码01)
    bool[] coilStatus = modbusClient.ReadCoils(0, 5); // 从地址0开始读取5个线圈

五 写入单个线圈

  // 写入单个线圈 (功能码05)
    modbusClient.WriteSingleCoil(0, true); // 向地址0写入true

六 读取保持寄存器

    // 读取保持寄存器 (功能码03)
    int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 10); // 从地址0开始读取10个寄存器

七 读取输入寄存器

int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);

八 写入单个输出寄存器

modbusClient.WriteSingleRegister(0, 1234);

九 写入多个输出寄存器

// 写入多个寄存器 (功能码16)
int[] valuesToWrite = { 100, 200, 300 };
modbusClient.WriteMultipleRegisters(0, valuesToWrite); // 从地址0开始写入

基本用法

1. Modbus TCP客户端

using EasyModbus;

// 创建Modbus客户端实例
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502); // IP地址和端口

try
{
    // 连接到Modbus服务器
    modbusClient.Connect();
    
    // 读取保持寄存器 (功能码03)
    int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 10); // 从地址0开始读取10个寄存器
    
    // 写入单个寄存器 (功能码06)
    modbusClient.WriteSingleRegister(0, 1234); // 向地址0写入值1234
    
    // 写入多个寄存器 (功能码16)
    int[] valuesToWrite = { 100, 200, 300 };
    modbusClient.WriteMultipleRegisters(10, valuesToWrite); // 从地址10开始写入
    
    // 读取线圈状态 (功能码01)
    bool[] coilStatus = modbusClient.ReadCoils(0, 5); // 从地址0开始读取5个线圈
    
    // 写入单个线圈 (功能码05)
    modbusClient.WriteSingleCoil(0, true); // 向地址0写入true
}
catch (Exception ex)
{
    Console.WriteLine($"发生错误: {ex.Message}");
}
finally
{
    // 断开连接
    modbusClient.Disconnect();
}

2. Modbus RTU客户端 (串口通信)

using EasyModbus;

// 创建Modbus RTU客户端
ModbusClient modbusClient = new ModbusClient("COM1"); // 串口号
modbusClient.Baudrate = 9600; // 波特率
modbusClient.Parity = System.IO.Ports.Parity.None; // 校验位
modbusClient.StopBits = System.IO.Ports.StopBits.One; // 停止位

try
{
    modbusClient.Connect();
    
    // 与TCP类似的操作
    int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);
    // ...其他操作
}
catch (Exception ex)
{
    Console.WriteLine($"发生错误: {ex.Message}");
}
finally
{
    modbusClient.Disconnect();
}

3. Modbus服务器

EasyModbus也支持创建Modbus服务器:

using EasyModbus;

// 创建Modbus TCP服务器
ModbusServer modbusServer = new ModbusServer();
modbusServer.Port = 502; // 设置端口

// 设置寄存器值(服务器模拟)
modbusServer.HoldingRegisters[0] = 100;
modbusServer.HoldingRegisters[1] = 200;

// 启动服务器
modbusServer.Listen();

Console.WriteLine("Modbus服务器已启动,按任意键停止...");
Console.ReadKey();

// 停止服务器
modbusServer.StopListening();

高级功能

异步操作

// 异步读取保持寄存器
int[] registers = await Task.Run(() => modbusClient.ReadHoldingRegisters(0, 10));

事件处理

modbusClient.DataReceived += (sender, e) => 
{
    Console.WriteLine($"接收到数据: {BitConverter.ToString(e.Data)}");
};

超时设置

modbusClient.ConnectionTimeout = 5000; // 5秒连接超时

注意事项

  1. 确保防火墙允许Modbus通信(默认端口502)
  2. 对于RTU模式,确保串口配置与设备匹配
  3. 处理异常情况,如连接失败、超时等
  4. 寄存器地址从0开始,但某些设备文档可能从1开始计数,需要注意偏移

完整示例

using System;
using EasyModbus;

class Program
{
    static void Main(string[] args)
    {
        ModbusClient modbusClient = new ModbusClient("192.168.1.100", 502);
        
        try
        {
            Console.WriteLine("正在连接Modbus服务器...");
            modbusClient.Connect();
            
            // 读取保持寄存器
            Console.WriteLine("读取保持寄存器...");
            int[] registers = modbusClient.ReadHoldingRegisters(0, 5);
            for (int i = 0; i < registers.Length; i++)
            {
                Console.WriteLine($"寄存器 {i}: {registers[i]}");
            }
            
            // 写入寄存器
            Console.WriteLine("写入寄存器...");
            modbusClient.WriteSingleRegister(10, 1234);
            
            // 验证写入
            int value = modbusClient.ReadHoldingRegisters(10, 1)[0];
            Console.WriteLine($"寄存器10的新值: {value}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误: {ex.Message}");
        }
        finally
        {
            modbusClient.Disconnect();
            Console.WriteLine("连接已关闭");
        }
    }
}

通过以上示例,你应该能够开始在C#项目中使用EasyModbus库进行Modbus通信了。

到此这篇关于C#使用EasyModbus进行通讯的实现示例的文章就介绍到这了,更多相关C# EasyModbus通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#简单快速的json组件fastJSON使用介绍

    C#简单快速的json组件fastJSON使用介绍

    JSON数据格式简洁,用于数据的持久化和对象传输很实用。最近在做一个Razor代码生成器,需要把数据库的表和列的信息修改后保存下来,想到用JSON序列化对象并保存,需要时再反序列化成对象会简单一些
    2012-11-11
  • C#实现多种图片格式转换的示例详解

    C#实现多种图片格式转换的示例详解

    这篇文章主要为大家详细介绍了C#如何实现多种图片格式转换,例如转换成图标图像ICO,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 基于C#实现图片合成功能

    基于C#实现图片合成功能

    这篇文章主要为大家详细介绍了如何利用C#实现图片合成的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 解决C#全屏幕截图的实现方法

    解决C#全屏幕截图的实现方法

    本篇文章是对在C#中实现全屏幕截图的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C#简单发送email的方法

    C#简单发送email的方法

    这篇文章主要介绍了C#简单发送email的方法,涉及C#发送Email的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#中实现AES算法加密解读

    C#中实现AES算法加密解读

    这篇文章主要介绍了C#中实现AES算法加密实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C#开发WinForm清空DataGridView控件绑定的数据

    C#开发WinForm清空DataGridView控件绑定的数据

    本文详细讲解了C#开发WinForm清空DataGridView控件绑定数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#实现托盘程序并禁止多个应用实例运行的方法

    C#实现托盘程序并禁止多个应用实例运行的方法

    这篇文章主要介绍了C#实现托盘程序并禁止多个应用实例运行的方法,涉及C#中NotifyIcon控件的使用及设置标志位控制程序只运行一个的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C# 中 TryParse如何将字符串转换为特定类型

    C# 中 TryParse如何将字符串转换为特定类型

    在 C# 中,TryParse 是一个用于将字符串转换为特定类型的方法,它用于尝试解析字符串并将其转换为指定类型的值,而不会引发异常,这篇文章主要介绍了C# 中 TryParse 将字符串转换为特定类型的方法,需要的朋友可以参考下
    2024-03-03
  • C#字符串如何提取数值(带小数点)

    C#字符串如何提取数值(带小数点)

    这篇文章主要介绍了C#字符串如何提取数值问题(带小数点),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论