C# 使用NModbus的實(shí)現(xiàn)示例
在工業(yè)自動(dòng)化和控制系統(tǒng)中,Modbus協(xié)議是一種廣泛使用的通信協(xié)議。它是一種基于主從結(jié)構(gòu)的串行通信協(xié)議,簡(jiǎn)單、可靠且易于實(shí)現(xiàn)。在C#中,可以使用NModbus4庫(kù)來執(zhí)行Modbus通信。本文將詳細(xì)介紹如何使用NModbus4庫(kù)在C#中執(zhí)行Modbus讀操作。
1.安裝NModbus4庫(kù)
使用Nuget包管理器安裝:

2.創(chuàng)建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 類設(shè)置串口連接,包括端口號(hào)、波特率、校驗(yàn)位等。
創(chuàng)建 Modbus RTU 客戶端:通過 ModbusSerialMaster.CreateRtu() 創(chuàng)建 Modbus RTU 客戶端。
讀取寄存器:通過 ReadHoldingRegisters 方法讀取指定從站地址和寄存器范圍的數(shù)據(jù)。
關(guān)閉串口連接:通信完成后,關(guān)閉串口。
常見 Modbus RTU 操作:
讀取數(shù)據(jù):ReadCoils()、ReadDiscreteInputs()、ReadHoldingRegisters()、ReadInputRegisters()。
寫入數(shù)據(jù):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 服務(wù)器(Modbus TCP)
tcpclient = new TcpClient();
tcpclient.Connect(IPAddress.Parse("127.0.0.1"),502);
// 2. 獲取 Modbus TCP 設(shè)備的協(xié)議客戶端
masterIp = ModbusIpMaster.CreateIp(tcpclient);
masterIp.Transport.WriteTimeout = 2000;
masterIp.Transport.ReadTimeout = 2000;
masterIp.Transport.WaitToRetryMilliseconds = 500;
masterIp.Transport.Retries = 3;
// 3. 讀取從站設(shè)備的寄存器
ushort startAddress = 0; // 寄存器起始地址
ushort numRegisters = 10; // 讀取 10 個(gè)寄存器
try
{
// 讀取保持寄存器
ushort[] registers = masterIp.ReadHoldingRegisters(startAddress, numRegisters);
// 輸出結(jié)果
Console.WriteLine("讀取到的寄存器值:");
foreach (var register in registers)
{
Console.WriteLine(register);
}
}
catch (Exception ex)
{
Console.WriteLine($"讀取錯(cuò)誤: {ex.Message}");
}
}
}
}
代碼解析:
連接到 Modbus 服務(wù)器:使用 TcpClient 與 Modbus 設(shè)備建立 TCP 連接。指定設(shè)備的 IP 地址和端口(默認(rèn)為 502)。
創(chuàng)建 Modbus 客戶端:通過 ModbusTcpMaster.CreateIp(client) 創(chuàng)建一個(gè) Modbus 客戶端,支持讀寫數(shù)據(jù)。
讀取保持寄存器:通過 ReadHoldingRegisters 方法從設(shè)備讀取指定地址的多個(gè)寄存器的值。
關(guān)閉連接:通信完成后,關(guān)閉與設(shè)備的連接。
常用 Modbus 操作:
讀取寄存器:ReadHoldingRegisters()、ReadInputRegisters()。
寫入寄存器:WriteSingleRegister()、WriteMultipleRegisters()。
到此這篇關(guān)于C# 使用NModbus的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# 使用NModbus內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#手動(dòng)操作DataGridView使用各種數(shù)據(jù)源填充表格實(shí)例
本文主要介紹了C#手動(dòng)操作DataGridView使用各種數(shù)據(jù)源填充表格實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
C#對(duì)文件進(jìn)行批量重命名或者對(duì)某單個(gè)文件進(jìn)行改名的示例代碼
這篇文章主要介紹了C#對(duì)文件進(jìn)行批量重命名或者對(duì)某個(gè)單獨(dú)的文件進(jìn)行改名的實(shí)現(xiàn)方法,文中有相關(guān)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-05-05
Unity創(chuàng)建平鋪網(wǎng)格地圖的方法
這篇文章主要為大家詳細(xì)介紹了Unity創(chuàng)建平鋪網(wǎng)格地圖的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

