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通信