list更改
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
using DeviceCommand.Base;
|
||||
using Model.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
@@ -39,6 +40,26 @@ namespace DeviceCommand.Devices
|
||||
: 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从设备返回的 SCPI 响应字符串中提取全部数值并按顺序转换为 double 数组。
|
||||
/// 用于解析形如 "1.2,3.4,5.6" 的多值响应(如谐波振幅数组 MEAS:HARM:ARR?)。
|
||||
/// 兼容逗号/分号/空格分隔及科学计数法。
|
||||
/// </summary>
|
||||
/// <param name="raw">设备返回的原始字符串</param>
|
||||
/// <returns>按出现顺序排列的数值数组,无有效数值时返回空数组</returns>
|
||||
private static double[] ExtractDoubleArray(string raw)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(raw)) return Array.Empty<double>();
|
||||
|
||||
var values = new List<double>();
|
||||
foreach (Match m in Regex.Matches(raw, @"[+-]?(?:\d+\.?\d*|\.\d+)(?:[Ee][+-]?\d+)?"))
|
||||
{
|
||||
if (double.TryParse(m.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double v))
|
||||
values.Add(v);
|
||||
}
|
||||
return values.ToArray();
|
||||
}
|
||||
|
||||
#region 1. 基础系统与公共指令
|
||||
|
||||
/// <summary>
|
||||
@@ -65,6 +86,17 @@ namespace DeviceCommand.Devices
|
||||
return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 命令流延时 (*D)
|
||||
/// <para>在 SCPI 命令流中插入一段延时(单位: ms),常用于 LIST 参数下发完成后、切换 OUTP:MODE 之前等待仪器就绪</para>
|
||||
/// </summary>
|
||||
/// <param name="milliseconds">延时时长 (ms)</param>
|
||||
public virtual async Task 延时Async(double milliseconds, CancellationToken ct = default)
|
||||
{
|
||||
string valStr = milliseconds.ToString("0.###", CultureInfo.InvariantCulture);
|
||||
await SendAsync($"*D {valStr}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 2. 基础输出与耦合控制 (OUTPut 子系统)
|
||||
@@ -161,6 +193,37 @@ namespace DeviceCommand.Devices
|
||||
await SendAsync($"PHASE:THREE {relation}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置相位耦合模式 (INST:COUP)
|
||||
/// <para>ALL: 后续命令发送至所有相位; NONE: 仅发送至 NSEL 选定的相位</para>
|
||||
/// </summary>
|
||||
/// <param name="coupling">耦合模式: ALL | NONE</param>
|
||||
public virtual async Task 设置相位耦合Async(string coupling, CancellationToken ct = default)
|
||||
{
|
||||
await SendAsync($"INST:COUP {coupling}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按编号选择输出相位 (INST:NSEL)
|
||||
/// <para>仅在 INST:COUP NONE 时生效,后续 SOURCE 命令将作用于选定相位</para>
|
||||
/// </summary>
|
||||
/// <param name="phase">相位编号: 1(A相) | 2(B相) | 3(C相)</param>
|
||||
public virtual async Task 选择相位Async(int phase, CancellationToken ct = default)
|
||||
{
|
||||
await SendAsync($"INST:NSEL {phase}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置参数编辑方式 (INST:EDIT)
|
||||
/// <para>EACH: 逐相独立编辑,配合 <see cref="选择相位Async"/> 分别为 A/B/C 三相下发各自的 LIST/参数;
|
||||
/// ALL: 三相统一编辑,一次下发同时作用于三相</para>
|
||||
/// </summary>
|
||||
/// <param name="mode">编辑方式: EACH | ALL</param>
|
||||
public virtual async Task 设置编辑方式Async(string mode, CancellationToken ct = default)
|
||||
{
|
||||
await SendAsync($"INST:EDIT {mode}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置输出开启相位角 (PHASE:ON)
|
||||
/// </summary>
|
||||
@@ -387,6 +450,110 @@ namespace DeviceCommand.Devices
|
||||
await SendAsync($"TRIG {state}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询列表触发执行状态 (TRIG:STATE?)
|
||||
/// <para>返回 ON 表示 LIST 正在执行,OFF 表示已执行完毕;
|
||||
/// 重新下发 LIST 参数前应先轮询本命令等待其变为 OFF,避免执行中被改写</para>
|
||||
/// </summary>
|
||||
/// <param name="ct">取消令牌</param>
|
||||
/// <returns>true: 正在执行(ON); false: 已结束(OFF)</returns>
|
||||
public virtual async Task<bool> 查询触发状态Async(CancellationToken ct = default)
|
||||
{
|
||||
string resp = await WriteReadAsync($"TRIG:STATE?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||||
return resp != null && resp.Trim().StartsWith("ON", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 7. 谐波量测 (Harmonic Sense 子系统)
|
||||
|
||||
/// <summary>
|
||||
/// 设置谐波分析的测量来源 (CONFigure:HARMonic:SOURce)
|
||||
/// </summary>
|
||||
/// <param name="source">VOLT: 输出电压; CURR: 输出电流</param>
|
||||
public virtual async Task 设置谐波量测源Async(string source, CancellationToken ct = default)
|
||||
{
|
||||
// 有效参数: VOLT, CURR
|
||||
await SendAsync($"CONF:HARM:SOUR {source}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置谐波量测结果显示方式 (CONFigure:HARMonic:TIMES)
|
||||
/// <para>SINGLE: 保留单次测量结果,约需 3 秒; CONTINUE: 持续更新,约需 10 秒稳定</para>
|
||||
/// </summary>
|
||||
/// <param name="times">显示方式: SINGLE | CONTINUE</param>
|
||||
public virtual async Task 设置谐波量测方式Async(string times, CancellationToken ct = default)
|
||||
{
|
||||
// 有效参数: SINGLE, CONTINUE
|
||||
await SendAsync($"CONF:HARM:TIM {times}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置每个谐波阶的数据格式 (CONFigure:HARMonic:PARameter)
|
||||
/// </summary>
|
||||
/// <param name="parameter">VALUE: 绝对值; PERCENT: 基频百分率</param>
|
||||
public virtual async Task 设置谐波数据格式Async(string parameter, CancellationToken ct = default)
|
||||
{
|
||||
// 有效参数: VALUE, PERCENT
|
||||
await SendAsync($"CONF:HARM:PAR {parameter}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置谐波分析的原始波形基频 (CONFigure:HARMonic:FREQuency)
|
||||
/// </summary>
|
||||
/// <param name="frequency">基频: 50 或 60 (Hz)</param>
|
||||
public virtual async Task 设置谐波基频Async(int frequency, CancellationToken ct = default)
|
||||
{
|
||||
await SendAsync($"CONF:HARM:FREQ {frequency}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 开启/关闭谐波量测 (SENSe:HARMonic)
|
||||
/// <para>每次新的 Fetch/Measure 前必须先 ON,约需 3 秒得到结果;
|
||||
/// 若要量测其他数据,须先设回 OFF。分相量测配合 INST:COUP NONE + INST:NSEL 逐相进行</para>
|
||||
/// </summary>
|
||||
/// <param name="isOn">true: 开启谐波量测(ON); false: 关闭(OFF)</param>
|
||||
public virtual async Task 设置谐波量测开关Async(bool isOn, CancellationToken ct = default)
|
||||
{
|
||||
string state = isOn ? "ON" : "OFF";
|
||||
await SendAsync($"SENS:HARM {state}{ScpiDelimiter}", ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询总谐波失真 (MEASure:HARMonic:THD?)
|
||||
/// </summary>
|
||||
/// <param name="ct">取消令牌</param>
|
||||
/// <returns>总谐波失真 THD (单位: %,保留两位小数)</returns>
|
||||
public virtual async Task<double> 查询谐波总失真Async(CancellationToken ct = default)
|
||||
{
|
||||
string resp = await WriteReadAsync($"MEAS:HARM:THD?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||||
return ExtractDouble(resp);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询输出电压/电流的基频幅值 (MEASure:HARMonic:FUNDamental?)
|
||||
/// </summary>
|
||||
/// <param name="ct">取消令牌</param>
|
||||
/// <returns>基频幅值 (单位依 CONF:HARM:PAR 为 V/A 绝对值或百分率)</returns>
|
||||
public virtual async Task<double> 查询谐波基频幅值Async(CancellationToken ct = default)
|
||||
{
|
||||
string resp = await WriteReadAsync($"MEAS:HARM:FUND?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||||
return ExtractDouble(resp);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询所有谐波阶的振幅数组 (MEASure:HARMonic:ARRay?)
|
||||
/// <para>手册 5.7 谐波测量:可量测 2~50 阶谐波,来源可选输出电压(VOLT)或电流(CURR)。
|
||||
/// 注意:仅返回各阶振幅,不含各阶相位角,故据此重构的波形形状为"同相叠加"近似</para>
|
||||
/// </summary>
|
||||
/// <param name="ct">取消令牌</param>
|
||||
/// <returns>各次谐波振幅数组(按阶次升序;单位依 CONF:HARM:PAR)</returns>
|
||||
public virtual async Task<double[]> 查询谐波振幅数组Async(CancellationToken ct = default)
|
||||
{
|
||||
string resp = await WriteReadAsync($"MEAS:HARM:ARR?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||||
return ExtractDoubleArray(resp);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user