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

C#實現(xiàn)Modbus通信功能的示例詳解

 更新時間:2024年11月29日 10:31:22   作者:小碼編匠  
Modbus作為一種開放且廣泛采用的通信協(xié)議,在實現(xiàn)設(shè)備間數(shù)據(jù)交換方面發(fā)揮著至關(guān)重要的作用,它不僅支持多種物理層接口(如RS-232,?RS-485,?以及以太網(wǎng)),還因其簡單易用的特點而被大家所青睞,本文通過實際示例介紹如何在C#項目中輕松實現(xiàn)Modbus通信功能

1、前言

Modbus作為一種開放且廣泛采用的通信協(xié)議,在實現(xiàn)設(shè)備間數(shù)據(jù)交換方面發(fā)揮著至關(guān)重要的作用。它不僅支持多種物理層接口(如RS-232, RS-485, 以及以太網(wǎng)),還因其簡單易用的特點而被大家所青睞。

本文通過實際示例介紹如何在C#項目中輕松實現(xiàn)Modbus通信功能。

2、開源通信庫

通信庫是對通信協(xié)議的封裝,一般是以dll動態(tài)鏈接庫的形式存在,對于編程者來說,只需要調(diào)用庫的各種方法即可實現(xiàn)數(shù)據(jù)讀寫。

通信庫有兩種,一種是開源的,即使開源,也要注意看下開源許可證,開源并不一定免費,另外一種就是自己開發(fā)封裝的,這個需要具備一定的開發(fā)能力。

Modbus通信有很多開源通信庫,這其中使用較為廣泛的是NModbus4,NModbus4是一個開源且免費的Modbus通信庫,它的開源許可證是MIT,是一個相對寬松的軟件授權(quán)條款,可以商用。

3、ModbusRTU通信

1、在項目解決方案資源管理器中,選擇【引用】右擊,在彈出的界面中,點擊【管理NuGet程序包】選項,如下圖所示:

2、在打開的選項卡中,選擇【瀏覽】,然后輸入NModbus4進行搜索,搜索到之后,選擇最新穩(wěn)定版2.1.0,點擊【安裝】即可:

3、在NModbus4基礎(chǔ)上封裝一個打開串口和關(guān)閉串口的方法:

private SerialPort serialPort;
private ModbusSerialMaster master;
public void Open(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits)
{
    if (this.serialPort != null && this.serialPort.IsOpen)
    {
        this.serialPort.Close();
    }
    this.serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
    this.serialPort.Open();
    this.master = ModbusSerialMaster.CreateRtu(this.serialPort);
    this.master.Transport.WriteTimeout = 2000;
    this.master.Transport.ReadTimeout = 2000;
    this.master.Transport.WaitToRetryMilliseconds = 500;
    this.master.Transport.Retries = 3;
}
 public void Close()
 {
     if (this.serialPort != null && this.serialPort.IsOpen)
     {
         this.serialPort.Close();
     }
     this.master = null;
 }

4、在NModbus4基礎(chǔ)上封裝各種讀寫的方法,這里以讀取保持型寄存器為例,其他方法都是類似的:

public byte[] ReadHoldingRegisters(byte slaveId, ushort start, ushort length)
{
    try
    {
        ushort[] data = this.master.ReadHoldingRegisters(slaveId, start, length);
        List<byte> result = new List<byte>();
        foreach (var item in data)
        {
            result.AddRange(BitConverter.GetBytes(item).Reverse());
        }
        return result.ToArray();
    }
    catch (Exception ex)
    {
        throw new Exception("【讀取保持寄存器】失?。? + ex.Message);
    }
}

基于NModbus4實現(xiàn)ModbusRTU通信,不需要關(guān)注協(xié)議及報文,只需要對NModbus4庫二次封裝即可。

4、ModbusTCP通信

NModbus4不僅支持ModbusRTU通信,也同樣支持ModbusTCP通信,ModbusTCP與ModbusRTU的封裝過程非常類似,主要是存在以下兩個不同點:

ModbusRTU是基于串口通信,因此主要使用的是SerialPort類,而ModbusTCP是基于以太網(wǎng)通信,主要使用的是TcpClient類。

ModbusRTU的讀取和寫入方法中都必須包含從站地址,而ModbusTCP可以把SlaveAddress作為一個可選項。

ModbusTCP通信庫封裝過程如下:

1、在NModbus4基礎(chǔ)上封裝一個TCP連接和斷開的方法:

private TcpClient tcpClient;
private ModbusIpMaster master
public void Connect(string ip, int port)
{
    tcpClient = new TcpClient();
    tcpClient.Connect(IPAddress.Parse(ip), port);
    this.master = ModbusIpMaster.CreateIp(this.tcpClient);
    this.master.Transport.WriteTimeout = 2000;
    this.master.Transport.ReadTimeout = 2000;
    this.master.Transport.WaitToRetryMilliseconds = 500;
    this.master.Transport.Retries = 3;
}
public void DisConnect()
{
     if (this.tcpClient != null && this.tcpClient.Connected)
     {
         this.tcpClient.Close();
     }
     this.master = null;
}

2、封裝一個讀取輸出線圈的方法,其他讀寫方法都是類似的:

public bool[] ReadOutputCoils(ushort start, ushort length, byte slaveAddress = 1)
{
     try
     {
         return this.master.ReadCoils(slaveAddress, start, length);
     }
     catch (Exception ex)
     {
         throw new Exception("【讀取輸出線圈】失?。? + ex.Message);
     }
}

總結(jié)

通過對本篇文章的學(xué)習(xí),我們探索了如何使用C#來實現(xiàn)Modbus協(xié)議下的數(shù)據(jù)通信。

最后

到此這篇關(guān)于C#實現(xiàn)Modbus通信功能的示例詳解的文章就介紹到這了,更多相關(guān)C#實現(xiàn)Modbus通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中string用法實例詳解

    C#中string用法實例詳解

    這篇文章主要介紹了C#中string用法,非常詳細的總結(jié)了比較常見的關(guān)于C#中string的幾個常用方法,需要的朋友可以參考下
    2014-08-08
  • C#多線程之線程池(ThreadPool)

    C#多線程之線程池(ThreadPool)

    這篇文章介紹了C#多線程之線程池(ThreadPool)的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 基于C#一個制作圖像的特寫窗口

    基于C#一個制作圖像的特寫窗口

    許多網(wǎng)站都會顯示一個特寫窗口,其中顯示放大的圖像部分,以便您可以看到更多細節(jié),本文將使用C#制作一個簡單的圖像的特寫窗口,感興趣的可以了解下
    2025-01-01
  • 深入理解.NET中的異步

    深入理解.NET中的異步

    異步編程是程序設(shè)計的重點,在實際的項目,在大量的數(shù)據(jù)入庫以及查詢數(shù)據(jù)并進行計算的時候,程序的UI界面往往卡死在那里,這時候就需要對計算時間限制的過程進行異步處理,同時正確的使用異步編程去處理計算限制的操作和耗時IO操作還能提升的應(yīng)用程序的吞吐量及性能
    2021-06-06
  • c# GridControl的模糊查詢實現(xiàn)代碼

    c# GridControl的模糊查詢實現(xiàn)代碼

    這篇文章主要介紹了c# GridControl的模糊查詢實現(xiàn)代碼,需要的朋友可以參考下
    2017-02-02
  • 對WPF中的TreeView實現(xiàn)右鍵選定

    對WPF中的TreeView實現(xiàn)右鍵選定

    這篇文章介紹了WPF實現(xiàn)右鍵選定TreeView的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • ListView用法中與滾動相關(guān)的需求實現(xiàn)

    ListView用法中與滾動相關(guān)的需求實現(xiàn)

    這篇文章主要介紹了ListView用法中與滾動相關(guān)的需求實現(xiàn),獲取并設(shè)置ListView的滾動位置,以及獲取滾動位置處的項目,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C# PDF轉(zhuǎn)圖片(JPG,Png)的項目實踐

    C# PDF轉(zhuǎn)圖片(JPG,Png)的項目實踐

    本文主要介紹了C# PDF轉(zhuǎn)圖片(JPG,Png)的項目實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C# 使用鼠標(biāo)點擊對Chart控件實現(xiàn)數(shù)據(jù)提示效果

    C# 使用鼠標(biāo)點擊對Chart控件實現(xiàn)數(shù)據(jù)提示效果

    這篇文章主要介紹了C# 使用鼠標(biāo)點擊對Chart控件實現(xiàn)數(shù)據(jù)提示效果,文章給予上一篇的詳細內(nèi)容做延伸介紹,需要的小伙伴可任意參考一下
    2022-08-08
  • C#8.0中的索引與范圍功能介紹

    C#8.0中的索引與范圍功能介紹

    這篇文章介紹了C#8.0中的索引與范圍功能,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評論