This commit is contained in:
GukSang.Jin
2026-04-07 11:58:05 +08:00
parent d8e8e61e7e
commit 03b08e1e88
4 changed files with 91 additions and 30 deletions

View File

@@ -135,13 +135,18 @@ public partial class PumpControlChannel : ObservableObject
: SetpointAvailable : SetpointAvailable
? RawSetpointValue.ToString() ? RawSetpointValue.ToString()
: "--"; : "--";
public string Rs485RunStateText => Rs485RunStatusCode switch public string Rs485RunStateText => PendingRs485RunningState switch
{
true => "启动确认中",
false => "停止确认中",
null => Rs485RunStatusCode switch
{ {
0 => "停止", 0 => "停止",
1 => "运行", 1 => "运行",
2 => "暂停", 2 => "暂停",
null => "--", null => "--",
_ => $"状态{Rs485RunStatusCode}" _ => $"状态{Rs485RunStatusCode}"
}
}; };
public string PumpGroupName => Key switch public string PumpGroupName => Key switch
{ {
@@ -151,22 +156,32 @@ public partial class PumpControlChannel : ObservableObject
"HemolysisDrainageSinglePump" or "HemolysisReturnSinglePump" or "HemolysisDualLumenPump" => "血细胞破坏", "HemolysisDrainageSinglePump" or "HemolysisReturnSinglePump" or "HemolysisDualLumenPump" => "血细胞破坏",
_ => "其他" _ => "其他"
}; };
public string StateText => !StateAvailable public string StateText => PendingRs485RunningState switch
{
true => "启动中",
false => "停止中",
null => !StateAvailable
? "未知" ? "未知"
: !IsRunning : !IsRunning
? "停止" ? "停止"
: IsFlowEstablished : IsFlowEstablished
? "运行" ? "运行"
: "启动中"; : "启动中"
};
public string StateHint => IsRs485Busy public string StateHint => IsRs485Busy
? string.IsNullOrWhiteSpace(Rs485BusyOperation) ? "RS485 操作中" : $"RS485 {Rs485BusyOperation}中" ? string.IsNullOrWhiteSpace(Rs485BusyOperation) ? "RS485 操作中" : $"RS485 {Rs485BusyOperation}中"
: !StateAvailable : PendingRs485RunningState switch
{
true => "等待驱动/流量确认",
false => "等待停止确认",
null => !StateAvailable
? "未收到状态反馈" ? "未收到状态反馈"
: !IsRunning : !IsRunning
? "泵未启动" ? "泵未启动"
: IsFlowEstablished : IsFlowEstablished
? "流量已建立" ? "流量已建立"
: "等待流量建立"; : "等待流量建立"
};
public string IndicatorColor => !StateAvailable public string IndicatorColor => !StateAvailable
? "#FF94A6AE" ? "#FF94A6AE"
: !IsRunning : !IsRunning
@@ -176,9 +191,17 @@ public partial class PumpControlChannel : ObservableObject
: "#FFD38A16"; : "#FFD38A16";
public string CardPrimaryDisplay => UsesLegacyPlcDirectControl ? StateText : FlowDisplay; public string CardPrimaryDisplay => UsesLegacyPlcDirectControl ? StateText : FlowDisplay;
public string FlowDisplay => !FlowAddress.HasValue ? "-" : FlowAvailable ? $"{FlowValue:F2} L/min" : "--"; public string FlowDisplay => !FlowAddress.HasValue ? "-" : FlowAvailable ? $"{FlowValue:F2} L/min" : "--";
public string ActionText => IsRs485Busy ? "处理中" : IsRunning ? "停止" : "启动"; public string ActionText => IsRs485Busy
public bool CanToggleRs485Action => IsRunning || HasConfirmedSetpointCalibration; ? "处理中"
public string ToggleActionHint => CanToggleRs485Action ? string.Empty : "未完成流量换算标定确认"; : PendingRs485RunningState == true || IsRunning
? "停止"
: "启动";
public bool CanToggleRs485Action => PendingRs485RunningState == true || IsRunning || HasConfirmedSetpointCalibration;
public string ToggleActionHint => PendingRs485RunningState == true
? "启动确认中,可执行停止"
: CanToggleRs485Action
? string.Empty
: "未完成流量换算标定确认";
public string Rs485ReadActionText => IsRs485Busy ? "处理中" : "读取"; public string Rs485ReadActionText => IsRs485Busy ? "处理中" : "读取";
public string Rs485WriteActionText => IsRs485Busy ? "处理中" : "写入"; public string Rs485WriteActionText => IsRs485Busy ? "处理中" : "写入";
public string SetpointStatusForeground => ResolveSetpointStatusForeground(); public string SetpointStatusForeground => ResolveSetpointStatusForeground();
@@ -290,6 +313,16 @@ public partial class PumpControlChannel : ObservableObject
partial void OnRs485RunStatusCodeChanged(ushort? value) => OnPropertyChanged(nameof(Rs485RunStateText)); partial void OnRs485RunStatusCodeChanged(ushort? value) => OnPropertyChanged(nameof(Rs485RunStateText));
partial void OnPendingRs485RunningStateChanged(bool? value)
{
OnPropertyChanged(nameof(Rs485RunStateText));
OnPropertyChanged(nameof(StateText));
OnPropertyChanged(nameof(StateHint));
OnPropertyChanged(nameof(ActionText));
OnPropertyChanged(nameof(CanToggleRs485Action));
OnPropertyChanged(nameof(ToggleActionHint));
}
partial void OnIsRs485BusyChanged(bool value) partial void OnIsRs485BusyChanged(bool value)
{ {
OnPropertyChanged(nameof(StateHint)); OnPropertyChanged(nameof(StateHint));

View File

@@ -1,4 +1,4 @@
using System.IO.Ports; using System.IO.Ports;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
@@ -185,13 +185,16 @@ public sealed class Rs485PumpFlowService : IRs485PumpFlowService
Thread.Sleep(PostCommandVerifyDelayMs); Thread.Sleep(PostCommandVerifyDelayMs);
} }
if (TryReadRegister(master, slave, request.PumpSettings.RunStatusRegister, out var runStatusValue, out _)) if (TryReadRegister(master, slave, request.PumpSettings.MotorControlRegister, out var motorCommandReadback, out _)
&& motorCommandReadback != unchecked((ushort)rawMotorSpeed))
{ {
if (runStatusValue != 1) return Failure($"RS485 直接启动失败:控制寄存器回读 {motorCommandReadback},目标 {rawMotorSpeed}");
{
return Failure($"RS485 直启失败:运行状态返回 {runStatusValue},未确认启动");
} }
if (TryReadRegister(master, slave, request.PumpSettings.RunStatusRegister, out var runStatusValue, out _))
{
if (runStatusValue == 1)
{
return new Rs485PumpFlowOperationResult return new Rs485PumpFlowOperationResult
{ {
Success = true, Success = true,
@@ -200,6 +203,13 @@ public sealed class Rs485PumpFlowService : IRs485PumpFlowService
}; };
} }
return new Rs485PumpFlowOperationResult
{
Success = true,
Message = $"RS485 启动命令已下发,控制值 {rawMotorSpeed},运行状态当前为 {runStatusValue},等待流量确认"
};
}
return new Rs485PumpFlowOperationResult return new Rs485PumpFlowOperationResult
{ {
Success = true, Success = true,
@@ -228,6 +238,12 @@ public sealed class Rs485PumpFlowService : IRs485PumpFlowService
Thread.Sleep(PostCommandVerifyDelayMs); Thread.Sleep(PostCommandVerifyDelayMs);
} }
if (TryReadRegister(master, slave, request.PumpSettings.MotorControlRegister, out var motorCommandReadback, out _)
&& motorCommandReadback != 0)
{
return Failure($"RS485 直接停止失败:控制寄存器回读 {motorCommandReadback},未回到 0");
}
if (TryReadRegister(master, slave, request.PumpSettings.RunStatusRegister, out var runStatusValue, out _)) if (TryReadRegister(master, slave, request.PumpSettings.RunStatusRegister, out var runStatusValue, out _))
{ {
if (runStatusValue != 0) if (runStatusValue != 0)
@@ -246,7 +262,8 @@ public sealed class Rs485PumpFlowService : IRs485PumpFlowService
return new Rs485PumpFlowOperationResult return new Rs485PumpFlowOperationResult
{ {
Success = true, Success = true,
Message = "RS485 停止命令已下发,等待流量确认" Message = "RS485 直接停止成功,控制寄存器已回到 0",
RunStatus = 0
}; };
}); });
} }

View File

@@ -854,7 +854,17 @@ public partial class MainViewModel
return; return;
} }
if (!expectedRunning)
{
pump.PendingRs485RunningState = null;
pump.IsRunning = false;
pump.StateAvailable = true;
pump.Rs485RunStatusCode = 0;
return;
}
pump.PendingRs485RunningState = expectedRunning; pump.PendingRs485RunningState = expectedRunning;
pump.IsRunning = expectedRunning;
pump.StateAvailable = false; pump.StateAvailable = false;
pump.Rs485RunStatusCode = null; pump.Rs485RunStatusCode = null;
} }

View File

@@ -696,7 +696,8 @@ public partial class MainViewModel : ObservableObject, IDisposable
return; return;
} }
var nextState = !pump.IsRunning; var effectiveRunning = pump.PendingRs485RunningState ?? pump.IsRunning;
var nextState = !effectiveRunning;
if (await TryTogglePumpControlViaRs485(pump, nextState)) if (await TryTogglePumpControlViaRs485(pump, nextState))
{ {
return; return;