命令树优化,测试编辑区域优化

This commit is contained in:
“hsc”
2026-08-27 10:50:10 +08:00
parent 99ac3f2b8d
commit e144dc78a7
24 changed files with 1520 additions and 338 deletions
+52 -26
View File
@@ -3,6 +3,7 @@ using DeviceCommand.Base;
using Model.Models;
using System;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
@@ -21,10 +22,27 @@ namespace DeviceCommand.Devices
{
}
/// <summary>
/// 从设备返回的 SCPI 响应字符串中提取数值部分并转换为 double。
/// 支持科学计数法(如 2.48E-03),结果保留两位小数。
/// </summary>
/// <param name="raw">设备返回的原始字符串</param>
/// <returns>提取到的数值(保留两位小数),解析失败时返回 0</returns>
private static double ExtractDouble(string raw)
{
if (string.IsNullOrWhiteSpace(raw)) return 0;
// 从响应中提取第一个数值(含正负号、小数点、科学计数法),可自动忽略单位后缀与命令头
var match = Regex.Match(raw, @"[+-]?(?:\d+\.?\d*|\.\d+)(?:[Ee][+-]?\d+)?");
return match.Success && double.TryParse(match.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double val)
? Math.Round(val, 2)
: 0;
}
#region 1.
/// <summary>
/// 清除错误队列 (*CLS)[cite: 1]
/// 清除错误队列 (*CLS)
/// </summary>
public virtual async Task Async(CancellationToken ct = default)
{
@@ -32,7 +50,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 重设仪器为初始状态 (*RST)[cite: 1]
/// 重设仪器为初始状态 (*RST)
/// </summary>
public virtual async Task Async(CancellationToken ct = default)
{
@@ -40,7 +58,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 查询仪器识别码 (*IDN?)[cite: 1]
/// 查询仪器识别码 (*IDN?)
/// </summary>
public virtual async Task<string> Async(CancellationToken ct = default)
{
@@ -49,10 +67,10 @@ namespace DeviceCommand.Devices
#endregion
#region 2. (OUTPut )[cite: 1]
#region 2. (OUTPut )
/// <summary>
/// 设置输出开关状态 (OUTP ON / OFF)[cite: 1]
/// 设置输出开关状态 (OUTP ON / OFF)
/// </summary>
/// <param name="isOn">true: 开启输出, false: 关闭输出</param>
public virtual async Task Async(bool isOn, CancellationToken ct = default)
@@ -62,7 +80,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置输出耦合模式 (OUTP:COUP AC | DC | ACDC)[cite: 1]
/// 设置输出耦合模式 (OUTP:COUP AC | DC | ACDC)
/// </summary>
public virtual async Task Async(string couplingMode, CancellationToken ct = default)
{
@@ -71,7 +89,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置输出继电器状态 (OUTP:REL ON | OFF)[cite: 1]
/// 设置输出继电器状态 (OUTP:REL ON | OFF)
/// </summary>
public virtual async Task Async(bool isOn, CancellationToken ct = default)
{
@@ -81,10 +99,10 @@ namespace DeviceCommand.Devices
#endregion
#region 3. (SOURCE )[cite: 1]
#region 3. (SOURCE )
/// <summary>
/// 设置交流电压 (VOLT:AC)[cite: 1]
/// 设置交流电压 (VOLT:AC)
/// </summary>
/// <param name="voltage">电压值 (0 ~ 300V 或高压选配范围)</param>
public virtual async Task Async(double voltage, CancellationToken ct = default)
@@ -94,7 +112,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置直流电压 (VOLT:DC)[cite: 1]
/// 设置直流电压 (VOLT:DC)
/// </summary>
public virtual async Task Async(double voltage, CancellationToken ct = default)
{
@@ -103,7 +121,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置输出频率 (FREQ)[cite: 1]
/// 设置输出频率 (FREQ)
/// </summary>
/// <param name="frequency">频率值 (Hz)</param>
public virtual async Task Async(double frequency, CancellationToken ct = default)
@@ -113,7 +131,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置波形选择 (FUNC:SHAP:A SINE / SQUA / CSIN 等)[cite: 1]
/// 设置波形选择 (FUNC:SHAP:A SINE / SQUA / CSIN 等)
/// </summary>
public virtual async Task Async(string shape, CancellationToken ct = default)
{
@@ -122,10 +140,10 @@ namespace DeviceCommand.Devices
#endregion
#region 4. (INST & PHASE )[cite: 1]
#region 4. (INST & PHASE )
/// <summary>
/// 设置单/三相工作模式 (INST:PHAS THREE / SINGLE)[cite: 1]
/// 设置单/三相工作模式 (INST:PHAS THREE / SINGLE)
/// </summary>
/// <param name="isThreePhase">true: 三相模式, false: 单相模式</param>
public virtual async Task Async(bool isThreePhase, CancellationToken ct = default)
@@ -135,7 +153,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置三相模式下的相互关系 (PHASE:THREE INDEPEND / SAMEFREQ / BALANCE)[cite: 1]
/// 设置三相模式下的相互关系 (PHASE:THREE INDEPEND / SAMEFREQ / BALANCE)
/// </summary>
public virtual async Task Async(string relation, CancellationToken ct = default)
{
@@ -144,7 +162,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置输出开启相位角 (PHASE:ON)[cite: 1]
/// 设置输出开启相位角 (PHASE:ON)
/// </summary>
public virtual async Task Async(double degree, CancellationToken ct = default)
{
@@ -153,7 +171,7 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置输出关闭相位角 (PHASE:OFF)[cite: 1]
/// 设置输出关闭相位角 (PHASE:OFF)
/// </summary>
public virtual async Task Async(double degree, CancellationToken ct = default)
{
@@ -163,42 +181,50 @@ namespace DeviceCommand.Devices
#endregion
#region 5. (MEASure )[cite: 1]
#region 5. (MEASure )
/// <summary>
/// 查询交流电压均方根值 (MEAS:VOLT:AC?)[cite: 1]
/// 查询交流电压均方根值 (MEAS:VOLT:AC?)
/// </summary>
/// <param name="ct">取消令牌</param>
/// <returns>交流电压均方根值 (单位: V,保留两位小数)</returns>
public virtual async Task<double> Async(CancellationToken ct = default)
{
string resp = await WriteReadAsync($"MEAS:VOLT:AC?{ScpiDelimiter}", ScpiDelimiter, ct);
return double.TryParse(resp, NumberStyles.Any, CultureInfo.InvariantCulture, out double val) ? val : 0.0;
return ExtractDouble(resp);
}
/// <summary>
/// 查询交流电流均方根值 (MEAS:CURR:AC?)[cite: 1]
/// 查询交流电流均方根值 (MEAS:CURR:AC?)
/// </summary>
/// <param name="ct">取消令牌</param>
/// <returns>交流电流均方根值 (单位: A,保留两位小数)</returns>
public virtual async Task<double> Async(CancellationToken ct = default)
{
string resp = await WriteReadAsync($"MEAS:CURR:AC?{ScpiDelimiter}", ScpiDelimiter, ct);
return double.TryParse(resp, NumberStyles.Any, CultureInfo.InvariantCulture, out double val) ? val : 0.0;
return ExtractDouble(resp);
}
/// <summary>
/// 查询输出频率 (MEAS:FREQ?)[cite: 1]
/// 查询输出频率 (MEAS:FREQ?)
/// </summary>
/// <param name="ct">取消令牌</param>
/// <returns>输出频率值 (单位: Hz,保留两位小数)</returns>
public virtual async Task<double> Async(CancellationToken ct = default)
{
string resp = await WriteReadAsync($"MEAS:FREQ?{ScpiDelimiter}", ScpiDelimiter, ct);
return double.TryParse(resp, NumberStyles.Any, CultureInfo.InvariantCulture, out double val) ? val : 0.0;
return ExtractDouble(resp);
}
/// <summary>
/// 查询真实输出功率 (MEAS:POW:AC?)[cite: 1]
/// 查询真实输出功率 (MEAS:POW:AC?)
/// </summary>
/// <param name="ct">取消令牌</param>
/// <returns>真实输出功率值 (单位: W,保留两位小数)</returns>
public virtual async Task<double> Async(CancellationToken ct = default)
{
string resp = await WriteReadAsync($"MEAS:POW:AC?{ScpiDelimiter}", ScpiDelimiter, ct);
return double.TryParse(resp, NumberStyles.Any, CultureInfo.InvariantCulture, out double val) ? val : 0.0;
return ExtractDouble(resp);
}
#endregion