更新
This commit is contained in:
@@ -29,8 +29,8 @@ namespace TabletTester2025
|
||||
await LoadPlcFloatToTextBoxAsync(ResolveDisintegrationSpeedRegister(), DisintegrationSpeedBox);
|
||||
|
||||
// 溶出度
|
||||
await LoadPlcIntToTextBoxAsync(ResolveDissolution1TimeRegister(), Dissolution1TimeBox);
|
||||
await LoadPlcIntToTextBoxAsync(ResolveDissolution2TimeRegister(), Dissolution2TimeBox);
|
||||
await LoadPlcFloatToTextBoxAsync(ResolveDissolution1SpeedRegister(), Dissolution1SpeedBox);
|
||||
await LoadPlcFloatToTextBoxAsync(ResolveDissolution2SpeedRegister(), Dissolution2SpeedBox);
|
||||
await LoadPlcIntToTextBoxAsync(ResolveDissolution1IntervalRegister(), Dissolution1IntervalBox);
|
||||
await LoadPlcIntToTextBoxAsync(ResolveDissolution2IntervalRegister(), Dissolution2IntervalBox);
|
||||
}
|
||||
@@ -38,8 +38,6 @@ namespace TabletTester2025
|
||||
private void LoadSettings()
|
||||
{
|
||||
var p = App.CurrentPharmaParams;
|
||||
HardnessMinBox.Text = p.HardnessMin_N.ToString();
|
||||
HardnessMaxBox.Text = p.HardnessMax_N.ToString();
|
||||
HardnessCountBox.Text = p.HardnessTestCount.ToString();
|
||||
FriabilityRpmBox.Text = p.FriabilityTargetRpm.ToString();
|
||||
//FriabilityTimeBox.Text = ResolveFriabilityTargetTimeMin(p).ToString("0.###");
|
||||
@@ -49,25 +47,26 @@ namespace TabletTester2025
|
||||
//DisintegrationMaxSecBox.Text = p.DisintegrationMaxSeconds.ToString();
|
||||
DisintegrationSpeedBox.Text = p.DisintegrationSpeedRpm.ToString();
|
||||
//DisintegrationTempBox.Text = p.DisintegrationTemperatureC.ToString();
|
||||
DissolutionMinPercentBox.Text = p.DissolutionMinPercentAt30min.ToString();
|
||||
//DissolutionTempBox.Text = p.DissolutionTemperatureC.ToString();
|
||||
Dissolution1TimeBox.Text = p.Dissolution1TimeMin.ToString();
|
||||
Dissolution2TimeBox.Text = p.Dissolution2TimeMin.ToString();
|
||||
Dissolution1IntervalBox.Text = p.Dissolution1SampleIntervalMin.ToString();
|
||||
Dissolution2IntervalBox.Text = p.Dissolution2SampleIntervalMin.ToString();
|
||||
SampleTimesBox.Text = string.Join(",", p.DissolutionSampleTimes ?? Array.Empty<int>());
|
||||
}
|
||||
|
||||
private async void SaveButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
var current = App.CurrentPharmaParams;
|
||||
var p = new PharmaParameters
|
||||
{
|
||||
StandardVersion = App.CurrentPharmaParams.StandardVersion
|
||||
StandardVersion = current.StandardVersion,
|
||||
HardnessMin_N = current.HardnessMin_N,
|
||||
HardnessMax_N = current.HardnessMax_N,
|
||||
DissolutionMinPercentAt30min = current.DissolutionMinPercentAt30min,
|
||||
Dissolution1TimeMin = current.Dissolution1TimeMin,
|
||||
Dissolution2TimeMin = current.Dissolution2TimeMin,
|
||||
DissolutionSampleTimes = current.DissolutionSampleTimes?.ToArray() ?? Array.Empty<int>()
|
||||
};
|
||||
p.HardnessMin_N = ParseFiniteDouble(HardnessMinBox.Text, "硬度内控下限");
|
||||
p.HardnessMax_N = ParseFiniteDouble(HardnessMaxBox.Text, "硬度内控上限");
|
||||
p.HardnessTestCount = int.Parse(HardnessCountBox.Text);
|
||||
double hardnessPressure = ParseFiniteDouble(HardnessPressureBox.Text, "加压压力");
|
||||
int hardnessDamageThreshold = ParsePositiveInt(HardnessDamageThresholdBox.Text, "硬度破损判定");
|
||||
@@ -80,21 +79,18 @@ namespace TabletTester2025
|
||||
//p.DisintegrationMaxSeconds = int.Parse(DisintegrationMaxSecBox.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);
|
||||
double dissolution1Speed = ParsePositiveDouble(Dissolution1SpeedBox.Text, "溶出速度1");
|
||||
double dissolution2Speed = ParsePositiveDouble(Dissolution2SpeedBox.Text, "溶出速度2");
|
||||
p.Dissolution1SampleIntervalMin = ParsePositiveInt(Dissolution1IntervalBox.Text, "溶出1取样间隔");
|
||||
p.Dissolution2SampleIntervalMin = ParsePositiveInt(Dissolution2IntervalBox.Text, "溶出2取样间隔");
|
||||
p.DissolutionSampleTimes = SampleTimesBox.Text
|
||||
.Split(',', StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(s => int.Parse(s.Trim()))
|
||||
.ToArray();
|
||||
|
||||
ValidateParameters(p);
|
||||
await WriteHardnessPressureAsync(hardnessPressure);
|
||||
await WriteHardnessDamageThresholdAsync(hardnessDamageThreshold);
|
||||
await WriteFriabilityRpmAsync(friabilityRpm);
|
||||
await WriteDissolution1SpeedAsync(dissolution1Speed);
|
||||
await WriteDissolution2SpeedAsync(dissolution2Speed);
|
||||
App.CurrentPharmaParams = p;
|
||||
App.SaveCurrentPharmaParameters();
|
||||
|
||||
@@ -167,7 +163,7 @@ namespace TabletTester2025
|
||||
if (p.Dissolution1SampleIntervalMin <= 0 || p.Dissolution2SampleIntervalMin <= 0)
|
||||
throw new InvalidOperationException("溶出取样间隔必须大于0。");
|
||||
if (p.DissolutionSampleTimes == null || p.DissolutionSampleTimes.Length == 0 || p.DissolutionSampleTimes.Any(t => t <= 0))
|
||||
throw new InvalidOperationException("溶出取样时间点必须为大于0的分钟数。");
|
||||
throw new InvalidOperationException("溶出取样配置必须为有效的正数分钟值。");
|
||||
}
|
||||
|
||||
private static double ParseFiniteDouble(string text, string fieldName)
|
||||
@@ -190,6 +186,15 @@ namespace TabletTester2025
|
||||
return value;
|
||||
}
|
||||
|
||||
private static double ParsePositiveDouble(string text, string fieldName)
|
||||
{
|
||||
double value = ParseFiniteDouble(text, fieldName);
|
||||
if (value <= 0)
|
||||
throw new InvalidOperationException($"{fieldName}必须大于0。");
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
private async Task LoadHardnessPressureAsync()
|
||||
{
|
||||
ushort registerAddress = ResolveHardnessPressureRegister();
|
||||
@@ -306,14 +311,32 @@ namespace TabletTester2025
|
||||
return App.PlcConfig.DisintegrationSpeed != 0 ? App.PlcConfig.DisintegrationSpeed : (ushort)330;
|
||||
}
|
||||
|
||||
private static ushort ResolveDissolution1TimeRegister()
|
||||
private static async Task WriteDissolution1SpeedAsync(double value)
|
||||
{
|
||||
return App.PlcConfig.Dissolution1Time != 0 ? App.PlcConfig.Dissolution1Time : (ushort)430;
|
||||
ushort registerAddress = ResolveDissolution1SpeedRegister();
|
||||
if (registerAddress == 0)
|
||||
throw new InvalidOperationException("溶出速度1 PLC寄存器地址未配置。");
|
||||
|
||||
await App.PlcService.WriteFloatAsync(registerAddress, (float)value);
|
||||
}
|
||||
|
||||
private static ushort ResolveDissolution2TimeRegister()
|
||||
private static async Task WriteDissolution2SpeedAsync(double value)
|
||||
{
|
||||
return App.PlcConfig.Dissolution2Time != 0 ? App.PlcConfig.Dissolution2Time : (ushort)440;
|
||||
ushort registerAddress = ResolveDissolution2SpeedRegister();
|
||||
if (registerAddress == 0)
|
||||
throw new InvalidOperationException("溶出速度2 PLC寄存器地址未配置。");
|
||||
|
||||
await App.PlcService.WriteFloatAsync(registerAddress, (float)value);
|
||||
}
|
||||
|
||||
private static ushort ResolveDissolution1SpeedRegister()
|
||||
{
|
||||
return App.PlcConfig.Dissolution1Speed != 0 ? App.PlcConfig.Dissolution1Speed : (ushort)340;
|
||||
}
|
||||
|
||||
private static ushort ResolveDissolution2SpeedRegister()
|
||||
{
|
||||
return App.PlcConfig.Dissolution2Speed != 0 ? App.PlcConfig.Dissolution2Speed : (ushort)350;
|
||||
}
|
||||
|
||||
private static ushort ResolveDissolution1IntervalRegister()
|
||||
|
||||
Reference in New Issue
Block a user