using Common.Attributes;
using DeviceCommand.Base;
using Model.Models;
using System;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[ADPCommand]
public class N69200 : Tcp
{
// 手册第 15 页 2.2.4 明确规定:命令结束符为换行符 (ASCII 字符 LF,即 \n)
private const string ScpiDelimiter = "\n";
///
/// 构造函数:传入 一次性初始化 N69200 电子负载通信参数。
///
public N69200(TcpConfig config) : base(config)
{
}
#region 3.1. IEEE 488.2 公共命令
///
/// 清除状态命令。清除标准事件状态寄存器和错误队列
///
public virtual async Task 清除错误队列和状态字节(CancellationToken ct = default)
{
await SendAsync($"*CLS{ScpiDelimiter}", ct);
}
///
/// 读取电子负载设备识别字符串(制造商、产品型号、系统 SN、软件版本号)
///
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);
}
///
/// 读取标准状态字节寄存器
///
public virtual async Task 读取状态字节(CancellationToken ct = default)
{
return await WriteReadAsync($"*STB?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 保存当前系统参数到指定的存储单元 (单元范围依型号而定)
///
public virtual async Task 保存当前状态(int 单元, CancellationToken ct = default)
{
await SendAsync($"*SAV {单元}{ScpiDelimiter}", ct);
}
///
/// 调用指定存储单元中保存的系统参数
///
public virtual async Task 调用存储状态(int 单元, CancellationToken ct = default)
{
await SendAsync($"*RCL {单元}{ScpiDelimiter}", ct);
}
#endregion
#region 3.2. 电子负载模式切换及拉载开关
///
/// 控制电子负载的输入控制开关(True: 开启拉载输入, False: 关闭拉载输入)
///
public virtual async Task 设置DC输入(bool 开启, CancellationToken ct = default)
{
string 参数 = 开启 ? "ON" : "OFF";
await SendAsync($":INPut {参数}{ScpiDelimiter}", ct);
}
///
/// 查询电子负载当前的拉载开关状态 (返回 ON 或 OFF)
///
public virtual async Task 查询DC输入状态(CancellationToken ct = default)
{
return await WriteReadAsync($":INPut?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 设置电子负载的基本工作模式
/// (CC: 恒电流, CV: 恒电压, CP: 恒功率, CR: 恒电阻)
///
public virtual async Task 设置负载模式(string 模式, CancellationToken ct = default)
{
// 转换为大写以确保设备命令解析兼容
string modeUpper = 模式.ToUpper();
if (modeUpper != "CC" && modeUpper != "CV" && modeUpper != "CP" && modeUpper != "CR")
throw new ArgumentException("工作模式只能为 CC, CV, CP, 或 CR");
await SendAsync($":MODE {modeUpper}{ScpiDelimiter}", ct);
}
///
/// 查询电子负载当前处于何种工作模式
///
public virtual async Task 查询负载模式(CancellationToken ct = default)
{
return await WriteReadAsync($":MODE?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 3.3. 负载参数设置 (CC / CV / CP / CR)
///
/// 设定恒电流模式(CC)下的拉载电流目标值 (单位: A)
///
public virtual async Task 设置恒电流CC(double 电流, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":CURRent {0:F4}{1}", 电流, ScpiDelimiter);
await SendAsync(cmd, ct);
}
///
/// 查询恒电流模式下设定的拉载电流值
///
public virtual async Task 查询恒电流CC设定(CancellationToken ct = default)
{
return await WriteReadAsync($":CURRent?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 设定恒电压模式(CV)下的拉载电压目标值 (单位: V)
///
public virtual async Task 设置恒电压CV(double 电压, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":VOLTage {0:F3}{1}", 电压, ScpiDelimiter);
await SendAsync(cmd, ct);
}
///
/// 查询恒电压模式下设定的拉载电压值
///
public virtual async Task 查询恒电压CV设定(CancellationToken ct = default)
{
return await WriteReadAsync($":VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 设定恒功率模式(CP)下的拉载功率目标值 (单位: W)
///
public virtual async Task 设置恒功率CP(double 功率, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":POWer {0:F3}{1}", 功率, ScpiDelimiter);
await SendAsync(cmd, ct);
}
///
/// 查询恒功率模式下设定的拉载功率值
///
public virtual async Task 查询恒功率CP设定(CancellationToken ct = default)
{
return await WriteReadAsync($":POWer?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 设定恒电阻模式(CR)下的等效拉载电阻阻值 (单位: Ω)
///
public virtual async Task 设置恒电阻CR(double 电阻, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":RESistance {0:F4}{1}", 电阻, ScpiDelimiter);
await SendAsync(cmd, ct);
}
///
/// 查询恒电阻模式下设定的拉载电阻值
///
public virtual async Task 查询恒电阻CR设定(CancellationToken ct = default)
{
return await WriteReadAsync($":RESistance?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 3.4. 测量与数据回测(高频数据轮询核心)
///
/// 回读电子负载输入端子上的实时测得电压值 (单位: V)
///
public virtual async Task 查询实际电压(CancellationToken ct = default)
{
return await WriteReadAsync($":MEASure:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 回读电子负载输入端子上的实时测得电流值 (单位: A)
///
public virtual async Task 查询实际电流(CancellationToken ct = default)
{
return await WriteReadAsync($":MEASure:CURRent?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 回读电子负载输入端子上的实时测得功率值 (单位: W)
///
public virtual async Task 查询实际功率(CancellationToken ct = default)
{
return await WriteReadAsync($":MEASure:POWer?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 一键回读当前负载测得的电压、电流和功率的组合数组数据
///
public virtual async Task 查询电压电流功率数组(CancellationToken ct = default)
{
return await WriteReadAsync($":MEASure:VAP?{ScpiDelimiter}", ScpiDelimiter, ct);
}
#endregion
#region 3.5. 保护限制参数设置
///
/// 设置电子负载的过流保护(OCP)报警值 (单位: A)
///
public virtual async Task 设置过流保护值_OCP(double 电流, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":PROTection:CURRent {0:F3}{1}", 电流, ScpiDelimiter);
await SendAsync(cmd, ct);
}
///
/// 设置电子负载的过功率保护(OPP)报警值 (单位: W)
///
public virtual async Task 设置过功率保护值_OPP(double 功率, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":PROTection:POWer {0:F3}{1}", 功率, ScpiDelimiter);
await SendAsync(cmd, ct);
}
///
/// 设置电子负载的过压保护(OVP)报警值 (单位: V)
///
public virtual async Task 设置过压保护值_OVP(double 电压, CancellationToken ct = default)
{
string cmd = string.Format(CultureInfo.InvariantCulture, ":PROTection:VOLTage {0:F3}{1}", 电压, ScpiDelimiter);
await SendAsync(cmd, ct);
}
#endregion
#region 3.6. 系统控制及报警清除
///
/// 读取仪器的出错记录记录 (当系统产生告警或指令解析异常时读取)
///
public virtual async Task 查询错误信息(CancellationToken ct = default)
{
return await WriteReadAsync($":SYSTem:ERRor?{ScpiDelimiter}", ScpiDelimiter, ct);
}
///
/// 切换电子负载到本地面板操作状态 (前面板按键解锁)
///
public virtual async Task 切换本地控制模式(CancellationToken ct = default)
{
await SendAsync($":SYSTem:LOCal{ScpiDelimiter}", ct);
}
///
/// 切换电子负载到远程计算机操作状态 (前面板按键锁定)
///
public virtual async Task 切换远程控制模式(CancellationToken ct = default)
{
await SendAsync($":SYSTem:REMote{ScpiDelimiter}", ct);
}
///
/// 清除负载当前的软件过流/过功率等保护(Protection)锁定触发状态
///
public virtual async Task 清除保护告警(CancellationToken ct = default)
{
await SendAsync($":PROTection:CLEar{ScpiDelimiter}", ct);
}
#endregion
}
}