|
- using ModbusDemo.Device;
- using ModbusDemo.Model;
- using Prism.Commands;
- using Prism.Mvvm;
- using System;
- using System.Collections.Generic;
- using System.IO.Ports;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
-
- namespace ModbusDemo.VIewModel
- {
- class RegisterUCViewModel : BindableBase
- {
- //定义数据库操作类
- private ModbusDbContext _modbusDbContext;
- //获取读线圈的类
- private IModbusRTU _modbusRTU;
- //定义读线圈的命令
- public DelegateCommand ReadRegisterCmm { get; set; }
- //定义写线圈操作
- public DelegateCommand WriteRegisterCmm { get; set; }
- //获取当前使用的串口
- private SerialPort _serialPort;
- //显示当前链接串口的信息
- public string SerialPortInfo
- {
- get
- {
- return "当前为读写寄存器:" + "串口号:" + _serialPort.PortName + ",波特率:" + _serialPort.BaudRate
- + ",数据位:" + _serialPort.DataBits + ",校验位:" + _serialPort.Parity + ",停止位:" + _serialPort.StopBits;
- }
-
- }
- #region 读取定义
-
- //读取的从站id
- private string _slaveAddress;
-
- public string SlaveAddress
- {
- get { return _slaveAddress; }
- set
- {
- _slaveAddress = value;
- RaisePropertyChanged();
- }
- }
- //读取的起始地址
- private string _startAddress;
-
-
- public string StartAddress
- {
- get { return _startAddress; }
- set
- {
- _startAddress = value;
- RaisePropertyChanged();
- }
- }
- //读取的位数
- private string _numberOfPoints;
-
-
- public string NumberOfPoints
- {
- get { return _numberOfPoints; }
- set
- {
- _numberOfPoints = value;
- RaisePropertyChanged();
- }
- }
-
- private string _readResult;
-
- //读取的结果
- public string ReadResult
- {
- get { return _readResult; }
- set
- {
- _readResult = value;
- RaisePropertyChanged();
- }
- }
- #endregion
-
- #region 写入定义
-
- //写入的从站id
- private string _writeslaveAddress;
-
- public string WriteSlaveAddress
- {
- get { return _writeslaveAddress; }
- set
- {
- _writeslaveAddress = value;
- RaisePropertyChanged();
- }
- }
- //写入的起始地址
- private string _writestartAddress;
-
-
- public string WriteStartAddress
- {
- get { return _writestartAddress; }
- set
- {
- _writestartAddress = value;
- RaisePropertyChanged();
- }
- }
- //写入的数据
- private string _writeData;
-
-
- public string WriteData
- {
- get { return _writeData; }
- set
- {
- _writeData = value;
- RaisePropertyChanged();
- }
- }
-
-
- #endregion
-
- private List<ModbusLog> _modbusLogList;
-
- public List<ModbusLog> ModbusLogList
- {
- get { return _modbusLogList; }
- set
- {
- _modbusLogList = value;
- RaisePropertyChanged();
- }
- }
-
- public RegisterUCViewModel()
- {
-
- }
- public RegisterUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU, ModbusDbContext modbusDbContext)
- {
- _serialPort = serialPort;
- ReadRegisterCmm = new DelegateCommand(ReadRegister);
- _modbusRTU = modbusRTU;
- WriteRegisterCmm = new DelegateCommand(WriteRegister);
- _modbusDbContext = modbusDbContext;
-
- ModbusLogList = GetOperateRegister();
-
- }
-
-
-
-
- /// <summary>
- /// 线圈读取操作
- /// </summary>
- private void ReadRegister()
- {
- if (!byte.TryParse(SlaveAddress, out byte slaveAddressValue))
- {
- MessageBox.Show("SlaveAddress 格式无效", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
- return;
- }
-
- if (!ushort.TryParse(StartAddress, out ushort startAddressValue))
- {
- MessageBox.Show("StartAddress 格式无效", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
- return;
- }
-
- if (!ushort.TryParse(NumberOfPoints, out ushort numberOfPointsValue))
- {
- MessageBox.Show("NumberOfPoints 格式无效", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
- return;
- }
- //使用子线程进行读取,防止ui线程卡顿
- Task.Run(() =>
- {
- ushort[] result = _modbusRTU.ReadRegisters(slaveAddressValue, startAddressValue, numberOfPointsValue);
- if (result == null)
- {
- MessageBox.Show("读取失败", "error", MessageBoxButton.OK, MessageBoxImage.Error);
- ModbusLogList = GetOperateRegister();
- return;
- }
- string temp = "";
- foreach (var item in result)
- {
- temp += item;
- temp += " ";
- }
- ReadResult = temp;
- MessageBox.Show("读取成功");
- ModbusLogList = GetOperateRegister();
- });
-
- }
-
-
-
- private void WriteRegister()
- {
- if (!byte.TryParse(WriteSlaveAddress, out byte writeSlaveAddressValue))
- {
- MessageBox.Show("WriteSlaveAddress 格式无效", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
- return;
- }
- if (!ushort.TryParse(WriteStartAddress, out ushort WriteStartAddressValue))
- {
- MessageBox.Show("WriteStartAddress 格式无效", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
- return;
- }
- if (string.IsNullOrEmpty(WriteData))
- {
- MessageBox.Show("WriteData 格式无效", "warning", MessageBoxButton.OK, MessageBoxImage.Warning);
- return;
- }
- string[] parts = WriteData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- // 3. 创建结果数组
- ushort[] data = new ushort[parts.Length];
-
- // 4. 遍历并转换每个部分
- for (int i = 0; i < parts.Length; i++)
- {
- // 尝试解析为ushort
- if (ushort.TryParse(parts[i], out ushort value))
- {
- data[i] = value;
- }
- else
- {
-
- MessageBox.Show($"无法将 '{parts[i]}' 转换为 ushort 类型");
- return;
- }
- }
-
- //使用子线程来去执行操作,防止ui线程卡顿
- Task.Run(() =>
- {
- _modbusRTU.WriteRegisters(writeSlaveAddressValue, WriteStartAddressValue, data);
- ModbusLogList = GetOperateRegister();
- ModbusLog modbusLog = ModbusLogList.FirstOrDefault();
- if (modbusLog != null && modbusLog.ResponseData != string.Empty)
- {
- MessageBox.Show("写入成功");
-
- }
- else
- {
- MessageBox.Show("写入失败", "error", MessageBoxButton.OK, MessageBoxImage.Error);
- }
- });
-
-
-
-
- }
- /// <summary>
- /// 获取展示数据
- /// </summary>
- /// <returns></returns>
- private List<ModbusLog> GetOperateRegister()
- {
- return _modbusDbContext.ModbusLog
- .Where(log => log.OperationType == "读寄存器" || log.OperationType == "写寄存器")
- .OrderByDescending(log => log.Time) // 按时间倒序,最新的在前
- .Take(20) // 只取前20条记录
- .ToList(); // 执行查询
- }
- }
- }
|