synthesis模式bug修改
This commit is contained in:
@@ -88,17 +88,7 @@ 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);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 退出远程状态、回到本地 (SYST:LOC,即 SYSTem:LOCal)
|
||||
/// <para>设定后仪器回到 LOCAL 状态,前面板恢复可用。手册注明本命令僅可用於 RS-232 控制之下,
|
||||
|
||||
@@ -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\源测试\合成波形)
|
||||
|
||||
@@ -394,10 +394,21 @@
|
||||
Text="{Binding SynthDc, UpdateSourceTrigger=PropertyChanged}" />
|
||||
<TextBlock Text="V" VerticalAlignment="Center" Margin="2,0,0,0" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,4">
|
||||
<TextBlock Text="编辑相位" Style="{StaticResource ParamLabel}" />
|
||||
<ComboBox Width="100" Height="32" FontSize="12" Margin="4,0"
|
||||
ToolTip="当前编辑的相位(INST:NSEL 1/2/3),起始相位/谐波振幅/谐波相位作用于该相"
|
||||
ItemsSource="{Binding ListPhaseOptions}"
|
||||
SelectedIndex="{Binding SynthEditPhaseIndex}" />
|
||||
<Button Content="复制当前相到三相(起始相位自动 ±120°)"
|
||||
Command="{Binding CopySynthPhaseToThreeCommand}"
|
||||
Style="{StaticResource CmdBtn}" Margin="8,0,0,0"
|
||||
ToolTip="把当前相的起始相位/谐波振幅/谐波相位复制到另外两相:谐波内容相同,起始相位按 ±120° 偏移生成对称三相;需再点「下发并启动 SYNTH」写入仪器" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Margin="0,4">
|
||||
<TextBlock Text="起始相位" Style="{StaticResource ParamLabel}" />
|
||||
<TextBox Style="{StaticResource NumInput}"
|
||||
ToolTip="SYNT:SPH,起始相位角,单位 °,0.0 ~ 359.9"
|
||||
ToolTip="SYNT:SPH,起始相位角,单位 °,0.0 ~ 359.9(作用于上方选中的编辑相位)"
|
||||
Text="{Binding SynthStartPhase, UpdateSourceTrigger=PropertyChanged}" />
|
||||
<TextBlock Text="°" VerticalAlignment="Center" Margin="2,0,0,0" />
|
||||
</StackPanel>
|
||||
@@ -415,12 +426,13 @@
|
||||
<StackPanel Orientation="Horizontal" Margin="0,4">
|
||||
<Button Content="下发并启动 SYNTH" Command="{Binding DownloadSynthesisCommand}"
|
||||
Style="{StaticResource CmdBtn}"
|
||||
ToolTip="三相独立下发(INST:EDIT EACH + INST:NSEL 逐相):每相谐波内容相同、起始相位各不相同(±120° 对称)"
|
||||
Background="#388E3C" Foreground="White" />
|
||||
<Button Content="停止 SYNTH" Command="{Binding SynthStopCommand}"
|
||||
Style="{StaticResource WarnBtn}" />
|
||||
<Button Content="重置谐波(50个0)" Command="{Binding ResetSynthHarmonicsCommand}"
|
||||
<Button Content="重置谐波(49个0)" Command="{Binding ResetSynthHarmonicsCommand}"
|
||||
Style="{StaticResource CmdBtn}"
|
||||
ToolTip="把谐波振幅/相位两框填成 50 个 0(仅改界面文本,需再点「下发并启动 SYNTH」才写入仪器)" />
|
||||
ToolTip="谐波范围 2~50 阶共 49 个值(首值对应 2 次):把谐波振幅/相位两框填成 49 个 0(仅改界面文本,需再点「下发并启动 SYNTH」才写入仪器)" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
Reference in New Issue
Block a user