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

C# Modbus RTU学习记录

继C# Modbus TCP/IP学习记录后,尝试串口通信。

操作步骤:

1.使用Visual Studio安装Nuget包NModbus.Serial。

2.使用Modbus Slave应用程序,工具栏Connection项,单击Connect,弹窗Connection Setup,修改Connection下拉框为Serial Port,下列配置按实际需求修改:

(端口此时使用的虚拟端口)

3.回到Visual Studio的控制台应用程序,输入以下代码,代码含有读写方法,按需修改:

using System;
using System.IO.Ports;
using NModbus;
using NModbus.Serial;

class ModbusRtuMaster
{
    static void Main(string[] args)
    {
        try
        {
            // 配置串口参数
            string portName = "COM31"; //串口号
            int baudRate = 9600;// 波特率
            Parity parity = Parity.None; // 校验位
            int dataBits = 8;// 数据位
            StopBits stopBits = StopBits.One; // 停止位

            // 初始化串口
            using (SerialPort serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits))
            {
                serialPort.Open();
                Console.WriteLine($"Modbus RTU 主站已启动,连接到 {portName}...");

                // 创建 Modbus RTU 主站
                var factory = new ModbusFactory();
                IModbusSerialMaster master = factory.CreateRtuMaster(new SerialPortAdapter(serialPort));

                // 从站地址
                byte slaveId = 1;

                // 测试读取保持寄存器
                ushort startAddress = 0; // 寄存器地址
                ushort numRegisters = 10; // 读取 10 个寄存器
                ushort[] readValues = ReadHoldingRegisters(master, slaveId, startAddress, numRegisters);

                Console.WriteLine("读取到的寄存器数据:");
                for (int i = 0; i < readValues.Length; i++)
                {
                    Console.WriteLine($"寄存器 {startAddress + i}: {readValues[i]}");
                }

                // 测试写入单个寄存器
                ushort writeAddress = 0; // 写入的寄存器地址
                ushort writeValue = 21; // 要写入的值
                WriteSingleRegister(master, slaveId, writeAddress, writeValue);

                Console.WriteLine($"已写入寄存器 {writeAddress}: {writeValue}");

                // 再次读取以验证写入是否成功
                ushort[] updatedValues = ReadHoldingRegisters(master, slaveId, startAddress, numRegisters);
                Console.WriteLine("更新后的寄存器数据:");
                for (int i = 0; i < updatedValues.Length; i++)
                {
                    Console.WriteLine($"寄存器 {startAddress + i}: {updatedValues[i]}");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生错误: {ex.Message}");
        }
        Console.ReadLine();
    }

    /// <summary>
    /// 读取保持寄存器
    /// </summary>
    public static ushort[] ReadHoldingRegisters(IModbusSerialMaster master, byte slaveId, ushort startAddress, ushort numRegisters)
    {
        return master.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
    }

    /// <summary>
    /// 写入单个保持寄存器
    /// </summary>
    public static void WriteSingleRegister(IModbusSerialMaster master, byte slaveId, ushort address, ushort value)
    {
        master.WriteSingleRegister(slaveId, address, value);
    }
}

4.运行结果:

相关文章:

  • Qt Concurrent Filter and Filter-Reduce
  • 雨晨 Windows 11 企业版 24H2 轻装版 26200.5510
  • 技术团队评估需求开发成本远超预期,如何应对
  • JS闭包--函数式编程的核心概念
  • Springboot 集成 Flowable 6.8.0
  • docker远程debug
  • SpringBoot项目图片上传成功,访问404
  • WordPress自动代码高亮插件Code Prettify插件
  • function、var、let 和 const 用于不同的声明场景
  • 【Linux进程】理解进程地址空间
  • 8.非监督学习与关系挖掘:聚类分析、客户细分、关联规则与协同过滤的全面解析——Python数据挖掘代码实践
  • 通过php连接redis数据库
  • 网络安全之STP(1)
  • Kotlin泛型: 协变|逆变|不变
  • mysql慢查询日志
  • Python - 爬虫-网页抓取数据-工具wget
  • ngx_http_core_root
  • Vue 中 v-if 和 v-show 的区别
  • 如何设计有效的用户反馈闭环机制
  • 微信小程序面试内容整理-如何优化小程序的启动速度?
  • 品牌网站建设框架/软文例文 经典软文范例
  • 做外单要上什么网站/关键词优化公司排行
  • 公司有域名的怎么建设网站/常用的seo工具的是有哪些
  • 网站建设的快乐/seo包括什么
  • 南阳做网站seo的/seo排名优化是什么
  • 网站的首页设计方案/竞价排名机制