普通优化

This commit is contained in:
hsc
2026-06-25 16:09:58 +08:00
parent 72f8b8c5b3
commit 45df76b06d
7 changed files with 87 additions and 35 deletions

View File

@@ -8,6 +8,12 @@
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<None Remove="Images\error.png" />
<None Remove="Images\info.png" />
<None Remove="Images\warning.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="16.1.1" />
</ItemGroup>
@@ -27,4 +33,16 @@
<ProjectReference Include="..\UpdateInfoMoudle\UpdateInfoMoudle.csproj" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\error.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
<Resource Include="Images\info.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
<Resource Include="Images\warning.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
</ItemGroup>
</Project>

BIN
ADP/Images/error.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
ADP/Images/info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
ADP/Images/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -11,7 +11,6 @@ namespace DeviceCommand.Device
[ADPCommand]
public class SDS2000X_HD : Tcp
{
//只有两个,八台产品公用两两分组各用一个
// 示波器底层 Socket 字符串命令通常以换行符 \n 结束
private const string ScpiDelimiter = "\n";
@@ -30,7 +29,7 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*CLS{ScpiDelimiter}", ct); //
await SendAsync($"*CLS{ScpiDelimiter}", ct);
}
/// <summary>
@@ -38,7 +37,7 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); //
return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct);
}
/// <summary>
@@ -46,17 +45,29 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*RST{ScpiDelimiter}", ct); //
await SendAsync($"*RST{ScpiDelimiter}", ct);
}
/// <summary>
/// 【补充】查询先前操作是否完成。
/// 在重置设备(*RST)或切换大物理量程后调用,返回 "1" 代表示波器继电器切换就绪,防止后续指令引发阻塞。
/// </summary>
public virtual async Task<bool> _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)
/// <summary>
/// 控制示波器开始捕获波形 (等同于按下前端面板的 Run 键)
/// </summary>
public virtual async Task _RUN(CancellationToken ct = default)
{
await SendAsync($"RUN{ScpiDelimiter}", ct); //
await SendAsync($"RUN{ScpiDelimiter}", ct);
}
/// <summary>
@@ -64,15 +75,15 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task _STOP(CancellationToken ct = default)
{
await SendAsync($"STOP{ScpiDelimiter}", ct); //
await SendAsync($"STOP{ScpiDelimiter}", ct);
}
/// <summary>
/// 强制示波器进入单次触发捕获模式
/// 强制示波器进入单次触发捕获模式 (常用于捕捉充电瞬间的过冲浪涌波形)
/// </summary>
public virtual async Task _SINGLE(CancellationToken ct = default)
{
await SendAsync($"SINGle{ScpiDelimiter}", ct); //
await SendAsync($"SINGle{ScpiDelimiter}", ct);
}
/// <summary>
@@ -80,7 +91,19 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*TRG{ScpiDelimiter}", ct); //
await SendAsync($"*TRG{ScpiDelimiter}", ct);
}
/// <summary>
/// 【补充】设置触发模式 (AUTO, NORM, SINGLE)
/// </summary>
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)
/// <summary>
/// 开启或关闭指定的模拟通道 (例如: channel=1 代表 C1)
/// 开启或关闭指定的模拟通道
/// </summary>
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);
}
/// <summary>
@@ -101,27 +125,35 @@ namespace DeviceCommand.Device
/// </summary>
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);
}
/// <summary>
/// 【补充验证】查询指定通道当前的电压档位 (用于 Setup-Verify 闭环验证逻辑)
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await WriteReadAsync($"C{channel}:VDIV?{ScpiDelimiter}", ScpiDelimiter, ct);
}
/// <summary>
/// 设置指定通道的垂直偏移量 (Offset单位: V)
/// </summary>
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);
}
/// <summary>
/// 设置通道的输入阻抗 (1MΩ 或 50Ω)
/// 设置通道的输入阻抗与耦合模式
/// </summary>
/// <param name="is50Ohm">True: 50欧姆, False: 1M欧姆</param>
public virtual async Task (int channel, bool is50Ohm, CancellationToken ct = default)
/// <param name="coupling">合法参数A1M (交流1M), D1M (直流1M), D50 (直流50欧)</param>
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
/// </summary>
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
/// </summary>
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
/// </summary>
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
/// </summary>
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
/// <param name="paramName">参数名称助记符:
/// PKPK(峰峰值), MAX(最大值), MIN(最小值), AMPL(振幅值),
/// FREQ(频率), PER(周期), MEAN(平均值), RMS(均方根) 等</param>
/// <returns>设备返回的科学计数法或自定义字符串数值</returns>
public virtual async Task<string> (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);
}
/// <summary>
@@ -191,7 +226,7 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await (channel, "PKPK", ct); //
return await (channel, "PKPK", ct);
}
/// <summary>
@@ -199,7 +234,7 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await (channel, "FREQ", ct); //
return await (channel, "FREQ", ct);
}
/// <summary>
@@ -207,7 +242,7 @@ namespace DeviceCommand.Device
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await (channel, "RMS", ct); //
return await (channel, "RMS", ct);
}
#endregion

View File

@@ -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}"); }));

View File

@@ -481,6 +481,7 @@
<TextBlock Grid.Column="0" Text="{Binding ParameterName}" VerticalAlignment="Center"/>
<TextBox Grid.Column="1"
VerticalAlignment="Center"
materialDesign:HintAssist.Hint=""
Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</DataTemplate>