Files
ACP/DeviceCommand/Devices/DG1000Z.cs

240 lines
8.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Common.Attributes;
using DeviceCommand.Base;
using Model.Models;
using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Devices
{
#region
/// <summary>
/// 信号发生器输出波形类型
/// </summary>
public enum SignalWaveform
{
/// <summary> 正弦波 </summary>
SINusoid,
/// <summary> 方波 </summary>
SQUare,
/// <summary> 锯齿波 </summary>
RAMP,
/// <summary> 脉冲波 (重点用于CP信号模拟) </summary>
PULSe,
/// <summary> 噪声 </summary>
NOISe,
/// <summary> 任意波 (USER) </summary>
USER
}
/// <summary>
/// 频率计输入信号的耦合方式
/// </summary>
public enum CounterCoupling
{
/// <summary> 交流耦合 </summary>
AC,
/// <summary> 直流耦合 </summary>
DC
}
#endregion
[ACPCommand]
public class DG1000Z : Tcp
{
// 使用换行符 \n (ASCII 0x0A) 作为 SCPI 结束符
private const string ScpiDelimiter = "\n";
public DG1000Z(TcpConfig config) : base(config)
{
}
#region 1. IEEE 488.2
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*CLS{ScpiDelimiter}", ct);
}
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct);
}
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*RST{ScpiDelimiter}", ct);
}
public virtual async Task<string> SCPI版本(CancellationToken ct = default)
{
return await WriteReadAsync($":SYSTem:VERSion?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 2. (CH1 / CH2)
/// <summary>
/// 打开或关闭指定通道的输出
/// </summary>
/// <param name="通道号">通道 1 或 2默认 1</param>
/// <param name="开启">true为开启false为关闭</param>
public virtual async Task (int = 1, bool = true, CancellationToken ct = default)
{
string = ? "ON" : "OFF";
await SendAsync($":OUTPut{通道号}:STATe {参数}{ScpiDelimiter}", ct);
}
public virtual async Task<string> (int = 1, CancellationToken ct = default)
{
return await WriteReadAsync($":OUTPut{通道号}:STATe?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 3. ()
/// <summary>
/// 设置指定通道的波形类型 (如正弦波、方波等)
/// </summary>
public virtual async Task (int = 1, SignalWaveform = SignalWaveform.SINusoid, CancellationToken ct = default)
{
await SendAsync($":SOURce{通道号}:FUNCtion:SHAPe {波形}{ScpiDelimiter}", ct);
}
/// <summary>
/// 设置指定通道的输出频率 (单位: Hz)
/// </summary>
public virtual async Task (int = 1, double Hz = 1000, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce{0}:FREQuency {1:F2}{2}", , Hz, ScpiDelimiter);
await SendAsync(cmd, ct);
}
public virtual async Task<string> (int = 1, CancellationToken ct = default)
{
return await WriteReadAsync($":SOURce{通道号}:FREQuency?{ScpiDelimiter}", ScpiDelimiter, ct);
}
/// <summary>
/// 设置指定通道的输出幅度 (单位: Vpp峰峰值)
/// </summary>
public virtual async Task (int = 1, double Vpp = 5, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce{0}:VOLTage:AMPLitude {1:F2}{2}", , Vpp, ScpiDelimiter);
await SendAsync(cmd, ct);
}
public virtual async Task<string> (int = 1, CancellationToken ct = default)
{
return await WriteReadAsync($":SOURce{通道号}:VOLTage:AMPLitude?{ScpiDelimiter}", ScpiDelimiter, ct);
}
/// <summary>
/// 设置指定通道的直流偏移电压 (单位: Vdc)
/// </summary>
public virtual async Task (int = 1, double Vdc = 0, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce{0}:VOLTage:OFFSet {1:F2}{2}", , Vdc, ScpiDelimiter);
await SendAsync(cmd, ct);
}
public virtual async Task<string> (int = 1, CancellationToken ct = default)
{
return await WriteReadAsync($":SOURce{通道号}:VOLTage:OFFSet?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 4. / (CP信号模拟)
/// <summary>
/// 设置方波信号的占空比 (0.01% ~ 99.99%)[cite: 1]
/// </summary>
public virtual async Task (int = 1, double = 50.0, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce{0}:FUNCtion:SQUare:DCYCle {1:F2}{2}", , , ScpiDelimiter);
await SendAsync(cmd, ct);
}
/// <summary>
/// 设置脉冲波信号的占空比 (0.01% ~ 99.99%)[cite: 1]
/// 注意:使用此命令前必须先设置为 PULSe 波形类型
/// </summary>
public virtual async Task (int = 1, double = 50.0, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce{0}:FUNCtion:PULSe:DCYCle {1:F2}{2}", , , ScpiDelimiter);
await SendAsync(cmd, ct);
}
#endregion
#region 5. ()
/// <summary>
/// 打开或关闭内置频率计功能
/// </summary>
public virtual async Task (bool = true, CancellationToken ct = default)
{
string = ? "ON" : "OFF";
await SendAsync($":COUNter:STATe {参数}{ScpiDelimiter}", ct);
}
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($":COUNter:STATe?{ScpiDelimiter}", ScpiDelimiter, ct);
}
/// <summary>
/// 设置频率计输入信号的耦合方式
/// </summary>
public virtual async Task (CounterCoupling = CounterCoupling.AC, CancellationToken ct = default)
{
await SendAsync($":COUNter:COUPling {耦合}{ScpiDelimiter}", ct);
}
/// <summary>
/// 设置频率计的触发电平 (单位: V)
/// </summary>
public virtual async Task (double V = 0.1, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":COUNter:LEVel {0:F2}{1}", V, ScpiDelimiter);
await SendAsync(cmd, ct);
}
[Monitorable("信号发生器频率计测量值")]
public virtual async Task<string> (CancellationToken ct = default)
{
// 返回格式: 频率, 周期, 占空比, 正脉宽, 负脉宽
return await WriteReadAsync($":COUNter:MEASure?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 6.
public virtual async Task (CancellationToken ct = default)
{
// 信号发生器通常通过 LAN/USB 和 VISA 通信即自动进入远程控制,
// 但为了兼容模板,保留一个类似的方法。
await Task.CompletedTask;
}
public virtual async Task (CancellationToken ct = default)
{
// 通常通过前面板按键退出远程。不过可提供 SCPI 关闭屏幕保护等。
await Task.CompletedTask;
}
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($":SYSTem:ERRor?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
}
}