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

114 lines
4.9 KiB
C#

using Common.Attributes;
using DeviceCommand.Base;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class SQ0030G1D : Tcp
{
public SQ0030G1D(string ip, int port, int sendTimeout, int receiveTimeout)
{
ConfigureDevice(ip, port, sendTimeout, receiveTimeout);
}
public SQ0030G1D() { }
// ===================== 基础封装 =====================
protected virtual Task WriteAsync(string cmd, CancellationToken ct = default)
=> SendAsync(cmd + "\n", ct);
protected virtual async Task<string> QueryAsync(string cmd, CancellationToken ct = default)
{
await SendAsync(cmd + "\n", ct);
return await ReadAsync(ct: ct);
}
// ===================== 1. 基础控制 =====================
public virtual Task<string> GetIdAsync(CancellationToken ct = default)
=> QueryAsync("*IDN?", ct);
public virtual Task ResetAsync(CancellationToken ct = default)
=> WriteAsync("*RST", ct);
public virtual Task SetRemoteAsync(CancellationToken ct = default)
=> WriteAsync("SYST:REM", ct);
public virtual Task SetLocalAsync(CancellationToken ct = default)
=> WriteAsync("SYST:LOC", ct);
public virtual Task SetOutputAsync(bool on, CancellationToken ct = default)
=> WriteAsync($"OUTP:STAT {(on ? "ON" : "OFF")}", ct);
public virtual async Task<bool> GetOutputAsync(CancellationToken ct = default)
=> (await QueryAsync("OUTP:STAT?", ct)).Trim().ToUpper() == "ON";
// ===================== 2. 电压/频率控制 =====================
public virtual Task SetVoltageAsync(double value, CancellationToken ct = default)
=> WriteAsync($"VOLT {value}", ct);
public virtual async Task<double> GetVoltageAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("VOLT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture);
public virtual Task SetFrequencyAsync(double freq, CancellationToken ct = default)
=> WriteAsync($"FREQ {freq}", ct);
public virtual async Task<double> GetFrequencyAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("FREQ?", ct)).Replace("Hz", ""), CultureInfo.InvariantCulture);
// ===================== 3. 保护 =====================
public virtual Task SetOVPAsync(double v, CancellationToken ct = default)
=> WriteAsync($"VOLT:PROT {v}", ct);
public virtual async Task<double> GetOVPAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("VOLT:PROT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture);
public virtual Task SetOCPAsync(double a, CancellationToken ct = default)
=> WriteAsync($"CURR:PROT {a}", ct);
public virtual async Task<double> GetOCPAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("CURR:PROT?", ct)).Replace("A", ""), CultureInfo.InvariantCulture);
public virtual Task ClearProtectionAsync(CancellationToken ct = default)
=> WriteAsync("SYST:PROT:CLE", ct);
// ===================== 4. 测量 =====================
public virtual async Task<double> MeasureVoltageAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("MEAS:VOLT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture);
public virtual async Task<double> MeasureCurrentAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("MEAS:CURR?", ct)).Replace("A", ""), CultureInfo.InvariantCulture);
public virtual async Task<double> MeasurePowerAsync(CancellationToken ct = default)
=> double.Parse((await QueryAsync("MEAS:POW?", ct)).Replace("W", ""), CultureInfo.InvariantCulture);
public virtual async Task<(double volt, double curr, double pow)> MeasureArrayAsync(CancellationToken ct = default)
{
var parts = (await QueryAsync("MEAS:ARR?", ct)).Split(',');
return (
double.Parse(parts[0].Replace("V", ""), CultureInfo.InvariantCulture),
double.Parse(parts[1].Replace("A", ""), CultureInfo.InvariantCulture),
double.Parse(parts[2].Replace("W", ""), CultureInfo.InvariantCulture)
);
}
// ===================== 5.(可选)瞬态 =====================
public virtual Task SetTransientOnAsync(bool on, CancellationToken ct = default)
=> WriteAsync($"TRAN:STAT {(on ? "ON" : "OFF")}", ct);
public virtual Task SetTransientStepVoltageAsync(int step, double volt, CancellationToken ct = default)
=> WriteAsync($"TRAN:STEP {step}:VOLT {volt}", ct);
public virtual Task RunTransientAsync(CancellationToken ct = default)
=> WriteAsync("TRAN:RUN", ct);
}
}