This commit is contained in:
@@ -12,9 +12,41 @@ namespace MembranePoreTester.ViewModels
|
||||
public class MainViewModel : ViewModelBase
|
||||
{
|
||||
public ObservableCollection<StationItem> Stations { get; } = new();
|
||||
public class PressureModeItem
|
||||
{
|
||||
public string Text { get; set; }
|
||||
public int Value { get; set; }
|
||||
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Text; // 直接返回要显示的文本
|
||||
}
|
||||
}
|
||||
public class StationItem : ViewModelBase
|
||||
{
|
||||
private PressureModeItem _selectedPressureMode;
|
||||
private List<PressureModeItem> _pressureModeList;
|
||||
|
||||
public List<PressureModeItem> PressureModeList => _pressureModeList ??= new List<PressureModeItem>
|
||||
{
|
||||
new PressureModeItem { Text = "低压", Value = 1 },
|
||||
new PressureModeItem { Text = "高压", Value = 0 }
|
||||
};
|
||||
|
||||
public PressureModeItem SelectedPressureMode
|
||||
{
|
||||
get => _selectedPressureMode;
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _selectedPressureMode, value))
|
||||
{
|
||||
Task.Run(async () => await WritePressureModeAsync(value?.Text ?? "低压"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private readonly IPlcService _plcService;
|
||||
private readonly PlcConfiguration _plcConfig;
|
||||
private bool _isPressing;
|
||||
@@ -29,13 +61,13 @@ namespace MembranePoreTester.ViewModels
|
||||
|
||||
public string HighLowPressure
|
||||
{
|
||||
get => _highLowPressure;
|
||||
get => _selectedPressureMode?.Text ?? "低压";
|
||||
set
|
||||
{
|
||||
if (SetProperty(ref _highLowPressure, value))
|
||||
var mode = PressureModeList.FirstOrDefault(m => m.Text == value);
|
||||
if (mode != null)
|
||||
{
|
||||
// 当选择变化时,写入 PLC 压力模式寄存器
|
||||
Task.Run(async () => await WritePressureModeAsync(value));
|
||||
SelectedPressureMode = mode;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -46,17 +78,25 @@ namespace MembranePoreTester.ViewModels
|
||||
set => SetProperty(ref _pressButtonText, value);
|
||||
}
|
||||
|
||||
// 使能状态(只读)
|
||||
public bool EnableStatus
|
||||
{
|
||||
get => _enableStatus;
|
||||
private set => SetProperty(ref _enableStatus, value);
|
||||
private set
|
||||
{
|
||||
if (SetProperty(ref _enableStatus, value))
|
||||
{
|
||||
// 当 EnableStatus 变化时,通知依赖的属性也变化
|
||||
OnPropertyChanged(nameof(EnableStatusText));
|
||||
OnPropertyChanged(nameof(EnableStatusColor));
|
||||
}
|
||||
}
|
||||
}
|
||||
// 使能状态显示文本
|
||||
public string EnableStatusText => EnableStatus ? "运行中" : "未启动";
|
||||
|
||||
// 使能状态显示颜色(绿色表示运行中,灰色表示未启动)
|
||||
public string EnableStatusColor => EnableStatus ? "Green" : "Gray";
|
||||
// 使能状态显示颜色(更亮的颜色)
|
||||
public string EnableStatusColor => EnableStatus ? "#00FF00" : "#FF3333";
|
||||
|
||||
// 定时器,用于轮询 M21 状态
|
||||
private System.Windows.Threading.DispatcherTimer _timer;
|
||||
@@ -67,8 +107,21 @@ namespace MembranePoreTester.ViewModels
|
||||
public ICommand StopCommand { get; }
|
||||
public ICommand EnableCommand { get; } // 备用,但可以使用复选框直接绑定
|
||||
|
||||
|
||||
|
||||
|
||||
public StationItem()
|
||||
{
|
||||
|
||||
if (IsInDesignMode())
|
||||
{
|
||||
return; // 设计时跳过PLC初始化
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
_plcService = App.PlcService;
|
||||
_plcConfig = App.PlcConfig;
|
||||
|
||||
@@ -81,15 +134,55 @@ namespace MembranePoreTester.ViewModels
|
||||
_timer.Interval = TimeSpan.FromSeconds(1);
|
||||
_timer.Tick += async (s, e) => await ReadEnableStatusAsync();
|
||||
_timer.Start();
|
||||
|
||||
// 延迟2秒后读取,确保连接稳定
|
||||
Task.Delay(2000).ContinueWith(async _ =>
|
||||
{
|
||||
await ReadPressureModeAsync();
|
||||
}, TaskScheduler.Default);
|
||||
|
||||
}
|
||||
private async Task ReadPressureModeAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
ushort[] values = await _plcService.ReadHoldingRegistersAsync(_plcConfig.PressureModeRegister, 1);
|
||||
ushort val = values[0];
|
||||
string newValue = val == 0 ? "高压" : "低压";
|
||||
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
// 更新选中项
|
||||
HighLowPressure = newValue;
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"读取压力模式失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task TogglePressAsync()
|
||||
{
|
||||
_isPressing = !_isPressing;
|
||||
await WriteCoilAsync(_plcConfig.PressCoil, _isPressing);
|
||||
PressButtonText = _isPressing ? "停止加压" : "加压";
|
||||
}
|
||||
try
|
||||
{
|
||||
// 先读取PLC当前的加压状态
|
||||
bool currentStatus = await _plcService.ReadCoilAsync(_plcConfig.PressCoil);
|
||||
|
||||
// 切换状态
|
||||
_isPressing = !currentStatus;
|
||||
|
||||
// 写入新状态到PLC
|
||||
await WriteCoilAsync(_plcConfig.PressCoil, _isPressing);
|
||||
|
||||
// 更新按钮文字
|
||||
PressButtonText = _isPressing ? "停止加压" : "加压";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"读取加压状态失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ReadEnableStatusAsync()
|
||||
{
|
||||
@@ -97,6 +190,20 @@ namespace MembranePoreTester.ViewModels
|
||||
{
|
||||
bool status = await _plcService.ReadCoilAsync(_plcConfig.EnableCoil); // 读取 M21
|
||||
EnableStatus = status;
|
||||
|
||||
|
||||
bool pressStatus = await _plcService.ReadCoilAsync(_plcConfig.PressCoil);//这里也要更新加压的按钮状态
|
||||
|
||||
_isPressing = pressStatus;
|
||||
|
||||
// 在UI线程更新按钮文字
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
PressButtonText = pressStatus ? "停止加压" : "加压";
|
||||
});
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user