using Common.Attributes; using DeviceCommand.Base; using Model.Models; using System; using System.Globalization; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace DeviceCommand.Devices { /// /// S7200 负载工作模式枚举 (恒流/恒压/恒功率/恒阻等) /// public enum S7200负载模式_枚举 { /// 恒流模式 CC, /// 恒压模式 CV, /// 恒功率模式 CP, /// 恒阻模式 CR, /// 恒压+恒流组合模式 CVCC, /// 恒阻+恒流组合模式 CRCC, /// 恒压+恒阻组合模式 CVCR, /// 自动模式 AUTO } /// /// S7200 直流源工作模式枚举 (电压源/电流源/电池模拟/光伏模拟等) /// public enum S7200直流源模式_枚举 { /// 电压源模式 VOLTage, /// 电流源模式 CURRent, /// 电池测试模式 BATTest, /// 电池模拟模式 BATSim, /// 光伏模拟模式 SOLar, /// EN50530 标准光伏曲线模式 EN50530, /// 列表输出模式 LIST, /// 用户自定义波形模式 UDW, /// 方波输出模式 SQUare, /// 三角波输出模式 TRIangle, /// 正弦波输出模式 SINusoid, /// DIN40839 12V 启动曲线 DIN40839_12V, /// DIN40839 24V 启动曲线 DIN40839_24V, /// ISO16750 短时跌落 12V IS016750_SHORTDROP_12V, /// ISO16750 短时跌落 24V IS016750_SHORTDROP_24V, /// ISO16750 复位测试 IS016750_RESETTEST, /// ISO16750 启动曲线 12V 第 1 组 IS016750_STARTINGPROFILE_12V_1, /// ISO16750 启动曲线 12V 第 2 组 IS016750_STARTINGPROFILE_12V_2, /// ISO16750 启动曲线 12V 第 3 组 IS016750_STARTINGPROFILE_12V_3, /// ISO16750 启动曲线 12V 第 4 组 IS016750_STARTINGPROFILE_12V_4, /// ISO16750 启动曲线 24V 第 1 组 IS016750_STARTINGPROFILE_24V_1, /// ISO16750 启动曲线 24V 第 2 组 IS016750_STARTINGPROFILE_24V_2, /// ISO16750 启动曲线 24V 第 3 组 IS016750_STARTINGPROFILE_24V_3, /// ISO16750 抛负载测试 A 12V IS016750_LOADDUMP_TESTA_12V, /// ISO16750 抛负载测试 A 24V IS016750_LOADDUMP_TESTA_24V, /// ISO16750 抛负载测试 B 12V IS016750_LOADDUMP_TESTB_12V, /// ISO16750 抛负载测试 B 24V IS016750_LOADDUMP_TESTB_24V, /// LV123 高压曲线 1 LV123_HV_1, /// LV123 高压曲线 2A LV123_HV_2A, /// LV123 高压曲线 2B LV123_HV_2B, /// LV123 高压曲线 3 LV123_HV_3 } /// /// S7200 工作模式枚举 (电源模式 / 负载模式) /// public enum S7200工作模式_枚举 { /// 作为电源输出 电源模式, /// 作为负载吸收 负载模式, } /// /// 高压直流源载一体机 (适配 IT6000C SCPI 指令集),支持电源输出与负载吸收双向工作 /// [ACPCommand] public class S7200 : Tcp { // SCPI 指令结束符 private const string ScpiDelimiter = "\n"; /// /// 构造函数:传入 一次性初始化一体机通信参数 /// public S7200(TcpConfig config) : base(config) { } /// /// 从设备返回的 SCPI 响应字符串中提取数值部分并转换为 double。 /// 支持科学计数法(如 2.48E-03),结果保留两位小数。 /// /// 设备返回的原始字符串 /// 提取到的数值(保留两位小数),解析失败时返回 0 private static double ExtractDouble(string raw) { if (string.IsNullOrWhiteSpace(raw)) return 0; // 从响应中提取第一个数值(含正负号、小数点、科学计数法),可自动忽略单位后缀与命令头 var match = Regex.Match(raw, @"[+-]?(?:\d+\.?\d*|\.\d+)(?:[Ee][+-]?\d+)?"); return match.Success && double.TryParse(match.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double val) ? Math.Round(val, 2) : 0; } #region 设置 /// /// 设置仪器为远程控制模式 (SYSTem:REMote) /// /// 取消令牌 public async Task 设置为远程模式(CancellationToken ct = default) { await SendAsync($"SYSTem:REMote{ScpiDelimiter}", ct); } /// /// 设置电源工作模式 (电源/负载)。IT6000C 支持双向无缝切换,无需显式下发源载切换指令 /// /// 工作模式枚举 (电源模式 / 负载模式) /// 取消令牌 public async Task 设置电源工作模式(S7200工作模式_枚举 开关, CancellationToken ct = default) { // IT6000C 为双向无缝切换,底层硬件无需显式发送源载切换指令 // 保留此方法仅为兼容原有上位机的工步调用流程 await Task.CompletedTask; } /// /// 设置直流源工作模式 (FUNCtion 指令,如 VOLTage / CURRent / SOLar 等) /// /// 直流源工作模式枚举 /// 取消令牌 public async Task 设置直流源工作模式(S7200直流源模式_枚举 模式, CancellationToken ct = default) { await SendAsync($"FUNCtion {模式}{ScpiDelimiter}", ct); } /// /// 设置负载工作模式。IT6000C 负载控制通过负向边界实现 /// /// 负载工作模式枚举 /// 取消令牌 public async Task 设置负载工作模式(S7200负载模式_枚举 模式, CancellationToken ct = default) { // 若想开启纯电阻模式,可调用 SINK:RESistance:STATe ON await Task.CompletedTask; } /// /// 开启或关闭通道输出 (OUTPut 指令) /// /// true: 开启输出, false: 关闭输出 /// 取消令牌 public async Task 设置通道开关(bool 开关, CancellationToken ct = default) { await SendAsync($"OUTPut {(开关 ? 1 : 0)}{ScpiDelimiter}", ct); } /// /// 设置恒流 (CC) 模式的电流值 (CURRent 指令) /// /// 电流设定值 (单位: A) /// 取消令牌 public async Task 设置CC模式电流(double 电流, CancellationToken ct = default) { await SendAsync($"CURRent {电流}{ScpiDelimiter}", ct); } /// /// 设置恒流 (CC) 模式的电压上限 (VOLTage:LIMit:POSitive 指令) /// /// 电压上限设定值 (单位: V),沿用原参数名 /// 取消令牌 public async Task 设置CC电压H(double 电流, CancellationToken ct = default) { await SendAsync($"VOLTage:LIMit:POSitive {电流}{ScpiDelimiter}", ct); } /// /// 设置恒流 (CC) 模式的电压下限 (VOLTage:LIMit:NEGative 指令) /// /// 电压下限设定值 (单位: V),沿用原参数名 /// 取消令牌 public async Task 设置CC电压L(double 电流, CancellationToken ct = default) { await SendAsync($"VOLTage:LIMit:NEGative {电流}{ScpiDelimiter}", ct); } /// /// 设置恒压 (CV) 模式的正向电流限制 (CURRent:LIMit:POSitive 指令) /// /// 正向电流限制值 (单位: A) /// 取消令牌 public async Task 设置CV正向电流(double 电流, CancellationToken ct = default) { await SendAsync($"CURRent:LIMit:POSitive {电流}{ScpiDelimiter}", ct); } /// /// 设置恒压 (CV) 模式的反向电流限制 (CURRent:LIMit:NEGative 指令) /// /// 反向电流限制值 (单位: A),负载模式需传负值 /// 取消令牌 public async Task 设置CV反向电流(double 电流, CancellationToken ct = default) { // 载模式限制需要负数,若传入正数建议在外部转换为负值 await SendAsync($"CURRent:LIMit:NEGative {电流}{ScpiDelimiter}", ct); } /// /// 设置正向功率阈值 (POWer:LIMit:POSitive 指令) /// /// 正向功率阈值 (单位: W) /// 取消令牌 public async Task 设置正向功率阈值(double 功率, CancellationToken ct = default) { await SendAsync($"POWer:LIMit:POSitive {功率}{ScpiDelimiter}", ct); } /// /// 设置反向功率阈值 (POWer:LIMit:NEGative 指令) /// /// 反向功率阈值 (单位: W),必须为负数 /// 取消令牌 public async Task 设置反向功率阈值(double 功率, CancellationToken ct = default) { await SendAsync($"POWer:LIMit:NEGative {功率}{ScpiDelimiter}", ct); } /// /// 设置输出电压值 (VOLTage 指令) /// /// 电压设定值 (单位: V) /// 取消令牌 public async Task 设置电压(double 电压, CancellationToken ct = default) { await SendAsync($"VOLTage {电压}{ScpiDelimiter}", ct); } /// /// 清除保护状态 (OUTPut:PROTection:CLEar 指令) /// /// 取消令牌 public async Task 清除保护状态(CancellationToken ct = default) { await SendAsync($"OUTPut:PROTection:CLEar{ScpiDelimiter}", ct); } /// /// 开启或关闭过流保护 (OCP) 功能 (CURRent:PROTection:STATe 指令) /// /// true: 开启过流保护, false: 关闭过流保护 /// 取消令牌 public async Task 设置OCP开关(bool v, CancellationToken ct = default) { await SendAsync($"CURRent:PROTection:STATe {(v ? 1 : 0)}{ScpiDelimiter}", ct); } /// /// 开启或关闭过压保护 (OVP) 功能 (VOLTage:PROTection:STATe 指令) /// /// true: 开启过压保护, false: 关闭过压保护 /// 取消令牌 public async Task 设置OVP开关(bool v, CancellationToken ct = default) { await SendAsync($"VOLTage:PROTection:STATe {(v ? 1 : 0)}{ScpiDelimiter}", ct); } /// /// 设置过压保护 (OVP) 的触发电压值 (VOLTage:PROTection 指令) /// /// 过压保护触发电压值 (单位: V) /// 取消令牌 public async Task 设置电压保护OVP电压(double oVP电压, CancellationToken ct = default) { await SendAsync($"VOLTage:PROTection {oVP电压}{ScpiDelimiter}", ct); } /// /// 设置过流保护 (OCP) 的触发电流值 (CURRent:PROTection 指令) /// /// 过流保护触发电流值 (单位: A) /// 取消令牌 public async Task 设置电流保护OCP电流(double oCP电流, CancellationToken ct = default) { await SendAsync($"CURRent:PROTection {oCP电流}{ScpiDelimiter}", ct); } /// /// 开启或关闭过功率保护 (OPP) 功能 (POWer:PROTection:STATe 指令) /// /// true: 开启过功率保护, false: 关闭过功率保护 /// 取消令牌 public async Task 设置功率保护开关(bool v, CancellationToken ct = default) { await SendAsync($"POWer:PROTection:STATe {(v ? 1 : 0)}{ScpiDelimiter}", ct); } /// /// 设置过功率保护 (OPP) 的触发功率值 (POWer:PROTection 指令) /// /// 过功率保护触发功率值 (单位: W) /// 取消令牌 public async Task 设置功率保护功率(double oPP功率, CancellationToken ct = default) { await SendAsync($"POWer:PROTection {oPP功率}{ScpiDelimiter}", ct); } /// /// 发送自定义 SCPI 指令 /// /// 自定义指令字符串 /// 取消令牌 public async Task 发送自定义命令(string 指令, CancellationToken ct = default) { await SendAsync($"{指令}{ScpiDelimiter}", ct); } #endregion #region 查询 /// /// 查询设备识别信息 (*IDN? 指令) /// /// 取消令牌 /// 设备标识字符串 (制造商, 型号, 序列号, 固件版本) public async Task 查询设备信息(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); } /// /// 查询实时输出电压 (MEASure:VOLTage? 指令) /// /// 取消令牌 /// 实时电压值 (单位: V,保留两位小数) public async Task 查询实时电压(CancellationToken ct = default) { var str = await WriteReadAsync($"MEASure:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct); return ExtractDouble(str); } /// /// 查询实时输出电流 (MEASure:CURRent? 指令) /// /// 取消令牌 /// 实时电流值 (单位: A,保留两位小数) public async Task 查询实时电流(CancellationToken ct = default) { var str = await WriteReadAsync($"MEASure:CURRent?{ScpiDelimiter}", ScpiDelimiter, ct); return ExtractDouble(str); } /// /// 查询实时功率 (MEASure:POWer? 指令) /// /// 取消令牌 /// 实时功率值 (单位: W,保留两位小数) public async Task 查询功率(CancellationToken ct = default) { var str = await WriteReadAsync($"MEASure:POWer?{ScpiDelimiter}", ScpiDelimiter, ct); return ExtractDouble(str); } #endregion } }