最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1、前言

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

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

2、開(kāi)源通信庫(kù)

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

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

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

3、ModbusRTU通信

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

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

3、在NModbus4基礎(chǔ)上封裝一個(gè)打開(kāi)串口和關(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ǔ)上封裝各種讀寫(xiě)的方法,這里以讀取保持型寄存器為例,其他方法都是類似的:

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實(shí)現(xiàn)ModbusRTU通信,不需要關(guān)注協(xié)議及報(bào)文,只需要對(duì)NModbus4庫(kù)二次封裝即可。

4、ModbusTCP通信

NModbus4不僅支持ModbusRTU通信,也同樣支持ModbusTCP通信,ModbusTCP與ModbusRTU的封裝過(guò)程非常類似,主要是存在以下兩個(gè)不同點(diǎn):

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

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

ModbusTCP通信庫(kù)封裝過(guò)程如下:

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

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、封裝一個(gè)讀取輸出線圈的方法,其他讀寫(xiě)方法都是類似的:

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é)

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

最后

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

相關(guān)文章

  • C#遞歸算法之歸并排序

    C#遞歸算法之歸并排序

    這篇文章主要介紹了C#遞歸算法中的歸并排序,需要的朋友可以參考下。
    2016-06-06
  • C#讀寫(xiě)INI文件的最簡(jiǎn)方法

    C#讀寫(xiě)INI文件的最簡(jiǎn)方法

    INI文件,全稱為Initialization File(初始化文件),是一種傳統(tǒng)的文本型配置文件格式,廣泛應(yīng)用于Windows操作系統(tǒng)及早期應(yīng)用程序中,本文將聚焦于C#語(yǔ)言環(huán)境下,介紹如何以最簡(jiǎn)化的方式實(shí)現(xiàn)INI文件的讀寫(xiě)操,需要的朋友可以參考下
    2025-01-01
  • c# 如何對(duì)網(wǎng)絡(luò)信息進(jìn)行相關(guān)設(shè)置(ip,dns,網(wǎng)關(guān)等)

    c# 如何對(duì)網(wǎng)絡(luò)信息進(jìn)行相關(guān)設(shè)置(ip,dns,網(wǎng)關(guān)等)

    這篇文章主要介紹了c# 網(wǎng)絡(luò)適配器的相關(guān)操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • WinForm調(diào)用jar包的方法分析

    WinForm調(diào)用jar包的方法分析

    這篇文章主要介紹了WinForm調(diào)用jar包的方法,結(jié)合實(shí)例形式分析了WinForm調(diào)用jar包的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • C#實(shí)現(xiàn)關(guān)閉其他程序窗口或進(jìn)程代碼分享

    C#實(shí)現(xiàn)關(guān)閉其他程序窗口或進(jìn)程代碼分享

    這篇文章主要介紹了C#實(shí)現(xiàn)關(guān)閉其他程序窗口或進(jìn)程代碼分享,本文給出了兩種方法,并分別給出示例代碼,需要的朋友可以參考下
    2015-06-06
  • C#觀察者模式(Observer Pattern)實(shí)例教程

    C#觀察者模式(Observer Pattern)實(shí)例教程

    這篇文章主要介紹了C#觀察者模式(Observer Pattern),主要以一個(gè)實(shí)例的形式講述了C#觀察者模式的實(shí)現(xiàn)過(guò)程,詳細(xì)講述了接口的定義、通知及動(dòng)作的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-09-09
  • c#將不同類型的數(shù)據(jù)存儲(chǔ)到一起的實(shí)現(xiàn)

    c#將不同類型的數(shù)據(jù)存儲(chǔ)到一起的實(shí)現(xiàn)

    在C#中存儲(chǔ)不同類型的數(shù)據(jù)有多種方式,本文主要介紹了c#將不同類型的數(shù)據(jù)存儲(chǔ)到一起的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-07-07
  • C#使用CSRedisCore的實(shí)現(xiàn)示例

    C#使用CSRedisCore的實(shí)現(xiàn)示例

    CSRedisCore是高效的.NET Redis客戶端,支持單節(jié)點(diǎn)、哨兵和集群模式,本文詳細(xì)介紹了其安裝配置方法和基礎(chǔ)操作,感興趣的可以了解一下
    2025-11-11
  • C#中的線程Threads與任務(wù)Tasks詳解(最新整理)

    C#中的線程Threads與任務(wù)Tasks詳解(最新整理)

    C#開(kāi)發(fā)中推薦使用Task而非Thread,由于Task更高效,提供更簡(jiǎn)單的接口,并且由.NET運(yùn)行時(shí)管理線程,減少開(kāi)發(fā)者負(fù)擔(dān),Task適合異步操作和返回值處理,而Thread則適用于需要低級(jí)控制和實(shí)時(shí)系統(tǒng),這篇文章介紹C#中的線程Threads與任務(wù)Tasks,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • C#分屏控件用法實(shí)例

    C#分屏控件用法實(shí)例

    這篇文章主要介紹了C#分屏控件用法實(shí)例,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

武汉市| 五大连池市| 会东县| 清原| 安国市| 军事| 宜宾市| 邹平县| 隆昌县| 通山县| 乌兰浩特市| 托克托县| 黄大仙区| 田林县| 台中县| 花垣县| 大丰市| 娄底市| 姚安县| 慈利县| 英山县| 竹北市| 壶关县| 射阳县| 广丰县| 织金县| 京山县| 平昌县| 巴青县| 手机| 葫芦岛市| 济南市| 上思县| 夏津县| 洛浦县| 金塔县| 河东区| 河津市| 中山市| 安国市| 襄樊市|