Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

108 linhas
3.0 KiB

  1. using Modbus.Device;
  2. using Prism.Commands;
  3. using Prism.Mvvm;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO.Ports;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. namespace ModbusDemo.VIewModel
  12. {
  13. public class AttachUCViewModel : BindableBase
  14. {
  15. private SerialPort _serialPort;
  16. public DelegateCommand ReadOddRegisterCmm { get; set; }
  17. //读取的结果
  18. private string _readResult;
  19. public string ReadResult
  20. {
  21. get { return _readResult; }
  22. set
  23. {
  24. _readResult = value;
  25. RaisePropertyChanged();
  26. }
  27. }
  28. //显示操作的时间
  29. private int _time;
  30. public int Time
  31. {
  32. get { return _time; }
  33. set
  34. {
  35. _time = value;
  36. RaisePropertyChanged();
  37. }
  38. }
  39. public AttachUCViewModel()
  40. {
  41. }
  42. public AttachUCViewModel(SerialPort serialPort)
  43. {
  44. ReadOddRegisterCmm = new DelegateCommand(ReadOddRegister);
  45. _serialPort = serialPort;
  46. }
  47. private void ReadOddRegister()
  48. {
  49. // 创建 Modbus RTU 主站
  50. IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(_serialPort);
  51. byte slaveId = 1;
  52. ushort totalRegisters = 1000;
  53. ushort chunkSize = 100;
  54. int numChunks = (int)Math.Ceiling((double)totalRegisters / chunkSize);
  55. ushort[] allRegisters = new ushort[totalRegisters];
  56. Task[] tasks = new Task[numChunks];
  57. DateTime startTime = DateTime.Now;
  58. for (int i = 0; i < numChunks; i++)
  59. {
  60. ushort startAddress = (ushort)(10300 + i * chunkSize);
  61. ushort currentChunkSize = 100;
  62. int chunkIndex = i;
  63. tasks[i] = Task.Run(() =>
  64. {
  65. try
  66. {
  67. ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, currentChunkSize);
  68. Array.Copy(registers, 0, allRegisters, chunkIndex * chunkSize, currentChunkSize);
  69. }
  70. catch (Exception ex)
  71. {
  72. Console.WriteLine($"线程 {chunkIndex} 读取寄存器时出错: {ex.Message}");
  73. }
  74. });
  75. }
  76. // 等待所有任务完成
  77. Task.WaitAll(tasks);
  78. Time = (int)(DateTime.Now - startTime).TotalMilliseconds;
  79. StringBuilder result = new StringBuilder();
  80. int count = 0;
  81. for (int i = 1; i < totalRegisters; i += 2)
  82. {
  83. result.Append(allRegisters[i].ToString()+" ");
  84. count++;
  85. if (count % 50 == 0)
  86. {
  87. result.AppendLine();
  88. }
  89. }
  90. ReadResult = result.ToString();
  91. }
  92. }
  93. }