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#并行编程之Task同步机制

    C#并行编程之Task同步机制

    这篇文章介绍了C#并行编程之Task同步机制,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 浅谈Unity中的Shader

    浅谈Unity中的Shader

    Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在。Shader其实就是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果
    2021-06-06
  • C#4.0新特性之协变与逆变实例分析

    C#4.0新特性之协变与逆变实例分析

    这篇文章主要介绍了C#4.0新特性的协变与逆变,是比较实用的一个新功能,需要的朋友可以参考下
    2014-09-09
  • Unity3D实现人物移动示例

    Unity3D实现人物移动示例

    这篇文章主要为大家详细介绍了Unity3D实现人物移动示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • c#实现选择排序的示例

    c#实现选择排序的示例

    这篇文章主要介绍了c#实现选择排序的示例,帮助大家更好的理解和使用排序算法,感兴趣的朋友可以了解下
    2020-10-10
  • C#使用Dapper存取数据库详解

    C#使用Dapper存取数据库详解

    Dapper是的一个开源对象关系映射(ORM)库.NET和.NET核心应用程序,本文将介绍C#如何使用Dapper操作数据库,感兴趣的小伙伴可以了解一下
    2024-12-12
  • c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码

    c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码

    c# 如何实现MD5,SHA1,SHA256,SHA512等常用加密算法,需要的朋友可以参考下
    2012-12-12
  • c#与mysql的连接

    c#与mysql的连接

    c#与mysql的连接...
    2007-03-03
  • 基于C#实现微信支付宝扫码支付功能

    基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能。需要的朋友跟随小编一起看看吧
    2019-06-06
  • 如何利用现代化C#语法简化代码

    如何利用现代化C#语法简化代码

    这篇文章主要给大家介绍了关于如何利用现代化C#语法简化代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论