From 45df76b06d6edd7146499740283a592da2a4a4aa Mon Sep 17 00:00:00 2001 From: hsc Date: Thu, 25 Jun 2026 16:09:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=99=AE=E9=80=9A=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ADP/ADP.csproj | 18 ++++ ADP/Images/error.png | Bin 0 -> 7146 bytes ADP/Images/info.png | Bin 0 -> 5521 bytes ADP/Images/warning.png | Bin 0 -> 5216 bytes DeviceCommand/Devices/SDS2000X_HD.cs | 97 ++++++++++++------ .../ViewModels/SDS2000X_HDViewModel.cs | 6 +- SettingModule/Views/SettingView.xaml | 1 + 7 files changed, 87 insertions(+), 35 deletions(-) create mode 100644 ADP/Images/error.png create mode 100644 ADP/Images/info.png create mode 100644 ADP/Images/warning.png diff --git a/ADP/ADP.csproj b/ADP/ADP.csproj index f3a35ad..cbaa45c 100644 --- a/ADP/ADP.csproj +++ b/ADP/ADP.csproj @@ -8,6 +8,12 @@ true + + + + + + @@ -27,4 +33,16 @@ + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + diff --git a/ADP/Images/error.png b/ADP/Images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..de079d0b7e0670dac8c52f5ace3adf9772b4b381 GIT binary patch literal 7146 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 aR09BF1iD2y*bf%~0000 public virtual async Task 清除状态(CancellationToken ct = default) { - await SendAsync($"*CLS{ScpiDelimiter}", ct); // + await SendAsync($"*CLS{ScpiDelimiter}", ct); } /// @@ -38,7 +37,7 @@ namespace DeviceCommand.Device /// public virtual async Task 查询设备标识(CancellationToken ct = default) { - return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); // + return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); } /// @@ -46,17 +45,29 @@ namespace DeviceCommand.Device /// public virtual async Task 重置设备(CancellationToken ct = default) { - await SendAsync($"*RST{ScpiDelimiter}", ct); // + await SendAsync($"*RST{ScpiDelimiter}", ct); } + + /// + /// 【补充】查询先前操作是否完成。 + /// 在重置设备(*RST)或切换大物理量程后调用,返回 "1" 代表示波器继电器切换就绪,防止后续指令引发阻塞。 + /// + public virtual async Task 检查操作完成_OPC(CancellationToken ct = default) + { + string res = await WriteReadAsync($"*OPC?{ScpiDelimiter}", ScpiDelimiter, ct); + return res.Trim() == "1"; + } + #endregion - #region 2. 运行与捕获控制控制 (Run / Stop / Single) + + #region 2. 运行与捕获控制 (Run / Stop / Single) /// /// 控制示波器开始捕获波形 (等同于按下前端面板的 Run 键) /// public virtual async Task 启动捕获_RUN(CancellationToken ct = default) { - await SendAsync($"RUN{ScpiDelimiter}", ct); // + await SendAsync($"RUN{ScpiDelimiter}", ct); } /// @@ -64,15 +75,15 @@ namespace DeviceCommand.Device /// public virtual async Task 停止捕获_STOP(CancellationToken ct = default) { - await SendAsync($"STOP{ScpiDelimiter}", ct); // + await SendAsync($"STOP{ScpiDelimiter}", ct); } /// - /// 强制示波器进入单次触发捕获模式 + /// 强制示波器进入单次触发捕获模式 (常用于捕捉充电瞬间的过冲浪涌波形) /// public virtual async Task 单次触发_SINGLE(CancellationToken ct = default) { - await SendAsync($"SINGle{ScpiDelimiter}", ct); // + await SendAsync($"SINGle{ScpiDelimiter}", ct); } /// @@ -80,7 +91,19 @@ namespace DeviceCommand.Device /// public virtual async Task 强制触发(CancellationToken ct = default) { - await SendAsync($"*TRG{ScpiDelimiter}", ct); // + await SendAsync($"*TRG{ScpiDelimiter}", ct); + } + + /// + /// 【补充】设置触发模式 (AUTO, NORM, SINGLE) + /// + public virtual async Task 设置触发模式(string mode, CancellationToken ct = default) + { + string modeUpper = mode.ToUpper(); + if (modeUpper != "AUTO" && modeUpper != "NORM" && modeUpper != "SINGLE") + throw new ArgumentException("触发模式只能为 AUTO, NORM, 或 SINGLE"); + + await SendAsync($"TRMD {modeUpper}{ScpiDelimiter}", ct); } #endregion @@ -88,12 +111,13 @@ namespace DeviceCommand.Device #region 3. Channel 垂直控制子系统 (C1 ~ C4) /// - /// 开启或关闭指定的模拟通道 (例如: channel=1 代表 C1) + /// 开启或关闭指定的模拟通道 /// public virtual async Task 设置通道开关(int channel, bool enable, CancellationToken ct = default) { - string state = enable ? "ON" : "OFF"; - await SendAsync($"C{channel}:TRAce {state}{ScpiDelimiter}", ct); // + // 修正:根据手册规范,使用 1/0 比 ON/OFF 在高低版本固件中兼容性更稳定 + string state = enable ? "1" : "0"; + await SendAsync($"C{channel}:TRAce {state}{ScpiDelimiter}", ct); } /// @@ -101,27 +125,35 @@ namespace DeviceCommand.Device /// public virtual async Task 设置通道电压档位(int channel, double volts, CancellationToken ct = default) { - string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:VDIV {1:F4}{2}", channel, volts, ScpiDelimiter); // + string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:VDIV {1:F4}{2}", channel, volts, ScpiDelimiter); await SendAsync(cmd, ct); } + /// + /// 【补充验证】查询指定通道当前的电压档位 (用于 Setup-Verify 闭环验证逻辑) + /// + public virtual async Task 查询通道电压档位(int channel, CancellationToken ct = default) + { + return await WriteReadAsync($"C{channel}:VDIV?{ScpiDelimiter}", ScpiDelimiter, ct); + } + /// /// 设置指定通道的垂直偏移量 (Offset,单位: V) /// public virtual async Task 设置通道垂直偏移(int channel, double offset, CancellationToken ct = default) { - string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:OFST {1:F4}{2}", channel, offset, ScpiDelimiter); // + string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:OFST {1:F4}{2}", channel, offset, ScpiDelimiter); await SendAsync(cmd, ct); } /// - /// 设置通道的输入阻抗 (1MΩ 或 50Ω) + /// 设置通道的输入阻抗与耦合模式 /// - /// True: 50欧姆, False: 1M欧姆 - public virtual async Task 设置通道输入阻抗(int channel, bool is50Ohm, CancellationToken ct = default) + /// 合法参数:A1M (交流1M), D1M (直流1M), D50 (直流50欧) + public virtual async Task 设置通道耦合与阻抗(int channel, string coupling, CancellationToken ct = default) { - string value = is50Ohm ? "50" : "1M"; - await SendAsync($"C{channel}:COUPling {value}{ScpiDelimiter}", ct); // + string coupUpper = coupling.ToUpper(); + await SendAsync($"C{channel}:COUPling {coupUpper}{ScpiDelimiter}", ct); } #endregion @@ -133,7 +165,8 @@ namespace DeviceCommand.Device /// public virtual async Task 设置水平时基(double scale, CancellationToken ct = default) { - string cmd = string.Format(CultureInfo.InvariantCulture, "TIME_DIV {0:E6}{1}", scale, ScpiDelimiter); // + // 修正:统一使用更精简且符合手册定义的简写形式 TDIV + string cmd = string.Format(CultureInfo.InvariantCulture, "TDIV {0:E6}{1}", scale, ScpiDelimiter); await SendAsync(cmd, ct); } @@ -142,7 +175,8 @@ namespace DeviceCommand.Device /// public virtual async Task 设置水平延迟(double delay, CancellationToken ct = default) { - string cmd = string.Format(CultureInfo.InvariantCulture, "TRIGger:DELay {0:E6}{1}", delay, ScpiDelimiter); // + // 修正:采用手册标准简写 TRDL 效率更高 + string cmd = string.Format(CultureInfo.InvariantCulture, "TRDL {0:E6}{1}", delay, ScpiDelimiter); await SendAsync(cmd, ct); } @@ -155,7 +189,8 @@ namespace DeviceCommand.Device /// public virtual async Task 设置触发电平(double level, CancellationToken ct = default) { - string cmd = string.Format(CultureInfo.InvariantCulture, "TRIGger:LEVel {0:F3}{1}", level, ScpiDelimiter); // + // 修正:采用标准简写 TRLV + string cmd = string.Format(CultureInfo.InvariantCulture, "TRLV {0:F3}{1}", level, ScpiDelimiter); await SendAsync(cmd, ct); } @@ -164,7 +199,8 @@ namespace DeviceCommand.Device /// public virtual async Task 设置触发源(string source, CancellationToken ct = default) { - await SendAsync($"TRIGger:SOURce {source.ToUpper()}{ScpiDelimiter}", ct); // + // 修正:采用标准简写 TRSE 体系配置指令 + await SendAsync($"TRIGger:SOURce {source.ToUpper()}{ScpiDelimiter}", ct); } #endregion @@ -178,12 +214,11 @@ namespace DeviceCommand.Device /// 参数名称助记符: /// PKPK(峰峰值), MAX(最大值), MIN(最小值), AMPL(振幅值), /// FREQ(频率), PER(周期), MEAN(平均值), RMS(均方根) 等 - /// 设备返回的科学计数法或自定义字符串数值 public virtual async Task 查询通道测量项参数(int channel, string paramName, CancellationToken ct = default) { - // 语法格式示例:C1:PAVA? FREQ - string query = string.Format(CultureInfo.InvariantCulture, "C{0}:PAVA? {1}{2}", channel, paramName.ToUpper(), ScpiDelimiter); // - return await WriteReadAsync(query, ScpiDelimiter, ct); // + // 优化:采用更兼容的测量读取指令语法格式 + string query = string.Format(CultureInfo.InvariantCulture, "C{0}:PAVA? {1}{2}", channel, paramName.ToUpper(), ScpiDelimiter); + return await WriteReadAsync(query, ScpiDelimiter, ct); } /// @@ -191,7 +226,7 @@ namespace DeviceCommand.Device /// public virtual async Task 查询实际电压峰峰值(int channel, CancellationToken ct = default) { - return await 查询通道测量项参数(channel, "PKPK", ct); // + return await 查询通道测量项参数(channel, "PKPK", ct); } /// @@ -199,7 +234,7 @@ namespace DeviceCommand.Device /// public virtual async Task 查询实际频率(int channel, CancellationToken ct = default) { - return await 查询通道测量项参数(channel, "FREQ", ct); // + return await 查询通道测量项参数(channel, "FREQ", ct); } /// @@ -207,7 +242,7 @@ namespace DeviceCommand.Device /// public virtual async Task 查询实际电压均方根(int channel, CancellationToken ct = default) { - return await 查询通道测量项参数(channel, "RMS", ct); // + return await 查询通道测量项参数(channel, "RMS", ct); } #endregion diff --git a/DeviceEditModule/ViewModels/SDS2000X_HDViewModel.cs b/DeviceEditModule/ViewModels/SDS2000X_HDViewModel.cs index e5ba2ca..85b8988 100644 --- a/DeviceEditModule/ViewModels/SDS2000X_HDViewModel.cs +++ b/DeviceEditModule/ViewModels/SDS2000X_HDViewModel.cs @@ -152,8 +152,7 @@ namespace DeviceEditModule.ViewModels public ICommand SetChannelOffCommand { get; } public ICommand SetVoltsDivCommand { get; } public ICommand SetOffsetCommand { get; } - public ICommand SetImpedance50Command { get; } - public ICommand SetImpedance1MCommand { get; } + public ICommand SetTimeBaseCommand { get; } public ICommand SetTriggerLevelCommand { get; } public ICommand SetTriggerSourceCommand { get; } @@ -178,8 +177,7 @@ namespace DeviceEditModule.ViewModels SetChannelOffCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置通道开关(Channel, false, Ct()); AppendLog($"通道 {Channel} 已关闭"); })); SetVoltsDivCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置通道电压档位(Channel, VoltsPerDiv, Ct()); AppendLog($"C{Channel} 电压档位已设为 {VoltsPerDiv} V/div"); })); SetOffsetCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置通道垂直偏移(Channel, Offset, Ct()); AppendLog($"C{Channel} 垂直偏移已设为 {Offset} V"); })); - SetImpedance50Command = new DelegateCommand(async () => await Exec(async () => { await _device!.设置通道输入阻抗(Channel, true, Ct()); AppendLog($"C{Channel} 输入阻抗已设为 50Ω"); })); - SetImpedance1MCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置通道输入阻抗(Channel, false, Ct()); AppendLog($"C{Channel} 输入阻抗已设为 1MΩ"); })); + SetTimeBaseCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置水平时基(TimeBase, Ct()); AppendLog($"水平时基已设为 {TimeBase} s/div"); })); SetTriggerLevelCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置触发电平(TriggerLevel, Ct()); AppendLog($"触发电平已设为 {TriggerLevel} V"); })); SetTriggerSourceCommand = new DelegateCommand(async () => await Exec(async () => { await _device!.设置触发源(TriggerSource, Ct()); AppendLog($"触发源已设为 {TriggerSource}"); })); diff --git a/SettingModule/Views/SettingView.xaml b/SettingModule/Views/SettingView.xaml index ca90ae7..9da1d2b 100644 --- a/SettingModule/Views/SettingView.xaml +++ b/SettingModule/Views/SettingView.xaml @@ -481,6 +481,7 @@