97 lines
3.6 KiB
C#
97 lines
3.6 KiB
C#
using System.Windows.Input;
|
|
using MembranePoreTester.Communication;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
|
|
namespace MembranePoreTester.ViewModels
|
|
{
|
|
public class StationViewModel : ViewModelBase
|
|
{
|
|
private readonly IPlcService _plcService;
|
|
private readonly PlcConfiguration _plcConfig;
|
|
private bool _isPressing;
|
|
private string _pressButtonText = "加压";
|
|
private string _highLowPressure = "低压";
|
|
private bool _enableChecked;
|
|
|
|
public int StationId { get; set; }
|
|
|
|
public BubblePointViewModel BubblePointVM { get; } = new();
|
|
public PoreDistributionViewModel PoreDistributionVM { get; } = new();
|
|
|
|
public string HighLowPressure
|
|
{
|
|
get => _highLowPressure;
|
|
set => SetProperty(ref _highLowPressure, value);
|
|
}
|
|
|
|
public string PressButtonText
|
|
{
|
|
get => _pressButtonText;
|
|
set => SetProperty(ref _pressButtonText, value);
|
|
}
|
|
|
|
public bool EnableChecked
|
|
{
|
|
get => _enableChecked;
|
|
set => SetProperty(ref _enableChecked, value);
|
|
}
|
|
|
|
public ICommand PressCommand { get; }
|
|
public ICommand BurstCommand { get; }
|
|
public ICommand StartCommand { get; }
|
|
public ICommand StopCommand { get; }
|
|
public ICommand EnableCommand { get; } // 用于使能复选框
|
|
|
|
public StationViewModel()
|
|
{
|
|
_plcService = App.PlcService;
|
|
_plcConfig = App.PlcConfig;
|
|
BubblePointVM.StationId = StationId;
|
|
PoreDistributionVM.StationId = StationId;
|
|
// 初始化按钮文字
|
|
_pressButtonText = "加压"; // 直接设置字段,避免触发属性通知循环
|
|
PressButtonText = "加压"; // 或者通过属性设置
|
|
System.Diagnostics.Debug.WriteLine($"工位{StationId} PressButtonText初始值: {PressButtonText}");
|
|
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));
|
|
// 使能复选框点击时写入对应线圈
|
|
EnableCommand = new RelayCommand(async () => await WriteCoilAsync(_plcConfig.EnableCoil, EnableChecked));
|
|
}
|
|
|
|
private async Task TogglePressAsync()
|
|
{
|
|
_isPressing = !_isPressing;
|
|
await WriteCoilAsync(_plcConfig.PressCoil, _isPressing);
|
|
PressButtonText = _isPressing ? "停止加压" : "加压";
|
|
}
|
|
|
|
private async Task ReadBurstPressureAsync()
|
|
{
|
|
try
|
|
{
|
|
float pressure = await ((ModbusTcpPlcService)_plcService).ReadPressureAsync(StationId);
|
|
BubblePointVM.UpdateBubblePointPressure(pressure * _plcConfig.PressureFactor);
|
|
MessageBox.Show($"涨破压力: {pressure} {BubblePointVM.Record.PressureUnit}", "提示");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show($"读取压力失败: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private async Task WriteCoilAsync(ushort coil, bool value)
|
|
{
|
|
try
|
|
{
|
|
await ((ModbusTcpPlcService)_plcService).WriteCoilAsync(coil, value);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show($"写线圈失败: {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
} |