更新201

This commit is contained in:
GukSang.Jin
2026-05-19 17:19:54 +08:00
parent 72fac0e41b
commit 8d504d91e5
4 changed files with 58 additions and 17 deletions

View File

@@ -36,37 +36,41 @@ namespace TabletTester2025
Dissolution2TimeBox.Text = p.Dissolution2TimeMin.ToString();
Dissolution1IntervalBox.Text = p.Dissolution1SampleIntervalMin.ToString();
Dissolution2IntervalBox.Text = p.Dissolution2SampleIntervalMin.ToString();
SampleTimesBox.Text = string.Join(",", p.DissolutionSampleTimes);
SampleTimesBox.Text = string.Join(",", p.DissolutionSampleTimes ?? Array.Empty<int>());
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
try
{
var p = App.CurrentPharmaParams;
p.HardnessMin_N = double.Parse(HardnessMinBox.Text);
p.HardnessMax_N = double.Parse(HardnessMaxBox.Text);
var p = new PharmaParameters
{
StandardVersion = App.CurrentPharmaParams.StandardVersion
};
p.HardnessMin_N = ParseFiniteDouble(HardnessMinBox.Text, "硬度内控下限");
p.HardnessMax_N = ParseFiniteDouble(HardnessMaxBox.Text, "硬度内控上限");
p.HardnessTestCount = int.Parse(HardnessCountBox.Text);
p.FriabilityTargetRpm = double.Parse(FriabilityRpmBox.Text);
p.FriabilityTargetTimeMin = double.Parse(FriabilityTimeBox.Text);
p.FriabilityTargetRpm = ParseFiniteDouble(FriabilityRpmBox.Text, "脆碎度转速");
p.FriabilityTargetTimeMin = ParseFiniteDouble(FriabilityTimeBox.Text, "脆碎度试验时间");
p.FriabilityTargetRounds = CalculateFriabilityRounds(p.FriabilityTargetTimeMin, p.FriabilityTargetRpm);
p.FriabilityMaxLossPercent = double.Parse(FriabilityMaxLossBox.Text);
p.FriabilityMaxLossPercent = ParseFiniteDouble(FriabilityMaxLossBox.Text, "最大失重率");
p.DisintegrationDosageForm = GetSelectedDisintegrationDosageForm();
p.DisintegrationMaxSeconds = int.Parse(DisintegrationMaxSecBox.Text);
p.DisintegrationSpeedRpm = double.Parse(DisintegrationSpeedBox.Text);
p.DisintegrationTemperatureC = double.Parse(DisintegrationTempBox.Text);
p.DissolutionMinPercentAt30min = double.Parse(DissolutionMinPercentBox.Text);
p.DissolutionTemperatureC = double.Parse(DissolutionTempBox.Text);
p.DisintegrationSpeedRpm = ParseFiniteDouble(DisintegrationSpeedBox.Text, "崩解升降频率");
p.DisintegrationTemperatureC = ParseFiniteDouble(DisintegrationTempBox.Text, "崩解介质温度");
p.DissolutionMinPercentAt30min = ParseFiniteDouble(DissolutionMinPercentBox.Text, "30分钟最低溶出度");
p.DissolutionTemperatureC = ParseFiniteDouble(DissolutionTempBox.Text, "溶出介质温度");
p.Dissolution1TimeMin = int.Parse(Dissolution1TimeBox.Text);
p.Dissolution2TimeMin = int.Parse(Dissolution2TimeBox.Text);
p.Dissolution1SampleIntervalMin = double.Parse(Dissolution1IntervalBox.Text);
p.Dissolution2SampleIntervalMin = double.Parse(Dissolution2IntervalBox.Text);
p.Dissolution1SampleIntervalMin = ParseFiniteDouble(Dissolution1IntervalBox.Text, "溶出1取样间隔");
p.Dissolution2SampleIntervalMin = ParseFiniteDouble(Dissolution2IntervalBox.Text, "溶出2取样间隔");
p.DissolutionSampleTimes = SampleTimesBox.Text
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(s => int.Parse(s.Trim()))
.ToArray();
ValidateParameters(p);
App.CurrentPharmaParams = p;
App.SaveCurrentPharmaParameters();
MessageBox.Show("参数已保存并立即生效", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
@@ -96,8 +100,10 @@ namespace TabletTester2025
if (FriabilityRoundsBox == null)
return;
if (int.TryParse(FriabilityTimeBox?.Text, out int timeMin)
&& int.TryParse(FriabilityRpmBox?.Text, out int rpm)
if (double.TryParse(FriabilityTimeBox?.Text, out double timeMin)
&& double.IsFinite(timeMin)
&& double.TryParse(FriabilityRpmBox?.Text, out double rpm)
&& double.IsFinite(rpm)
&& timeMin > 0
&& rpm > 0)
{
@@ -132,14 +138,23 @@ namespace TabletTester2025
private static void ValidateParameters(PharmaParameters p)
{
if (!double.IsFinite(p.HardnessMin_N) || !double.IsFinite(p.HardnessMax_N))
throw new InvalidOperationException("硬度内控参数必须为有效数字。");
if (p.HardnessMin_N < 0 || p.HardnessMax_N <= p.HardnessMin_N)
throw new InvalidOperationException("硬度内控上限必须大于下限。");
if (p.HardnessTestCount <= 0)
throw new InvalidOperationException("硬度测试次数必须大于0。");
if (!double.IsFinite(p.FriabilityTargetRpm) || !double.IsFinite(p.FriabilityTargetTimeMin) || !double.IsFinite(p.FriabilityMaxLossPercent))
throw new InvalidOperationException("脆碎度参数必须为有效数字。");
if (p.FriabilityTargetRpm <= 0 || p.FriabilityTargetTimeMin <= 0 || p.FriabilityTargetRounds <= 0 || p.FriabilityMaxLossPercent <= 0)
throw new InvalidOperationException("脆碎度参数必须大于0。");
if (!double.IsFinite(p.DisintegrationSpeedRpm) || !double.IsFinite(p.DisintegrationTemperatureC))
throw new InvalidOperationException("崩解参数必须为有效数字。");
if (p.DisintegrationMaxSeconds <= 0 || p.DisintegrationSpeedRpm <= 0 || p.DisintegrationTemperatureC <= 0)
throw new InvalidOperationException("崩解参数必须大于0。");
if (!double.IsFinite(p.DissolutionMinPercentAt30min) || !double.IsFinite(p.DissolutionTemperatureC)
|| !double.IsFinite(p.Dissolution1SampleIntervalMin) || !double.IsFinite(p.Dissolution2SampleIntervalMin))
throw new InvalidOperationException("溶出度参数必须为有效数字。");
if (p.DissolutionMinPercentAt30min < 0 || p.DissolutionMinPercentAt30min > 150)
throw new InvalidOperationException("溶出度Q值应在0到150之间。");
if (p.DissolutionTemperatureC <= 0 || p.Dissolution1TimeMin <= 0 || p.Dissolution2TimeMin <= 0)
@@ -150,6 +165,14 @@ namespace TabletTester2025
throw new InvalidOperationException("溶出取样时间点必须为大于0的分钟数。");
}
private static double ParseFiniteDouble(string text, string fieldName)
{
if (!double.TryParse(text, out double value) || !double.IsFinite(value))
throw new InvalidOperationException($"{fieldName}必须为有效数字。");
return value;
}
private static double ResolveFriabilityTargetTimeMin(PharmaParameters p)
{
if (p.FriabilityTargetTimeMin > 0)

View File

@@ -126,9 +126,13 @@
<StackPanel>
<TextBlock Style="{StaticResource GroupTitle}" Text="⚙ 溶出测试参数"/>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource SettingLabel}" Text="溶出时间设置(min)"/>
<TextBlock Style="{StaticResource SettingLabel}" Text="溶出1时间设置(min)"/>
<TextBox Style="{StaticResource SettingTextBox}" Name="txt_DissolutionTime"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource SettingLabel}" Text="溶出2时间设置(min)"/>
<TextBox Style="{StaticResource SettingTextBox}" Name="txt_Dissolution2Time"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource SettingLabel}" Text="溶出1间隔取样时间设置"/>
<TextBox Style="{StaticResource SettingTextBox}" Name="txt_Dissolution1SamplingInterval"/>

View File

@@ -79,6 +79,17 @@ namespace 片剂四用仪.Views
// 窗口关闭时的取消异常,正常退出循环
break;
}
catch
{
try
{
await Task.Delay(1000, token);
}
catch (OperationCanceledException)
{
break;
}
}
//await Task.Delay(1000, token);
}
@@ -141,6 +152,7 @@ namespace 片剂四用仪.Views
new PlcParamMapping("txt_DisintegrationTime", 420, PlcParamType.Int),
new PlcParamMapping("txt_DissolutionTime", 430, PlcParamType.Int),
new PlcParamMapping("txt_Dissolution2Time", 440, PlcParamType.Int),
new PlcParamMapping("txt_Dissolution1SamplingInterval", 432, PlcParamType.Float),
new PlcParamMapping("txt_Dissolution2SamplingInterval", 442, PlcParamType.Float),

View File

@@ -60,7 +60,9 @@
"Dissolution2StopCoil": 33,
"Dissolution2SampleAckCoil": 34,
"Dissolution1Time": 430,
"Dissolution2Time": 440
"Dissolution2Time": 440,
"Dissolution1SampleInterval": 432,
"Dissolution2SampleInterval": 442
},
"PharmaStandard": {
"StandardVersion": "中国药典2025",