欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > C# 简单使用NModbus

C# 简单使用NModbus

2025/9/14 13:57:58 来源:https://blog.csdn.net/weixin_45144862/article/details/144794647  浏览:    关键词:C# 简单使用NModbus

C# 简单使用NModbus

在工业自动化和控制系统中,Modbus协议是一种广泛使用的通信协议。它是一种基于主从结构的串行通信协议,简单、可靠且易于实现。在C#中,可以使用NModbus4库来执行Modbus通信。本文将详细介绍如何使用NModbus4库在C#中执行Modbus读操作。

1.安装NModbus4库

使用Nuget包管理器安装:

在这里插入图片描述

2.创建MoModbus连接

2.1ModbusRTU通信

using System.IO.Ports;
using Modbus.Device;
using Modbus;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Remoting.Contexts;
using System.Collections;namespace CModbusTest
{internal class Program{private static SerialPort serialport;private static ModbusSerialMaster master;private static ModbusIpMaster masterIp;private static TcpClient tcpclient;static void Main(string[] args){//string[] ports = SerialPort.GetPortNames();serialport = new SerialPort(ports[0], 9600, Parity.None, 8, StopBits.One);serialport.Open();master = ModbusSerialMaster.CreateRtu(serialport);master.Transport.WriteTimeout = 2000;master.Transport.ReadTimeout = 2000;master.Transport.WaitToRetryMilliseconds = 500;master.Transport.Retries = 3;try{ushort[] data = master.ReadHoldingRegisters(1, 0, 2);List<byte> list = new List<byte>();foreach (var item in data){list.AddRange(BitConverter.GetBytes(item).Reverse());}Console.WriteLine(list.ToArray());}catch (Exception ex){if (serialport != null || serialport.IsOpen){serialport.Close();}master = null;throw new Exception("【读取保持寄存器】失败:" + ex.Message);}}}
}

代码解析:
配置串口连接:使用 SerialPort 类设置串口连接,包括端口号、波特率、校验位等。
创建 Modbus RTU 客户端:通过 ModbusSerialMaster.CreateRtu() 创建 Modbus RTU 客户端。
读取寄存器:通过 ReadHoldingRegisters 方法读取指定从站地址和寄存器范围的数据。
关闭串口连接:通信完成后,关闭串口。
常见 Modbus RTU 操作:
读取数据:ReadCoils()、ReadDiscreteInputs()、ReadHoldingRegisters()、ReadInputRegisters()。
写入数据:WriteSingleCoil()、WriteSingleRegister()、WriteMultipleCoils()、WriteMultipleRegisters()。

2.2ModbusTCP通信

using System.IO.Ports;
using Modbus.Device;
using Modbus;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Remoting.Contexts;
using System.Collections;namespace CModbusTest
{internal class Program{private static SerialPort serialport;private static ModbusSerialMaster master;private static ModbusIpMaster masterIp;private static TcpClient tcpclient;static void Main(string[] args){// 1. 连接到 Modbus 服务器(Modbus TCP)tcpclient = new TcpClient();tcpclient.Connect(IPAddress.Parse("127.0.0.1"),502);// 2. 获取 Modbus TCP 设备的协议客户端masterIp = ModbusIpMaster.CreateIp(tcpclient);masterIp.Transport.WriteTimeout = 2000;masterIp.Transport.ReadTimeout = 2000;masterIp.Transport.WaitToRetryMilliseconds = 500;masterIp.Transport.Retries = 3;// 3. 读取从站设备的寄存器ushort startAddress = 0;  // 寄存器起始地址ushort numRegisters = 10; // 读取 10 个寄存器try{// 读取保持寄存器ushort[] registers = masterIp.ReadHoldingRegisters(startAddress, numRegisters);// 输出结果Console.WriteLine("读取到的寄存器值:");foreach (var register in registers){Console.WriteLine(register);}}catch (Exception ex){Console.WriteLine($"读取错误: {ex.Message}");}}}
}

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

参考文章:

1.C# 实现 Modbus 通信的简单教程(支持 TCP 和 RTU)

2.C#轻松实现Modbus通信

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词