Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

200 строки
5.0 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. /// <summary>
  14. /// 这是CoilUC的VM用来支持数据绑定
  15. /// </summary>
  16. public class CoilUCViewModel : BindableBase
  17. {
  18. //获取读线圈的类
  19. private IModbusRTU _modbusRTU;
  20. //定义读线圈的命令
  21. public DelegateCommand ReadCoilCmm { get; set; }
  22. //定义写线圈操作
  23. public DelegateCommand WriteCoilCmm { get; set; }
  24. //获取当前使用的串口
  25. private SerialPort _serialPort;
  26. //显示当前链接串口的信息
  27. public string SerialPortInfo
  28. {
  29. get
  30. {
  31. return "当前链接的状态:" + "串口号:" + _serialPort.PortName + ",波特率:" + _serialPort.BaudRate
  32. + ",数据位:" + _serialPort.DataBits + ",校验位:" + _serialPort.Parity + ",停止位:" + _serialPort.StopBits;
  33. }
  34. }
  35. #region 读取定义
  36. //读取的从站id
  37. private string _slaveAddress;
  38. public string SlaveAddress
  39. {
  40. get { return _slaveAddress; }
  41. set
  42. {
  43. _slaveAddress = value;
  44. RaisePropertyChanged();
  45. }
  46. }
  47. //读取的起始地址
  48. private string _startAddress;
  49. public string StartAddress
  50. {
  51. get { return _startAddress; }
  52. set
  53. {
  54. _startAddress = value;
  55. RaisePropertyChanged();
  56. }
  57. }
  58. //读取的位数
  59. private string _numberOfPoints;
  60. public string NumberOfPoints
  61. {
  62. get { return _numberOfPoints; }
  63. set
  64. {
  65. _numberOfPoints = value;
  66. RaisePropertyChanged();
  67. }
  68. }
  69. private string _readResult;
  70. //读取的结果
  71. public string ReadResult
  72. {
  73. get { return _readResult; }
  74. set
  75. {
  76. _readResult = value;
  77. RaisePropertyChanged();
  78. }
  79. }
  80. #endregion
  81. #region 写入定义
  82. //写入的从站id
  83. private string _writeslaveAddress;
  84. public string WriteSlaveAddress
  85. {
  86. get { return _writeslaveAddress; }
  87. set
  88. {
  89. _writeslaveAddress = value;
  90. RaisePropertyChanged();
  91. }
  92. }
  93. //写入的起始地址
  94. private string _writestartAddress;
  95. public string WriteStartAddress
  96. {
  97. get { return _writestartAddress; }
  98. set
  99. {
  100. _writestartAddress = value;
  101. RaisePropertyChanged();
  102. }
  103. }
  104. //写入的数据
  105. private string _writeData;
  106. public string WriteData
  107. {
  108. get { return _writeData; }
  109. set
  110. {
  111. _writeData = value;
  112. RaisePropertyChanged();
  113. }
  114. }
  115. #endregion
  116. public CoilUCViewModel()
  117. {
  118. }
  119. public CoilUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU)
  120. {
  121. _serialPort = serialPort;
  122. ReadCoilCmm = new DelegateCommand(ReadCoil);
  123. _modbusRTU = modbusRTU;
  124. WriteCoilCmm = new DelegateCommand(WriteCoil);
  125. }
  126. /// <summary>
  127. /// 线圈读取操作
  128. /// </summary>
  129. private void ReadCoil()
  130. {
  131. try
  132. {
  133. bool[] result = _modbusRTU.ReadCoil(byte.Parse(SlaveAddress),
  134. ushort.Parse(StartAddress),
  135. ushort.Parse(NumberOfPoints));
  136. if (result != null)
  137. {
  138. string temp = "";
  139. foreach (var item in result)
  140. {
  141. temp += item;
  142. temp += " ";
  143. }
  144. ReadResult = temp;
  145. }
  146. }
  147. catch (Exception)
  148. {
  149. MessageBox.Show("参数配置错误");
  150. }
  151. }
  152. private void WriteCoil()
  153. {
  154. //去除字符串中的空格
  155. WriteData = WriteData.Replace(" ", "");
  156. //转换为布尔数组
  157. bool[] data = WriteData.Select(m => m == '1').ToArray();
  158. try
  159. {
  160. _modbusRTU.WriteCoil(byte.Parse(WriteSlaveAddress),
  161. ushort.Parse(WriteStartAddress),
  162. data);
  163. }
  164. catch (Exception)
  165. {
  166. MessageBox.Show("信息配置错误");
  167. }
  168. }
  169. }
  170. }