当前位置: 首页 > article >正文

C# 简单使用NModbus

C# 简单使用NModbus

在工业自动化和控制系统中,Modbus协议是一种广泛使用的通信协议。它是一种基于主从结构的串行通信协议,简单、可靠且易于实现。在C#中,可以使用NModbus4库来执行Modbus通信。本文将详细介绍如何使用NModbus4库在C#中执行Modbus读操作。

1.安装NModbus4库

使用Nuget包管理器安装:

在这里插入图片描述

2.创建MoModbus连接

2.1ModbusRTU通信

using System.IO.Ports;
using Modbus.Device;
using Modbus;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Remoting.Contexts;
using System.Collections;

namespace CModbusTest
{
    internal class Program
    {
        private static SerialPort serialport;
        private static ModbusSerialMaster master;
        private static ModbusIpMaster masterIp;
        private static TcpClient tcpclient;
        static void Main(string[] args)
        {
            //
            string[] ports = SerialPort.GetPortNames();
            serialport = new SerialPort(ports[0], 9600, Parity.None, 8, StopBits.One);
            serialport.Open();
            master = ModbusSerialMaster.CreateRtu(serialport);
            master.Transport.WriteTimeout = 2000;
            master.Transport.ReadTimeout = 2000;
            master.Transport.WaitToRetryMilliseconds = 500;
            master.Transport.Retries = 3;

            try
            {
                ushort[] data = master.ReadHoldingRegisters(1, 0, 2);
                List<byte> list = new List<byte>();
                foreach (var item in data)
                {
                    list.AddRange(BitConverter.GetBytes(item).Reverse());
                }
                Console.WriteLine(list.ToArray());
            }
            catch (Exception ex)
            {
                if (serialport != null || serialport.IsOpen)
                {
                    serialport.Close();
                }
                master = null;
                throw new Exception("【读取保持寄存器】失败:" + ex.Message);
            }
        }
    }
}

代码解析:
配置串口连接:使用 SerialPort 类设置串口连接,包括端口号、波特率、校验位等。
创建 Modbus RTU 客户端:通过 ModbusSerialMaster.CreateRtu() 创建 Modbus RTU 客户端。
读取寄存器:通过 ReadHoldingRegisters 方法读取指定从站地址和寄存器范围的数据。
关闭串口连接:通信完成后,关闭串口。
常见 Modbus RTU 操作:
读取数据:ReadCoils()、ReadDiscreteInputs()、ReadHoldingRegisters()、ReadInputRegisters()。
写入数据:WriteSingleCoil()、WriteSingleRegister()、WriteMultipleCoils()、WriteMultipleRegisters()。

2.2ModbusTCP通信

using System.IO.Ports;
using Modbus.Device;
using Modbus;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Remoting.Contexts;
using System.Collections;

namespace CModbusTest
{
    internal class Program
    {
        private static SerialPort serialport;
        private static ModbusSerialMaster master;
        private static ModbusIpMaster masterIp;
        private static TcpClient tcpclient;
        static void Main(string[] args)
        {
             // 1. 连接到 Modbus 服务器(Modbus TCP)
             tcpclient = new TcpClient();
             tcpclient.Connect(IPAddress.Parse("127.0.0.1"),502);

             // 2. 获取 Modbus TCP 设备的协议客户端
             masterIp = ModbusIpMaster.CreateIp(tcpclient);
             masterIp.Transport.WriteTimeout = 2000;
             masterIp.Transport.ReadTimeout = 2000;
             masterIp.Transport.WaitToRetryMilliseconds = 500;
             masterIp.Transport.Retries = 3;

             // 3. 读取从站设备的寄存器
             ushort startAddress = 0;  // 寄存器起始地址
             ushort numRegisters = 10; // 读取 10 个寄存器
             try
             {
                 // 读取保持寄存器
                 ushort[] registers = masterIp.ReadHoldingRegisters(startAddress, numRegisters);

                // 输出结果
                Console.WriteLine("读取到的寄存器值:");
                foreach (var register in registers)
                {
                   Console.WriteLine(register);
                }
             }
             catch (Exception ex)
             {
                   Console.WriteLine($"读取错误: {ex.Message}");
             }
        }
    }
}

代码解析:
连接到 Modbus 服务器:使用 TcpClient 与 Modbus 设备建立 TCP 连接。指定设备的 IP 地址和端口(默认为 502)。
创建 Modbus 客户端:通过 ModbusTcpMaster.CreateIp(client) 创建一个 Modbus 客户端,支持读写数据。
读取保持寄存器:通过 ReadHoldingRegisters 方法从设备读取指定地址的多个寄存器的值。
关闭连接:通信完成后,关闭与设备的连接。
常用 Modbus 操作:
读取寄存器:ReadHoldingRegisters()、ReadInputRegisters()。
写入寄存器:WriteSingleRegister()、WriteMultipleRegisters()。

参考文章:

1.C# 实现 Modbus 通信的简单教程(支持 TCP 和 RTU)

2.C#轻松实现Modbus通信


http://www.kler.cn/a/456225.html

相关文章:

  • 5.系统学习-PyTorch与多层感知机
  • JavaFX FXML模式下的布局
  • 尚硅谷Vue3入门到实战 —— 01 创建 VUe3工程
  • unity中Timeline动画的播放和播放中如何判断播放结束
  • springboot整合log4j2日志框架1
  • 25秋招面试总结
  • Kotlin快速入门
  • 惠州市政数局局长杨伟斌:惠州市公共数据授权运营模式探索
  • 雷池 WAF 搭配阿里云 CDN 使用教程
  • javaEE-多线程案例-单例模式
  • 深度学习:从原理到搭建基础模型
  • RabbitMQ HAProxy 负载均衡
  • 应对TensorFlow导入Keras时发生的错误问题
  • SPI实验 LED数码管
  • 用三种安全思维重新审视零信任网络
  • 云效流水线自动化部署web静态网站
  • opencl 封装简单api
  • CSDN编辑器
  • 长沙景区数据分析项目实现
  • Django实现异步视图adrf请求