2026-03-19 20:40:54 +08:00
|
|
|
|
using MembranePoreTester.Communication;
|
|
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
|
using System.ComponentModel; // 用于 PropertyChanged
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using System.Windows;
|
|
|
|
|
|
using System.Windows.Input;
|
2026-03-02 18:50:30 +08:00
|
|
|
|
|
|
|
|
|
|
namespace MembranePoreTester.ViewModels
|
|
|
|
|
|
{
|
|
|
|
|
|
public class MainViewModel : ViewModelBase
|
|
|
|
|
|
{
|
|
|
|
|
|
public ObservableCollection<StationItem> Stations { get; } = new();
|
|
|
|
|
|
|
2026-03-19 20:40:54 +08:00
|
|
|
|
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}");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-24 19:33:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-19 20:40:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-24 19:33:35 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-02 18:50:30 +08:00
|
|
|
|
public MainViewModel()
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 1; i <= 3; i++)
|
|
|
|
|
|
{
|
2026-03-19 20:40:54 +08:00
|
|
|
|
var station = new StationItem
|
2026-03-02 18:50:30 +08:00
|
|
|
|
{
|
|
|
|
|
|
Name = $"工位 {i}",
|
|
|
|
|
|
BubblePointVM = new BubblePointViewModel { StationId = i },
|
2026-03-19 20:40:54 +08:00
|
|
|
|
PoreDistributionVM = new PoreDistributionViewModel { StationId = i },
|
|
|
|
|
|
StationId = i
|
|
|
|
|
|
};
|
|
|
|
|
|
Stations.Add(station);
|
2026-03-02 18:50:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|