synthesis模式bug修改

This commit is contained in:
“hsc”
2026-10-22 14:36:21 +08:00
parent 6bbca727ca
commit d9052861f5
3 changed files with 103 additions and 41 deletions
@@ -266,17 +266,47 @@ namespace PowerAdaptabilityModule.ViewModels
/// <summary>叠加直流电压 (SYNT:DC, -495.0 ~ 495.0 V)</summary>
public double SynthDc { get => _synthDc; set => SetProperty(ref _synthDc, value); }
private double _synthStartPhase;
/// <summary>起始相位角 (SYNT:SPH, 0.0 ~ 359.9 °)</summary>
public double SynthStartPhase { get => _synthStartPhase; set => SetProperty(ref _synthStartPhase, value); }
// —— SYNTHESIS 三相独立编辑:每相持有各自的起始相位/谐波振幅/谐波相位(索引 0=A/Φ1, 1=B/Φ2, 2=C/Φ3),INST:EDIT EACH 逐相下发 ——
private readonly double[] _synthStartPhases = new double[3];
private readonly string[] _synthAmplitudeTexts = new string[3];
private readonly string[] _synthPhaseTexts = new string[3];
private string _synthAmplitudeText = "";
/// <summary>各次谐波振幅序列文本 (SYNT:AMPL, 英文逗号分隔, 最多 50 阶)</summary>
public string SynthAmplitudeText { get => _synthAmplitudeText; set => SetProperty(ref _synthAmplitudeText, value); }
private int _synthEditPhaseIndex;
/// <summary>当前正在编辑的相位索引 (0=A, 1=B, 2=C),切换时下方起始相位/谐波文本框自动刷新为该相内容</summary>
public int SynthEditPhaseIndex
{
get => _synthEditPhaseIndex;
set
{
if (SetProperty(ref _synthEditPhaseIndex, value))
{
RaisePropertyChanged(nameof(SynthStartPhase));
RaisePropertyChanged(nameof(SynthAmplitudeText));
RaisePropertyChanged(nameof(SynthPhaseText));
}
}
}
private string _synthPhaseText = "";
/// <summary>各次谐波相位角序列文本 (SYNT:PHAS, 英文逗号分隔, 0~359.9°)</summary>
public string SynthPhaseText { get => _synthPhaseText; set => SetProperty(ref _synthPhaseText, value); }
/// <summary>起始相位角 (SYNT:SPH, 0.0 ~ 359.9 °),作用于当前编辑相位;复制到三相时按 ±120° 偏移</summary>
public double SynthStartPhase
{
get => _synthStartPhases[_synthEditPhaseIndex];
set { _synthStartPhases[_synthEditPhaseIndex] = value; RaisePropertyChanged(); }
}
/// <summary>各次谐波振幅序列文本 (SYNT:AMPL, 英文逗号分隔, 首值对应 2 次谐波,2~50 次共 49 个值),作用于当前编辑相位</summary>
public string SynthAmplitudeText
{
get => _synthAmplitudeTexts[_synthEditPhaseIndex];
set { _synthAmplitudeTexts[_synthEditPhaseIndex] = value; RaisePropertyChanged(); }
}
/// <summary>各次谐波相位角序列文本 (SYNT:PHAS, 英文逗号分隔, 0~359.9°),作用于当前编辑相位</summary>
public string SynthPhaseText
{
get => _synthPhaseTexts[_synthEditPhaseIndex];
set { _synthPhaseTexts[_synthEditPhaseIndex] = value; RaisePropertyChanged(); }
}
#endregion
#region SYNTHESIS 波形预设(文件:D:\acp\源测试\合成波形,一键载入/保存自定义谐波波形)
@@ -410,6 +440,7 @@ namespace PowerAdaptabilityModule.ViewModels
public ICommand DownloadSynthesisCommand { get; }
public ICommand SynthStopCommand { get; }
public ICommand ResetSynthHarmonicsCommand { get; }
public ICommand CopySynthPhaseToThreeCommand { get; }
public ICommand LoadSynthPresetCommand { get; }
public ICommand SaveSynthPresetCommand { get; }
public ICommand SaveSynthPresetAsCommand { get; }
@@ -588,7 +619,6 @@ namespace PowerAdaptabilityModule.ViewModels
await 下发单相序列Async(_phaseConfigs[p]); // LIST:xxx 序列
}
await _dev.延时Async(StartDelayMs, Ct()); // *D 200(等待仪器就绪)
await _dev.设置操作模态Async("LIST", Ct()); // OUTP:MODE LIST
// 回读校验:确认 COUN 真的写入(当前相位上下文=相3);读回 0 而设>0 即未生效
@@ -601,7 +631,8 @@ namespace PowerAdaptabilityModule.ViewModels
ListStopCommand = new DelegateCommand(async () =>
await Exec(async () => { await _dev!.触发列表执行Async(false, Ct()); Log("LIST 已停止执行(TRIG OFF)"); }));
// 下发 SYNTHESIS 自定义谐波波形并启动:手册要求进入 SYNTH 前先离开输出,参数下发后 OUTP:MODE SYNTH → TRIG ON
// 下发 SYNTHESIS 自定义谐波波形并启动(三相独立):INST:EDIT EACH + NSEL 逐相下发,
// 谐波内容三相相同(复制到三相生成),仅起始相位按 ±120° 对称;手册要求进入 SYNTH 前先离开输出
DownloadSynthesisCommand = new DelegateCommand(async () => await Exec(async () =>
{
// 先强制 TRIG OFF 停止连续执行模态并等状态回 OFF,再改写参数(执行中改写会被仪器忽略)
@@ -610,41 +641,70 @@ namespace PowerAdaptabilityModule.ViewModels
await _dev!.清除错误队列Async(Ct()); // *CLS
await _dev.设置输出开关Async(false, Ct()); // OUTP OFF(进入 SYNTH 前先离开输出)
await _dev.设置操作模态Async("FIXED", Ct()); // OUTP:MODE FIXED(清模态)
await _dev.设置合成数据格式Async(SynthCompose, Ct()); // SYNT:COMP
await _dev.设置合成基频Async(SynthFrequency, Ct()); // SYNT:FREQ
await _dev.设置合成基波电压Async(SynthFundamental, Ct()); // SYNT:FUND
await _dev.设置合成直流电压Async(SynthDc, Ct()); // SYNT:DC
await _dev.设置合成起始相位Async(SynthStartPhase, Ct()); // SYNT:SPH
await _dev.设置单三相模式Async(true, Ct()); // INST:PHAS THREE
await _dev.设置编辑方式Async("EACH", Ct()); // INST:EDIT EACH(逐相独立编辑,缺此步无法分相)
var ampl = ParseDoubles(SynthAmplitudeText);
if (ampl.Length > 0) await _dev.设置合成谐波振幅Async(ampl, Ct()); // SYNT:AMPL
var phas = ParseDoubles(SynthPhaseText);
if (phas.Length > 0) await _dev.设置合成谐波相位Async(phas, Ct()); // SYNT:PHAS
for (int p = 0; p < 3; p++)
{
await _dev.选择相位Async(p + 1, Ct()); // INST:NSEL 1|2|3
await _dev.设置合成数据格式Async(SynthCompose, Ct()); // SYNT:COMP(EACH 模式随相位上下文生效,逐相各发一次)
await _dev.设置合成基频Async(SynthFrequency, Ct()); // SYNT:FREQ
await _dev.设置合成基波电压Async(SynthFundamental, Ct()); // SYNT:FUND
await _dev.设置合成直流电压Async(SynthDc, Ct()); // SYNT:DC
await _dev.设置合成起始相位Async(_synthStartPhases[p], Ct()); // SYNT:SPH(分相参数,三相 ±120° 对称)
var ampl = ParseDoubles(_synthAmplitudeTexts[p]);
if (ampl.Length > 0) await _dev.设置合成谐波振幅Async(ampl, Ct()); // SYNT:AMPL
var phas = ParseDoubles(_synthPhaseTexts[p]);
if (phas.Length > 0) await _dev.设置合成谐波相位Async(phas, Ct()); // SYNT:PHAS
}
// 回读校验:用仪器自己的回答确认参数是否真的写入(设定与回读不符=被拒绝或落到别的槽位)
// 回读校验:逐相回读起始相位确认 ±120° 偏移真实写入(读回与界面不符=被拒绝)
string compBack = await _dev.查询合成数据格式Async(Ct());
double fundBack = await _dev.查询合成基波电压Async(Ct());
var sphBack = new List<string>();
for (int p = 0; p < 3; p++)
{
await _dev.选择相位Async(p + 1, Ct()); // INST:NSEL
double sph = await _dev.查询合成起始相位Async(Ct());
sphBack.Add($"{ListPhaseOptions[p].Substring(0, 1)}={sph:0.#}°");
}
double[] amplBack = await _dev.查询合成谐波振幅Async(Ct());
Log($"回读校验:COMP 设={SynthCompose} 读={compBack};FUND 设={SynthFundamental} 读={fundBack};AMPL 读前6阶={string.Join(",", amplBack.Take(6))}");
Log($"回读校验:COMP 设={SynthCompose} 读={compBack};FUND 设={SynthFundamental} 读={fundBack};SPH {string.Join(" ", sphBack)};AMPL 回读{amplBack.Length}阶(仪器实际保留的阶数,当前上下文=C相),前6阶={string.Join(",", amplBack.Take(6))}");
await _dev.延时Async(StartDelayMs, Ct()); // *D 200(等待仪器就绪)
await _dev.设置操作模态Async("SYNTH", Ct()); // OUTP:MODE SYNTH
await _dev.触发列表执行Async(true, Ct()); // TRIG ON
double vrms = await _dev.读取交流电压Async(Ct()); // MEAS:VOLT:AC? 实测输出
Log($"SYNTHESIS 波形已下发并启动(格式={SynthCompose} 基频={SynthFrequency}Hz 基波={SynthFundamental}V 谐波阶数={ampl.Length})实测Vrms={vrms}");
Log($"SYNTHESIS 三相波形已下发并启动(格式={SynthCompose} 基频={SynthFrequency}Hz 基波={SynthFundamental}V 谐波阶数={ParseDoubles(_synthAmplitudeTexts[_synthEditPhaseIndex]).Length})实测Vrms={vrms}");
}));
SynthStopCommand = new DelegateCommand(async () =>
await Exec(async () => { await _dev!.触发列表执行Async(false, Ct()); Log("SYNTHESIS 已停止执行(TRIG OFF)"); }));
// 重置谐波:把振幅/相位两个序列框填成 50 个 0(仅改界面文本,需再点「下发并启动 SYNTH」才写入仪器)
// 重置谐波:SYNT 数组首值对应 2 次谐波,仪器谐波范围 2~50 阶共 49 个值(填 50 个则末值落到不存在的 51 阶,可能被拒或截断)
// (仅改界面文本,需再点「下发并启动 SYNTH」才写入仪器)
ResetSynthHarmonicsCommand = new DelegateCommand(() =>
{
string zeros = string.Join(",", Enumerable.Repeat("0", 50));
string zeros = string.Join(",", Enumerable.Repeat("0", 49));
SynthAmplitudeText = zeros;
SynthPhaseText = zeros;
Log("SYNTHESIS 谐波已重置:振幅/相位两框均填入 50 个 0;点「下发并启动 SYNTH」写入仪器");
Log("SYNTHESIS 谐波已重置:振幅/相位两框均填入 49 个 0(覆盖 2~50 阶);点「下发并启动 SYNTH」写入仪器");
});
// 复制当前相到三相:谐波内容相同,起始相位按 ±120° 偏移生成对称三相(与 LIST 复制同机制,仅改界面数据)
CopySynthPhaseToThreeCommand = new DelegateCommand(() =>
{
int src = _synthEditPhaseIndex;
for (int p = 0; p < 3; p++)
{
if (p == src) continue;
_synthAmplitudeTexts[p] = _synthAmplitudeTexts[src];
_synthPhaseTexts[p] = _synthPhaseTexts[src];
double d = (_synthStartPhases[src] + (p - src) * 120.0) % 360.0;
if (d < 0) d += 360.0;
_synthStartPhases[p] = d;
}
Log($"已将 [{ListPhaseOptions[src]}] 的 SYNTHESIS 参数复制到三相(起始相位自动 ±120° 偏移,谐波内容相同);点「下发并启动 SYNTH」写入仪器");
});
// 合成波形的载入 / 保存 / 另存为 / 删除(与 LIST 测试项同机制,文件存于 D:\acp\源测试\合成波形)