From 6bbca727ca2cd17cd53472453885d43a53fc7d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Chsc=E2=80=9D?= <“huangsucan@kaiyili-lab.com”> Date: Wed, 21 Oct 2026 16:44:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=BA=90=E9=80=82=E5=BA=94=E6=80=A7=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DeviceCommand/Devices/Chroma61800.cs | 50 ++++++++--- .../ViewModels/PowerAdaptabilityViewModel.cs | 87 ++++++++++--------- .../Views/PowerAdaptabilityView.xaml | 14 +-- 3 files changed, 91 insertions(+), 60 deletions(-) diff --git a/DeviceCommand/Devices/Chroma61800.cs b/DeviceCommand/Devices/Chroma61800.cs index 864d43c..e68cb7c 100644 --- a/DeviceCommand/Devices/Chroma61800.cs +++ b/DeviceCommand/Devices/Chroma61800.cs @@ -12,6 +12,8 @@ namespace DeviceCommand.Devices { /// /// 交流源 一拖三 (Chroma 61800系列) + /// 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 /// [ACPCommand] public class Chroma61800 : Tcp @@ -155,7 +157,7 @@ namespace DeviceCommand.Devices /// /// 设置交流电压 (VOLT:AC) /// - /// 电压值 (0 ~ 300V 或高压选配范围) + /// 电压值 (0.0 ~ 350.0V) public virtual async Task 设置交流电压Async(double voltage, CancellationToken ct = default) { string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture); @@ -165,6 +167,7 @@ namespace DeviceCommand.Devices /// /// 设置直流电压 (VOLT:DC) /// + /// 电压值 (-495.0 ~ 495.0V) public virtual async Task 设置直流电压Async(double voltage, CancellationToken ct = default) { string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture); @@ -174,7 +177,7 @@ namespace DeviceCommand.Devices /// /// 设置输出频率 (FREQ) /// - /// 频率值 (Hz) + /// 频率值 (30.00 ~ 100.00 Hz) public virtual async Task 设置频率Async(double frequency, CancellationToken ct = default) { string valStr = frequency.ToString("0.###", CultureInfo.InvariantCulture); @@ -182,8 +185,11 @@ namespace DeviceCommand.Devices } /// - /// 设置波形选择 (FUNC:SHAP:A SINE / SQUA / CSIN 等) + /// 设置波形 A 组形状 (FUNC:SHAP:A) + /// 冒号后的 A 是波形组别(仪器有 A/B 两组波形寄存器),不是波形形状; + /// 三角波拼写为 TRIAN(TRIA/TRI 均非法,仪器只接受精确的 TRIAN) /// + /// SINE | SQUA | TRIAN | CSIN | DST01~DST30(内建)| USR01~USR30(用户自定义) 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 子系统) /// - /// 设置单/三相工作模式 (INST:PHAS THREE / SINGLE) + /// 设置单/三相工作模式 (INST:PHAS THREE / SINGLE / SPLIT) /// /// true: 三相模式, false: 单相模式 public virtual async Task 设置单三相模式Async(bool isThreePhase, CancellationToken ct = default) @@ -373,7 +379,7 @@ namespace DeviceCommand.Devices /// /// 设定波形缓冲区列表点数的顺序 (SOUR:LIST:SHAP) /// - /// 波形缓冲区顺序,每个元素为 A 或 B + /// 各点波形: A | B | SINE | SQUA | TRIAN | CSIN | DST01~DST30 | USR01~USR30(可直接写形状名,也可引用 A/B 波形组) 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); } + /// + /// 设定列表功能的相位连续功能 (SOUR:LIST:PHAS:CONT) + /// + /// DISABLE | ENABLE + public virtual async Task 设置列表相位连续Async(string state, CancellationToken ct = default) + { + await SendAsync($"SOUR:LIST:PHAS:CONT {state}{ScpiDelimiter}", ct); + } + + /// + /// 查询列表功能的相位连续功能 (SOUR:LIST:PHAS:CONT?),返回 DISABLE 或 ENABLE + /// + public virtual async Task 查询列表相位连续Async(CancellationToken ct = default) + { + string resp = await WriteReadAsync($"SOUR:LIST:PHAS:CONT?{ScpiDelimiter}", ScpiDelimiter, ct); + return resp?.Trim() ?? string.Empty; + } + /// /// 设定 AC 起始电压列表点数的顺序 (SOUR:LIST:VOLT:AC:STAR) /// - /// AC 起始电压序列 (单位: V,每个值 0.0 ~ 300.0) + /// AC 起始电压序列 (单位: V,每个值 0.0 ~ 350.0) 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 /// /// 设定 AC 结束电压列表点数的顺序 (SOUR:LIST:VOLT:AC:END) /// - /// AC 结束电压序列 (单位: V,每个值 0.0 ~ 300.0) + /// AC 结束电压序列 (单位: V,每个值 0.0 ~ 350.0) 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 /// /// 设定 DC 起始电压列表点数的顺序 (SOUR:LIST:VOLT:DC:STAR) /// - /// DC 起始电压序列 (单位: V,每个值 -424.2 ~ 414.2) + /// DC 起始电压序列 (单位: V,每个值 -495.0 ~ 495.0) 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 /// /// 设定 DC 结束电压列表点数的顺序 (SOUR:LIST:VOLT:DC:END) /// - /// DC 结束电压序列 (单位: V,每个值 -424.2 ~ 414.2) + /// DC 结束电压序列 (单位: V,每个值 -495.0 ~ 495.0) 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 /// /// 设定起始频率列表点数的顺序 (SOUR:LIST:FREQ:STAR) /// - /// 起始频率序列 (单位: Hz,每个值 15.00 ~ 100.00) + /// 起始频率序列 (单位: Hz,每个值 30.00 ~ 100.00) 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 /// /// 设定结束频率列表点数的顺序 (SOUR:LIST:FREQ:END) /// - /// 结束频率序列 (单位: Hz,每个值 15.00 ~ 100.00) + /// 结束频率序列 (单位: Hz,每个值 30.00 ~ 100.00) 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 /// /// 设定 SYNTHESIS 模式的基波交流电压 (SOUR:SYNT:FUND) /// - /// 基波交流电压 (单位: V,0.0 ~ 300.0) + /// 基波交流电压 (单位: V,0.0 ~ 350.0) public virtual async Task 设置合成基波电压Async(double voltage, CancellationToken ct = default) { string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture); @@ -633,7 +657,7 @@ namespace DeviceCommand.Devices /// /// 设定叠加于 SYNTHESIS 波形的直流电压 (SOUR:SYNT:DC) /// - /// 直流电压 (单位: V,-424.2 ~ 424.2) + /// 直流电压 (单位: V,-495.0 ~ 495.0) public virtual async Task 设置合成直流电压Async(double voltage, CancellationToken ct = default) { string valStr = voltage.ToString("0.###", CultureInfo.InvariantCulture); diff --git a/PowerAdaptabilityModule/ViewModels/PowerAdaptabilityViewModel.cs b/PowerAdaptabilityModule/ViewModels/PowerAdaptabilityViewModel.cs index b61ef00..a97f9c0 100644 --- a/PowerAdaptabilityModule/ViewModels/PowerAdaptabilityViewModel.cs +++ b/PowerAdaptabilityModule/ViewModels/PowerAdaptabilityViewModel.cs @@ -173,6 +173,10 @@ namespace PowerAdaptabilityModule.ViewModels /// 列表时间基础 (TIME / CYCLE) public string ListTimeBase { get => _listTimeBase; set => SetProperty(ref _listTimeBase, value); } + private string _listPhaseContinue = "DISABLE"; + /// 相位连续功能 (LIST:PHAS:CONT, DISABLE / ENABLE) + public string ListPhaseContinue { get => _listPhaseContinue; set => SetProperty(ref _listPhaseContinue, value); } + /// 三相各自的 LIST 序列配置(索引 0=A/Φ1, 1=B/Φ2, 2=C/Φ3),INST:EDIT EACH 逐相下发 private readonly ListPhaseConfig[] _phaseConfigs = { new(), new(), new() }; @@ -195,8 +199,6 @@ namespace PowerAdaptabilityModule.ViewModels private ListPhaseConfig CurCfg => _phaseConfigs[_listEditPhaseIndex]; // —— 以下文本属性均代理到"当前编辑相位"的配置,切换相位时统一刷新 —— - /// 当前相波形 (FUNC:SHAP:A) - public string ListWaveform { get => CurCfg.Waveform; set { if (CurCfg.Waveform != value) { CurCfg.Waveform = value; RaisePropertyChanged(); } } } /// 相位角度序列 (LIST:DEGR, °) public string ListDegrText { get => CurCfg.Degr; set { if (CurCfg.Degr != value) { CurCfg.Degr = value; RaisePropertyChanged(); } } } /// AC 起始电压序列 (LIST:VOLT:AC:STAR, V) @@ -213,13 +215,12 @@ namespace PowerAdaptabilityModule.ViewModels public string ListFreqEndText { get => CurCfg.FreqEnd; set { if (CurCfg.FreqEnd != value) { CurCfg.FreqEnd = value; RaisePropertyChanged(); } } } /// 静止时间序列 (LIST:DWEL, ms) public string ListDwellText { get => CurCfg.Dwell; set { if (CurCfg.Dwell != value) { CurCfg.Dwell = value; RaisePropertyChanged(); } } } - /// 波形缓冲顺序 (LIST:SHAP, A/B) + /// 波形顺序 (LIST:SHAP,可直接写形状名或引用 A/B 组) public string ListShapeText { get => CurCfg.ShapeSeq; set { if (CurCfg.ShapeSeq != value) { CurCfg.ShapeSeq = value; RaisePropertyChanged(); } } } /// 切换编辑相位后,通知所有序列文本框刷新为新相位内容 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 WaveformOptions { get; } = new[] { "SINE", "SQUA", "CSIN" }; + public IReadOnlyList WaveformOptions { get; } = new[] { "SINE", "SQUA", "TRIAN", "CSIN" }; public IReadOnlyList CouplingOptions { get; } = new[] { "AC", "DC", "ACDC" }; public IReadOnlyList RelationOptions { get; } = new[] { "INDEPEND", "SAMEFREQ", "BALANCE" }; public IReadOnlyList ListTriggerOptions { get; } = new[] { "AUTO", "MANUAL", "EXCITE" }; public IReadOnlyList ListTimeBaseOptions { get; } = new[] { "TIME", "CYCLE" }; + public IReadOnlyList 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; - /// 基波交流电压 (SYNT:FUND, 0.0 ~ 300.0 V) + /// 基波交流电压 (SYNT:FUND, 0.0 ~ 350.0 V) public double SynthFundamental { get => _synthFundamental; set => SetProperty(ref _synthFundamental, value); } private double _synthDc; - /// 叠加直流电压 (SYNT:DC, -424.2 ~ 424.2 V) + /// 叠加直流电压 (SYNT:DC, -495.0 ~ 495.0 V) 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); } /// 按名称拼出测试项文件完整路径(写入、另存、删除共用同一规则)。 @@ -952,7 +958,8 @@ namespace PowerAdaptabilityModule.ViewModels ListCount, new[] { _phaseConfigs[0].Clone(), _phaseConfigs[1].Clone(), _phaseConfigs[2].Clone() }, ListTrigger, - ListTimeBase); + ListTimeBase, + ListPhaseContinue); /// /// 保存:覆盖写入“当前打开的文件”,不改变文件名(名称框内容不参与)。 @@ -1446,7 +1453,7 @@ namespace PowerAdaptabilityModule.ViewModels .ToArray(); } - /// 解析波形缓冲顺序(A/B)序列。 + /// 解析波形顺序序列(形状名或 A/B)。 private static string[] ParseShapes(string text) { if (string.IsNullOrWhiteSpace(text)) return Array.Empty(); @@ -1457,13 +1464,11 @@ namespace PowerAdaptabilityModule.ViewModels /// /// 下发单个相位的 LIST 序列(调用前须已通过 INST:NSEL 选定目标相、并已 INST:EDIT EACH)。 - /// 依次下发 FUNC:SHAP:A 波形,以及 DEGR / VOLT:AC / VOLT:DC / FREQ / DWEL / SHAP 各序列,留空的序列跳过。 + /// 依次下发 DEGR / VOLT:AC / VOLT:DC / FREQ / DWEL / SHAP 各序列,留空的序列跳过; + /// LIST:SHAP 各点可直接写形状名 SINE/SQUA/TRIAN/CSIN/DST01~30/USR01~30,也可引用仪器 A/B 波形组。 /// 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。 /// - 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 /// public class ListPhaseConfig { - /// 该相波形 (FUNC:SHAP:A),如 SINE / SQUA - public string Waveform { get; set; } = "SINE"; /// 相位角度序列 (LIST:DEGR, °) public string Degr { get; set; } = ""; /// AC 起始电压序列 (LIST:VOLT:AC:STAR, V) @@ -1657,7 +1659,7 @@ namespace PowerAdaptabilityModule.ViewModels public string FreqEnd { get; set; } = ""; /// 静止时间序列 (LIST:DWEL, ms) public string Dwell { get; set; } = ""; - /// 波形缓冲顺序 (LIST:SHAP, A/B) + /// 波形顺序 (LIST:SHAP,可直接写形状名或引用 A/B 组) public string ShapeSeq { get; set; } = ""; /// 浅拷贝一份配置(用于"复制到三相")。 @@ -1665,7 +1667,7 @@ namespace PowerAdaptabilityModule.ViewModels } /// - /// 大纲典型试验预设:一次载入即可填充三相 LIST 序列与基础参数(次数/触发/时基)。 + /// 大纲典型试验预设:一次载入即可填充三相 LIST 序列与基础参数(次数/触发/时基/相位连续)。 /// public class ListPreset { @@ -1679,12 +1681,14 @@ namespace PowerAdaptabilityModule.ViewModels public string Trigger { get; } /// 时间基础 (LIST:BASE) public string TimeBase { get; } + /// 相位连续功能 (LIST:PHAS:CONT);旧文件无此键时为 null,载入时保持界面当前值 + public string? PhaseContinue { get; } /// 三相序列配置(索引 0=A/Φ1, 1=B/Φ2, 2=C/Φ3) 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; } } diff --git a/PowerAdaptabilityModule/Views/PowerAdaptabilityView.xaml b/PowerAdaptabilityModule/Views/PowerAdaptabilityView.xaml index 9a6bf80..22d93cc 100644 --- a/PowerAdaptabilityModule/Views/PowerAdaptabilityView.xaml +++ b/PowerAdaptabilityModule/Views/PowerAdaptabilityView.xaml @@ -163,7 +163,8 @@ + SelectedItem="{Binding Waveform}" + ToolTip="FUNC:SHAP:A — SINE / SQUA / TRIAN(三角)/ CSIN、内建 DST01~30、自定义 USR01~30" />