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

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)行讀寫(xiě)數(shù)據(jù)。

一、Modbus RTU通訊

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

1.C#程序編寫(xiě)

代碼如下:

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類(lèi)型,不是IModbusSerialMaster類(lèi)型
        public IModbusMaster master;
        public SerialPort serialPort = null;

        public RS485Service()
        {
        	
        }

        public void Connect()
        {
            if (serialPort == null)
            {
                try
                {
                    // 配置串口連接
        			string portName = "COM1";  // 串口名稱(chēng)
        			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 地址寫(xiě)值

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

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

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

        //寫(xiě)多個(gè)保持寄存器(功能碼 0x10)
        //如果需要寫(xiě)入多個(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#程序編寫(xiě)

代碼如下:

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>
        /// 寫(xiě)入線圈值
        /// </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>
        /// 寫(xiě)入寄存器值
        /// </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# 使用handle.exe解決程序更新文件被占用的問(wèn)題

    c# 使用handle.exe解決程序更新文件被占用的問(wèn)題

    這篇文章主要介紹了c# 使用handle.exe解決程序更新文件被占用的問(wèn)題,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#實(shí)現(xiàn)屬于自己的QQ截圖工具

    C#實(shí)現(xiàn)屬于自己的QQ截圖工具

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)屬于自己的QQ截圖工具的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • C#實(shí)現(xiàn)圖像銳化的方法

    C#實(shí)現(xiàn)圖像銳化的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)圖像銳化的方法,涉及C#操作圖像的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • PropertyGrid自定義控件使用詳解

    PropertyGrid自定義控件使用詳解

    這篇文章主要為大家詳細(xì)介紹了PropertyGrid自定義控件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Quartz.Net使用方法詳解

    Quartz.Net使用方法詳解

    本文詳細(xì)講解了Quartz.Net的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 淺析C# 結(jié)構(gòu)體struct

    淺析C# 結(jié)構(gòu)體struct

    這篇文章主要介紹了C# 結(jié)構(gòu)體struct 的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-08-08
  • C#中的SQLCommand命令與DbTransaction事務(wù)處理

    C#中的SQLCommand命令與DbTransaction事務(wù)處理

    這篇文章介紹了C#中的SQLCommand命令與DbTransaction事務(wù)處理,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#實(shí)現(xiàn)的AES加密解密完整實(shí)例

    C#實(shí)現(xiàn)的AES加密解密完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)的AES加密解密,結(jié)合完整實(shí)例形式分析了C#實(shí)現(xiàn)的AES算法進(jìn)行加密與解密的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 基于C#實(shí)現(xiàn)語(yǔ)音識(shí)別功能詳解

    基于C#實(shí)現(xiàn)語(yǔ)音識(shí)別功能詳解

    在.NET4.0中,可以借助System.Speech組件讓電腦來(lái)識(shí)別我們的聲音。本文將利用該組件實(shí)現(xiàn)語(yǔ)音識(shí)別功能,文中實(shí)現(xiàn)過(guò)程講解詳細(xì),需要的可以參考一下
    2022-04-04
  • 解析C#中的裝箱與拆箱的詳解

    解析C#中的裝箱與拆箱的詳解

    本篇文章是對(duì)C#中的裝箱與拆箱進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

安多县| 琼结县| 资中县| 花莲市| 重庆市| 建德市| 昌吉市| 睢宁县| 灵台县| 乌拉特中旗| 维西| 缙云县| 大姚县| 桐梓县| 丰镇市| 晋宁县| 肇源县| 兴国县| 金沙县| 安宁市| 长顺县| 双柏县| 边坝县| 石渠县| 邻水| 电白县| 睢宁县| 长治县| 临洮县| 敦化市| 子长县| 新野县| 朝阳市| 师宗县| 樟树市| 诸暨市| 平罗县| 安丘市| 兴安县| 东乡| 西峡县|