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

C#實現(xiàn)modbus通訊的實現(xiàn)示例

 更新時間:2025年07月04日 09:09:43   作者:老農民編程  
本文主要介紹了modbus通訊的串口(RTU)、網口(TCP)通訊的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

這篇文章是modbus通訊的串口(RTU)、網口(TCP)通訊的記錄,以下都是使用NModbus4第三方庫實現(xiàn),能進行讀寫數據。

一、Modbus RTU通訊

Modbus RTU通訊是一種基于串口通訊的協(xié)議。它使用串行通信接口(如RS232、RS485等)來傳輸數據,并且是Modbus協(xié)議的一種物理層實現(xiàn)方式。

1.C#程序編寫

代碼如下:

using Modbus.Device;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1.Service
{
    //modbus串口通訊
    class RS485Service
    {
        //配置文件
        public IniFile m_ConfigFile;

        //從站地址
        byte slaveAddress = 1;

		//注:是IModbusMaster類型,不是IModbusSerialMaster類型
        public IModbusMaster master;
        public SerialPort serialPort = null;

        public RS485Service()
        {
        	
        }

        public void Connect()
        {
            if (serialPort == null)
            {
                try
                {
                    // 配置串口連接
        			string portName = "COM1";  // 串口名稱
        			int baudRate = 9600;       // 波特率
        			Parity parity = Parity.None;  // 校驗位
        			int dataBits = 8;          // 數據位
        			StopBits stopBits = StopBits.One;  // 停止位
        			
                    serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
                    //serialPort.DataReceived += SerialPort_DataReceived;
                    serialPort.Open();

                    if (serialPort.IsOpen)
                    {
                        master = ModbusSerialMaster.CreateRtu(serialPort);
                        Console.WriteLine("串口通訊連接成功!");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("串口通訊未連接!" + ex.Message);
                }
            }
        }

        #region 地址讀值

        //讀取單個線圈狀態(tài)(功能碼 0x01)
        public bool ReadCoil(ushort coilAddress)
        {
            bool[] coils = master.ReadCoils(slaveAddress, coilAddress, 1);
            return coils[0];
        }

        //讀取多個線圈狀態(tài)(功能碼 0x01)
        public bool[] ReadCoils(ushort startAddress, ushort quantity)
        {
            return master.ReadCoils(slaveAddress, startAddress, quantity);
        }

        //讀取單個保持寄存器(功能碼 0x03)
        public ushort ReadRegister(ushort registerAddress)
        {
            ushort[] registers = master.ReadHoldingRegisters(slaveAddress, registerAddress, 1);
            return registers[0];
        }

        //讀取多個保持寄存器(功能碼 0x03)
        public ushort[] ReadResgisters(ushort startAddress, ushort quantity)
        {
            return master.ReadHoldingRegisters(slaveAddress, startAddress, quantity);
        }

        #endregion

        #region 地址寫值

        //寫單個線圈(功能碼 0x05)
        //如果需要控制單個 IO 點(例如一個繼電器),可以使用 WriteSingleCoil 方法
        public void WriteCoil(ushort coilAddress, bool value)
        {
            master.WriteSingleCoil(slaveAddress, coilAddress, value);
        }

        //寫多個線圈(功能碼 0x0F)
        //如果需要同時控制多個 IO 點,可以使用 WriteMultipleCoils 方法
        public void WriteMultCoils(ushort startAddress, bool[] values)
        {
            master.WriteMultipleCoils(slaveAddress, startAddress, values);
        }

        //寫單個保持寄存器(功能碼 0x06)
        //如果需要寫入單個寄存器(例如一個數字量輸出),可以使用 WriteSingleRegister 方法
        public void WriteRegister(ushort registerAddress, ushort value)
        {
            master.WriteSingleRegister(slaveAddress, registerAddress, value);
        }

        //寫多個保持寄存器(功能碼 0x10)
        //如果需要寫入多個寄存器,可以使用 WriteMultipleRegisters 方法
        public void WriteMultRegisters(ushort startAddress, ushort[] values)
        {
            master.WriteMultipleRegisters(slaveAddress, startAddress, values);
        }

        #endregion
    }
}

二、Modbus TCP通訊

Modbus TCP是一種基于以太網的Modbus協(xié)議實現(xiàn)方式。它通過TCP/IP網絡進行數據傳輸,適用于工業(yè)自動化和設備監(jiān)控中的高速通信。

1.C#程序編寫

代碼如下:

using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace XiSi.Communications
{
    class ModbusTCPProtocol
    {
    
        #region 屬性
        
        private string _ip = "127.0.0.1";
        private int _port = 502;

        public byte slaveAddress = 1;
        public IModbusMaster _master;
        TcpClient client;

        #endregion

        public void Config(string ip, int port)
        {
            _ip = ip;
            _port = port;
        }

        /// <summary>
        /// modbus的tcp連接(網口連接)
        /// </summary>
        public void Connect()
        {
        	//連接到Modbus TCP服務器(IP地址和端口)
            client = new TcpClient();
            client.Connect(IPAddress.Parse(_ip), _port);
            //創(chuàng)建Modbus TCP主站對象
            _master = ModbusIpMaster.CreateIp(client);
        }

        public void Disconnect()
        {
            _master.Dispose();
        }

        public bool IsConnected()
        {
            return _master != null && client.Connected;
        }

        /// <summary>
        /// 讀取線圈
        /// </summary>
        public bool[] ReadCoils(ushort startAddress, ushort count)
        {
            return _master.ReadCoils(slaveAddress, startAddress, count);
        }

        /// <summary>
        /// 寫入線圈值
        /// </summary>
        public void WriteCoil(ushort startAddress, bool value)
        {
            _master.WriteSingleCoil(slaveAddress, startAddress, value);
        }

        /// <summary>
        /// 讀取寄存器
        /// </summary>
        public ushort[] ReadRegisters(ushort startAdress, ushort count)
        {
            return _master.ReadHoldingRegisters(slaveAddress, startAdress, count);
        }

        /// <summary>
        /// 寫入寄存器值
        /// </summary>
        public void WriteRegisters(ushort startAddress, ushort[] data)
        {
            _master.WriteMultipleRegisters(slaveAddress, startAddress, data);
        }
    }
}

到此這篇關于C#實現(xiàn)modbus通訊的實現(xiàn)示例的文章就介紹到這了,更多相關C# modbus通訊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望 

相關文章

  • C#使用LOCK實現(xiàn)線程同步

    C#使用LOCK實現(xiàn)線程同步

    這篇文章介紹了C#使用LOCK實現(xiàn)線程同步的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C# WebClient類用法實例

    C# WebClient類用法實例

    這篇文章主要介紹了C# WebClient類用法實例,本文講解使用WebClient下載文件、OpenWriter打開一個流使用指定的方法將數據寫入到uri以及上傳文件示例,需要的朋友可以參考下
    2015-07-07
  • WPF中不規(guī)則窗體與WindowsFormsHost控件兼容問題的解決方法

    WPF中不規(guī)則窗體與WindowsFormsHost控件兼容問題的解決方法

    這篇文章主要介紹了WPF中不規(guī)則窗體與WindowsFormsHost控件兼容問題的解決方法,對比以往的解決方案,給出了一個具有普遍性的技巧,具有一定的借鑒價值,需要的朋友可以參考下
    2014-11-11
  • 詳解C#中 Thread,Task,Async/Await,IAsyncResult的那些事兒

    詳解C#中 Thread,Task,Async/Await,IAsyncResult的那些事兒

    本文主要介紹了C#中 Thread,Task,Async/Await,IAsyncResult的相關知識。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C#使用回溯法解決背包問題實例分析

    C#使用回溯法解決背包問題實例分析

    這篇文章主要介紹了C#使用回溯法解決背包問題,實例分析了背包問題的描述及C#解決方法,需要的朋友可以參考下
    2015-04-04
  • C# StreamReader類實現(xiàn)讀取文件的方法

    C# StreamReader類實現(xiàn)讀取文件的方法

    這篇文章主要介紹了C# StreamReader類實現(xiàn)讀取文件的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • C#常用數據結構之數組Array

    C#常用數據結構之數組Array

    這篇文章介紹了C#常用數據結構之數組Array,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#使用Data?Annotations進行手動數據驗證

    C#使用Data?Annotations進行手動數據驗證

    這篇文章介紹了C#使用Data?Annotations進行手動數據驗證的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#利用XML創(chuàng)建Excel文檔的實現(xiàn)方法

    C#利用XML創(chuàng)建Excel文檔的實現(xiàn)方法

    這篇文章主要介紹了C#利用XML創(chuàng)建Excel文檔的實現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • Entity?Framework使用ObjectContext類

    Entity?Framework使用ObjectContext類

    這篇文章介紹了Entity?Framework使用ObjectContext類的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論