From df5c7566fbaba56ecfc51a7e2ced391e1ee0facc Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Wed, 20 May 2026 14:27:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/ExcelExportService.cs | 9 ++++--- Services/PlcSimulator.cs | 3 ++- ViewModels/MainViewModel.cs | 2 +- ViewModels/StationViewModel.cs | 44 ++++++++++++++++++++++++++++++---- Views/HistoryWindow.xaml | 1 - Views/HistoryWindow.xaml.cs | 5 ++-- Views/MainWindow.xaml | 21 +++++++--------- Views/SettingsWindow.xaml | 4 ++++ Views/SettingsWindow.xaml.cs | 35 +++++++++++++++++++++++++++ 9 files changed, 97 insertions(+), 27 deletions(-) diff --git a/Services/ExcelExportService.cs b/Services/ExcelExportService.cs index 3936c61..2380ed5 100644 --- a/Services/ExcelExportService.cs +++ b/Services/ExcelExportService.cs @@ -60,7 +60,7 @@ namespace TabletTester2025.Services { var data = batches.ToList(); var sheet = package.Workbook.Worksheets.Add("硬度报表"); - WriteHeader(sheet, "检测时间", "样品名称", "平均值(N)", "平均偏差(N)", "RSD(%)", "最大值(N)", "最小值(N)", "测试次数", "单次数据(N)", "判定"); + WriteHeader(sheet, "检测时间", "样品名称", "平均值(N)", "平均偏差(N)", "RSD(%)", "最大值(N)", "测试次数", "单次数据(N)", "判定"); if (data.Count == 0) { @@ -78,10 +78,9 @@ namespace TabletTester2025.Services sheet.Cells[row, 4].Value = b.HardnessAverageDeviation; sheet.Cells[row, 5].Value = b.HardnessRSD; sheet.Cells[row, 6].Value = b.HardnessMax; - sheet.Cells[row, 7].Value = b.HardnessMin; - sheet.Cells[row, 8].Value = b.HardnessTestCount; - sheet.Cells[row, 9].Value = b.HardnessSampleSummary; - sheet.Cells[row, 10].Value = b.HardnessPassText; + sheet.Cells[row, 7].Value = b.HardnessTestCount; + sheet.Cells[row, 8].Value = b.HardnessSampleSummary; + sheet.Cells[row, 9].Value = b.HardnessPassText; row++; } diff --git a/Services/PlcSimulator.cs b/Services/PlcSimulator.cs index 467736b..a2ec195 100644 --- a/Services/PlcSimulator.cs +++ b/Services/PlcSimulator.cs @@ -17,12 +17,13 @@ namespace TabletTester2025.Services // 模拟不同地址的数据 float value = startAddress switch { + 72 => 40 + (float)_rand.NextDouble() * 20, // 硬度最大采集力 100 => 40 + (float)_rand.NextDouble() * 20, // 硬度 40~60N 410 => 100f, // 脆碎圈数 412 => 5.0f + (float)_rand.NextDouble() * 2, // 脆碎度前重 414 => 4.9f + (float)_rand.NextDouble() * 2, // 后重 416 => 1.0f, // 失重率% - 300 => 37.0f, // 温度 + 300 => 100.0f, // 硬度加压速度(mm/min) 340 => 50f, // 溶出速度1(r/min) 350 => 50f, // 溶出速度2(r/min) 400 => 50 + (float)_rand.NextDouble() * 30, // 转速 diff --git a/ViewModels/MainViewModel.cs b/ViewModels/MainViewModel.cs index 6e7fbd0..8f00e5e 100644 --- a/ViewModels/MainViewModel.cs +++ b/ViewModels/MainViewModel.cs @@ -64,7 +64,7 @@ namespace TabletTester2025.ViewModels Tester.ApplyPharmaDefaults(); return Task.CompletedTask; }); - OpenHistoryCommand = new AsyncRelayCommand(() => { new HistoryWindow().ShowDialog(); return Task.CompletedTask; }); + OpenHistoryCommand = new AsyncRelayCommand(() => { new HistoryWindow(_db).ShowDialog(); return Task.CompletedTask; }); } private async Task ConnectToPlc() diff --git a/ViewModels/StationViewModel.cs b/ViewModels/StationViewModel.cs index 4cc4b1f..a1e921d 100644 --- a/ViewModels/StationViewModel.cs +++ b/ViewModels/StationViewModel.cs @@ -1603,8 +1603,13 @@ namespace TabletTester2025.ViewModels throw new InvalidOperationException("硬度完成线圈未配置"); if (ResolveHardnessLiveForceRegister() == 0) throw new InvalidOperationException("硬度实时力寄存器未配置"); + if (ResolveHardnessMaxRegister() == 0) + throw new InvalidOperationException("硬度最大采集力寄存器未配置"); + if (ResolveHardnessSpeedRegister() == 0) + throw new InvalidOperationException("硬度加压速度寄存器未配置"); - await _plc.WriteFloatAsync(_plcConfig.HardnessSudu, (float)HardnessSudu); + await LoadHardnessSpeedSettingAsync(); + await _plc.WriteFloatAsync(ResolveHardnessSpeedRegister(), (float)HardnessSudu); await _plc.WriteFloatAsync(_plcConfig.HardnessWeiyi, (float)HardnessWeiyi); while (_isHardnessRunning && _hardnessResults.Count < count) @@ -1617,6 +1622,7 @@ namespace TabletTester2025.ViewModels double value = await WaitForHardnessSamplePeakAsync(completeCoil); AddHardnessSample(value); + await ReadHardnessMaxCaptureAsync(); ApplyHardnessStatistics(count); await WaitForCoilStateAsync(completeCoil, false, TimeSpan.FromSeconds(10), "硬度完成信号未回落"); } @@ -1624,6 +1630,7 @@ namespace TabletTester2025.ViewModels if (_hardnessResults.Count < count) throw new InvalidOperationException("硬度测试已停止,未保存结果"); + await ReadHardnessMaxCaptureAsync(); ApplyHardnessStatistics(count); AddHardnessGroupSummaryRow(); resultReady = true; @@ -1663,6 +1670,20 @@ namespace TabletTester2025.ViewModels : (ushort)1314; } + private ushort ResolveHardnessMaxRegister() + { + return _plcConfig.HardnessMax != 0 + ? _plcConfig.HardnessMax + : (ushort)72; + } + + private ushort ResolveHardnessSpeedRegister() + { + return _plcConfig.HardnessSudu != 0 + ? _plcConfig.HardnessSudu + : (ushort)300; + } + private async Task ReadHardnessLiveForceAsync() { double value = await _plc.ReadFloatAsync(ResolveHardnessLiveForceRegister()); @@ -1673,6 +1694,23 @@ namespace TabletTester2025.ViewModels return value; } + private async Task ReadHardnessMaxCaptureAsync() + { + double value = await _plc.ReadFloatAsync(ResolveHardnessMaxRegister()); + if (!double.IsFinite(value) || value < 0) + throw new InvalidOperationException("硬度最大采集力数据异常"); + + HardnessMax = value; + return value; + } + + private async Task LoadHardnessSpeedSettingAsync() + { + double value = await _plc.ReadFloatAsync(ResolveHardnessSpeedRegister()); + if (double.IsFinite(value) && value > 0) + HardnessSudu = value; + } + private async Task WaitForHardnessSamplePeakAsync(ushort completeCoil) { double peak = 0; @@ -1759,8 +1797,6 @@ namespace TabletTester2025.ViewModels HardnessAvg = stats.Average; HardnessAverageDeviation = stats.AverageDeviation; HardnessRSD = stats.RsdPercent; - HardnessMax = stats.Maximum; - HardnessMin = stats.Minimum; HardnessCurrentCount = stats.Count; HardnessPass = stats.IsPass; @@ -2357,7 +2393,7 @@ namespace TabletTester2025.ViewModels TestType.Dissolution => string.IsNullOrWhiteSpace(effectiveDissolutionChannel) ? "溶出" : effectiveDissolutionChannel, _ => "" }; - LocalAlarm = $"{projectName}测试完成"; + LocalAlarm = $"{projectName}测试完成,已保存"; }); return true; } diff --git a/Views/HistoryWindow.xaml b/Views/HistoryWindow.xaml index e41a920..0d52c71 100644 --- a/Views/HistoryWindow.xaml +++ b/Views/HistoryWindow.xaml @@ -199,7 +199,6 @@ - diff --git a/Views/HistoryWindow.xaml.cs b/Views/HistoryWindow.xaml.cs index 50612fc..352b7e5 100644 --- a/Views/HistoryWindow.xaml.cs +++ b/Views/HistoryWindow.xaml.cs @@ -13,11 +13,10 @@ namespace TabletTester2025 private readonly DatabaseService _dbService; private List _allData; - public HistoryWindow() + public HistoryWindow(DatabaseService dbService) { InitializeComponent(); - var connectionString = "Data Source=TabletTests.db"; - _dbService = new DatabaseService(connectionString); + _dbService = dbService ?? throw new ArgumentNullException(nameof(dbService)); LoadData(); } diff --git a/Views/MainWindow.xaml b/Views/MainWindow.xaml index 858031f..64b55df 100644 --- a/Views/MainWindow.xaml +++ b/Views/MainWindow.xaml @@ -235,22 +235,22 @@ - + - + - + - + - + - + @@ -260,6 +260,8 @@ + @@ -304,12 +306,6 @@ - - - - - - @@ -465,6 +461,7 @@