查看: 96|回复: 0

[教程] C#使用EasyModbus进行通讯的实现示例

[复制链接]

2

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2008-6-15
发表于 2026-1-4 09:50:17 | 显示全部楼层 |阅读模式

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}");
            }
            
            // 写入寄存器
            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#实现Modbus RTU通信
  • C#实现modbus通讯的实现示例
  • C#实现Modbus通信功能的示例详解
  • C# NModbus RTU通信实现方法详解
  • C# 中使用NModbus4通信库执行写操作
  • C#中的modbus Tcp协议的数据抓取和使用解析
  • C#操作串口通信协议Modbus的常用方法介绍
  • C#基于Modbus三种CRC16校验方法的性能对比
  • c# modbus大小端的使用小结
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部