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

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

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

前言

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

一、Modbus RTU通訊

Modbus RTU通訊是一種基于串口通訊的協(xié)議。它使用串行通信接口(如RS232、RS485等)來(lái)傳輸數(shù)據(jù),并且是Modbus協(xié)議的一種物理層實(shí)現(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;  // 校驗(yàn)位
        			int dataBits = 8;          // 數(shù)據(jù)位
        			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 地址讀值

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

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

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

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

        #endregion

        #region 地址寫值

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

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

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

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

        #endregion
    }
}

二、Modbus TCP通訊

Modbus TCP是一種基于以太網(wǎng)的Modbus協(xié)議實(shí)現(xiàn)方式。它通過(guò)TCP/IP網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,適用于工業(yè)自動(dòng)化和設(shè)備監(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連接(網(wǎng)口連接)
        /// </summary>
        public void Connect()
        {
        	//連接到Modbus TCP服務(wù)器(IP地址和端口)
            client = new TcpClient();
            client.Connect(IPAddress.Parse(_ip), _port);
            //創(chuàng)建Modbus TCP主站對(duì)象
            _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);
        }
    }
}

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

相關(guān)文章

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

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

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

    C# WebClient類用法實(shí)例

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

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

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

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

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

    C#使用回溯法解決背包問(wèn)題實(shí)例分析

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

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

    這篇文章主要介紹了C# StreamReader類實(shí)現(xiàn)讀取文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C#常用數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array

    C#常用數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array

    這篇文章介紹了C#常用數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#使用Data?Annotations進(jìn)行手動(dòng)數(shù)據(jù)驗(yàn)證

    C#使用Data?Annotations進(jìn)行手動(dòng)數(shù)據(jù)驗(yàn)證

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

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

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

    Entity?Framework使用ObjectContext類

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

最新評(píng)論