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通信

参考资源链接:[C#实现Modbus TCP通讯协议客户端](https://wenku.csdn.net/doc/iqmc4jaufo?utm_source=wenku_answer2doc_content) 在面对工业自动化控制项目时,了解如何通过C#实现Modbus TCP客户端以进行数据交换是一个常见需求。本篇技术指南将深入探讨如何使用NModbus库,这是一个广泛应用于.NET平台的Modbus协议实现库。通过它,你可以在C#中高效地创建Modbus TCP客户端,实现与设备的连接和数据读写操作。 首先,需要明确Modbus TCP客户端的基本构成。客户端需要建立TCP连接到Modbus服务器,随后通过发送包含功能码的请求来读取或写入设备的寄存器。使用NModbus库时,你可以通过创建一个继承自`TcpClient`的类来实现这一过程。这个类将负责建立连接、发送Modbus TCP消息、接收响应以及处理异常情况。 接下来,以一个简单的示例来说明如何使用NModbus库。首先,你需要引入NModbus库到你的项目中。然后,创建一个Modbus TCP客户端类,并在其中实现连接、读写操作。例如,读取设备保持寄存器值的代码段可能如下所示: ```csharp using Modbus.Device; ***.Sockets; // 其他必要的using语句 public class ModbusTcpClientExample { public void ConnectToModbusTcpServer(string ipAddress, int port) { using (TcpClient client = new TcpClient()) { client.Connect(ipAddress, port); ModbusIpMaster master = ModbusIpMaster.CreateIp(client); // 读取保持寄存器的示例代码 ushort startAddress = 0x0000; // 起始地址 ushort numInputs = 10; // 需要读取的寄存器数量 ushort[] inputs = master.ReadHoldingRegisters(1, startAddress, numInputs); // 处理读取到的数据 foreach (var input in inputs) { Console.WriteLine($ 参考资源链接:[C#实现Modbus TCP通讯协议客户端](https://wenku.csdn.net/doc/iqmc4jaufo?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值