You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

213 lines
5.4 KiB

  1. using ModbusDemo.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. class RegisterUCViewModel:BindableBase
  14. {
  15. //获取读线圈的类
  16. private IModbusRTU _modbusRTU;
  17. //定义读线圈的命令
  18. public DelegateCommand ReadRegisterCmm { get; set; }
  19. //定义写线圈操作
  20. public DelegateCommand WriteRegisterCmm { get; set; }
  21. //获取当前使用的串口
  22. private SerialPort _serialPort;
  23. //显示当前链接串口的信息
  24. public string SerialPortInfo
  25. {
  26. get
  27. {
  28. return "当前链接的状态:" + "串口号:" + _serialPort.PortName + ",波特率:" + _serialPort.BaudRate
  29. + ",数据位:" + _serialPort.DataBits + ",校验位:" + _serialPort.Parity + ",停止位:" + _serialPort.StopBits;
  30. }
  31. }
  32. #region 读取定义
  33. //读取的从站id
  34. private string _slaveAddress;
  35. public string SlaveAddress
  36. {
  37. get { return _slaveAddress; }
  38. set
  39. {
  40. _slaveAddress = value;
  41. RaisePropertyChanged();
  42. }
  43. }
  44. //读取的起始地址
  45. private string _startAddress;
  46. public string StartAddress
  47. {
  48. get { return _startAddress; }
  49. set
  50. {
  51. _startAddress = value;
  52. RaisePropertyChanged();
  53. }
  54. }
  55. //读取的位数
  56. private string _numberOfPoints;
  57. public string NumberOfPoints
  58. {
  59. get { return _numberOfPoints; }
  60. set
  61. {
  62. _numberOfPoints = value;
  63. RaisePropertyChanged();
  64. }
  65. }
  66. private string _readResult;
  67. //读取的结果
  68. public string ReadResult
  69. {
  70. get { return _readResult; }
  71. set
  72. {
  73. _readResult = value;
  74. RaisePropertyChanged();
  75. }
  76. }
  77. #endregion
  78. #region 写入定义
  79. //写入的从站id
  80. private string _writeslaveAddress;
  81. public string WriteSlaveAddress
  82. {
  83. get { return _writeslaveAddress; }
  84. set
  85. {
  86. _writeslaveAddress = value;
  87. RaisePropertyChanged();
  88. }
  89. }
  90. //写入的起始地址
  91. private string _writestartAddress;
  92. public string WriteStartAddress
  93. {
  94. get { return _writestartAddress; }
  95. set
  96. {
  97. _writestartAddress = value;
  98. RaisePropertyChanged();
  99. }
  100. }
  101. //写入的数据
  102. private string _writeData;
  103. public string WriteData
  104. {
  105. get { return _writeData; }
  106. set
  107. {
  108. _writeData = value;
  109. RaisePropertyChanged();
  110. }
  111. }
  112. #endregion
  113. public RegisterUCViewModel()
  114. {
  115. }
  116. public RegisterUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU)
  117. {
  118. _serialPort = serialPort;
  119. ReadRegisterCmm = new DelegateCommand(ReadRegister);
  120. _modbusRTU = modbusRTU;
  121. WriteRegisterCmm = new DelegateCommand(WriteRegister);
  122. }
  123. /// <summary>
  124. /// 线圈读取操作
  125. /// </summary>
  126. private void ReadRegister()
  127. {
  128. try
  129. {
  130. ushort[] result = _modbusRTU.ReadRegisters(byte.Parse(SlaveAddress),
  131. ushort.Parse(StartAddress),
  132. ushort.Parse(NumberOfPoints));
  133. if (result != null)
  134. {
  135. string temp = "";
  136. foreach (var item in result)
  137. {
  138. temp += item;
  139. temp += " ";
  140. }
  141. ReadResult = temp;
  142. }
  143. }
  144. catch (Exception)
  145. {
  146. MessageBox.Show("参数配置错误");
  147. }
  148. }
  149. private void WriteRegister()
  150. {
  151. string[] parts = WriteData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  152. // 3. 创建结果数组
  153. ushort[] data = new ushort[parts.Length];
  154. // 4. 遍历并转换每个部分
  155. for (int i = 0; i < parts.Length; i++)
  156. {
  157. // 尝试解析为ushort
  158. if (ushort.TryParse(parts[i], out ushort value))
  159. {
  160. data[i] = value;
  161. }
  162. else
  163. {
  164. // 处理解析失败的情况
  165. throw new FormatException($"无法将 '{parts[i]}' 转换为 ushort 类型");
  166. }
  167. }
  168. try
  169. {
  170. _modbusRTU.WriteRegisters(byte.Parse(WriteSlaveAddress),
  171. ushort.Parse(WriteStartAddress),
  172. data);
  173. }
  174. catch (Exception)
  175. {
  176. MessageBox.Show("信息配置错误");
  177. }
  178. }
  179. }
  180. }