BOB/DeviceCommand/Device/E36233A.cs
2025-11-21 17:11:06 +08:00

161 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
/// <summary>查询设备身份</summary>
public virtual Task<string> QueryIDAsync(CancellationToken ct = default)
=> SendCommandReadAsync("*IDN?", ct);
/// <summary>清除错误与状态</summary>
public virtual Task ClearStatusAsync(CancellationToken ct = default)
=> SendAsync("*CLS\r\n", ct);
/// <summary>系统复位</summary>
public virtual Task ResetAsync(CancellationToken ct = default)
=> SendAsync("*RST\r\n", ct);
#endregion
#region
/// <summary>选择通道 CH1 或 CH2</summary>
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);
}
/// <summary>开关输出</summary>
public virtual Task SetOutputAsync(bool on, string channels = "1", CancellationToken ct = default)
=> SendAsync($"OUTP {(on ? "ON" : "OFF")},(@{channels})\r\n", ct);
#endregion
#region /
/// <summary>设置电压 (0~30.9V)</summary>
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);
}
/// <summary>设置电流限值 (0~20.6A)</summary>
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);
}
/// <summary>设置过压保护</summary>
public virtual Task SetOVPAsync(double ovp, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:PROT {ovp},(@{channels})\r\n", ct);
/// <summary>设置过流保护</summary>
public virtual Task SetOCPAsync(double ocp, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:CURR:PROT {ocp},(@{channels})\r\n", ct);
/// <summary>清除 OVP/OCP 错误</summary>
public virtual Task ClearProtectionAsync(string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:PROT:CLE (@{channels})\r\n", ct);
#endregion
#region
/// <summary>设置电压上升斜率</summary>
public virtual Task SetRiseSlewAsync(double slew, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:SLEW:RIS {slew},(@{channels})\r\n", ct);
/// <summary>设置电压下降斜率</summary>
public virtual Task SetFallSlewAsync(double slew, string channels = "1", CancellationToken ct = default)
=> SendAsync($"SOUR:VOLT:SLEW:FALL {slew},(@{channels})\r\n", ct);
#endregion
#region
/// <summary>测量电压(V)</summary>
public virtual async Task<double> MeasureVoltageAsync(string channels = "1", CancellationToken ct = default)
{
string result = await SendCommandReadAsync($"MEAS:VOLT? (@{channels})", ct);
return double.TryParse(result, out var value) ? value : 0;
}
/// <summary>测量电流(A)</summary>
public virtual async Task<double> 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<bool> QueryOVPTrippedAsync(string channels = "1", CancellationToken ct = default)
{
string result = await SendCommandReadAsync($"SOUR:VOLT:PROT:TRIP? (@{channels})", ct);
return result == "1";
}
public virtual async Task<bool> 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<string> SendCommandReadAsync(string cmd, CancellationToken ct = default)
{
await SendAsync(cmd + "\r\n", ct);
return await ReadAsync("\n", ct);
}
#endregion
}
}