249 lines
9.5 KiB
C#
249 lines
9.5 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 IT7800E : Tcp
|
||
{
|
||
// 根据通用 SCPI 指令规范,使用换行符 (ASCII 字符 LF,即 \n) 作为标准结束符
|
||
private const string ScpiDelimiter = "\n";
|
||
|
||
/// <summary>
|
||
/// 构造函数:初始化 IT7800E 交直流电源通信参数
|
||
/// </summary>
|
||
public IT7800E(string ipAddress, int port, int sendTimeout, int receiveTimeout)
|
||
{
|
||
ConfigureDevice(ipAddress, port, sendTimeout, receiveTimeout);
|
||
}
|
||
|
||
#region 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); //
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 2. 耦合模式与拉载开关控制
|
||
|
||
/// <summary>
|
||
/// 设置电源输出源的电气模式/工作耦合模式
|
||
/// (AC: 纯交流, DC: 纯直流, ACDC: 交直流混合模式)
|
||
/// </summary>
|
||
public virtual async Task 设置电源模式(string 模式, CancellationToken ct = default)
|
||
{
|
||
string modeUpper = 模式.ToUpper();
|
||
if (modeUpper != "AC" && modeUpper != "DC" && modeUpper != "ACDC")
|
||
throw new ArgumentException("工作模式只能为 AC, DC, 或 ACDC");
|
||
|
||
await SendAsync($":SOURce:MODE {modeUpper}{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询电源当前的工作模式
|
||
/// </summary>
|
||
public virtual async Task<string> 查询电源模式(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":SOURce:MODE?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 控制电源的主输出开关 (True: 开启输出, False: 关闭输出)
|
||
/// </summary>
|
||
public virtual async Task 设置DC输出(bool 开启, CancellationToken ct = default)
|
||
{
|
||
// 注意:虽然方法名叫设置DC输出,但对交直流电源它代表通用的主输出控制(Main Output)
|
||
string 参数 = 开启 ? "ON" : "OFF";
|
||
await SendAsync($":OUTPut {参数}{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询电源当前主输出开关状态 (返回 ON 或 OFF)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询DC输出状态(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":OUTPut?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 3. 设定输出参数设置 (AC 电压/频率/DC 电压)
|
||
|
||
/// <summary>
|
||
/// 设定交流(AC)模式下的电压有效值 (单位: V)
|
||
/// </summary>
|
||
public virtual async Task 设置交流电压(double 电压, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:VOLTage:AC {0:F2}{1}", 电压, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设定直流(DC)模式或交直流(AC+DC)模式下的直流偏置电压值 (单位: V)
|
||
/// </summary>
|
||
public virtual async Task 设置直流电压(double 电压, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:VOLTage:DC {0:F2}{1}", 电压, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设定电源交流输出的频率值 (单位: Hz)
|
||
/// </summary>
|
||
public virtual async Task 设置频率(double 频率, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:FREQuency {0:F2}{1}", 频率, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置硬件交流输出的有效值限流门限 (单位: A)
|
||
/// </summary>
|
||
public virtual async Task 设置电流(double 电流, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:CURRent {0:F3}{1}", 电流, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 4. 测量与数据回测(高频数据轮询核心)
|
||
|
||
/// <summary>
|
||
/// 查询通道实时测得的电压有效值(RMS,支持 AC 或 DC 模式下的回测)(单位: V)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询实际电压(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询通道实时测得的电流有效值(RMS)(单位: 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>
|
||
/// 查询通道实时测得的视在功率 (单位: VA)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询视在功率(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:POWer:APParent?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询通道实时测得的输出频率 (单位: Hz)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询实际频率(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:FREQuency?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询当前的功率因数 (PF)
|
||
/// </summary>
|
||
public virtual async Task<string> 查询功率因数(CancellationToken ct = default)
|
||
{
|
||
return await WriteReadAsync($":MEASure:PF?{ScpiDelimiter}", ScpiDelimiter, ct);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 5. 保护参数设置与系统监控
|
||
|
||
/// <summary>
|
||
/// 设置电源的过流保护(OCP)值 (单位: A)
|
||
/// </summary>
|
||
public virtual async Task 设置过流保护_OCP(double 电流, CancellationToken ct = default)
|
||
{
|
||
string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:CURRent:PROTection {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, ":SOURce:VOLTage:PROTection {0:F2}{1}", 电压, ScpiDelimiter);
|
||
await SendAsync(cmd, ct);
|
||
}
|
||
|
||
/// <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:REMote{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 切换仪器至前面板操作的本地模式 (前面板解锁)
|
||
/// </summary>
|
||
public virtual async Task 切换本地控制模式(CancellationToken ct = default)
|
||
{
|
||
await SendAsync($":SYSTem:LOCal{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 清除仪器当前的保护状态(例如触发 OCP/OVP 被锁死后进行软件解锁)
|
||
/// </summary>
|
||
public virtual async Task 清除保护告警(CancellationToken ct = default)
|
||
{
|
||
await SendAsync($":PROTection:CLEar{ScpiDelimiter}", ct);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
} |