源适应性修改

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
@@ -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>