C# 使用NModbus的實現(xiàn)示例
在工業(yè)自動化和控制系統(tǒng)中,Modbus協(xié)議是一種廣泛使用的通信協(xié)議。它是一種基于主從結構的串行通信協(xié)議,簡單、可靠且易于實現(xiàn)。在C#中,可以使用NModbus4庫來執(zhí)行Modbus通信。本文將詳細介紹如何使用NModbus4庫在C#中執(zhí)行Modbus讀操作。
1.安裝NModbus4庫
使用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 類設置串口連接,包括端口號、波特率、校驗位等。
創(chuàng)建 Modbus RTU 客戶端:通過 ModbusSerialMaster.CreateRtu() 創(chuàng)建 Modbus RTU 客戶端。
讀取寄存器:通過 ReadHoldingRegisters 方法讀取指定從站地址和寄存器范圍的數(shù)據(jù)。
關閉串口連接:通信完成后,關閉串口。
常見 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 服務器(Modbus TCP) tcpclient = new TcpClient(); tcpclient.Connect(IPAddress.Parse("127.0.0.1"),502); // 2. 獲取 Modbus TCP 設備的協(xié)議客戶端 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)。
創(chuàng)建 Modbus 客戶端:通過 ModbusTcpMaster.CreateIp(client) 創(chuàng)建一個 Modbus 客戶端,支持讀寫數(shù)據(jù)。
讀取保持寄存器:通過 ReadHoldingRegisters 方法從設備讀取指定地址的多個寄存器的值。
關閉連接:通信完成后,關閉與設備的連接。
常用 Modbus 操作:
讀取寄存器:ReadHoldingRegisters()、ReadInputRegisters()。
寫入寄存器:WriteSingleRegister()、WriteMultipleRegisters()。
到此這篇關于C# 使用NModbus的實現(xiàn)示例的文章就介紹到這了,更多相關C# 使用NModbus內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#手動操作DataGridView使用各種數(shù)據(jù)源填充表格實例
本文主要介紹了C#手動操作DataGridView使用各種數(shù)據(jù)源填充表格實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02Unity創(chuàng)建平鋪網(wǎng)格地圖的方法
這篇文章主要為大家詳細介紹了Unity創(chuàng)建平鋪網(wǎng)格地圖的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07