亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實(shí)現(xiàn)Modbus通信的詳細(xì)教程(支持TCP和RTU)

 更新時(shí)間:2025年01月20日 10:03:41   作者:威哥說(shuō)編程  
Modbus 協(xié)議是一種廣泛應(yīng)用于工業(yè)自動(dòng)化中的通信協(xié)議,用于在設(shè)備之間進(jìn)行數(shù)據(jù)交換,它基于主/從架構(gòu),并支持多種傳輸方式,如 Modbus TCP 和 Modbus RTU,在本文中,我們將使用 C# 編程語(yǔ)言和開源庫(kù) NModbus,展示如何輕松實(shí)現(xiàn) Modbus 通信,需要的朋友可以參考下

引言

Modbus 協(xié)議是一種廣泛應(yīng)用于工業(yè)自動(dòng)化中的通信協(xié)議,用于在設(shè)備之間進(jìn)行數(shù)據(jù)交換。它基于主/從架構(gòu),并支持多種傳輸方式,如 Modbus TCP 和 Modbus RTU。由于其簡(jiǎn)潔、可靠和開放性,Modbus 被廣泛應(yīng)用于 SCADA 系統(tǒng)、PLC(可編程邏輯控制器)、傳感器以及其他嵌入式系統(tǒng)。

在本文中,我們將使用 C# 編程語(yǔ)言和開源庫(kù) NModbus,展示如何輕松實(shí)現(xiàn) Modbus 通信,支持 Modbus TCP 和 Modbus RTU 兩種通信方式。

1. 準(zhǔn)備工作

在開始編寫代碼之前,你需要做一些準(zhǔn)備工作:

  • NModbus 庫(kù):NModbus 是一個(gè)用 C# 實(shí)現(xiàn)的開源 Modbus 協(xié)議庫(kù),支持 Modbus RTU 和 Modbus TCP。我們將利用這個(gè)庫(kù)來(lái)簡(jiǎn)化 Modbus 協(xié)議的實(shí)現(xiàn)。
  • 安裝 NModbus 庫(kù):你可以通過(guò) NuGet 包管理器或者 .NET CLI 安裝 NModbus。

打開 Visual Studio 中的 NuGet 包管理器控制臺(tái),運(yùn)行以下命令來(lái)安裝 NModbus:

Install-Package NModbus

或者,使用 .NET CLI:

dotnet add package NModbus

2. Modbus TCP 客戶端實(shí)現(xiàn)

Modbus TCP 是基于以太網(wǎng)的協(xié)議,通信速度較快,適用于大多數(shù)現(xiàn)代設(shè)備。如果你有一個(gè)支持 Modbus TCP 協(xié)議的設(shè)備或服務(wù)器,以下是如何在 C# 中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 Modbus TCP 客戶端。

代碼示例:Modbus TCP 客戶端

using System;
using System.Net.Sockets;
using Modbus.Device;  // 引入 NModbus 庫(kù)
 
class Program
{
    static void Main(string[] args)
    {
        // 1. 連接到 Modbus 服務(wù)器(Modbus TCP)
        string ipAddress = "192.168.0.100"; // 設(shè)備的 IP 地址
        int port = 502; // Modbus TCP 默認(rèn)端口
        var client = new TcpClient(ipAddress, port);
 
        // 2. 獲取 Modbus TCP 設(shè)備的協(xié)議客戶端
        var modbusTcpMaster = ModbusTcpMaster.CreateIp(client);
 
        // 3. 讀取從站設(shè)備的寄存器
        ushort startAddress = 0;  // 寄存器起始地址
        ushort numRegisters = 10; // 讀取 10 個(gè)寄存器
 
        try
        {
            // 讀取保持寄存器
            ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
            
            // 輸出結(jié)果
            Console.WriteLine("讀取到的寄存器值:");
            foreach (var register in registers)
            {
                Console.WriteLine(register);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"讀取錯(cuò)誤: {ex.Message}");
        }
 
        // 4. 關(guān)閉連接
        client.Close();
    }
}

代碼解析:

  1. 連接到 Modbus 服務(wù)器:使用 TcpClient 與 Modbus 設(shè)備建立 TCP 連接。指定設(shè)備的 IP 地址和端口(默認(rèn)為 502)。
  2. 創(chuàng)建 Modbus 客戶端:通過(guò) ModbusTcpMaster.CreateIp(client) 創(chuàng)建一個(gè) Modbus 客戶端,支持讀寫數(shù)據(jù)。
  3. 讀取保持寄存器:通過(guò) ReadHoldingRegisters 方法從設(shè)備讀取指定地址的多個(gè)寄存器的值。
  4. 關(guān)閉連接:通信完成后,關(guān)閉與設(shè)備的連接。

常用 Modbus 操作:

  • 讀取寄存器ReadHoldingRegisters()、ReadInputRegisters()。
  • 寫入寄存器WriteSingleRegister()、WriteMultipleRegisters()

3. Modbus RTU 客戶端實(shí)現(xiàn)

Modbus RTU(Remote Terminal Unit)是基于串口通信的協(xié)議,常用于嵌入式設(shè)備和遠(yuǎn)程設(shè)備的通信。Modbus RTU 適用于較為簡(jiǎn)單的設(shè)備,尤其是需要通過(guò)串口(如 RS232 或 RS485)通信的情況。

代碼示例:Modbus RTU 客戶端

using System;
using System.IO.Ports;
using Modbus.Device;  // 引入 NModbus 庫(kù)
 
class Program
{
    static void Main(string[] args)
    {
        // 1. 通過(guò)串口連接到 Modbus 設(shè)備
        string portName = "COM1";  // 串口名稱
        int baudRate = 9600;       // 波特率
        int parity = 0;            // 校驗(yàn)位,0: 無(wú)校驗(yàn),1: 偶校驗(yàn),2: 奇校驗(yàn)
        int dataBits = 8;          // 數(shù)據(jù)位
        int stopBits = 1;          // 停止位
 
        var serialPort = new SerialPort(portName, baudRate, (Parity)parity, dataBits, (StopBits)stopBits);
        serialPort.Open();
 
        // 2. 創(chuàng)建 Modbus RTU 主機(jī)對(duì)象
        var modbusRtuMaster = ModbusSerialMaster.CreateRtu(serialPort);
 
        // 3. 讀取從站設(shè)備的寄存器
        ushort startAddress = 0;   // 寄存器起始地址
        ushort numRegisters = 10;  // 讀取 10 個(gè)寄存器
 
        try
        {
            // 讀取保持寄存器(從站地址為 1)
            ushort[] registers = modbusRtuMaster.ReadHoldingRegisters(1, startAddress, numRegisters);
 
            // 輸出結(jié)果
            Console.WriteLine("讀取到的寄存器值:");
            foreach (var register in registers)
            {
                Console.WriteLine(register);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"讀取錯(cuò)誤: {ex.Message}");
        }
 
        // 4. 關(guān)閉串口連接
        serialPort.Close();
    }
}

代碼解析:

  1. 配置串口連接:使用 SerialPort 類設(shè)置串口連接,包括端口號(hào)、波特率、校驗(yàn)位等。
  2. 創(chuàng)建 Modbus RTU 客戶端:通過(guò) ModbusSerialMaster.CreateRtu() 創(chuàng)建 Modbus RTU 客戶端。
  3. 讀取寄存器:通過(guò) ReadHoldingRegisters 方法讀取指定從站地址和寄存器范圍的數(shù)據(jù)。
  4. 關(guān)閉串口連接:通信完成后,關(guān)閉串口。

常見 Modbus RTU 操作:

  • 讀取數(shù)據(jù)ReadCoils()、ReadDiscreteInputs()ReadHoldingRegisters()、ReadInputRegisters()。
  • 寫入數(shù)據(jù)WriteSingleCoil()、WriteSingleRegister()、WriteMultipleCoils()、WriteMultipleRegisters()。

4. 錯(cuò)誤處理和調(diào)試

在實(shí)際使用 Modbus 協(xié)議進(jìn)行通信時(shí),錯(cuò)誤處理和調(diào)試至關(guān)重要。常見的錯(cuò)誤包括連接超時(shí)、通信中斷、數(shù)據(jù)格式錯(cuò)誤等。

錯(cuò)誤處理示例:

try
{
    // 讀取寄存器
    ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
}
catch (SocketException ex)
{
    Console.WriteLine($"網(wǎng)絡(luò)錯(cuò)誤:{ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine($"I/O 錯(cuò)誤:{ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"未知錯(cuò)誤:{ex.Message}");
}

通過(guò)捕獲不同類型的異常,你可以更精確地定位問(wèn)題所在,便于調(diào)試和修復(fù)。

5. 小結(jié)

在 C# 中實(shí)現(xiàn) Modbus 通信非常簡(jiǎn)單,通過(guò)使用 NModbus 庫(kù),我們能夠輕松地構(gòu)建 Modbus TCP 和 Modbus RTU 客戶端。無(wú)論是與工業(yè)設(shè)備、傳感器,還是 PLC 通信,Modbus 都是一個(gè)可靠且高效的選擇。

本教程展示了如何在 C# 中使用 NModbus 庫(kù)實(shí)現(xiàn) Modbus TCP 和 Modbus RTU 通信。通過(guò)這些示例,你可以快速入門并根據(jù)自己的需求進(jìn)一步擴(kuò)展和優(yōu)化代碼。希望本教程能幫助你實(shí)現(xiàn)與各種 Modbus 設(shè)備的高效通信。

以上就是C#實(shí)現(xiàn)Modbus通信的詳細(xì)教程(支持TCP和RTU)的詳細(xì)內(nèi)容,更多關(guān)于C# Modbus通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#如何實(shí)現(xiàn)圖片的剪裁并保存

    C#如何實(shí)現(xiàn)圖片的剪裁并保存

    基于c#實(shí)現(xiàn)圖片的裁剪并保存功能,實(shí)現(xiàn)方法非常簡(jiǎn)單的,前端采用的cropper插件,但是在本文中沒(méi)有給大家多介紹,需要的朋友可以到腳本之家去查找這個(gè)插件。好了,如果大家對(duì)c#實(shí)現(xiàn)圖片裁剪并保存功能感興趣的朋友一起看看吧
    2016-11-11
  • C# LINQ查詢表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法

    C# LINQ查詢表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法

    這篇文章主要介紹了C# LINQ查詢表達(dá)式及對(duì)應(yīng)LAMBDA表達(dá)式的用法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • 如何用C#實(shí)現(xiàn)壓縮文件

    如何用C#實(shí)現(xiàn)壓縮文件

    話說(shuō)當(dāng)今壓縮市場(chǎng)三足鼎立,能叫上名號(hào)的有zip、rar、7z。其中zip是壓縮界的鼻祖,在各大平臺(tái)上的流行度最廣,rar是商業(yè)軟件,壓縮率和效率都是很高的。7z是開源的,屬于后起之秀。這篇文章介紹了如何使用ICSharpCode組件,在windows平臺(tái)下zip的壓縮與解壓的方法
    2021-06-06
  • Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果

    Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果

    這篇文章主要介紹了Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • C#創(chuàng)建IIS虛擬目錄的方法

    C#創(chuàng)建IIS虛擬目錄的方法

    這篇文章主要介紹了C#創(chuàng)建IIS虛擬目錄的方法,實(shí)例分析了C#在IIS服務(wù)器上創(chuàng)建虛擬目錄的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 在C#中如何使用Dapper詳解(譯)

    在C#中如何使用Dapper詳解(譯)

    這篇文章主要給大家介紹了關(guān)于在C#中如何使用Dapper的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧
    2018-09-09
  • C#使用List類實(shí)現(xiàn)動(dòng)態(tài)變長(zhǎng)數(shù)組的方法

    C#使用List類實(shí)現(xiàn)動(dòng)態(tài)變長(zhǎng)數(shù)組的方法

    這篇文章主要介紹了C#使用List類實(shí)現(xiàn)動(dòng)態(tài)變長(zhǎng)數(shù)組的方法,涉及C#中List類的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于C#反射 你需要知道的

    關(guān)于C#反射 你需要知道的

    這篇文章主要介紹了C#反射的相關(guān)知識(shí),文中講解的非常詳細(xì),代碼幫助大家更好的參考學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# Record構(gòu)造函數(shù)的行為更改詳解

    C# Record構(gòu)造函數(shù)的行為更改詳解

    C# 9 中的record類型是僅具有只讀屬性的輕量級(jí)、不可變數(shù)據(jù)類型(或輕量級(jí)類),下面這篇文章主要給大家介紹了關(guān)于C# Record構(gòu)造函數(shù)的行為更改的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C# 操作 access 數(shù)據(jù)庫(kù)的實(shí)例代碼

    C# 操作 access 數(shù)據(jù)庫(kù)的實(shí)例代碼

    這篇文章主要介紹了C# 操作 access 數(shù)據(jù)庫(kù)的實(shí)例代碼,需要的朋友可以參考下
    2018-03-03

最新評(píng)論