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" /> TextWrapping="Wrap" />
</StackPanel> </StackPanel>
</Border> </Border>
<Grid Grid.Row="4" Margin="0,10,0,0"> <StackPanel Grid.Row="4" Margin="0,10,0,0">
<Grid.ColumnDefinitions> <Button Height="34"
<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"
Padding="12,4" Padding="12,4"
Command="{Binding DataContext.QuickToggleRs485PumpCommand, RelativeSource={RelativeSource AncestorType=Window}}" Command="{Binding DataContext.StartSingleRs485PumpCommand, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}" CommandParameter="{Binding}"
Content="{Binding ActionText}" Content="启动"
IsEnabled="{Binding CanToggleRs485Action}" IsEnabled="{Binding CanStartRs485Action}"
Background="#FF2B8F6A" Background="#FF2B8F6A"
ToolTipService.ShowOnDisabled="True" ToolTipService.ShowOnDisabled="True"
ToolTip="{Binding ToggleActionHint}" /> ToolTip="{Binding StartActionHint}" />
</Grid> <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> </Grid>
</Border> </Border>
</DataTemplate> </DataTemplate>

View File

@@ -198,6 +198,19 @@ public partial class PumpControlChannel : ObservableObject
: PendingRs485RunningState == true || IsRunning : 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 bool CanToggleRs485Action => PendingRs485RunningState == true || IsRunning || HasConfirmedSetpointCalibration;
public string ToggleActionHint => PendingRs485RunningState == true public string ToggleActionHint => PendingRs485RunningState == true
? "启动确认中,可执行停止" ? "启动确认中,可执行停止"
@@ -215,6 +228,10 @@ public partial class PumpControlChannel : ObservableObject
OnPropertyChanged(nameof(StateHint)); OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(IndicatorColor)); OnPropertyChanged(nameof(IndicatorColor));
OnPropertyChanged(nameof(ActionText)); OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(CanStopRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(StopActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action)); OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint)); OnPropertyChanged(nameof(ToggleActionHint));
OnPropertyChanged(nameof(CardPrimaryDisplay)); OnPropertyChanged(nameof(CardPrimaryDisplay));
@@ -267,6 +284,8 @@ public partial class PumpControlChannel : ObservableObject
OnPropertyChanged(nameof(HasSetpointCalibration)); OnPropertyChanged(nameof(HasSetpointCalibration));
OnPropertyChanged(nameof(HasConfirmedSetpointCalibration)); OnPropertyChanged(nameof(HasConfirmedSetpointCalibration));
OnPropertyChanged(nameof(CalibrationStatusText)); OnPropertyChanged(nameof(CalibrationStatusText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action)); OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint)); OnPropertyChanged(nameof(ToggleActionHint));
OnPropertyChanged(nameof(SetpointReadbackDisplay)); OnPropertyChanged(nameof(SetpointReadbackDisplay));
@@ -276,6 +295,8 @@ public partial class PumpControlChannel : ObservableObject
{ {
OnPropertyChanged(nameof(HasConfirmedSetpointCalibration)); OnPropertyChanged(nameof(HasConfirmedSetpointCalibration));
OnPropertyChanged(nameof(CalibrationStatusText)); OnPropertyChanged(nameof(CalibrationStatusText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action)); OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint)); OnPropertyChanged(nameof(ToggleActionHint));
} }
@@ -284,6 +305,8 @@ public partial class PumpControlChannel : ObservableObject
{ {
OnPropertyChanged(nameof(HasConfirmedSetpointCalibration)); OnPropertyChanged(nameof(HasConfirmedSetpointCalibration));
OnPropertyChanged(nameof(CalibrationStatusText)); OnPropertyChanged(nameof(CalibrationStatusText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action)); OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint)); OnPropertyChanged(nameof(ToggleActionHint));
} }
@@ -319,6 +342,10 @@ public partial class PumpControlChannel : ObservableObject
OnPropertyChanged(nameof(StateText)); OnPropertyChanged(nameof(StateText));
OnPropertyChanged(nameof(StateHint)); OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(ActionText)); OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(CanStopRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(StopActionHint));
OnPropertyChanged(nameof(CanToggleRs485Action)); OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint)); OnPropertyChanged(nameof(ToggleActionHint));
} }
@@ -327,6 +354,10 @@ public partial class PumpControlChannel : ObservableObject
{ {
OnPropertyChanged(nameof(StateHint)); OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(ActionText)); OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanStartRs485Action));
OnPropertyChanged(nameof(CanStopRs485Action));
OnPropertyChanged(nameof(StartActionHint));
OnPropertyChanged(nameof(StopActionHint));
OnPropertyChanged(nameof(Rs485ReadActionText)); OnPropertyChanged(nameof(Rs485ReadActionText));
OnPropertyChanged(nameof(Rs485WriteActionText)); OnPropertyChanged(nameof(Rs485WriteActionText));
OnPropertyChanged(nameof(SetpointStatusForeground)); OnPropertyChanged(nameof(SetpointStatusForeground));

View File

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

View File

@@ -82,7 +82,8 @@ public sealed class ModbusTelemetryService : IModbusTelemetryService, IDisposabl
private readonly List<ValveControlChannel> _valveControls = private readonly List<ValveControlChannel> _valveControls =
[ [
new() { Key = "TestLoopValve1", Name = "测试回路阀 1", StartAddress = 10 }, 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; private TcpClient? _tcpClient;

View File

@@ -688,6 +688,33 @@ public partial class MainViewModel
await TryWriteAndStartPumpCore(pump, "RS485 快捷启动"); 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] [RelayCommand]
private async Task StartAllRs485Pumps() private async Task StartAllRs485Pumps()
{ {