ModbusRtuClient_A.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Modbus.Device;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO.Ports;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace MV485.helper
  10. {
  11. public class ModbusRtuClient_A
  12. {
  13. private SerialPort _serialPort;
  14. private IModbusSerialMaster _modbusMaster;
  15. private readonly string _portName;
  16. private readonly int _baudRate;
  17. private readonly Parity _parity;
  18. private readonly int _dataBits;
  19. private readonly StopBits _stopBits;
  20. private readonly List<byte> _deviceAddresses;
  21. private readonly int _pollingIntervalMs;
  22. private CancellationTokenSource _cancellationTokenSource;
  23. public ModbusRtuClient_A(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, List<byte> deviceAddresses, int pollingIntervalMs)
  24. {
  25. _portName = portName;
  26. _baudRate = baudRate;
  27. _parity = parity;
  28. _dataBits = dataBits;
  29. _stopBits = stopBits;
  30. _deviceAddresses = deviceAddresses;
  31. _pollingIntervalMs = pollingIntervalMs;
  32. Console.WriteLine("ModbusRtuClient initialized.");
  33. }
  34. public void Start()
  35. {
  36. Console.WriteLine("Starting Modbus RTU client...");
  37. _serialPort = new SerialPort(_portName, _baudRate, _parity, _dataBits, _stopBits);
  38. _serialPort.Open();
  39. Console.WriteLine("Serial port opened.");
  40. //_modbusMaster = new ModbusFactory().CreateRtuMaster(_serialPort);
  41. _modbusMaster = ModbusSerialMaster.CreateRtu(_serialPort);
  42. Console.WriteLine("Modbus master created.");
  43. _cancellationTokenSource = new CancellationTokenSource();
  44. Task.Run(() => PollingLoop(_cancellationTokenSource.Token));
  45. }
  46. public void Stop()
  47. {
  48. Console.WriteLine("Stopping Modbus RTU client...");
  49. _cancellationTokenSource?.Cancel();
  50. _modbusMaster?.Dispose();
  51. _serialPort?.Close();
  52. Console.WriteLine("Modbus RTU client stopped.");
  53. }
  54. private async Task PollingLoop(CancellationToken token)
  55. {
  56. Console.WriteLine("Starting polling loop...");
  57. while (!token.IsCancellationRequested)
  58. {
  59. foreach (var address in _deviceAddresses)
  60. {
  61. try
  62. {
  63. Console.WriteLine($"Reading from device {address}...");
  64. ushort[] registers = _modbusMaster.ReadHoldingRegisters(address, 0, 2);
  65. Console.WriteLine($"Device {address}: Water Usage = {registers[0]}, Sampling Time = {registers[1]}");
  66. }
  67. catch (Exception ex)
  68. {
  69. Console.WriteLine($"Error reading device {address}: {ex.Message}");
  70. }
  71. }
  72. Console.WriteLine("Polling cycle completed. Waiting for next cycle...");
  73. await Task.Delay(_pollingIntervalMs, token);
  74. }
  75. Console.WriteLine("Polling loop terminated.");
  76. }
  77. //-------------------------------------------------------------------------------------------------
  78. }
  79. }