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 QueryAsync(string cmd, CancellationToken ct = default) { await SendAsync(cmd + "\n", ct); return await ReadAsync(ct: ct); } // ===================== 1. 基础控制 ===================== public virtual Task 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 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 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 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 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 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 MeasureVoltageAsync(CancellationToken ct = default) => double.Parse((await QueryAsync("MEAS:VOLT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture); public virtual async Task MeasureCurrentAsync(CancellationToken ct = default) => double.Parse((await QueryAsync("MEAS:CURR?", ct)).Replace("A", ""), CultureInfo.InvariantCulture); public virtual async Task 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); } }