diff --git a/Models/PlcConfiguration.cs b/Models/PlcConfiguration.cs index 7dd8d65..ab53c52 100644 --- a/Models/PlcConfiguration.cs +++ b/Models/PlcConfiguration.cs @@ -7,19 +7,18 @@ public byte SlaveId { get; set; } // 硬度 - //public ushort HardnessValue { get; set; } + public ushort HardnessMax { get; set; } public ushort HardnessStartCoil { get; set; } - - public ushort HardnessCompleteCoil { get; set; } public ushort HardnessStartReset { get; set; } public ushort HardnessStartStop { get; set; } public ushort HardnessSudu { get; set; } public ushort HardnessWeiyi { get; set; } - public ushort HardnessPoSun { get; set; } + public ushort HardnessForward { get; set; } public ushort HardnessBack { get; set; } + public ushort HardnessShishilizhi { get; set; } // 脆碎度 public ushort FriabilityStartCoil { get; set; } public ushort WeightBefore { get; set; } // 天平重量寄存器(可选) diff --git a/PLC.cs b/PLC.cs deleted file mode 100644 index 4048a5a..0000000 --- a/PLC.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace 片剂四用仪 -{ - internal class PLC - { -// "CSI-Z420片剂四用仪" -//"软元件名" "注释" -//"X000" "溶出电机原点" -//"X001" "崩解电机原点" -//"X002" "脆碎度电机原点" -//"X003" "硬度电机原点" -//"X007" "急停" -//"Y000" "硬度电机脉冲" -//"Y001" "脆碎度电机脉冲" -//"Y002" "崩解电机脉冲" -//"Y003" "溶出电机脉冲" -//"Y004" "硬度电机方向" -//"Y005" "脆碎度电机方向" -//"Y006" "崩解电机方向" -//"Y007" "溶出电机方向" -//"M0" "硬前进" -//"M1" "硬后退" -//"M2" "脆正转" -//"M3" "脆反转" -//"M4" "崩正转" -//"M5" "崩反转" -//"M6" "溶正转" -//"M7" "溶反转" -//"M40" "溶出开始" -//"M41" "溶出使能" -//"M42" "溶出完成" -//"M43" "溶出停止" -//"M44" "暂停(提示取样)" -//"M50" "崩解开始" -//"M51" "崩解使能" -//"M52" "崩解完成" -//"M53" "崩解停止" -//"M60" "时间设置" -//"M70" "硬度开始" -//"M71" "硬度使能" -//"M72" "硬度完成" -//"M73" "硬度停止" -//"M74" "感应力标志" -//"M80" "脆碎开始" -//"M81" "脆碎使能" -//"M82" "脆碎完成" -//"M83" "脆碎停止" -//"M90" "硬复位启动" -//"M91" "硬复位使能" -//"M92" "硬复位完成" -//"M95" "脆复位启动" -//"M96" "脆复位使能" -//"M97" "脆复位完成" -//"M100" "崩复位启动" -//"M101" "崩复位使能" -//"M102" "崩复位完成" -//"M105" "溶复位启动" -//"M106" "溶复位使能" -//"M107" "溶复位完成" -//"M200" "硬度电机极限" -//"M201" "硬度电机等于" -//"M202" "硬度电机小于" -//"M210" "大于" -//"M211" "等于" -//"M212" "小于" -//"M215" "称重保护大于" -//"M216" "称重保护等于" -//"M217" "称重保护小于" -//"M220" "大于" -//"M221" "等于" -//"M222" "小于" -//"M225" "大于" -//"M226" "等于" -//"M227" "小于" -//"M230" "大于" -//"M231" "等于" -//"M232" "小于" -//"M1300" "称重校零" -//"M8000" "常通" -//"M8002" "上电" -//"M8013" "1s脉冲" -//"D10" "硬度当前位置" -//"D40" "溶出步" -//"D42" "溶出计时递增s" -//"D44" "溶出计时递增min" -//"D50" "崩解步" -//"D52" "崩解计时递增s" -//"D54" "崩解计时递增min" -//"D60" "秒" -//"D61" "分" -//"D62" "时" -//"D63" "日" -//"D64" "月" -//"D65" "年" -//"D66" "周" -//"D70" "硬度步" -//"D72" "最大力采集" -//"D74" "判定比较" -//"D80" "碎脆度步" -//"D82" "脆测次数递增" -//"D90" "硬复位步" -//"D94" "脆复位步" -//"D100" "崩复位步" -//"D104" "溶复位步" -//"D290" "硬mm脉冲" -//"D292" "脆r脉冲" -//"D294" "崩r脉冲" -//"D296" "溶r脉冲" -//"D298" "硬度电机极限输入" -//"D300" "硬度速度输入mm/min" -//"D306" "硬速度int" -//"D310" "硬度位移输入mm/min" -//"D314" "硬度位移int+" -//"D316" "硬度位移int-" -//"D320" "脆速度输入r/min" -//"D326" "脆速度int" -//"D330" "崩速度输入r/min" -//"D336" "崩速度int" -//"D340" "溶速度输入r/min" -//"D346" "溶速度int" -//"D400" "硬度破损判定输入N" -//"D410" "脆碎试验时间设置" -//"D412" "脆碎前质量输入" -//"D414" "脆碎后质量输入" -//"D416" "失重率%" -//"D420" "崩解时间min设置" -//"D430" "溶出时间min设置" -//"D432" "溶出间隔取样时间设置" -//"D434" "溶出间隔时间过渡" -//"D500" "时钟设置" -//"D1300" "力读取" -//"D1304" "力浮点" -//"D1308" "校准后力" -//"D1314" "力显示" -//"D1320" "力系数" -//"D1322" "力保护" -//"D1410" "数据读取" -//"D1412" "数据浮点" -//"D1416" "算" -//"D1418" "算" -//"D1420" "算" -//"D1422" "温度" -//"D1428" "温度系数" -//"D1430" "温度显示" -//"D8340" "硬度脉冲" -//"D8350" "脆碎度脉冲" -//"D8360" "崩解脉冲" -//"D8370" "溶出脉冲" - - - - } -} diff --git a/ViewModels/MainViewModel.cs b/ViewModels/MainViewModel.cs index afd0804..0942856 100644 --- a/ViewModels/MainViewModel.cs +++ b/ViewModels/MainViewModel.cs @@ -61,7 +61,6 @@ namespace TabletTester2025.ViewModels // 在构造函数中 OpenSettingsCommand = new AsyncRelayCommand(() => { new SettingsWindow().ShowDialog(); return Task.CompletedTask; }); OpenHistoryCommand = new AsyncRelayCommand(() => { new HistoryWindow().ShowDialog(); return Task.CompletedTask; }); - OpenCalibrationCommand = new AsyncRelayCommand(() => { MessageBox.Show("校准功能待实现"); return Task.CompletedTask; }); // 跳转到 PlcDataPage 页面 diff --git a/ViewModels/StationViewModel.cs b/ViewModels/StationViewModel.cs index 31304f8..a036f8c 100644 --- a/ViewModels/StationViewModel.cs +++ b/ViewModels/StationViewModel.cs @@ -20,6 +20,7 @@ namespace TabletTester2025.ViewModels { public partial class StationViewModel : ObservableObject { + private DispatcherTimer _hardnessGlobalTimer; private readonly IPlcService _plc; private readonly PlcConfiguration _plcConfig; private readonly DatabaseService _db; @@ -75,7 +76,8 @@ namespace TabletTester2025.ViewModels [ObservableProperty] private double _hardnessSudu = 300;// 硬度速度输入mm/min [ObservableProperty] private double _hardnessWeiyi = 100; // 硬度位移输入mm //[ObservableProperty] private double _hardnessPoSun = 400; // 硬度破损判定输入N - //[ObservableProperty] private int _hardnessMaxN = 72; //最大力采集 + //[ObservableProperty] private double _hardnessMaxN = 72; //最大力采集 + [ObservableProperty] private double _hardnessShishilizhi = 0.0; //最大力采集 @@ -105,7 +107,8 @@ namespace TabletTester2025.ViewModels [ObservableProperty] private int _hardnessIntervalSec = 2; [ObservableProperty] private int _hardnessCurrentCount; [ObservableProperty] private double _hardnessMax; - [ObservableProperty] private double _hardnessMin; + + [ObservableProperty] private bool _disintegrationPass; // 新增 @@ -221,23 +224,16 @@ namespace TabletTester2025.ViewModels DissolutionPlotModel.Series.Add(_dissolution1Series); DissolutionPlotModel.Series.Add(_dissolution2Series); - // 硬度命令 - //HardnessUpCommand = new AsyncRelayCommand(async () => - //{ + - // await _plc.WriteCoilAsync(0x20, true); - // await Task.Delay(100); - // await _plc.WriteCoilAsync(0x20, false); - //}); - - HardnessDownCommand = new AsyncRelayCommand(async () => + HardnessDownCommand = new AsyncRelayCommand(async () => { await _plc.WriteCoilAsync(0x21, true); await Task.Delay(100); await _plc.WriteCoilAsync(0x21, false); }); - //复位 + //硬复位 HardnessResetCommand = new AsyncRelayCommand(async () => { // 1. 标准PLC按钮脉冲逻辑:置1 → 延时 → 置0(模拟按下再松开按钮) @@ -245,12 +241,8 @@ namespace TabletTester2025.ViewModels await Task.Delay(100); // 脉冲宽度,可根据PLC程序调整20~100ms await _plc.WriteCoilAsync(_plcConfig.HardnessStartReset, false); _hardnessResults.Clear(); - HardnessValue = 0; - HardnessAvg = 0; - HardnessRSD = 0; - HardnessCurrentCount = 0; HardnessMax = 0; - HardnessMin = 0; + HardnessShishilizhi = 0; Phase = TestPhase.Idle; }); @@ -1101,11 +1093,10 @@ namespace TabletTester2025.ViewModels private async Task RunHardnessAsync() { + // 点击启动才执行一次 if (Phase != TestPhase.Idle) return; CurrentTest = TestType.Hardness; Phase = TestPhase.Running; - HardnessPass = false; - _hardnessResults.Clear(); try { @@ -1118,44 +1109,17 @@ namespace TabletTester2025.ViewModels double currentWeiyi = HardnessWeiyi; - // 如果你需要把这3个值发给PLC,就在这里发一次(测试开始用当前参数) + // 写入PLC await _plc.WriteFloatAsync(_plcConfig.HardnessSudu, (float)currentSpeed); await _plc.WriteFloatAsync(_plcConfig.HardnessWeiyi, (float)currentWeiyi); - + await _plc.WriteCoilAsync(_plcConfig.HardnessStartCoil, true);//启动 - // 开始循环测试 - for (int i = 0; i < count; i++) - { - await _plc.WriteCoilAsync(_plcConfig.HardnessStartCoil, true); - bool completed = false; - while (!completed && Phase == TestPhase.Running) - { - await Task.Delay(200); - completed = await _plc.ReadCoilAsync(_plcConfig.HardnessCompleteCoil); - } - - double val = await _plc.ReadFloatAsync(_plcConfig.HardnessPoSun); - _hardnessResults.Add(val); - //HardnessPoSun = val; - - await Task.Delay(1000); - } - - // 计算结果 - HardnessAvg = _hardnessResults.Average(); - HardnessMax = _hardnessResults.Max(); - HardnessMin = _hardnessResults.Min(); - HardnessCurrentCount = count; - HardnessRSD = (StandardDeviation(_hardnessResults) / HardnessAvg) * 100; - HardnessPass = HardnessAvg >= min && HardnessAvg <= max; - - Phase = TestPhase.Completed; + } catch (Exception ex) { - await App.Current.Dispatcher.InvokeAsync(() => MessageBox.Show($"硬度测试出错:{ex.Message}")); - Phase = TestPhase.Error; + } finally { @@ -1544,8 +1508,7 @@ namespace TabletTester2025.ViewModels // 硬度 HardnessAvg = HardnessAvg, HardnessRSD = HardnessRSD, - HardnessMax = HardnessMax, - HardnessMin = HardnessMin, + HardnessTestCount = HardnessTestCount, HardnessInternalMin = HardnessInternalMin, HardnessInternalMax = HardnessInternalMax, diff --git a/Views/ShowData.xaml b/Views/ShowData.xaml index f70f83d..9907af1 100644 --- a/Views/ShowData.xaml +++ b/Views/ShowData.xaml @@ -60,19 +60,19 @@ - + - + - + - + @@ -87,7 +87,7 @@ - + @@ -99,7 +99,7 @@ - + @@ -110,11 +110,11 @@ - + - + @@ -125,7 +125,7 @@ - + diff --git a/appsettings.json b/appsettings.json index 2a48189..6809dcd 100644 --- a/appsettings.json +++ b/appsettings.json @@ -22,6 +22,7 @@ "HardnessWeiyi": 310, // 硬度位移输入mm/min "HardnessPoSun": 400, // 硬度破损判定输入N "HardnessMax": 72, //最大力采集 + "HardnessShishilizhi": 1314, //力显示 @@ -32,7 +33,7 @@ "FriabilityStartCoil3": 80, //脆碎工位1启动测试M70 "FriabilityStartCoilStop": 83, // 脆碎停止 "FriabilityStartCoilReset": 95, // 脆碎复位启动 - "HardnessCompleteCoil": 11, + "WeightBefore": 412, "WeightAfter": 414, @@ -58,8 +59,8 @@ "Dissolution2Time": 440 }, "PharmaStandard": { - "HardnessMin_N": 40, - "HardnessMax_N": 60, + + "HardnessTestCount": 6, "FriabilityTargetRpm": 25.0, "FriabilityTargetRounds": 100,