孤山朕爷 發表於 2026-1-4 09:50:17

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一 安装EasyModbus</li><li>二 ModbusRTU-串口连接</li><li>三 ModbusTCP-网口连接</li><li>四 读取多个输出线圈</li><li>五 写入单个线圈</li><li>六 读取保持寄存器</li><li>七 读取输入寄存器</li><li>八 写入单个输出寄存器</li><li>九 写入多个输出寄存器</li><li>基本用法</li><ul class="second_class_ul"><li>1. Modbus TCP客户端</li><li>2. Modbus RTU客户端 (串口通信)</li><li>3. Modbus服务器</li></ul><li>高级功能</li><ul class="second_class_ul"><li>异步操作</li><li>事件处理</li><li>超时设置</li></ul><li>注意事项</li><ul class="second_class_ul"></ul><li>完整示例</li><ul class="second_class_ul"></ul></ul></div><p>EasyModbus是一个流行的.NET库,用于实现Modbus TCP、RTU和UDP协议通信。</p>
<p class="maodian"></p><h2>一 安装EasyModbus</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010409491954.png" /></p>
<p class="maodian"></p><h2>二 ModbusRTU-串口连接</h2>
<div class="jb51code"><pre class="brush:csharp;">// 创建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();
</pre></div>
<p class="maodian"></p><h2>三 ModbusTCP-网口连接</h2>
<div class="jb51code"><pre class="brush:csharp;">// 创建Modbus客户端实例
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502); // IP地址和端口
// 连接到Modbus服务器
modbusClient.Connect();
</pre></div>
<p class="maodian"></p><h2>四 读取多个输出线圈</h2>
<div class="jb51code"><pre class="brush:csharp;">    // 读取线圈状态 (功能码01)
    bool[] coilStatus = modbusClient.ReadCoils(0, 5); // 从地址0开始读取5个线圈
</pre></div>
<p class="maodian"></p><h2>五 写入单个线圈</h2>
<div class="jb51code"><pre class="brush:csharp;">// 写入单个线圈 (功能码05)
    modbusClient.WriteSingleCoil(0, true); // 向地址0写入true
</pre></div>
<p class="maodian"></p><h2>六 读取保持寄存器</h2>
<div class="jb51code"><pre class="brush:csharp;">    // 读取保持寄存器 (功能码03)
    int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 10); // 从地址0开始读取10个寄存器
</pre></div>
<p class="maodian"></p><h2>七 读取输入寄存器</h2>
<div class="jb51code"><pre class="brush:csharp;">int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);
</pre></div>
<p class="maodian"></p><h2>八 写入单个输出寄存器</h2>
<div class="jb51code"><pre class="brush:csharp;">modbusClient.WriteSingleRegister(0, 1234);
</pre></div>
<p class="maodian"></p><h2>九 写入多个输出寄存器</h2>
<div class="jb51code"><pre class="brush:csharp;">// 写入多个寄存器 (功能码16)
int[] valuesToWrite = { 100, 200, 300 };
modbusClient.WriteMultipleRegisters(0, valuesToWrite); // 从地址0开始写入
</pre></div>
<p class="maodian"></p><h2>基本用法</h2>
<p class="maodian"></p><h3>1. Modbus TCP客户端</h3>
<div class="jb51code"><pre class="brush:csharp;">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();
}
</pre></div>
<p class="maodian"></p><h3>2. Modbus RTU客户端 (串口通信)</h3>
<div class="jb51code"><pre class="brush:csharp;">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();
}
</pre></div>
<p class="maodian"></p><h3>3. Modbus服务器</h3>
<p>EasyModbus也支持创建Modbus服务器:</p>
<div class="jb51code"><pre class="brush:csharp;">using EasyModbus;

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

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

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

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

// 停止服务器
modbusServer.StopListening();
</pre></div>
<p class="maodian"></p><h2>高级功能</h2>
<p class="maodian"></p><h3>异步操作</h3>
<div class="jb51code"><pre class="brush:csharp;">// 异步读取保持寄存器
int[] registers = await Task.Run(() =&gt; modbusClient.ReadHoldingRegisters(0, 10));
</pre></div>
<p class="maodian"></p><h3>事件处理</h3>
<div class="jb51code"><pre class="brush:csharp;">modbusClient.DataReceived += (sender, e) =&gt;
{
    Console.WriteLine($"接收到数据: {BitConverter.ToString(e.Data)}");
};
</pre></div>
<p class="maodian"></p><h3>超时设置</h3>
<div class="jb51code"><pre class="brush:csharp;">modbusClient.ConnectionTimeout = 5000; // 5秒连接超时
</pre></div>
<p class="maodian"></p><h2>注意事项</h2>
<ol><li>确保防火墙允许Modbus通信(默认端口502)</li><li>对于RTU模式,确保串口配置与设备匹配</li><li>处理异常情况,如连接失败、超时等</li><li>寄存器地址从0开始,但某些设备文档可能从1开始计数,需要注意偏移</li></ol>
<p class="maodian"></p><h2>完整示例</h2>
<div class="jb51code"><pre class="brush:csharp;">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 &lt; registers.Length; i++)
            {
                Console.WriteLine($"寄存器 {i}: {registers}");
            }
            
            // 写入寄存器
            Console.WriteLine("写入寄存器...");
            modbusClient.WriteSingleRegister(10, 1234);
            
            // 验证写入
            int value = modbusClient.ReadHoldingRegisters(10, 1);
            Console.WriteLine($"寄存器10的新值: {value}");
      }
      catch (Exception ex)
      {
            Console.WriteLine($"错误: {ex.Message}");
      }
      finally
      {
            modbusClient.Disconnect();
            Console.WriteLine("连接已关闭");
      }
    }
}
</pre></div>
<p>通过以上示例,你应该能够开始在C#项目中使用EasyModbus库进行Modbus通信了。</p>
<p>到此这篇关于C#使用EasyModbus进行通讯的实现示例的文章就介绍到这了,更多相关C# EasyModbus通讯内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>基于C#实现Modbus&nbsp;RTU通信</li><li>C#实现modbus通讯的实现示例</li><li>C#实现Modbus通信功能的示例详解</li><li>C# NModbus RTU通信实现方法详解</li><li>C#&nbsp;中使用NModbus4通信库执行写操作</li><li>C#中的modbus&nbsp;Tcp协议的数据抓取和使用解析</li><li>C#操作串口通信协议Modbus的常用方法介绍</li><li>C#基于Modbus三种CRC16校验方法的性能对比</li><li>c#&nbsp;modbus大小端的使用小结</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C#使用EasyModbus进行通讯的实现示例