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

 更新时间:2025年07月04日 09:09:43   作者:老农民编程  
本文主要介绍了modbus通讯的串口(RTU)、网口(TCP)通讯的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

这篇文章是modbus通讯的串口(RTU)、网口(TCP)通讯的记录,以下都是使用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 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#实现modbus通讯的实现示例的文章就介绍到这了,更多相关C# modbus通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望 

相关文章

  • 深入c#绘制验证码的详解

    深入c#绘制验证码的详解

    本篇文章是对用c#绘制验证码的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#对Json进行序列化和反序列化

    C#对Json进行序列化和反序列化

    这篇文章介绍了C#对Json进行序列化和反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# 添加、修改和删除PDF书签的实例代码

    C# 添加、修改和删除PDF书签的实例代码

    本篇文章主要介绍了C# 添加、修改和删除PDF书签的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • C#获取项目指定目录下文件的方法

    C#获取项目指定目录下文件的方法

    这篇文章主要介绍了C#获取项目指定目录下文件的方法,涉及C#操作目录及文件的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • c#与WMI使用技巧集

    c#与WMI使用技巧集

    c#与WMI使用技巧集...
    2007-03-03
  • 详解C# Lazy Loading(延迟加载)

    详解C# Lazy Loading(延迟加载)

    这篇文章主要介绍了C# Lazy Loading(延迟加载)的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • 详解C# 泛型中的数据类型判定与转换

    详解C# 泛型中的数据类型判定与转换

    这篇文章主要介绍了C# 泛型中的数据类型判定与转换,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 深入理解C#委托delegate的使用

    深入理解C#委托delegate的使用

    本文主要介绍了C#委托delegate的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C#校验时间格式的场景分析

    C#校验时间格式的场景分析

    本文通过场景分析给大家讲解C#里如何简单的校验时间格式,本次的场景属于比较常见的收单API,对第三方的订单进行签名验证,然后持久化到数据库,需要的朋友跟随小编一起看看吧
    2022-08-08
  • C#中Activator.CreateInstance()方法用法分析

    C#中Activator.CreateInstance()方法用法分析

    这篇文章主要介绍了C#中Activator.CreateInstance()方法用法,实例分析了C#中Activator.CreateInstance()方法的功能、定义及使用技巧,需要的朋友可以参考下
    2015-03-03

最新评论