using DeviceCommand.Device; using Prism.Commands; using Prism.Ioc; using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Input; using UIShare.GlobalVariable; using UIShare.ViewModelBase; namespace DeviceEditModule.ViewModels { /// /// PW8001 功率分析仪 控制面板 ViewModel /// public class PW8001ViewModel : NavigateViewModelBase, IDisposable { private readonly DeviceManager _dm; private PW8001? _dev; private CancellationTokenSource? _cts; private string _deviceName = "PW8001"; public string DeviceName { get => _deviceName; set => SetProperty(ref _deviceName, value); } private bool _isConnected; public bool IsConnected { get => _isConnected; set => SetProperty(ref _isConnected, value); } private bool _isBusy; public bool IsBusy { get => _isBusy; set => SetProperty(ref _isBusy, value); } #region 输入参数 private int _channel = 1; public int Channel { get => _channel; set => SetProperty(ref _channel, value); } #endregion #region 测量结果 private double _measuredVoltage; public double MeasuredVoltage { get => _measuredVoltage; set => SetProperty(ref _measuredVoltage, value); } private double _measuredCurrent; public double MeasuredCurrent { get => _measuredCurrent; set => SetProperty(ref _measuredCurrent, value); } private double _measuredPower; public double MeasuredPower { get => _measuredPower; set => SetProperty(ref _measuredPower, value); } private double _voltageTHD; public double VoltageTHD { get => _voltageTHD; set => SetProperty(ref _voltageTHD, value); } private double _currentTHD; public double CurrentTHD { get => _currentTHD; set => SetProperty(ref _currentTHD, value); } private double _totalPower; public double TotalPower { get => _totalPower; set => SetProperty(ref _totalPower, value); } private string _responseLog = ""; public string ResponseLog { get => _responseLog; set => SetProperty(ref _responseLog, value); } #endregion #region 命令 public ICommand QueryIdn { get; } public ICommand Reset { get; } public ICommand Clear { get; } public ICommand ModeWIDE { get; } public ICommand ModeIEC { get; } public ICommand QV { get; } public ICommand QI { get; } public ICommand QP { get; } public ICommand QP123 { get; } public ICommand QTHD { get; } #endregion public PW8001ViewModel(IContainerProvider cp) : base(cp) { _dm = cp.Resolve(); QueryIdn = new DelegateCommand(async () => await Exec(async () => Log("IDN:" + await _dev!.查询机器信息(Ct())))); Reset = new DelegateCommand(async () => await Exec(async () => { await _dev!.复位仪器(Ct()); Log("仪器已复位"); })); Clear = new DelegateCommand(async () => await Exec(async () => { await _dev!.清除状态(Ct()); Log("状态已清除"); })); ModeWIDE = new DelegateCommand(async () => await Exec(async () => { await _dev!.设置测试模式_WIDE(Ct()); Log("WIDE模式"); })); ModeIEC = new DelegateCommand(async () => await Exec(async () => { await _dev!.设置测试模式_IEC(Ct()); Log("IEC模式"); })); QV = new DelegateCommand(async () => await Exec(async () => { MeasuredVoltage = await _dev!.查询电压_不含变比(Channel, Ct()); Log($"CH{Channel}电压={MeasuredVoltage}V"); })); QI = new DelegateCommand(async () => await Exec(async () => { MeasuredCurrent = await _dev!.查询电流_不含变比(Channel, Ct()); Log($"CH{Channel}电流={MeasuredCurrent}A"); })); QP = new DelegateCommand(async () => await Exec(async () => { MeasuredPower = await _dev!.查询功率_不含变比(Channel, Ct()); Log($"CH{Channel}功率={MeasuredPower}W"); })); QP123 = new DelegateCommand(async () => await Exec(async () => { TotalPower = await _dev!.查询总功率P123(Ct()); Log($"三相总功率={TotalPower}W"); })); QTHD = new DelegateCommand(async () => await Exec(async () => { VoltageTHD = await _dev!.查询电压THD(Channel, Ct()); CurrentTHD = await _dev!.查询电流THD(Channel, Ct()); Log($"CH{Channel} THD→U:{VoltageTHD}% I:{CurrentTHD}%"); })); Initialize(); } #region 初始化 / Navigation public void Initialize(string? deviceName = null) { PW8001? found = null; string? fn = null; if (deviceName != null && _dm.DeviceMap.TryGetValue(deviceName, out var d) && d is PW8001 e) { found = e; fn = deviceName; } else { foreach (var kv in _dm.DeviceMap) if (kv.Value is PW8001 it) { found = it; fn = kv.Key; break; } } _dev = found; DeviceName = fn ?? "PW8001 (未找到)"; IsConnected = _dev?.IsConnected ?? false; Log(found != null ? $"已关联设备 [{DeviceName}],连接:{(IsConnected ? "已连接" : "未连接")}" : "未在 DeviceManager 中找到 PW8001 设备"); } public override void OnNavigatedTo(NavigationContext context) { var pName = context.Parameters.GetValue("DeviceName"); Initialize(pName); } #endregion #region 辅助 private CancellationToken Ct() => (_cts = new CancellationTokenSource(TimeSpan.FromSeconds(10))).Token; private async Task Exec(Func action) { if (_dev == null) { Log("错误:未关联到设备实例,请检查设备配置。"); return; } if (IsBusy) return; IsBusy = true; try { await action(); IsConnected = _dev.IsConnected; } catch (OperationCanceledException) { Log("命令超时或已取消。"); } catch (Exception ex) { Log($"错误:{ex.Message}"); } finally { IsBusy = false; } } private void Log(string message) { var line = $"[{DateTime.Now:HH:mm:ss}] {message}"; ResponseLog = ResponseLog.Length > 4000 ? line + "\n" + ResponseLog[..3000] : line + "\n" + ResponseLog; } #endregion public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } } }