欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 使用NModbus的實現(xiàn)示例

 更新時間:2025年01月13日 11:55:03   作者:追烽少年x  
本文主要介紹了在C#中使用NModbus4庫進行Modbus通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在工業(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ù)源填充表格實例

    本文主要介紹了C#手動操作DataGridView使用各種數(shù)據(jù)源填充表格實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C#對文件進行批量重命名或者對某單個文件進行改名的示例代碼

    C#對文件進行批量重命名或者對某單個文件進行改名的示例代碼

    這篇文章主要介紹了C#對文件進行批量重命名或者對某個單獨的文件進行改名的實現(xiàn)方法,文中有相關的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2024-05-05
  • C# 操作Excel代碼總結

    C# 操作Excel代碼總結

    這篇文章主要介紹了C# 操作Excel代碼總結,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • C#中迭代器和分部類的使用

    C#中迭代器和分部類的使用

    迭代器和分部類是C#語言的兩種重要特性,本文主要介紹了C#中迭代器和分部類的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • C#快速配置NLog日志的教程詳解

    C#快速配置NLog日志的教程詳解

    這篇文章主要為大家詳細介紹了C#快速配置NLog日志的教程相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2024-02-02
  • Unity創(chuàng)建平鋪網(wǎng)格地圖的方法

    Unity創(chuàng)建平鋪網(wǎng)格地圖的方法

    這篇文章主要為大家詳細介紹了Unity創(chuàng)建平鋪網(wǎng)格地圖的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C#多線程系列之線程等待

    C#多線程系列之線程等待

    本文詳細講解了C#多線程中的線程等待,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • c# WPF中CheckBox樣式的使用總結

    c# WPF中CheckBox樣式的使用總結

    這篇文章主要介紹了c# WPF中CheckBox樣式的使用總結,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • Unity實現(xiàn)枚舉類型中文顯示

    Unity實現(xiàn)枚舉類型中文顯示

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)枚舉類型中文顯示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C#中載入界面的常用方法

    C#中載入界面的常用方法

    這篇文章主要介紹了C#中載入界面的常用方法,涉及窗體的操作,非常具有實用價值,需要的朋友可以參考下
    2014-10-10

最新評論