亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

一、Modbus RTU通訊

Modbus RTU通訊是一種基于串口通訊的協(xié)議。它使用串行通信接口(如RS232、RS485等)來傳輸數(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)方式。它通過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主站對象
            _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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望 

相關(guān)文章

最新評論