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"; /// /// 构造函数:初始化 N69200 电子负载通信参数 /// public N69200(string ipAddress, int port, int sendTimeout, int receiveTimeout) { ConfigureDevice(ipAddress, port, sendTimeout, receiveTimeout); } #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 } }