c#实现modbus rtu定时采集数据
以下是使用C#实现Modbus RTU定时采集数据的完整代码示例,包含定时任务、数据采集和异常处理:
csharp
复制
using System; using System.IO.Ports; using System.Timers; public class ModbusRtuCollector : IDisposable { private readonly SerialPort _serialPort; private readonly Timer _timer; private readonly object _portLock = new object(); // 配置参数 public string PortName { get; } public int BaudRate { get; } public int PollingInterval { get; set; } = 1000; // 默认1秒采集间隔 public ModbusRtuCollector(string portName, int baudRate) { PortName = portName; BaudRate = baudRate; // 初始化串口 _serialPort = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One) { ReadTimeout = 500, WriteTimeout = 500, Handshake = Handshake.RequestToSend // RTS控制收发 }; // 初始化定时器 _timer = new Timer(PollingInterval); _timer.Elapsed += async (s, e) => await PollDataAsync(); } public void Start() { if (!_serialPort.IsOpen) { _serialPort.Open(); _timer.Start(); Console.WriteLine($"已启动数据采集,端口:{PortName}"); } } public void Stop() { _timer.Stop(); if (_serialPort.IsOpen) _serialPort.Close(); Console.WriteLine("已停止数据采集"); } private async Task PollDataAsync() { try { // 示例:读取设备地址1的保持寄存器40001-40004 var result = await ReadHoldingRegistersAsync(0x01, 0x0000, 4); var timestamp = DateTime.Now.ToString("HH:mm:ss.fff"); Con