using Common.Attributes;
using DeviceCommand.Base;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class E36233A : Tcp
{
public E36233A(string ipAddress, int port, int sendTimeout, int receiveTimeout)
{
ConfigureDevice(ipAddress, port, sendTimeout, receiveTimeout);
}
public E36233A()
{
}
#region 基础系统命令(必须保留)
/// 查询设备身份
public virtual Task QueryIDAsync(CancellationToken ct = default)
=> SendCommandReadAsync("*IDN?", ct);
/// 清除错误与状态
public virtual Task ClearStatusAsync(CancellationToken ct = default)
=> SendAsync("*CLS\r\n", ct);
/// 系统复位
public virtual Task ResetAsync(CancellationToken ct = default)
=> SendAsync("*RST\r\n", ct);
#endregion
#region 通道与输出控制
/// 选择通道 CH1 或 CH2
public virtual Task SelectChannelAsync(int channel, CancellationToken ct = default)
{
if (channel < 1 || channel > 2)
throw new ArgumentOutOfRangeException(nameof(channel));
return SendAsync($"INST:SEL CH{channel}\r\n", ct);
}
/// 开关输出
public virtual Task SetOutputAsync(bool on, string channels = "1", CancellationToken ct = default)
=> SendAsync($"OUTP {(on ? "ON" : "OFF")},(@{channels})\r\n", ct);
#endregion
#region 电压/电流设置
/// 设置电压 (0~30.9V)
public virtual Task SetVoltageAsync(double volt, string channels = "1", CancellationToken ct = default)
{
if (volt < 0 || volt > 30.9) throw new ArgumentOutOfRangeException(nameof(volt));
return SendAsync($"SOUR:VOLT {volt},(@{channels})\r\n", ct);
}
/// 设置电流限值 (0~20.6A)
public virtual Task SetCurrentAsync(double curr, string channels = "1", CancellationToken ct = default)
{
if (curr < 0 || curr > 20.6) throw new ArgumentOutOfRangeException(nameof(curr));
return SendAsync($"SOUR:CURR {curr},(@{channels})\r\n", ct);
}
/// 设置过压保护
public virtual Task SetOVPAsync(double ovp, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:PROT {ovp},(@{channels})\r\n", ct);
/// 设置过流保护
public virtual Task SetOCPAsync(double ocp, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:CURR:PROT {ocp},(@{channels})\r\n", ct);
/// 清除 OVP/OCP 错误
public virtual Task ClearProtectionAsync(string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:PROT:CLE (@{channels})\r\n", ct);
#endregion
#region 斜率设置(用于启动测试)
/// 设置电压上升斜率
public virtual Task SetRiseSlewAsync(double slew, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:SLEW:RIS {slew},(@{channels})\r\n", ct);
/// 设置电压下降斜率
public virtual Task SetFallSlewAsync(double slew, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:SLEW:FALL {slew},(@{channels})\r\n", ct);
#endregion
#region 测量
/// 测量电压(V)
public virtual async Task MeasureVoltageAsync(string channels = "1", CancellationToken ct = default)
{
string result = await SendCommandReadAsync($"MEAS:VOLT? (@{channels})", ct);
return double.TryParse(result, out var value) ? value : 0;
}
/// 测量电流(A)
public virtual async Task MeasureCurrentAsync(string channels = "1", CancellationToken ct = default)
{
string result = await SendCommandReadAsync($"MEAS:CURR? (@{channels})", ct);
return double.TryParse(result, out var value) ? value : 0;
}
#endregion
#region 保护状态查询
public virtual async Task QueryOVPTrippedAsync(string channels = "1", CancellationToken ct = default)
{
string result = await SendCommandReadAsync($"SOUR:VOLT:PROT:TRIP? (@{channels})", ct);
return result == "1";
}
public virtual async Task QueryOCPTrippedAsync(string channels = "1", CancellationToken ct = default)
{
string result = await SendCommandReadAsync($"SOUR:CURR:PROT:TRIP? (@{channels})", ct);
return result == "1";
}
#endregion
#region 序列(用于阶梯电压/耐久测试)
public virtual Task SetVoltageListAsync(double[] voltages, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:LIST:VOLT {string.Join(",", voltages)},(@{channels})\r\n", ct);
public virtual Task SetCurrentListAsync(double[] currents, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:LIST:CURR {string.Join(",", currents)},(@{channels})\r\n", ct);
public virtual Task SetDwellListAsync(double[] times, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:LIST:DWEL {string.Join(",", times)},(@{channels})\r\n", ct);
public virtual Task SetSequenceRepeatAsync(string count, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:LIST:COUN {count},(@{channels})\r\n", ct);
public virtual Task StartSequenceAsync(string channels = "1", CancellationToken ct = default)
=> SendAsync($"INIT (@{channels})\r\n", ct);
#endregion
#region 辅助方法
protected virtual async Task SendCommandReadAsync(string cmd, CancellationToken ct = default)
{
await SendAsync(cmd + "\r\n", ct);
return await ReadAsync("\n", ct);
}
#endregion
}
}