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
}
}