using MembranePoreTester.Communication; using System.Collections.ObjectModel; using System.ComponentModel; // 用于 PropertyChanged using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace MembranePoreTester.ViewModels { public class MainViewModel : ViewModelBase { public ObservableCollection Stations { get; } = new(); public class StationItem : ViewModelBase { private readonly IPlcService _plcService; private readonly PlcConfiguration _plcConfig; private bool _isPressing; private string _pressButtonText = "加压"; private string _highLowPressure = "低压"; private bool _enableStatus; // M21 状态 public string Name { get; set; } public BubblePointViewModel BubblePointVM { get; set; } public PoreDistributionViewModel PoreDistributionVM { get; set; } public int StationId { get; set; } public string HighLowPressure { get => _highLowPressure; set { if (SetProperty(ref _highLowPressure, value)) { // 当选择变化时,写入 PLC 压力模式寄存器 Task.Run(async () => await WritePressureModeAsync(value)); } } } public string PressButtonText { get => _pressButtonText; set => SetProperty(ref _pressButtonText, value); } // 使能状态(只读) public bool EnableStatus { get => _enableStatus; private set => SetProperty(ref _enableStatus, value); } // 使能状态显示文本 public string EnableStatusText => EnableStatus ? "运行中" : "未启动"; // 使能状态显示颜色(绿色表示运行中,灰色表示未启动) public string EnableStatusColor => EnableStatus ? "Green" : "Gray"; // 定时器,用于轮询 M21 状态 private System.Windows.Threading.DispatcherTimer _timer; public ICommand PressCommand { get; } //public ICommand BurstCommand { get; } public ICommand StartCommand { get; } public ICommand StopCommand { get; } public ICommand EnableCommand { get; } // 备用,但可以使用复选框直接绑定 public StationItem() { _plcService = App.PlcService; _plcConfig = App.PlcConfig; PressCommand = new RelayCommand(async () => await TogglePressAsync()); //BurstCommand = new RelayCommand(async () => await ReadBurstPressureAsync()); StartCommand = new RelayCommand(async () => await WriteCoilAsync(_plcConfig.StartCoil, true)); StopCommand = new RelayCommand(async () => await WriteCoilAsync(_plcConfig.StopCoil, true)); // 启动定时器,每秒读取一次 M21 状态 _timer = new System.Windows.Threading.DispatcherTimer(); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += async (s, e) => await ReadEnableStatusAsync(); _timer.Start(); } private async Task TogglePressAsync() { _isPressing = !_isPressing; await WriteCoilAsync(_plcConfig.PressCoil, _isPressing); PressButtonText = _isPressing ? "停止加压" : "加压"; } private async Task ReadEnableStatusAsync() { try { bool status = await _plcService.ReadCoilAsync(_plcConfig.EnableCoil); // 读取 M21 EnableStatus = status; } catch (Exception ex) { // 读取出错时保持原状态或显示错误 System.Diagnostics.Debug.WriteLine($"读取使能状态失败: {ex.Message}"); } } private async Task WriteCoilAsync(ushort coil, bool value) { try { await _plcService.WriteCoilAsync(coil, value); } catch (Exception ex) { MessageBox.Show($"写线圈失败: {ex.Message}"); } } private async Task WritePressureModeAsync(string mode) { ushort val = mode == "高压" ? (ushort)1 : (ushort)0; try { await _plcService.WriteRegisterAsync(_plcConfig.PressureModeRegister, val); } catch (Exception ex) { MessageBox.Show($"写压力模式失败: {ex.Message}"); } } } public MainViewModel() { for (int i = 1; i <= 3; i++) { var station = new StationItem { Name = $"工位 {i}", BubblePointVM = new BubblePointViewModel { StationId = i }, PoreDistributionVM = new PoreDistributionViewModel { StationId = i }, StationId = i }; Stations.Add(station); } } } }