using ModbusDemo.Device; 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 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 public RegisterUCViewModel() { } public RegisterUCViewModel(SerialPort serialPort, ModbusRTU modbusRTU) { _serialPort = serialPort; ReadRegisterCmm = new DelegateCommand(ReadRegister); _modbusRTU = modbusRTU; WriteRegisterCmm = new DelegateCommand(WriteRegister); } /// /// 线圈读取操作 /// private void ReadRegister() { try { ushort[] result = _modbusRTU.ReadRegisters(byte.Parse(SlaveAddress), ushort.Parse(StartAddress), ushort.Parse(NumberOfPoints)); if (result != null) { string temp = ""; foreach (var item in result) { temp += item; temp += " "; } ReadResult = temp; } } catch (Exception) { MessageBox.Show("参数配置错误"); } } private void WriteRegister() { 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 { // 处理解析失败的情况 throw new FormatException($"无法将 '{parts[i]}' 转换为 ushort 类型"); } } try { _modbusRTU.WriteRegisters(byte.Parse(WriteSlaveAddress), ushort.Parse(WriteStartAddress), data); } catch (Exception) { MessageBox.Show("信息配置错误"); } } } }