开发者

C#实现modbus通讯的实现示例

目录
  • 前言
  • 一、Modbus RTU通讯
    • 1.C#程序编写
  • 二、Modbus TCP通讯
    • 1.C#程序编写

前言

这篇文章是modbus通讯的串口(RTU)、网口(TC编程P)通讯的记录,以下都是使用NModbus4第三方库实现,能进行读写数据。

一、Modbus RTU通讯

Modbus RTU通讯是一种基于串口通讯的协议。它使用串行通信接口(如RS232、RS485等)来传输数据,并且是Modbus协议的一种物理层实现方式。

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 地址读值

        //读取单个线圈状态(功能码 0x01)
        public bool ReadCoil(ushort coilAddress)
        {
            bool[] coils = master.ReadCoils(slaveAddress, coilAddress, 1);
            return coils[0];
        }

        //读取多个线圈状态(功能码 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协议实现方式。它通过TCP/IP网络进行数据传输,适用于工业自动化和设备监控中的高速通信。

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);
            //创建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 stjavascriptartAddress, ushort count)
        {
            return _master.ReadCoils(slaveAddress, startAddress, count);
      php  }

        /python// <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#实现modbus通讯的实现示例的文章就介绍到这了,更多相关C# modbus通讯内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望 

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜