添加项目文件。

This commit is contained in:
czj
2026-06-05 10:57:09 +08:00
parent f29671b374
commit d960cb5912
166 changed files with 15996 additions and 0 deletions

View File

@@ -0,0 +1,213 @@
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";
/// <summary>
/// 构造函数:初始化示波器通信参数 (鼎阳示波器网口 Socket 默认端口通常为 5025)
/// </summary>
public SDS2000X_HD(string ipAddress, int port = 5025, int sendTimeout = 3000, int receiveTimeout = 3000)
{
ConfigureDevice(ipAddress, port, sendTimeout, receiveTimeout);
}
#region 1. IEEE 488.2
/// <summary>
/// 清除标准事件状态寄存器和错误队列
/// </summary>
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*CLS{ScpiDelimiter}", ct); //
}
/// <summary>
/// 读取示波器识别字符串(制造商、型号、序列号、固件版本)
/// </summary>
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); //
}
/// <summary>
/// 复位命令。使示波器恢复到默认的出厂设置
/// </summary>
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*RST{ScpiDelimiter}", ct); //
}
#endregion
#region 2. (Run / Stop / Single)
/// <summary>
/// 控制示波器开始捕获波形 (等同于按下前端面板的 Run 键)
/// </summary>
public virtual async Task _RUN(CancellationToken ct = default)
{
await SendAsync($"RUN{ScpiDelimiter}", ct); //
}
/// <summary>
/// 停止捕获波形 (等同于按下前端面板的 Stop 键)
/// </summary>
public virtual async Task _STOP(CancellationToken ct = default)
{
await SendAsync($"STOP{ScpiDelimiter}", ct); //
}
/// <summary>
/// 强制示波器进入单次触发捕获模式
/// </summary>
public virtual async Task _SINGLE(CancellationToken ct = default)
{
await SendAsync($"SINGle{ScpiDelimiter}", ct); //
}
/// <summary>
/// 触发一次波形采样 (当触发源设为 Manual 时使用)
/// </summary>
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*TRG{ScpiDelimiter}", ct); //
}
#endregion
#region 3. Channel (C1 ~ C4)
/// <summary>
/// 开启或关闭指定的模拟通道 (例如: channel=1 代表 C1)
/// </summary>
public virtual async Task (int channel, bool enable, CancellationToken ct = default)
{
string state = enable ? "ON" : "OFF";
await SendAsync($"C{channel}:TRAce {state}{ScpiDelimiter}", ct); //
}
/// <summary>
/// 设置指定通道的垂直电压档位 (Volts/Div单位: V例如 0.05 代表 50mV/div)
/// </summary>
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);
}
/// <summary>
/// 设置指定通道的垂直偏移量 (Offset单位: V)
/// </summary>
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);
}
/// <summary>
/// 设置通道的输入阻抗 (1MΩ 或 50Ω)
/// </summary>
/// <param name="is50Ohm">True: 50欧姆, False: 1M欧姆</param>
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
/// <summary>
/// 设置示波器的水平时基档位 (Time/Div单位: s例如 0.001 代表 1ms/div)
/// </summary>
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);
}
/// <summary>
/// 设置示波器的触发水平延迟位置 (Horizontal Delay单位: s)
/// </summary>
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
/// <summary>
/// 设置边沿触发的电平值 (Trigger Level单位: V)
/// </summary>
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);
}
/// <summary>
/// 设置边沿触发的触发源 (例如: C1, C2, C3, C4, EX, LINE)
/// </summary>
public virtual async Task (string source, CancellationToken ct = default)
{
await SendAsync($"TRIGger:SOURce {source.ToUpper()}{ScpiDelimiter}", ct); //
}
#endregion
#region 6. Measure ()
/// <summary>
/// 查询指定通道自动测量项的当前实时测量数值
/// </summary>
/// <param name="channel">通道号 (1-4)</param>
/// <param name="paramName">参数名称助记符:
/// PKPK(峰峰值), MAX(最大值), MIN(最小值), AMPL(振幅值),
/// FREQ(频率), PER(周期), MEAN(平均值), RMS(均方根) 等</param>
/// <returns>设备返回的科学计数法或自定义字符串数值</returns>
public virtual async Task<string> (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); //
}
/// <summary>
/// 轮询便捷接口:查询指定通道的电压峰峰值 (Vpp)
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await (channel, "PKPK", ct); //
}
/// <summary>
/// 轮询便捷接口:查询指定通道的频率值 (Frequency)
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await (channel, "FREQ", ct); //
}
/// <summary>
/// 轮询便捷接口:查询指定通道的真均方根电压值 (Vrms)
/// </summary>
public virtual async Task<string> (int channel, CancellationToken ct = default)
{
return await (channel, "RMS", ct); //
}
#endregion
}
}