源适应性修改

This commit is contained in:
“hsc”
2026-10-21 16:44:15 +08:00
parent 12b532382d
commit 6bbca727ca
3 changed files with 91 additions and 60 deletions
+37 -13
View File
@@ -12,6 +12,8 @@ namespace DeviceCommand.Devices
{
/// <summary>
/// 交流源 一拖三 (Chroma 61800系列)
/// <para>SCPI 命令与参数范围按新手册 (61809/61812/61815, 新chromascpi.pdf) 校准:
/// 波形参数 SINE/SQUA/TRIAN/CSIN/DST01~30/USR01~30,Vac 0.0~350.0V,Vdc -495.0~495.0V,FREQ 30.00~100.00Hz</para>
/// </summary>
[ACPCommand]
public class Chroma61800 : Tcp
@@ -155,7 +157,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设置交流电压 (VOLT:AC)
/// </summary>
/// <param name="voltage">电压值 (0 ~ 300V 或高压选配范围)</param>
/// <param name="voltage">电压值 (0.0 ~ 350.0V)</param>
public virtual async Task 设置交流电压Async(double voltage, CancellationToken ct = default)
{
string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture);
@@ -165,6 +167,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设置直流电压 (VOLT:DC)
/// </summary>
/// <param name="voltage">电压值 (-495.0 ~ 495.0V)</param>
public virtual async Task 设置直流电压Async(double voltage, CancellationToken ct = default)
{
string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture);
@@ -174,7 +177,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设置输出频率 (FREQ)
/// </summary>
/// <param name="frequency">频率值 (Hz)</param>
/// <param name="frequency">频率值 (30.00 ~ 100.00 Hz)</param>
public virtual async Task 设置频率Async(double frequency, CancellationToken ct = default)
{
string valStr = frequency.ToString("0.###", CultureInfo.InvariantCulture);
@@ -182,8 +185,11 @@ namespace DeviceCommand.Devices
}
/// <summary>
/// 设置波形选择 (FUNC:SHAP:A SINE / SQUA / CSIN 等)
/// 设置波形 A 组形状 (FUNC:SHAP:A)
/// <para>冒号后的 A 是波形组别(仪器有 A/B 两组波形寄存器),不是波形形状;
/// 三角波拼写为 TRIAN(TRIA/TRI 均非法,仪器只接受精确的 TRIAN)</para>
/// </summary>
/// <param name="shape">SINE | SQUA | TRIAN | CSIN | DST01~DST30(内建)| USR01~USR30(用户自定义)</param>
public virtual async Task 设置波形Async(string shape, CancellationToken ct = default)
{
await SendAsync($"FUNC:SHAP:A {shape}{ScpiDelimiter}", ct);
@@ -194,7 +200,7 @@ namespace DeviceCommand.Devices
#region 4. 相位与多相模式控制 (INST & PHASE 子系统)
/// <summary>
/// 设置单/三相工作模式 (INST:PHAS THREE / SINGLE)
/// 设置单/三相工作模式 (INST:PHAS THREE / SINGLE / SPLIT)
/// </summary>
/// <param name="isThreePhase">true: 三相模式, false: 单相模式</param>
public virtual async Task 设置单三相模式Async(bool isThreePhase, CancellationToken ct = default)
@@ -373,7 +379,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定波形缓冲区列表点数的顺序 (SOUR:LIST:SHAP)
/// </summary>
/// <param name="shapes">波形缓冲区顺序,每个元素为 A 或 B</param>
/// <param name="shapes">各点波形: A | B | SINE | SQUA | TRIAN | CSIN | DST01~DST30 | USR01~USR30(可直接写形状名,也可引用 A/B 波形组)</param>
public virtual async Task 设置列表波形顺序Async(string[] shapes, CancellationToken ct = default)
{
string valStr = string.Join(",", shapes);
@@ -389,10 +395,28 @@ namespace DeviceCommand.Devices
await SendAsync($"SOUR:LIST:BASE {timeBase}{ScpiDelimiter}", ct);
}
/// <summary>
/// 设定列表功能的相位连续功能 (SOUR:LIST:PHAS:CONT)
/// </summary>
/// <param name="state">DISABLE | ENABLE</param>
public virtual async Task 设置列表相位连续Async(string state, CancellationToken ct = default)
{
await SendAsync($"SOUR:LIST:PHAS:CONT {state}{ScpiDelimiter}", ct);
}
/// <summary>
/// 查询列表功能的相位连续功能 (SOUR:LIST:PHAS:CONT?),返回 DISABLE 或 ENABLE
/// </summary>
public virtual async Task<string> 查询列表相位连续Async(CancellationToken ct = default)
{
string resp = await WriteReadAsync($"SOUR:LIST:PHAS:CONT?{ScpiDelimiter}", ScpiDelimiter, ct);
return resp?.Trim() ?? string.Empty;
}
/// <summary>
/// 设定 AC 起始电压列表点数的顺序 (SOUR:LIST:VOLT:AC:STAR)
/// </summary>
/// <param name="voltages">AC 起始电压序列 (单位: V,每个值 0.0 ~ 300.0)</param>
/// <param name="voltages">AC 起始电压序列 (单位: V,每个值 0.0 ~ 350.0)</param>
public virtual async Task 设置列表AC起始电压顺序Async(double[] voltages, CancellationToken ct = default)
{
string valStr = string.Join(",", Array.ConvertAll(voltages, v => v.ToString("0.###", CultureInfo.InvariantCulture)));
@@ -402,7 +426,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定 AC 结束电压列表点数的顺序 (SOUR:LIST:VOLT:AC:END)
/// </summary>
/// <param name="voltages">AC 结束电压序列 (单位: V,每个值 0.0 ~ 300.0)</param>
/// <param name="voltages">AC 结束电压序列 (单位: V,每个值 0.0 ~ 350.0)</param>
public virtual async Task 设置列表AC结束电压顺序Async(double[] voltages, CancellationToken ct = default)
{
string valStr = string.Join(",", Array.ConvertAll(voltages, v => v.ToString("0.###", CultureInfo.InvariantCulture)));
@@ -412,7 +436,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定 DC 起始电压列表点数的顺序 (SOUR:LIST:VOLT:DC:STAR)
/// </summary>
/// <param name="voltages">DC 起始电压序列 (单位: V,每个值 -424.2 ~ 414.2)</param>
/// <param name="voltages">DC 起始电压序列 (单位: V,每个值 -495.0 ~ 495.0)</param>
public virtual async Task 设置列表DC起始电压顺序Async(double[] voltages, CancellationToken ct = default)
{
string valStr = string.Join(",", Array.ConvertAll(voltages, v => v.ToString("0.###", CultureInfo.InvariantCulture)));
@@ -422,7 +446,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定 DC 结束电压列表点数的顺序 (SOUR:LIST:VOLT:DC:END)
/// </summary>
/// <param name="voltages">DC 结束电压序列 (单位: V,每个值 -424.2 ~ 414.2)</param>
/// <param name="voltages">DC 结束电压序列 (单位: V,每个值 -495.0 ~ 495.0)</param>
public virtual async Task 设置列表DC结束电压顺序Async(double[] voltages, CancellationToken ct = default)
{
string valStr = string.Join(",", Array.ConvertAll(voltages, v => v.ToString("0.###", CultureInfo.InvariantCulture)));
@@ -432,7 +456,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定起始频率列表点数的顺序 (SOUR:LIST:FREQ:STAR)
/// </summary>
/// <param name="frequencies">起始频率序列 (单位: Hz,每个值 15.00 ~ 100.00)</param>
/// <param name="frequencies">起始频率序列 (单位: Hz,每个值 30.00 ~ 100.00)</param>
public virtual async Task 设置列表起始频率顺序Async(double[] frequencies, CancellationToken ct = default)
{
string valStr = string.Join(",", Array.ConvertAll(frequencies, v => v.ToString("0.##", CultureInfo.InvariantCulture)));
@@ -442,7 +466,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定结束频率列表点数的顺序 (SOUR:LIST:FREQ:END)
/// </summary>
/// <param name="frequencies">结束频率序列 (单位: Hz,每个值 15.00 ~ 100.00)</param>
/// <param name="frequencies">结束频率序列 (单位: Hz,每个值 30.00 ~ 100.00)</param>
public virtual async Task 设置列表结束频率顺序Async(double[] frequencies, CancellationToken ct = default)
{
string valStr = string.Join(",", Array.ConvertAll(frequencies, v => v.ToString("0.##", CultureInfo.InvariantCulture)));
@@ -623,7 +647,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定 SYNTHESIS 模式的基波交流电压 (SOUR:SYNT:FUND)
/// </summary>
/// <param name="voltage">基波交流电压 (单位: V,0.0 ~ 300.0)</param>
/// <param name="voltage">基波交流电压 (单位: V,0.0 ~ 350.0)</param>
public virtual async Task 设置合成基波电压Async(double voltage, CancellationToken ct = default)
{
string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture);
@@ -633,7 +657,7 @@ namespace DeviceCommand.Devices
/// <summary>
/// 设定叠加于 SYNTHESIS 波形的直流电压 (SOUR:SYNT:DC)
/// </summary>
/// <param name="voltage">直流电压 (单位: V,-424.2 ~ 424.2)</param>
/// <param name="voltage">直流电压 (单位: V,-495.0 ~ 495.0)</param>
public virtual async Task 设置合成直流电压Async(double voltage, CancellationToken ct = default)
{
string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture);
@@ -173,6 +173,10 @@ namespace PowerAdaptabilityModule.ViewModels
/// <summary>列表时间基础 (TIME / CYCLE)</summary>
public string ListTimeBase { get => _listTimeBase; set => SetProperty(ref _listTimeBase, value); }
private string _listPhaseContinue = "DISABLE";
/// <summary>相位连续功能 (LIST:PHAS:CONT, DISABLE / ENABLE)</summary>
public string ListPhaseContinue { get => _listPhaseContinue; set => SetProperty(ref _listPhaseContinue, value); }
/// <summary>三相各自的 LIST 序列配置(索引 0=A/Φ1, 1=B/Φ2, 2=C/Φ3),INST:EDIT EACH 逐相下发</summary>
private readonly ListPhaseConfig[] _phaseConfigs = { new(), new(), new() };
@@ -195,8 +199,6 @@ namespace PowerAdaptabilityModule.ViewModels
private ListPhaseConfig CurCfg => _phaseConfigs[_listEditPhaseIndex];
// —— 以下文本属性均代理到"当前编辑相位"的配置,切换相位时统一刷新 ——
/// <summary>当前相波形 (FUNC:SHAP:A)</summary>
public string ListWaveform { get => CurCfg.Waveform; set { if (CurCfg.Waveform != value) { CurCfg.Waveform = value; RaisePropertyChanged(); } } }
/// <summary>相位角度序列 (LIST:DEGR, °)</summary>
public string ListDegrText { get => CurCfg.Degr; set { if (CurCfg.Degr != value) { CurCfg.Degr = value; RaisePropertyChanged(); } } }
/// <summary>AC 起始电压序列 (LIST:VOLT:AC:STAR, V)</summary>
@@ -213,13 +215,12 @@ namespace PowerAdaptabilityModule.ViewModels
public string ListFreqEndText { get => CurCfg.FreqEnd; set { if (CurCfg.FreqEnd != value) { CurCfg.FreqEnd = value; RaisePropertyChanged(); } } }
/// <summary>静止时间序列 (LIST:DWEL, ms)</summary>
public string ListDwellText { get => CurCfg.Dwell; set { if (CurCfg.Dwell != value) { CurCfg.Dwell = value; RaisePropertyChanged(); } } }
/// <summary>波形缓冲顺序 (LIST:SHAP, A/B)</summary>
/// <summary>波形顺序 (LIST:SHAP,可直接写形状名或引用 A/B 组)</summary>
public string ListShapeText { get => CurCfg.ShapeSeq; set { if (CurCfg.ShapeSeq != value) { CurCfg.ShapeSeq = value; RaisePropertyChanged(); } } }
/// <summary>切换编辑相位后,通知所有序列文本框刷新为新相位内容</summary>
private void RaiseListSequenceChanged()
{
RaisePropertyChanged(nameof(ListWaveform));
RaisePropertyChanged(nameof(ListDegrText));
RaisePropertyChanged(nameof(ListVoltAcStartText));
RaisePropertyChanged(nameof(ListVoltAcEndText));
@@ -233,11 +234,12 @@ namespace PowerAdaptabilityModule.ViewModels
#endregion
#region 下拉选项
public IReadOnlyList<string> WaveformOptions { get; } = new[] { "SINE", "SQUA", "CSIN" };
public IReadOnlyList<string> WaveformOptions { get; } = new[] { "SINE", "SQUA", "TRIAN", "CSIN" };
public IReadOnlyList<string> CouplingOptions { get; } = new[] { "AC", "DC", "ACDC" };
public IReadOnlyList<string> RelationOptions { get; } = new[] { "INDEPEND", "SAMEFREQ", "BALANCE" };
public IReadOnlyList<string> ListTriggerOptions { get; } = new[] { "AUTO", "MANUAL", "EXCITE" };
public IReadOnlyList<string> ListTimeBaseOptions { get; } = new[] { "TIME", "CYCLE" };
public IReadOnlyList<string> ListPhaseContinueOptions { get; } = new[] { "DISABLE", "ENABLE" };
#endregion
#region 输入参数(SYNTHESIS 自定义谐波波形输出)
@@ -257,11 +259,11 @@ namespace PowerAdaptabilityModule.ViewModels
public int SynthFrequency { get => _synthFrequency; set => SetProperty(ref _synthFrequency, value); }
private double _synthFundamental = 220;
/// <summary>基波交流电压 (SYNT:FUND, 0.0 ~ 300.0 V)</summary>
/// <summary>基波交流电压 (SYNT:FUND, 0.0 ~ 350.0 V)</summary>
public double SynthFundamental { get => _synthFundamental; set => SetProperty(ref _synthFundamental, value); }
private double _synthDc;
/// <summary>叠加直流电压 (SYNT:DC, -424.2 ~ 424.2 V)</summary>
/// <summary>叠加直流电压 (SYNT:DC, -495.0 ~ 495.0 V)</summary>
public double SynthDc { get => _synthDc; set => SetProperty(ref _synthDc, value); }
private double _synthStartPhase;
@@ -526,6 +528,9 @@ namespace PowerAdaptabilityModule.ViewModels
ListCount = p.Count;
ListTrigger = p.Trigger;
ListTimeBase = p.TimeBase;
// 旧测试项文件没有相位连续键(PhaseContinue 为 null)时保持界面当前值不动
if (!string.IsNullOrWhiteSpace(p.PhaseContinue))
ListPhaseContinue = p.PhaseContinue;
for (int i = 0; i < 3 && i < p.Phases.Length; i++)
_phaseConfigs[i] = p.Phases[i].Clone();
@@ -534,7 +539,7 @@ namespace PowerAdaptabilityModule.ViewModels
PresetName = p.Name; // 名称框回显当前文件名
PresetNote = p.Note;
_currentPresetPath = PresetPathOf(p.Name); // 记住当前打开的文件,此后“保存”只覆盖它
Log($"已载入测试项:{p.Name}(次数={(p.Count == 0 ? "无限" : p.Count.ToString())} 触发={p.Trigger} 时基={p.TimeBase})");
Log($"已载入测试项:{p.Name}(次数={(p.Count == 0 ? "无限" : p.Count.ToString())} 触发={p.Trigger} 时基={p.TimeBase} 相位连续={p.PhaseContinue ?? "未指定(保持当前)"})");
});
// 保存:覆盖当前打开的测试项文件(未打开文件时按“另存为”新建)
@@ -579,7 +584,8 @@ namespace PowerAdaptabilityModule.ViewModels
await _dev.设置列表执行次数Async(ListCount, Ct()); // LIST:COUN(0=无限循环)
await _dev.设置列表触发形态Async(ListTrigger, Ct()); // LIST:TRIG
await _dev.设置列表时间基础Async(ListTimeBase, Ct()); // LIST:BASE
await 下发单相序列Async(_phaseConfigs[p]); // FUNC:SHAP:A + LIST:xxx 序列
await _dev.设置列表相位连续Async(ListPhaseContinue, Ct()); // LIST:PHAS:CONT(相位连续,随相位上下文分相)
await 下发单相序列Async(_phaseConfigs[p]); // LIST:xxx 序列
}
await _dev.延时Async(StartDelayMs, Ct()); // *D 200(等待仪器就绪)
@@ -929,7 +935,7 @@ namespace PowerAdaptabilityModule.ViewModels
string stem = Path.GetFileNameWithoutExtension(file);
return string.Equals(item.Name, stem, StringComparison.Ordinal)
? item
: new ListPreset(stem, item.Note, item.Count, item.Phases, item.Trigger, item.TimeBase);
: new ListPreset(stem, item.Note, item.Count, item.Phases, item.Trigger, item.TimeBase, item.PhaseContinue);
}
/// <summary>按名称拼出测试项文件完整路径(写入、另存、删除共用同一规则)。</summary>
@@ -952,7 +958,8 @@ namespace PowerAdaptabilityModule.ViewModels
ListCount,
new[] { _phaseConfigs[0].Clone(), _phaseConfigs[1].Clone(), _phaseConfigs[2].Clone() },
ListTrigger,
ListTimeBase);
ListTimeBase,
ListPhaseContinue);
/// <summary>
/// 保存:覆盖写入“当前打开的文件”,不改变文件名(名称框内容不参与)。
@@ -1446,7 +1453,7 @@ namespace PowerAdaptabilityModule.ViewModels
.ToArray();
}
/// <summary>解析波形缓冲顺序(A/B)序列。</summary>
/// <summary>解析波形顺序序列(形状名或 A/B)。</summary>
private static string[] ParseShapes(string text)
{
if (string.IsNullOrWhiteSpace(text)) return Array.Empty<string>();
@@ -1457,13 +1464,11 @@ namespace PowerAdaptabilityModule.ViewModels
/// <summary>
/// 下发单个相位的 LIST 序列(调用前须已通过 INST:NSEL 选定目标相、并已 INST:EDIT EACH)。
/// <para>依次下发 FUNC:SHAP:A 波形,以及 DEGR / VOLT:AC / VOLT:DC / FREQ / DWEL / SHAP 各序列,留空的序列跳过。</para>
/// <para>依次下发 DEGR / VOLT:AC / VOLT:DC / FREQ / DWEL / SHAP 各序列,留空的序列跳过;
/// LIST:SHAP 各点可直接写形状名 SINE/SQUA/TRIAN/CSIN/DST01~30/USR01~30,也可引用仪器 A/B 波形组。</para>
/// </summary>
private async Task 下发单相序列Async(ListPhaseConfig cfg)
{
if (!string.IsNullOrWhiteSpace(cfg.Waveform))
await _dev!.设置波形Async(cfg.Waveform.Trim(), Ct()); // FUNC:SHAP:A
var degr = ParseDoubles(cfg.Degr);
if (degr.Length > 0) await _dev!.设置列表相位角度顺序Async(degr, Ct()); // LIST:DEGR
@@ -1532,12 +1537,11 @@ namespace PowerAdaptabilityModule.ViewModels
/// 构建三相对称的 LIST 相位配置:以给定参数为 A 相,B/C 相复制后 DEGR 自动 +120°/+240°。
/// 适用于三相平衡试验(电压/频率范围、骤变、瞬时跌落等)。DWEL 单位 ms。
/// </summary>
private static ListPhaseConfig[] Sym(string waveform, string degr, string vacS, string vacE,
private static ListPhaseConfig[] Sym(string degr, string vacS, string vacE,
string vdcS, string vdcE, string fS, string fE, string dwell, string shape = "")
{
var a = new ListPhaseConfig
{
Waveform = waveform,
Degr = degr,
VoltAcStart = vacS,
VoltAcEnd = vacE,
@@ -1562,66 +1566,66 @@ namespace PowerAdaptabilityModule.ViewModels
// ===== 5.1 交流电压范围(三相平衡渐变,2 循环,DWEL 单位 ms)=====
new ListPreset("5.1 上限电压范围 220→265V",
"三相平衡:额定 220V 线性升至上限 265V 再回落,各段 90s,2 循环。判定 A。",
2, Sym("SINE", "0,0", "220,265", "265,220", "", "", "50,50", "50,50", "90000,90000")),
2, Sym("0,0", "220,265", "265,220", "", "", "50,50", "50,50", "90000,90000")),
new ListPreset("5.1 下限电压范围 220→85V",
"三相平衡:220V 降至下限 85V 再回升,各段 90s,2 循环。判定 B。",
2, Sym("SINE", "0,0", "220,85", "85,220", "", "", "50,50", "50,50", "90000,90000")),
2, Sym("0,0", "220,85", "85,220", "", "", "50,50", "50,50", "90000,90000")),
new ListPreset("5.1 上限保护电压 220→275V",
"验证过压保护点与恢复点:220V 升至 275V 再回落,2 循环。判定 C。",
2, Sym("SINE", "0,0", "220,275", "275,220", "", "", "50,50", "50,50", "90000,90000")),
2, Sym("0,0", "220,275", "275,220", "", "", "50,50", "50,50", "90000,90000")),
new ListPreset("5.1 下限保护电压 220→80V",
"验证欠压保护点与恢复点:220V 降至 80V 再回升,2 循环。判定 C。",
2, Sym("SINE", "0,0", "220,80", "80,220", "", "", "50,50", "50,50", "90000,90000")),
2, Sym("0,0", "220,80", "80,220", "", "", "50,50", "50,50", "90000,90000")),
// ===== 5.3 交流频率范围(220V 恒定,频率渐变,2 循环)=====
new ListPreset("5.3 上限频率范围 50→65Hz",
"220V 恒定,频率 50Hz 升至 65Hz 再回落,各段 60s,2 循环。判定 B。",
2, Sym("SINE", "0,0", "220,220", "220,220", "", "", "50,65", "65,50", "60000,60000")),
2, Sym("0,0", "220,220", "220,220", "", "", "50,65", "65,50", "60000,60000")),
new ListPreset("5.3 下限频率范围 50→40Hz",
"220V 恒定,频率 50Hz 降至 40Hz 再回升,各段 60s,2 循环。判定 B。",
2, Sym("SINE", "0,0", "220,220", "220,220", "", "", "50,40", "40,50", "60000,60000")),
2, Sym("0,0", "220,220", "220,220", "", "", "50,40", "40,50", "60000,60000")),
new ListPreset("5.3 上限保护频率 50→75Hz",
"验证过频保护点与恢复点:50Hz 升至 75Hz 再回落,2 循环。判定 C。",
2, Sym("SINE", "0,0", "220,220", "220,220", "", "", "50,75", "75,50", "60000,60000")),
2, Sym("0,0", "220,220", "220,220", "", "", "50,75", "75,50", "60000,60000")),
// ===== 5.4 交流电压骤变(指定相位角阶跃,2 循环)=====
new ListPreset("5.4 上限电压骤变 220→265V@90°",
"稳态 220V(5s)→在 90° 相位瞬间跳到 265V(0.5s)→跳回。改 DEGR 中间值可切 0/180/270°。判定 B。",
2, Sym("SINE", "0,90,0", "220,265,220", "220,265,220", "", "", "50,50,50", "50,50,50", "5000,500,5000")),
2, Sym("0,90,0", "220,265,220", "220,265,220", "", "", "50,50,50", "50,50,50", "5000,500,5000")),
new ListPreset("5.4 下限电压骤变 220→90V@90°",
"稳态 220V→在 90° 瞬间跌到 90V(0.5s)→恢复。判定 B。",
2, Sym("SINE", "0,90,0", "220,90,220", "220,90,220", "", "", "50,50,50", "50,50,50", "5000,500,5000")),
2, Sym("0,90,0", "220,90,220", "220,90,220", "", "", "50,50,50", "50,50,50", "5000,500,5000")),
// ===== 5.5 交流频率骤变(2 循环)=====
new ListPreset("5.5 上限频率骤变 50→75Hz",
"220V 恒定,频率 50Hz 瞬间跳到 75Hz(1s)再回落。判定 B。",
2, Sym("SINE", "0,90,0", "220,220,220", "220,220,220", "", "", "50,75,50", "50,75,50", "5000,1000,5000")),
2, Sym("0,90,0", "220,220,220", "220,220,220", "", "", "50,75,50", "50,75,50", "5000,1000,5000")),
new ListPreset("5.5 下限频率骤变 50→40Hz",
"220V 恒定,频率 50Hz 瞬间跌到 40Hz(1s)再回升。判定 B。",
2, Sym("SINE", "0,90,0", "220,220,220", "220,220,220", "", "", "50,40,50", "50,40,50", "5000,1000,5000")),
2, Sym("0,90,0", "220,220,220", "220,220,220", "", "", "50,40,50", "50,40,50", "5000,1000,5000")),
// ===== 5.12 瞬时电压跌落/冲击(1ms 突变,2 循环)=====
new ListPreset("5.12 0°冲击 310V/1ms",
"稳态 220V→0° 相位冲击到 310V 峰值持续 1ms→恢复。1ms 接近 LIST 最小 dwell,若不精确请改 BASE CYCLE。判定不低于 C。",
2, Sym("SINE", "0,0,0", "220,310,220", "220,310,220", "", "", "50,50,50", "50,50,50", "5000,1,5000")),
2, Sym("0,0,0", "220,310,220", "220,310,220", "", "", "50,50,50", "50,50,50", "5000,1,5000")),
new ListPreset("5.12 90°跌落 0V/1ms",
"稳态 220V→90° 相位跌到 0V 持续 1ms→恢复。判定不低于 C。",
2, Sym("SINE", "0,90,0", "220,0,220", "220,0,220", "", "", "50,50,50", "50,50,50", "5000,1,5000")),
2, Sym("0,90,0", "220,0,220", "220,0,220", "", "", "50,50,50", "50,50,50", "5000,1,5000")),
// ===== 单相深跌(不对称,A 相深跌 / B·C 相浅跌,无限循环)=====
new ListPreset("5.x 单相深跌 A相11.5V(不对称示例)",
"A 相跌到 11.5V、B/C 相跌到 200.1V,跌落 280ms,前后各稳态 20s;三相 DEGR 基准 0/120/240、中间点各异。无限循环,需手动停止。",
0, new[]
{
new ListPhaseConfig { Waveform = "SINE", Degr = "0,0,0", VoltAcStart = "230,11.5,230", VoltAcEnd = "230,11.5,230", VoltDcStart = "10,10,10", VoltDcEnd = "10,10,10", FreqStart = "50,50,50", FreqEnd = "50,50,50", Dwell = "20000,280,20000" },
new ListPhaseConfig { Waveform = "SINE", Degr = "120,92,120", VoltAcStart = "230,200.1,230", VoltAcEnd = "230,200.1,230", VoltDcStart = "10,10,10", VoltDcEnd = "10,10,10", FreqStart = "50,50,50", FreqEnd = "50,50,50", Dwell = "20000,280,20000" },
new ListPhaseConfig { Waveform = "SINE", Degr = "240,268,240", VoltAcStart = "230,200.1,230", VoltAcEnd = "230,200.1,230", VoltDcStart = "10,10,10", VoltDcEnd = "10,10,10", FreqStart = "50,50,50", FreqEnd = "50,50,50", Dwell = "20000,280,20000" },
new ListPhaseConfig { Degr = "0,0,0", VoltAcStart = "230,11.5,230", VoltAcEnd = "230,11.5,230", VoltDcStart = "10,10,10", VoltDcEnd = "10,10,10", FreqStart = "50,50,50", FreqEnd = "50,50,50", Dwell = "20000,280,20000" },
new ListPhaseConfig { Degr = "120,92,120", VoltAcStart = "230,200.1,230", VoltAcEnd = "230,200.1,230", VoltDcStart = "10,10,10", VoltDcEnd = "10,10,10", FreqStart = "50,50,50", FreqEnd = "50,50,50", Dwell = "20000,280,20000" },
new ListPhaseConfig { Degr = "240,268,240", VoltAcStart = "230,200.1,230", VoltAcEnd = "230,200.1,230", VoltDcStart = "10,10,10", VoltDcEnd = "10,10,10", FreqStart = "50,50,50", FreqEnd = "50,50,50", Dwell = "20000,280,20000" },
}),
// ===== 6.3 直流电压骤变(注意量程与耦合模式)=====
new ListPreset("6.3 直流骤变 680→860→450V【注意量程】",
"直流侧瞬时骤变。⚠ 需先在“耦合模式”设为 DC;且 680~860V 已超 Chroma61800.cs 标注的 DC 量程(-424.2~414.2V),须确认设备为高压选配档,否则命令会被拒绝或截顶。",
2, Sym("SINE", "0,0,0,0", "", "", "680,860,450,680", "680,860,450,680", "", "", "5000,5000,5000,5000")),
"直流侧瞬时骤变。⚠ 需先在“耦合模式”设为 DC;且 680~860V 已超 Chroma61800.cs 标注的 DC 量程(-495.0~495.0V),须确认设备为高压选配档,否则命令会被拒绝或截顶。",
2, Sym("0,0,0,0", "", "", "680,860,450,680", "680,860,450,680", "", "", "5000,5000,5000,5000")),
};
#endregion
@@ -1639,8 +1643,6 @@ namespace PowerAdaptabilityModule.ViewModels
/// </summary>
public class ListPhaseConfig
{
/// <summary>该相波形 (FUNC:SHAP:A),如 SINE / SQUA</summary>
public string Waveform { get; set; } = "SINE";
/// <summary>相位角度序列 (LIST:DEGR, °)</summary>
public string Degr { get; set; } = "";
/// <summary>AC 起始电压序列 (LIST:VOLT:AC:STAR, V)</summary>
@@ -1657,7 +1659,7 @@ namespace PowerAdaptabilityModule.ViewModels
public string FreqEnd { get; set; } = "";
/// <summary>静止时间序列 (LIST:DWEL, ms)</summary>
public string Dwell { get; set; } = "";
/// <summary>波形缓冲顺序 (LIST:SHAP, A/B)</summary>
/// <summary>波形顺序 (LIST:SHAP,可直接写形状名或引用 A/B 组)</summary>
public string ShapeSeq { get; set; } = "";
/// <summary>浅拷贝一份配置(用于"复制到三相")。</summary>
@@ -1665,7 +1667,7 @@ namespace PowerAdaptabilityModule.ViewModels
}
/// <summary>
/// 大纲典型试验预设:一次载入即可填充三相 LIST 序列与基础参数(次数/触发/时基)。
/// 大纲典型试验预设:一次载入即可填充三相 LIST 序列与基础参数(次数/触发/时基/相位连续)。
/// </summary>
public class ListPreset
{
@@ -1679,12 +1681,14 @@ namespace PowerAdaptabilityModule.ViewModels
public string Trigger { get; }
/// <summary>时间基础 (LIST:BASE)</summary>
public string TimeBase { get; }
/// <summary>相位连续功能 (LIST:PHAS:CONT);旧文件无此键时为 null,载入时保持界面当前值</summary>
public string? PhaseContinue { get; }
/// <summary>三相序列配置(索引 0=A/Φ1, 1=B/Φ2, 2=C/Φ3)</summary>
public ListPhaseConfig[] Phases { get; }
[JsonConstructor]
public ListPreset(string name, string note, int count, ListPhaseConfig[] phases,
string trigger = "AUTO", string timeBase = "TIME")
string trigger = "AUTO", string timeBase = "TIME", string? phaseContinue = null)
{
Name = name;
Note = note;
@@ -1692,6 +1696,7 @@ namespace PowerAdaptabilityModule.ViewModels
Phases = phases;
Trigger = trigger;
TimeBase = timeBase;
PhaseContinue = phaseContinue;
}
}
@@ -163,7 +163,8 @@
<TextBlock Text="波形" Style="{StaticResource ParamLabel}" />
<ComboBox Width="130" Height="32" FontSize="12" Margin="4,0"
ItemsSource="{Binding WaveformOptions}"
SelectedItem="{Binding Waveform}" />
SelectedItem="{Binding Waveform}"
ToolTip="FUNC:SHAP:A — SINE / SQUA / TRIAN(三角)/ CSIN、内建 DST01~30、自定义 USR01~30" />
<Button Content="设置" Command="{Binding SetWaveformCommand}"
Style="{StaticResource CmdBtn}" />
</StackPanel>
@@ -228,6 +229,11 @@
<ComboBox Width="80" Height="32" FontSize="12" Margin="4,0"
ItemsSource="{Binding ListTimeBaseOptions}"
SelectedItem="{Binding ListTimeBase}" />
<TextBlock Text="相位连续" Style="{StaticResource ParamLabel}" />
<ComboBox Width="88" Height="32" FontSize="12" Margin="4,0"
ToolTip="SOUR:LIST:PHAS:CONT — 相位连续功能:DISABLE | ENABLE"
ItemsSource="{Binding ListPhaseContinueOptions}"
SelectedItem="{Binding ListPhaseContinue}" />
</StackPanel>
<Separator Margin="0,6" />
@@ -236,10 +242,6 @@
<ComboBox Width="100" Height="32" FontSize="12" Margin="4,0"
ItemsSource="{Binding ListPhaseOptions}"
SelectedIndex="{Binding ListEditPhaseIndex}" />
<TextBlock Text="该相波形" Style="{StaticResource ParamLabel}" />
<ComboBox Width="80" Height="32" FontSize="12" Margin="4,0"
ItemsSource="{Binding WaveformOptions}"
SelectedItem="{Binding ListWaveform}" />
</StackPanel>
<Button Content="复制当前相到三相(B/C 相位角自动 ±120°)"
Command="{Binding CopyPhaseToThreeCommand}"
@@ -315,7 +317,7 @@
<TextBlock Grid.Row="8" Grid.Column="0" Text="波形顺序"
Style="{StaticResource ParamLabel}" />
<TextBox Grid.Row="8" Grid.Column="1" Style="{StaticResource NumInput}"
Width="240" ToolTip="LIST:SHAP,A / B 序列,如 A,A,A(可留空)"
Width="240" ToolTip="LIST:SHAP 序列:可直接写形状名 SINE/SQUA/TRIAN/CSIN/DST01~30/USR01~30,或引用 A/B 组,如 SINE,SQUA,TRIAN(可留空)"
Text="{Binding ListShapeText, UpdateSourceTrigger=PropertyChanged}" />
</Grid>