C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# 使用NModbus

C# 使用NModbus的实现示例

作者:追烽少年x

本文主要介绍了在C#中使用NModbus4库进行Modbus通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在工业自动化和控制系统中,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()。

到此这篇关于C# 使用NModbus的实现示例的文章就介绍到这了,更多相关C# 使用NModbus内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文