No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

231 líneas
6.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 ModbusDbContext _modbusDbContext;
  21. //获取读线圈的类
  22. private IModbusRTU _modbusRTU;
  23. //定义读线圈的命令
  24. public DelegateCommand ReadCoilCmm { get; set; }
  25. //定义写线圈操作
  26. public DelegateCommand WriteCoilCmm { get; set; }
  27. //获取当前使用的串口
  28. private SerialPort _serialPort;
  29. //显示当前链接串口的信息
  30. public string SerialPortInfo
  31. {
  32. get
  33. {
  34. return "当前链接的状态:" + "串口号:" + _serialPort.PortName + ",波特率:" + _serialPort.BaudRate
  35. + ",数据位:" + _serialPort.DataBits + ",校验位:" + _serialPort.Parity + ",停止位:" + _serialPort.StopBits;
  36. }
  37. }
  38. #region 读取定义
  39. //读取的从站id
  40. private string _slaveAddress;
  41. public string SlaveAddress
  42. {
  43. get { return _slaveAddress; }
  44. set
  45. {
  46. _slaveAddress = value;
  47. RaisePropertyChanged();
  48. }
  49. }
  50. //读取的起始地址
  51. private string _startAddress;
  52. public string StartAddress
  53. {
  54. get { return _startAddress; }
  55. set
  56. {
  57. _startAddress = value;
  58. RaisePropertyChanged();
  59. }
  60. }
  61. //读取的位数
  62. private string _numberOfPoints;
  63. public string NumberOfPoints
  64. {
  65. get { return _numberOfPoints; }
  66. set
  67. {
  68. _numberOfPoints = value;
  69. RaisePropertyChanged();
  70. }
  71. }
  72. private string _readResult;
  73. //读取的结果
  74. public string ReadResult
  75. {
  76. get { return _readResult; }
  77. set
  78. {
  79. _readResult = value;
  80. RaisePropertyChanged();
  81. }
  82. }
  83. #endregion
  84. #region 写入定义
  85. //写入的从站id
  86. private string _writeslaveAddress;
  87. public string WriteSlaveAddress
  88. {
  89. get { return _writeslaveAddress; }
  90. set
  91. {
  92. _writeslaveAddress = value;
  93. RaisePropertyChanged();
  94. }
  95. }
  96. //写入的起始地址
  97. private string _writestartAddress;
  98. public string WriteStartAddress
  99. {
  100. get { return _writestartAddress; }
  101. set
  102. {
  103. _writestartAddress = value;
  104. RaisePropertyChanged();
  105. }
  106. }
  107. //写入的数据
  108. private string _writeData;
  109. public string WriteData
  110. {
  111. get { return _writeData; }
  112. set
  113. {
  114. _writeData = value;
  115. }
  116. }
  117. #endregion
  118. private List<ModbusLog> _modbusLogList;
  119. public List<ModbusLog> ModbusLogList
  120. {
  121. get { return _modbusLogList; }
  122. set
  123. {
  124. _modbusLogList = value;
  125. RaisePropertyChanged();
  126. }
  127. }
  128. public CoilUCViewModel()
  129. {
  130. }
  131. public CoilUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU, ModbusDbContext modbusDbContext)
  132. {
  133. _serialPort = serialPort;
  134. ReadCoilCmm = new DelegateCommand(ReadCoil);
  135. _modbusRTU = modbusRTU;
  136. WriteCoilCmm = new DelegateCommand(WriteCoil);
  137. _modbusDbContext = modbusDbContext;
  138. //初始化查询操作
  139. ModbusLogList = GetOperateCoil();
  140. }
  141. /// <summary>
  142. /// 线圈读取操作
  143. /// </summary>
  144. private void ReadCoil()
  145. {
  146. try
  147. {
  148. bool[] result = _modbusRTU.ReadCoil(byte.Parse(SlaveAddress),
  149. ushort.Parse(StartAddress),
  150. ushort.Parse(NumberOfPoints));
  151. if (result != null)
  152. {
  153. string temp = "";
  154. foreach (var item in result)
  155. {
  156. temp += item;
  157. temp += " ";
  158. }
  159. ReadResult = temp;
  160. }
  161. }
  162. catch (Exception)
  163. {
  164. MessageBox.Show("参数配置错误");
  165. }
  166. }
  167. private void WriteCoil()
  168. {
  169. //去除字符串中的空格
  170. WriteData = WriteData.Replace(" ", "");
  171. //转换为布尔数组
  172. bool[] data = WriteData.Select(m => m == '1').ToArray();
  173. try
  174. {
  175. _modbusRTU.WriteCoil(byte.Parse(WriteSlaveAddress),
  176. ushort.Parse(WriteStartAddress),
  177. data);
  178. }
  179. catch (Exception)
  180. {
  181. MessageBox.Show("信息配置错误");
  182. }
  183. }
  184. /// <summary>
  185. /// 获取展示数据
  186. /// </summary>
  187. /// <returns></returns>
  188. private List<ModbusLog> GetOperateCoil()
  189. {
  190. return _modbusDbContext.ModbusLog
  191. .Where(log => log.OperationType == "读线圈" || log.OperationType == "写线圈")
  192. .OrderByDescending(log => log.Time) // 按时间倒序,最新的在前
  193. .Take(20) // 只取前20条记录
  194. .ToList(); // 执行查询
  195. }
  196. }
  197. }