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

View File

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

View File

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

View File

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