This commit is contained in:
GukSang.Jin
2026-04-13 09:55:14 +08:00
parent e8245379f6
commit 631af5f682
5 changed files with 80 additions and 23 deletions

View File

@@ -204,29 +204,27 @@
TextWrapping="Wrap" />
</StackPanel>
</Border>
<Grid Grid.Row="4" Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="8" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0"
MinWidth="62"
Padding="10,4"
Command="{Binding DataContext.ReadPumpSetpointCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"
Content="读取" />
<Button Grid.Column="2"
Height="34"
<StackPanel Grid.Row="4" Margin="0,10,0,0">
<Button Height="34"
Padding="12,4"
Command="{Binding DataContext.QuickToggleRs485PumpCommand, RelativeSource={RelativeSource AncestorType=Window}}"
Command="{Binding DataContext.StartSingleRs485PumpCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"
Content="{Binding ActionText}"
IsEnabled="{Binding CanToggleRs485Action}"
Content="启动"
IsEnabled="{Binding CanStartRs485Action}"
Background="#FF2B8F6A"
ToolTipService.ShowOnDisabled="True"
ToolTip="{Binding ToggleActionHint}" />
</Grid>
ToolTip="{Binding StartActionHint}" />
<Button Height="34"
Margin="0,8,0,0"
Padding="12,4"
Command="{Binding DataContext.StopSingleRs485PumpCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"
Content="停止"
IsEnabled="{Binding CanStopRs485Action}"
Background="#FFB85C38"
ToolTipService.ShowOnDisabled="True"
ToolTip="{Binding StopActionHint}" />
</StackPanel>
</Grid>
</Border>
</DataTemplate>

View File

@@ -198,6 +198,19 @@ public partial class PumpControlChannel : ObservableObject
: PendingRs485RunningState == true || IsRunning
? "停止"
: "启动";
public bool CanStartRs485Action => !IsRs485Busy
&& PendingRs485RunningState != true
&& !IsRunning
&& HasConfirmedSetpointCalibration;
public bool CanStopRs485Action => !IsRs485Busy;
public string StartActionHint => IsRs485Busy
? "RS485 操作中"
: PendingRs485RunningState == true || IsRunning
? "泵已在运行"
: HasConfirmedSetpointCalibration
? string.Empty
: "未配置流量换算系数";
public string StopActionHint => IsRs485Busy ? "RS485 操作中" : string.Empty;
public bool CanToggleRs485Action => PendingRs485RunningState == true || IsRunning || HasConfirmedSetpointCalibration;
public string ToggleActionHint => PendingRs485RunningState == true
? "启动确认中,可执行停止"
@@ -215,6 +228,10 @@ public partial class PumpControlChannel : ObservableObject
OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(IndicatorColor));
OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(CanStopRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(StopActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint));
OnPropertyChanged(nameof(CardPrimaryDisplay));
@@ -267,6 +284,8 @@ public partial class PumpControlChannel : ObservableObject
OnPropertyChanged(nameof(HasSetpointCalibration));
OnPropertyChanged(nameof(HasConfirmedSetpointCalibration));
OnPropertyChanged(nameof(CalibrationStatusText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint));
OnPropertyChanged(nameof(SetpointReadbackDisplay));
@@ -276,6 +295,8 @@ public partial class PumpControlChannel : ObservableObject
{
OnPropertyChanged(nameof(HasConfirmedSetpointCalibration));
OnPropertyChanged(nameof(CalibrationStatusText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint));
}
@@ -284,6 +305,8 @@ public partial class PumpControlChannel : ObservableObject
{
OnPropertyChanged(nameof(HasConfirmedSetpointCalibration));
OnPropertyChanged(nameof(CalibrationStatusText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint));
}
@@ -319,6 +342,10 @@ public partial class PumpControlChannel : ObservableObject
OnPropertyChanged(nameof(StateText));
OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(CanStopRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(StopActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint));
}
@@ -327,6 +354,10 @@ public partial class PumpControlChannel : ObservableObject
{
OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(CanStopRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(StopActionHint));
OnPropertyChanged(nameof(Rs485ReadActionText));
OnPropertyChanged(nameof(Rs485WriteActionText));
OnPropertyChanged(nameof(SetpointStatusForeground));

View File

@@ -15,10 +15,10 @@ public partial class ValveControlChannel : ObservableObject
private bool stateAvailable;
public string StateText => !StateAvailable ? "未知" : IsOpen ? "开启" : "关闭";
public string ActionText => IsOpen ? "关闭阀门" : "开启阀门";
public string ActionText => IsOpen ? "关闭" : "开启";
public string IndicatorColor => !StateAvailable ? "#FF94A6AE" : IsOpen ? "#FF32B06A" : "#FFC8D4DA";
public string StateHint => !StateAvailable ? "未取得 PLC 状态" : IsOpen ? "测试回路已导通" : "测试回路已关闭";
public bool HideRealtimeCardStateDescription => Key is "TestLoopValve1" or "TestLoopValve2";
public string StateHint => !StateAvailable ? "未取得 PLC 状态" : $"{Name}已{StateText}";
public bool HideRealtimeCardStateDescription => Key is "TestLoopValve1" or "TestLoopValve2" or "CirculatingWaterTemperature";
partial void OnIsOpenChanged(bool value)
{

View File

@@ -82,7 +82,8 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
private readonly List<ValveControlChannel> _valveControls =
[
new() { Key = "TestLoopValve1", Name = "测试回路阀 1", StartAddress = 10 },
new() { Key = "TestLoopValve2", Name = "测试回路阀 2", StartAddress = 11 }
new() { Key = "TestLoopValve2", Name = "测试回路阀 2", StartAddress = 11 },
new() { Key = "CirculatingWaterTemperature", Name = "循环水温", StartAddress = 12 }
];
private TcpClient? _tcpClient;

View File

@@ -688,6 +688,33 @@ public partial class MainViewModel
await TryWriteAndStartPumpCore(pump, "RS485 快捷启动");
}
[RelayCommand]
private async Task StartSingleRs485Pump(PumpControlChannel? pump)
{
if (pump is null)
{
return;
}
await TryWriteAndStartPumpCore(pump, "RS485 单泵启动");
}
[RelayCommand]
private async Task StopSingleRs485Pump(PumpControlChannel? pump)
{
if (pump is null)
{
return;
}
if (!EnsureSessionEditable("RS485 单泵停止"))
{
return;
}
await TryTogglePumpControlViaRs485(pump, nextState: false);
}
[RelayCommand]
private async Task StartAllRs485Pumps()
{