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.

271 regels
7.0 KiB

  1. using ModbusDemo.Device;
  2. using ModbusDemo.Model;
  3. using Prism.Commands;
  4. using Prism.Mvvm;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IO.Ports;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. namespace ModbusDemo.VIewModel
  13. {
  14. /// <summary>
  15. /// 这是CoilUC的VM用来支持数据绑定
  16. /// </summary>
  17. public class CoilUCViewModel : BindableBase
  18. {
  19. //获取读线圈的类
  20. private IModbusRTU _modbusRTU;
  21. //定义读线圈的命令
  22. public DelegateCommand ReadCoilCmm { get; set; }
  23. //定义写线圈操作
  24. public DelegateCommand WriteCoilCmm { get; set; }
  25. //获取当前使用的串口
  26. private SerialPort _serialPort;
  27. //显示当前链接串口的信息
  28. public string SerialPortInfo
  29. {
  30. get
  31. {
  32. return "当前链接的状态:" + "串口号:" + _serialPort.PortName + ",波特率:" + _serialPort.BaudRate
  33. + ",数据位:" + _serialPort.DataBits + ",校验位:" + _serialPort.Parity + ",停止位:" + _serialPort.StopBits;
  34. }
  35. }
  36. #region 读取定义
  37. //读取的从站id
  38. private string _slaveAddress;
  39. public string SlaveAddress
  40. {
  41. get { return _slaveAddress; }
  42. set
  43. {
  44. _slaveAddress = value;
  45. RaisePropertyChanged();
  46. }
  47. }
  48. //读取的起始地址
  49. private string _startAddress;
  50. public string StartAddress
  51. {
  52. get { return _startAddress; }
  53. set
  54. {
  55. _startAddress = value;
  56. RaisePropertyChanged();
  57. }
  58. }
  59. //读取的位数
  60. private string _numberOfPoints;
  61. public string NumberOfPoints
  62. {
  63. get { return _numberOfPoints; }
  64. set
  65. {
  66. _numberOfPoints = value;
  67. RaisePropertyChanged();
  68. }
  69. }
  70. private string _readResult;
  71. //读取的结果
  72. public string ReadResult
  73. {
  74. get { return _readResult; }
  75. set
  76. {
  77. _readResult = value;
  78. RaisePropertyChanged();
  79. }
  80. }
  81. #endregion
  82. #region 写入定义
  83. //写入的从站id
  84. private string _writeslaveAddress;
  85. public string WriteSlaveAddress
  86. {
  87. get { return _writeslaveAddress; }
  88. set
  89. {
  90. _writeslaveAddress = value;
  91. RaisePropertyChanged();
  92. }
  93. }
  94. //写入的起始地址
  95. private string _writestartAddress;
  96. public string WriteStartAddress
  97. {
  98. get { return _writestartAddress; }
  99. set
  100. {
  101. _writestartAddress = value;
  102. RaisePropertyChanged();
  103. }
  104. }
  105. //写入的数据
  106. private string _writeData;
  107. public string WriteData
  108. {
  109. get { return _writeData; }
  110. set
  111. {
  112. _writeData = value;
  113. RaisePropertyChanged();
  114. }
  115. }
  116. #endregion
  117. private List<ModbusLog> _modbusLogList;
  118. public List<ModbusLog> ModbusLogList
  119. {
  120. get { return _modbusLogList; }
  121. set
  122. {
  123. _modbusLogList = value;
  124. RaisePropertyChanged();
  125. }
  126. }
  127. public CoilUCViewModel()
  128. {
  129. }
  130. public CoilUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU)
  131. {
  132. _serialPort = serialPort;
  133. ReadCoilCmm = new DelegateCommand(ReadCoil);
  134. _modbusRTU = modbusRTU;
  135. WriteCoilCmm = new DelegateCommand(WriteCoil);
  136. ModbusLogList = new List<ModbusLog>();
  137. ModbusLogList.Add(new ModbusLog
  138. {
  139. OperationType = "读取",
  140. RequestData = "01 03 00 00 00 02",
  141. ResponseData = "01 03 04 00 0A 00 0B",
  142. Time = DateTime.Now.AddMinutes(-5)
  143. });
  144. ModbusLogList.Add(new ModbusLog
  145. {
  146. OperationType = "写入",
  147. RequestData = "01 06 00 01 00 03",
  148. ResponseData = "01 06 00 01 00 03",
  149. Time = DateTime.Now.AddMinutes(-2)
  150. });
  151. ModbusLogList.Add(new ModbusLog
  152. {
  153. OperationType = "读取",
  154. RequestData = "01 03 00 00 00 02",
  155. ResponseData = "01 03 04 00 0A 00 0B",
  156. Time = DateTime.Now.AddMinutes(-5)
  157. });
  158. ModbusLogList.Add(new ModbusLog
  159. {
  160. OperationType = "写入",
  161. RequestData = "01 06 00 01 00 03",
  162. ResponseData = "01 06 00 01 00 03",
  163. Time = DateTime.Now.AddMinutes(-2)
  164. });
  165. ModbusLogList.Add(new ModbusLog
  166. {
  167. OperationType = "读取",
  168. RequestData = "01 03 00 00 00 02",
  169. ResponseData = "01 03 04 00 0A 00 0B",
  170. Time = DateTime.Now.AddMinutes(-5)
  171. });
  172. ModbusLogList.Add(new ModbusLog
  173. {
  174. OperationType = "写入",
  175. RequestData = "01 06 00 01 00 03",
  176. ResponseData = "01 06 00 01 00 03",
  177. Time = DateTime.Now.AddMinutes(-2)
  178. });
  179. }
  180. /// <summary>
  181. /// 线圈读取操作
  182. /// </summary>
  183. private void ReadCoil()
  184. {
  185. try
  186. {
  187. bool[] result = _modbusRTU.ReadCoil(byte.Parse(SlaveAddress),
  188. ushort.Parse(StartAddress),
  189. ushort.Parse(NumberOfPoints));
  190. if (result != null)
  191. {
  192. string temp = "";
  193. foreach (var item in result)
  194. {
  195. temp += item;
  196. temp += " ";
  197. }
  198. ReadResult = temp;
  199. }
  200. }
  201. catch (Exception)
  202. {
  203. MessageBox.Show("参数配置错误");
  204. }
  205. }
  206. private void WriteCoil()
  207. {
  208. //去除字符串中的空格
  209. WriteData = WriteData.Replace(" ", "");
  210. //转换为布尔数组
  211. bool[] data = WriteData.Select(m => m == '1').ToArray();
  212. try
  213. {
  214. _modbusRTU.WriteCoil(byte.Parse(WriteSlaveAddress),
  215. ushort.Parse(WriteStartAddress),
  216. data);
  217. }
  218. catch (Exception)
  219. {
  220. MessageBox.Show("信息配置错误");
  221. }
  222. }
  223. }
  224. }