213 lines
7.7 KiB
C#
213 lines
7.7 KiB
C#
using Common.Attributes;
|
|
using DeviceCommand.Base;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
// 根据您的项目实际路径保留枚举的引用
|
|
// using 通讯驱动Base.枚举;
|
|
|
|
namespace DeviceCommand.Devices
|
|
{
|
|
public enum S7200负载模式_枚举
|
|
{
|
|
CC,
|
|
CV,
|
|
CP,
|
|
CR,
|
|
CVCC,
|
|
CRCC,
|
|
CVCR,
|
|
AUTO
|
|
}
|
|
public enum S7200直流源模式_枚举
|
|
{
|
|
VOLTage,
|
|
CURRent,
|
|
BATTest,
|
|
BATSim,
|
|
SOLar,
|
|
EN50530,
|
|
LIST,
|
|
UDW,
|
|
SQUare,
|
|
TRIangle,
|
|
SINusoid,
|
|
DIN40839_12V,
|
|
DIN40839_24V,
|
|
IS016750_SHORTDROP_12V,
|
|
IS016750_SHORTDROP_24V,
|
|
IS016750_RESETTEST,
|
|
IS016750_STARTINGPROFILE_12V_1,
|
|
IS016750_STARTINGPROFILE_12V_2,
|
|
IS016750_STARTINGPROFILE_12V_3,
|
|
IS016750_STARTINGPROFILE_12V_4,
|
|
IS016750_STARTINGPROFILE_24V_1,
|
|
IS016750_STARTINGPROFILE_24V_2,
|
|
IS016750_STARTINGPROFILE_24V_3,
|
|
IS016750_LOADDUMP_TESTA_12V,
|
|
IS016750_LOADDUMP_TESTA_24V,
|
|
IS016750_LOADDUMP_TESTB_12V,
|
|
IS016750_LOADDUMP_TESTB_24V,
|
|
LV123_HV_1,
|
|
LV123_HV_2A,
|
|
LV123_HV_2B,
|
|
LV123_HV_3
|
|
}
|
|
public enum S7200工作模式_枚举
|
|
{
|
|
电源模式,
|
|
负载模式,
|
|
}
|
|
/// <summary>
|
|
/// 高压直流源载一体机 (适配 IT6000C SCPI指令集)
|
|
/// </summary>
|
|
[ACPCommand]
|
|
public class S7200 : Tcp
|
|
{
|
|
// SCPI 指令结束符
|
|
private const string ScpiDelimiter = "\n";
|
|
|
|
#region 设置
|
|
|
|
public async Task 设置为远程模式(CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"SYSTem:REMote{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置电源工作模式(S7200工作模式_枚举 开关, CancellationToken ct = default)
|
|
{
|
|
// IT6000C 为双向无缝切换,底层硬件无需显式发送源载切换指令
|
|
// 保留此方法仅为兼容您原有上位机的工步调用流程,直接返回即可
|
|
await Task.CompletedTask;
|
|
}
|
|
|
|
public async Task 设置直流源工作模式(S7200直流源模式_枚举 模式, CancellationToken ct = default)
|
|
{
|
|
// 原指令: MODE {模式} -> 现 IT6000C 指令: FUNCtion {模式} (如 VOLTage / CURRent)[cite: 1]
|
|
// 若枚举 ToString() 后不匹配,建议在此处加 Switch 转换
|
|
await SendAsync($"FUNCtion {模式}{ScpiDelimiter}", ct);
|
|
}
|
|
|
|
public async Task 设置负载工作模式(S7200负载模式_枚举 模式, CancellationToken ct = default)
|
|
{
|
|
// IT6000C 负载控制通过负向边界实现。若是想开启纯电阻模式,可调用 SINK:RESistance:STATe ON[cite: 1]
|
|
await Task.CompletedTask;
|
|
}
|
|
|
|
public async Task 设置通道开关(bool 开关, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"OUTPut {(开关 ? 1 : 0)}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置CC模式电流(double 电流, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"CURRent {电流}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置CC电压H(double 电流, CancellationToken ct = default) // 沿用原参数名“电流”,实际是设定电压上限
|
|
{
|
|
await SendAsync($"VOLTage:LIMit:POSitive {电流}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置CC电压L(double 电流, CancellationToken ct = default) // 沿用原参数名“电流”,实际是设定电压下限
|
|
{
|
|
await SendAsync($"VOLTage:LIMit:NEGative {电流}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置CV正向电流(double 电流, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"CURRent:LIMit:POSitive {电流}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置CV反向电流(double 电流, CancellationToken ct = default)
|
|
{
|
|
// 提醒: 此处传入的参数如果是正数,建议在外部或此处转换为负值,因为载模式限制需要负数[cite: 1]
|
|
await SendAsync($"CURRent:LIMit:NEGative {电流}{ScpiDelimiter}", ct);
|
|
}
|
|
|
|
public async Task 设置正向功率阈值(double 功率, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"POWer:LIMit:POSitive {功率}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置反向功率阈值(double 功率, CancellationToken ct = default)
|
|
{
|
|
// 提醒: 此处传入的参数必须为负数[cite: 1]
|
|
await SendAsync($"POWer:LIMit:NEGative {功率}{ScpiDelimiter}", ct);
|
|
}
|
|
|
|
public async Task 设置电压(double 电压, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"VOLTage {电压}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 清除保护状态(CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"OUTPut:PROTection:CLEar{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置OCP开关(bool v, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"CURRent:PROTection:STATe {(v ? 1 : 0)}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置OVP开关(bool v, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"VOLTage:PROTection:STATe {(v ? 1 : 0)}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置电压保护OVP电压(double oVP电压, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"VOLTage:PROTection {oVP电压}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置电流保护OCP电流(double oCP电流, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"CURRent:PROTection {oCP电流}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置功率保护开关(bool v, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"POWer:PROTection:STATe {(v ? 1 : 0)}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 设置功率保护功率(double oPP功率, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"POWer:PROTection {oPP功率}{ScpiDelimiter}", ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task 发送自定义命令(string 指令, CancellationToken ct = default)
|
|
{
|
|
await SendAsync($"{指令}{ScpiDelimiter}", ct);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 查询
|
|
|
|
public async Task<string> 查询设备信息(CancellationToken ct = default)
|
|
{
|
|
return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1]
|
|
}
|
|
|
|
public async Task<double> 查询实时电压(CancellationToken ct = default)
|
|
{
|
|
var str = await WriteReadAsync($"MEASure:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1]
|
|
return double.TryParse(str, out double result) ? result : 0;
|
|
}
|
|
|
|
public async Task<double> 查询实时电流(CancellationToken ct = default)
|
|
{
|
|
var str = await WriteReadAsync($"MEASure:CURRent?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1]
|
|
return double.TryParse(str, out double result) ? result : 0;
|
|
}
|
|
|
|
public async Task<double> 查询功率(CancellationToken ct = default)
|
|
{
|
|
var str = await WriteReadAsync($"MEASure:POWer?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1]
|
|
return double.TryParse(str, out double result) ? result : 0;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |