294 lines
11 KiB
C#
294 lines
11 KiB
C#
using Common.Attributes;
|
||
using DeviceCommand.Base;
|
||
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";
|
||
|
||
/// <summary>
|
||
/// 构造函数:初始化 N69200 电子负载通信参数
|
||
/// </summary>
|
||
public N69200(string ipAddress, int port, int sendTimeout, int receiveTimeout)
|
||
{
|
||
ConfigureDevice(ipAddress, port, sendTimeout, receiveTimeout);
|
||
}
|
||
|
||
#region 3.1. IEEE 488.2 公共命令
|
||
|
||
/// <summary>
|
||
/// 清除状态命令。清除标准事件状态寄存器和错误队列
|
||
/// </summary>
|
||
public virtual async Task 清除错误队列和状态字节(CancellationToken ct = default)
|
||
{
|
||
await SendAsync($"*CLS{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 读取电子负载设备识别字符串(制造商、产品型号、系统 SN、软件版本号)
|
||
/// </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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 读取标准状态字节寄存器
|
||
/// </summary>
|
||
public virtual async Task<string> 读取状态字节(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($"*STB?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存当前系统参数到指定的存储单元 (单元范围依型号而定)
|
||
/// </summary>
|
||
public virtual async Task 保存当前状态(int 单元, CancellationToken ct = default)
|
||
{
|
||
await SendAsync($"*SAV {单元}{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 调用指定存储单元中保存的系统参数
|
||
/// </summary>
|
||
public virtual async Task 调用存储状态(int 单元, CancellationToken ct = default)
|
||
{
|
||
await SendAsync($"*RCL {单元}{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 3.2. 电子负载模式切换及拉载开关
|
||
|
||
/// <summary>
|
||
/// 控制电子负载的输入控制开关(True: 开启拉载输入, False: 关闭拉载输入)
|
||
/// </summary>
|
||
public virtual async Task 设置DC输入(bool 开启, CancellationToken ct = default)
|
||
{
|
||
string 参数 = 开启 ? "ON" : "OFF";
|
||
await SendAsync($":INPut {参数}{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询电子负载当前的拉载开关状态 (返回 ON 或 OFF)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询DC输入状态(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":INPut?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置电子负载的基本工作模式
|
||
/// (CC: 恒电流, CV: 恒电压, CP: 恒功率, CR: 恒电阻)
|
||
/// </summary>
|
||
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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询电子负载当前处于何种工作模式
|
||
/// </summary>
|
||
public virtual async Task<string> 查询负载模式(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MODE?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 3.3. 负载参数设置 (CC / CV / CP / CR)
|
||
|
||
/// <summary>
|
||
/// 设定恒电流模式(CC)下的拉载电流目标值 (单位: A)
|
||
/// </summary>
|
||
public virtual async Task 设置恒电流CC(double 电流, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":CURRent {0:F4}{1}", 电流, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询恒电流模式下设定的拉载电流值
|
||
/// </summary>
|
||
public virtual async Task<string> 查询恒电流CC设定(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":CURRent?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设定恒电压模式(CV)下的拉载电压目标值 (单位: V)
|
||
/// </summary>
|
||
public virtual async Task 设置恒电压CV(double 电压, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":VOLTage {0:F3}{1}", 电压, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询恒电压模式下设定的拉载电压值
|
||
/// </summary>
|
||
public virtual async Task<string> 查询恒电压CV设定(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设定恒功率模式(CP)下的拉载功率目标值 (单位: W)
|
||
/// </summary>
|
||
public virtual async Task 设置恒功率CP(double 功率, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":POWer {0:F3}{1}", 功率, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询恒功率模式下设定的拉载功率值
|
||
/// </summary>
|
||
public virtual async Task<string> 查询恒功率CP设定(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":POWer?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设定恒电阻模式(CR)下的等效拉载电阻阻值 (单位: Ω)
|
||
/// </summary>
|
||
public virtual async Task 设置恒电阻CR(double 电阻, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":RESistance {0:F4}{1}", 电阻, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询恒电阻模式下设定的拉载电阻值
|
||
/// </summary>
|
||
public virtual async Task<string> 查询恒电阻CR设定(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":RESistance?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 3.4. 测量与数据回测(高频数据轮询核心)
|
||
|
||
/// <summary>
|
||
/// 回读电子负载输入端子上的实时测得电压值 (单位: V)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询实际电压(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 回读电子负载输入端子上的实时测得电流值 (单位: A)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询实际电流(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:CURRent?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 回读电子负载输入端子上的实时测得功率值 (单位: W)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询实际功率(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:POWer?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 一键回读当前负载测得的电压、电流和功率的组合数组数据
|
||
/// </summary>
|
||
public virtual async Task<string> 查询电压电流功率数组(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:VAP?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 3.5. 保护限制参数设置
|
||
|
||
/// <summary>
|
||
/// 设置电子负载的过流保护(OCP)报警值 (单位: A)
|
||
/// </summary>
|
||
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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置电子负载的过功率保护(OPP)报警值 (单位: W)
|
||
/// </summary>
|
||
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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置电子负载的过压保护(OVP)报警值 (单位: V)
|
||
/// </summary>
|
||
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. 系统控制及报警清除
|
||
|
||
/// <summary>
|
||
/// 读取仪器的出错记录记录 (当系统产生告警或指令解析异常时读取)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询错误信息(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":SYSTem:ERRor?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 切换电子负载到本地面板操作状态 (前面板按键解锁)
|
||
/// </summary>
|
||
public virtual async Task 切换本地控制模式(CancellationToken ct = default)
|
||
{
|
||
await SendAsync($":SYSTem:LOCal{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 切换电子负载到远程计算机操作状态 (前面板按键锁定)
|
||
/// </summary>
|
||
public virtual async Task 切换远程控制模式(CancellationToken ct = default)
|
||
{
|
||
await SendAsync($":SYSTem:REMote{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 清除负载当前的软件过流/过功率等保护(Protection)锁定触发状态
|
||
/// </summary>
|
||
public virtual async Task 清除保护告警(CancellationToken ct = default)
|
||
{
|
||
await SendAsync($":PROTection:CLEar{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
} |