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

基于C#實現(xiàn)Modbus RTU通信

 更新時間:2026年03月12日 09:29:10   作者:yongui47834  
本文主要介紹了使用C#和Modbus RTU模式與下位機進行通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、環(huán)境配置與依賴安裝

# NuGet包安裝(支持.NET Framework 4.5+)
Install-Package NModbus4
Install-Package System.IO.Ports

二、核心代碼實現(xiàn)

1. 串口初始化與連接

using System.IO.Ports;
using Modbus.Device;

public class ModbusRtuMaster
{
    private SerialPort _serialPort;
    private IModbusSerialMaster _master;

    public void Connect(string portName, int baudRate = 9600, Parity parity = Parity.None, 
                       int dataBits = 8, StopBits stopBits = StopBits.One)
    {
        try
        {
            _serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits)
            {
                ReadTimeout = 3000,
                WriteTimeout = 3000
            };
            
            _serialPort.Open();
            _master = ModbusSerialMaster.CreateRtu(_serialPort);
            _master.Transport.Retries = 3; // 設置重試次數(shù)
            _master.Transport.WriteTimeout = 2000;
            _master.Transport.ReadTimeout = 2000;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"連接失敗: {ex.Message}");
            throw;
        }
    }

    public void Disconnect()
    {
        _master?.Close();
        _serialPort?.Close();
    }
}

2. 數(shù)據(jù)讀取操作

public ushort[] ReadHoldingRegisters(byte slaveId, ushort startAddr, ushort count)
{
    try
    {
        return _master.ReadHoldingRegisters(slaveId, startAddr, count);
    }
    catch (ModbusException ex)
    {
        Console.WriteLine($"Modbus錯誤: {ex.ErrorCode}");
        return null;
    }
    catch (IOException ex)
    {
        Console.WriteLine($"通信異常: {ex.Message}");
        return null;
    }
}

// 示例調(diào)用
var data = master.ReadHoldingRegisters(1, 0, 10); // 從站1讀取保持寄存器0-9

3. 數(shù)據(jù)寫入操作

public void WriteSingleRegister(byte slaveId, ushort address, ushort value)
{
    _master.WriteSingleRegister(slaveId, address, value);
}

public void WriteMultipleCoils(byte slaveId, ushort startAddr, bool[] values)
{
    _master.WriteMultipleCoils(slaveId, startAddr, values);
}

三、關鍵功能實現(xiàn)

1. CRC16校驗(Modbus標準)

public static class Crc16
{
    public static byte[] Compute(byte[] data)
    {
        ushort crc = 0xFFFF;
        foreach (byte b in data)
        {
            crc ^= (ushort)b;
            for (int i = 0; i < 8; i++)
            {
                if ((crc & 0x0001) != 0)
                {
                    crc >>= 1;
                    crc ^= 0xA001;
                }
                else
                {
                    crc >>= 1;
                }
            }
        }
        return new[] { (byte)crc, (byte)(crc >> 8) };
    }

    public static bool Validate(byte[] dataWithCrc)
    {
        if (dataWithCrc.Length < 2) return false;
        byte[] data = dataWithCrc.Take(dataWithCrc.Length - 2).ToArray();
        byte[] crc = Compute(data);
        return crc[0] == dataWithCrc[dataWithCrc.Length - 2] 
            && crc[1] == dataWithCrc[dataWithCrc.Length - 1];
    }
}

2. 幀間延遲計算

private int CalculateInterFrameDelay()
{
    int charBits = 1 + _serialPort.DataBits + 
                  (_serialPort.StopBits == StopBits.One ? 1 : 2) + 
                  (_serialPort.Parity == Parity.None ? 0 : 1);
    return (int)(3500.0 * charBits / _serialPort.BaudRate); // 3.5字符時間
}

四、錯誤處理與調(diào)試

1. 異常處理策略

try
{
    var data = ReadHoldingRegisters(1, 0, 10);
    if (data == null) throw new InvalidOperationException("讀取失敗");
}
catch (TimeoutException)
{
    Console.WriteLine("通信超時,請檢查設備狀態(tài)");
    Reconnect();
}
catch (InvalidOperationException ex)
{
    Console.WriteLine($"操作失敗: {ex.Message}");
}

2. 自動重連機制

private void Reconnect()
{
    Disconnect();
    Thread.Sleep(1000);
    Connect(_config.PortName, _config.BaudRate);
}

五、性能優(yōu)化

1批量操作優(yōu)化

// 批量讀取多個寄存器區(qū)域
public Dictionary<ushort, ushort[]> BatchRead(
    params (byte SlaveId, ushort StartAddr, ushort Count)[] requests)
{
    var results = new Dictionary<ushort, ushort[]>();
    Parallel.ForEach(requests, request => 
    {
        var data = ReadHoldingRegisters(request.SlaveId, request.StartAddr, request.Count);
        lock (results) results[request.SlaveId] = data;
    });
    return results;
}

2異步通信實現(xiàn)

public async Task<ushort[]> ReadAsync(byte slaveId, ushort startAddr, ushort count)
{
    return await Task.Run(() => ReadHoldingRegisters(slaveId, startAddr, count));
}

參考代碼 C#利用modbus rtu模式與下位機通訊 www.youwenfan.com/contentcsr/112701.html

六、完整項目結構

ModbusRTUDemo/
├── src/
│   ├── ModbusMaster/          // 主站核心邏輯
│   ├── SerialPortConfig.cs    // 串口配置管理
│   └── ProtocolHandler.cs     // 協(xié)議解析器
├── tests/
│   ├── ModbusTests.cs         // 單元測試
│   └── StressTests.cs         // 壓力測試
└── docs/
    └── 開發(fā)指南.md

七、調(diào)試與測試工具

  1. 虛擬串口工具

    使用VSPD創(chuàng)建虛擬串口對(如COM3<->COM4),方便調(diào)試

  2. Wireshark抓包分析

    過濾Modbus RTU協(xié)議,觀察完整的請求/響應幀結構

  3. Modbus從站模擬

    使用Modbus Slave工具創(chuàng)建測試從站設備

八、擴展應用場景

1.多從站管理

public class ModbusNetwork
{
    private Dictionary<byte, ModbusRtuMaster> _slaves = new();
    
    public void AddSlave(byte address, string portName)
    {
        var master = new ModbusRtuMaster();
        master.Connect(portName);
        _slaves[address] = master;
    }
}

2.數(shù)據(jù)緩存機制

public class DataCache
{
    private Dictionary<ushort, (DateTime Timestamp, ushort Value)[]> _cache = new();
    
    public void UpdateCache(ushort[] data, ushort startAddr)
    {
        _cache[startAddr] = data.Select((v, i) => 
            (DateTime.Now, v)).ToArray();
    }
}

九、最佳實踐建議

參數(shù)配置規(guī)范

  • 波特率:9600/19200/115200(根據(jù)設備手冊選擇)
  • 數(shù)據(jù)格式:8N1(默認配置)
  • 超時時間:讀操作1000ms,寫操作500ms

安全防護措施

  • 添加設備認證機制
  • 實現(xiàn)數(shù)據(jù)加密傳輸
  • 設置訪問權限控制

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

相關文章

  • C# WinForm實現(xiàn)自動更新程序之客戶端的示例代碼

    C# WinForm實現(xiàn)自動更新程序之客戶端的示例代碼

    這篇文章主要為大家詳細介紹了利用C# WinForm實現(xiàn)自動更新程序之客戶端的實現(xiàn)方法,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下
    2022-10-10
  • 基于WPF實現(xiàn)簡單的值轉換器

    基于WPF實現(xiàn)簡單的值轉換器

    值轉換器是?WPF?項目中具有特色的組成部分,這篇文章將帶大家實現(xiàn)一個標準的值轉換器,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2025-02-02
  • C#實現(xiàn)窗口之間的傳值

    C#實現(xiàn)窗口之間的傳值

    本文給大家介紹的是C#中利用靜態(tài)類和靜態(tài)變量來實現(xiàn)窗口間傳值的方法和示例,非常的實用,有需要的小伙伴可以參考下。
    2015-06-06
  • C#?CefSharp?根據(jù)輸入日期段自動選擇日期的操作代碼

    C#?CefSharp?根據(jù)輸入日期段自動選擇日期的操作代碼

    這篇文章主要介紹了C#?CefSharp?根據(jù)輸入日期段自動選擇日期的操作代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • c#使用熱鍵實現(xiàn)程序窗口隱藏示例

    c#使用熱鍵實現(xiàn)程序窗口隱藏示例

    下面我們將演示如何通過熱鍵隱藏窗口,會用到DllImports of Win32 API、CallBacks/Delegates,定制事件與事件的句柄,大家參考使用吧友
    2014-01-01
  • 基于C#實現(xiàn)文檔打印功能

    基于C#實現(xiàn)文檔打印功能

    在軟件開發(fā)過程中,文檔打印是一個常見的功能需求,本文將詳細介紹如何在C#中實現(xiàn)文檔打印,并通過代碼示例介紹的非常詳細,對大家的學習或工作有一定幫助,需要的朋友可以參考下
    2024-10-10
  • WinForm跨線程訪問UI及UI卡死的解決方案

    WinForm跨線程訪問UI及UI卡死的解決方案

    在WinForm開發(fā)過程中,跨線程訪問UI控件和界面卡死是常見的技術難題,由于Windows窗體應用程序的UI控件默認只能在主線程(UI線程)上操作,直接在其他線程中修改UI會導致異常,本文通過實際測試案例,總結了Invoke和BeginInvoke在不同場景下的使用方法及注意事項
    2025-07-07
  • c# 獲得局域網(wǎng)主機列表實例

    c# 獲得局域網(wǎng)主機列表實例

    c# 獲得局域網(wǎng)主機列表實例...
    2007-03-03
  • C#使用foreach語句搜索數(shù)組元素的方法

    C#使用foreach語句搜索數(shù)組元素的方法

    這篇文章主要介紹了C#使用foreach語句搜索數(shù)組元素的方法,涉及C#使用foreach語句遍歷數(shù)組實現(xiàn)搜索功能的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制

    C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制

    這篇文章主要介紹了C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論

滨海县| 丰镇市| 达日县| 隆子县| 新化县| 桐梓县| 隆安县| 阆中市| 桓仁| 乐陵市| 东安县| 武夷山市| 加查县| 观塘区| 乌海市| 房产| 财经| 子洲县| 旬阳县| 长武县| 布拖县| 石狮市| 海伦市| 开远市| 彰化市| 长顺县| 青铜峡市| 秀山| 盐源县| 南和县| 淳化县| 巴彦县| 广宁县| 女性| 南部县| 鄂温| 溧阳市| 新兴县| 林芝县| 江城| 页游|