using Common.Attributes; using DeviceCommand.Base; using System; using System.Globalization; using System.Threading; using System.Threading.Tasks; namespace DeviceCommand.Device { [ADPCommand] public class SDS2000X_HD : Tcp { // 示波器底层 Socket 字符串命令通常以换行符 \n 结束 private const string ScpiDelimiter = "\n"; /// /// 构造函数:传入 一次性初始化示波器通信参数。 /// 鼎阳示波器网口 Socket 默认端口通常为 5025,请在配置中设置。 /// public SDS2000X_HD(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 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); // } /// /// 复位命令。使示波器恢复到默认的出厂设置 /// public virtual async Task 重置设备(CancellationToken ct = default) { await SendAsync($"*RST{ScpiDelimiter}", ct); // } #endregion #region 2. 运行与捕获控制控制 (Run / Stop / Single) /// /// 控制示波器开始捕获波形 (等同于按下前端面板的 Run 键) /// public virtual async Task 启动捕获_RUN(CancellationToken ct = default) { await SendAsync($"RUN{ScpiDelimiter}", ct); // } /// /// 停止捕获波形 (等同于按下前端面板的 Stop 键) /// public virtual async Task 停止捕获_STOP(CancellationToken ct = default) { await SendAsync($"STOP{ScpiDelimiter}", ct); // } /// /// 强制示波器进入单次触发捕获模式 /// public virtual async Task 单次触发_SINGLE(CancellationToken ct = default) { await SendAsync($"SINGle{ScpiDelimiter}", ct); // } /// /// 触发一次波形采样 (当触发源设为 Manual 时使用) /// public virtual async Task 强制触发(CancellationToken ct = default) { await SendAsync($"*TRG{ScpiDelimiter}", ct); // } #endregion #region 3. Channel 垂直控制子系统 (C1 ~ C4) /// /// 开启或关闭指定的模拟通道 (例如: channel=1 代表 C1) /// public virtual async Task 设置通道开关(int channel, bool enable, CancellationToken ct = default) { string state = enable ? "ON" : "OFF"; await SendAsync($"C{channel}:TRAce {state}{ScpiDelimiter}", ct); // } /// /// 设置指定通道的垂直电压档位 (Volts/Div,单位: V,例如 0.05 代表 50mV/div) /// public virtual async Task 设置通道电压档位(int channel, double volts, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:VDIV {1:F4}{2}", channel, volts, ScpiDelimiter); // await SendAsync(cmd, ct); } /// /// 设置指定通道的垂直偏移量 (Offset,单位: V) /// public virtual async Task 设置通道垂直偏移(int channel, double offset, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:OFST {1:F4}{2}", channel, offset, ScpiDelimiter); // await SendAsync(cmd, ct); } /// /// 设置通道的输入阻抗 (1MΩ 或 50Ω) /// /// True: 50欧姆, False: 1M欧姆 public virtual async Task 设置通道输入阻抗(int channel, bool is50Ohm, CancellationToken ct = default) { string value = is50Ohm ? "50" : "1M"; await SendAsync($"C{channel}:COUPling {value}{ScpiDelimiter}", ct); // } #endregion #region 4. Timebase 水平时基子系统 /// /// 设置示波器的水平时基档位 (Time/Div,单位: s,例如 0.001 代表 1ms/div) /// public virtual async Task 设置水平时基(double scale, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "TIME_DIV {0:E6}{1}", scale, ScpiDelimiter); // await SendAsync(cmd, ct); } /// /// 设置示波器的触发水平延迟位置 (Horizontal Delay,单位: s) /// public virtual async Task 设置水平延迟(double delay, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "TRIGger:DELay {0:E6}{1}", delay, ScpiDelimiter); // await SendAsync(cmd, ct); } #endregion #region 5. Trigger 触发子系统 /// /// 设置边沿触发的电平值 (Trigger Level,单位: V) /// public virtual async Task 设置触发电平(double level, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "TRIGger:LEVel {0:F3}{1}", level, ScpiDelimiter); // await SendAsync(cmd, ct); } /// /// 设置边沿触发的触发源 (例如: C1, C2, C3, C4, EX, LINE) /// public virtual async Task 设置触发源(string source, CancellationToken ct = default) { await SendAsync($"TRIGger:SOURce {source.ToUpper()}{ScpiDelimiter}", ct); // } #endregion #region 6. Measure 自动测量参数回读 (高频轮询核心) /// /// 查询指定通道自动测量项的当前实时测量数值 /// /// 通道号 (1-4) /// 参数名称助记符: /// PKPK(峰峰值), MAX(最大值), MIN(最小值), AMPL(振幅值), /// FREQ(频率), PER(周期), MEAN(平均值), RMS(均方根) 等 /// 设备返回的科学计数法或自定义字符串数值 public virtual async Task 查询通道测量项参数(int channel, string paramName, CancellationToken ct = default) { // 语法格式示例:C1:PAVA? FREQ string query = string.Format(CultureInfo.InvariantCulture, "C{0}:PAVA? {1}{2}", channel, paramName.ToUpper(), ScpiDelimiter); // return await WriteReadAsync(query, ScpiDelimiter, ct); // } /// /// 轮询便捷接口:查询指定通道的电压峰峰值 (Vpp) /// public virtual async Task 查询实际电压峰峰值(int channel, CancellationToken ct = default) { return await 查询通道测量项参数(channel, "PKPK", ct); // } /// /// 轮询便捷接口:查询指定通道的频率值 (Frequency) /// public virtual async Task 查询实际频率(int channel, CancellationToken ct = default) { return await 查询通道测量项参数(channel, "FREQ", ct); // } /// /// 轮询便捷接口:查询指定通道的真均方根电压值 (Vrms) /// public virtual async Task 查询实际电压均方根(int channel, CancellationToken ct = default) { return await 查询通道测量项参数(channel, "RMS", ct); // } #endregion } }