首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 实现 Modbus 通信Demo

C# 实现 Modbus 通信Demo

原创
作者头像
软件架构师Michael
发布2025-08-22 10:23:56
发布2025-08-22 10:23:56
2990
举报

Modbus是一种广泛应用于工业自动化中的通信协议,主要用于设备间的数据交换。

1.环境准备:安装NMobuds库

代码语言:csharp
复制
Install-Package NModbus

2.Modbus TCP客户端实现,基于以太网的通信协议,速度快

代码语言:csharp
复制
using System;
using System.Net.Sockets;
using Modbus.Device;  // 引入 NModbus 库
 
class Program
{
    static void Main(string[] args)
    {
        // 1. 连接到 Modbus 服务器(Modbus TCP)
        string ipAddress = "192.168.0.100"; // 设备的 IP 地址
        int port = 502; // Modbus TCP 默认端口
        var client = new TcpClient(ipAddress, port);
 
        // 2. 获取 Modbus TCP 设备的协议客户端
        var modbusTcpMaster = ModbusTcpMaster.CreateIp(client);
 
        // 3. 读取从站设备的寄存器
        ushort startAddress = 0;  // 寄存器起始地址
        ushort numRegisters = 10; // 读取 10 个寄存器
 
        try
        {
            // 读取保持寄存器
            ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
            
            // 输出结果
            Console.WriteLine("读取到的寄存器值:");
            foreach (var register in registers)
            {
                Console.WriteLine(register);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取错误: {ex.Message}");
        }
 
        // 4. 关闭连接
        client.Close();
    }
}

3.Modbus RTU 客户端实现,基于串口通信

代码语言:txt
复制
using System;
using System.IO.Ports;
using Modbus.Device;  // 引入 NModbus 库
 
class Program
{
    static void Main(string[] args)
    {
        // 1. 通过串口连接到 Modbus 设备
        string portName = "COM1";  // 串口名称
        int baudRate = 9600;       // 波特率
        int parity = 0;            // 校验位,0: 无校验,1: 偶校验,2: 奇校验
        int dataBits = 8;          // 数据位
        int stopBits = 1;          // 停止位
 
        var serialPort = new SerialPort(portName, baudRate, (Parity)parity, dataBits, (StopBits)stopBits);
        serialPort.Open();
 
        // 2. 创建 Modbus RTU 主机对象
        var modbusRtuMaster = ModbusSerialMaster.CreateRtu(serialPort);
 
        // 3. 读取从站设备的寄存器
        ushort startAddress = 0;   // 寄存器起始地址
        ushort numRegisters = 10;  // 读取 10 个寄存器
 
        try
        {
            // 读取保持寄存器(从站地址为 1)
            ushort[] registers = modbusRtuMaster.ReadHoldingRegisters(1, startAddress, numRegisters);
 
            // 输出结果
            Console.WriteLine("读取到的寄存器值:");
            foreach (var register in registers)
            {
                Console.WriteLine(register);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取错误: {ex.Message}");
        }
 
        // 4. 关闭串口连接
        serialPort.Close();
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档