电机驱动_上位机_ModbusRTU

本文分享了一名开发者在一年多后重启编程,如何使用NModbus4库在VS2019环境中,通过ModbusSerialMaster监控串口设备,并实现实时数据读取,以WPF定时器为例,展示了从打开串口到处理数据的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一年多没有敲代码了,最近暑假在做一个项目,这里记录一下我遇到过的一些问题。

这是我使用的工具和开发环境:

  • Modbus Poll
  • Modbus Slave
  • NModbus4
  • VS2019开发环境
  • C# WPF

NModbus4

引用NMdbus4,modbus RTU使用下面这个就OK
NMdbus4库传送门

using Modbus.Device;

开发流程

在这里插入图片描述
第一步,实现打开串口,modbus建立主站

//全局变量
ModbusSerialMaster master;//主站
byte slaveID = 1;//设备站号
ushort address = 0;//寄存器地址
ushort[] Registers = new ushort[30];//用来保存寄存器的数据
 serialPort.PortName = COM_ComboBox.Text;//串口号
 serialPort.BaudRate =Convert.ToInt32(BaudRate_ComboBox.Text);//波特率
serialPort.DataBits = Convert.ToInt16(DaTaBit_ComboBox.Text);//数据位
serialPort.Parity =(Parity)Convert.ToInt16(ParityBit_ComboBox.Text);//校验位
serialPort.StopBits = (StopBits)Convert.ToDouble(StopBit_Combobox.Text);//停止位
serialPort.Open(); //串口打开

master = ModbusSerialMaster.CreateRtu(serialPort);    //建立连接
master.Transport.Retries = 3;   //尝试三次
master.Transport.ReadTimeout = 1000; //milliseconds    响应时间

第二步,使用03功能码相对应的方法,03的功能是:读保持寄存器

Registers = master.ReadHoldingRegisters(slaveID, address, 30);//功能码03(从站地址,寄存器地址,读几个寄存器)
//Registers 收到数据,直接更新到界面就好了
//在这里朋友们注意一下,这个方法是一次性读完的。我之前就是不注意添加了for循环读取,结果总引发事件,提示bug

如果要实时读取,可以使用WPF界面专用的的定时器

using System.Windows.Threading;

   public MainWindow()
        {
            InitializeComponent();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            serialPort.DataReceived += new 	SerialDataReceivedEventHandler(serialPort_DataReceived);//数据接收
        }
DispatcherTimer dispatcherTimer = new DispatcherTimer();//计时器
//这里的代码放Button事件里,因为我是调试,所以我是跟串口打开,放一起的
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);//定时
dispatcherTimer.Start();
 private void dispatcherTimer_Tick(object sender, EventArgs e)//定时引发事件
        {
            Registers = master.ReadHoldingRegisters(slaveID, address, 30);//功能码03(从站地址,寄存器地址,读几个寄存器)
            //Registers[这里我是直接对应寄存器地址了,这样方便]
            CurrentSpeed.Content = "电机当前速度:" + Registers[0x10].ToString();
            SystemVoltage.Content = "系统电压:" + Registers[0x11].ToString() + " V";
            SystemTemp.Content = "系统温度:" + Registers[0x12].ToString() + " ℃";
            SystemCurrent.Content = "系统电流:" + Registers[0x0f].ToString() + " mA";
        }

如图,这就是我模拟调试的结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值