using Common.Attributes; using DeviceCommand.Base; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DeviceCommand.Device { //是德 [BOBCommand] public class E36233A:Tcp { public E36233A() { ConfigureDevice("127.0.0.1", 502, 3000, 3000); ConnectAsync(); } #region SCPI 常用命令方法 /// /// 查询仪器标识,返回制造商、型号、序列号、固件版本 /// public Task QueryIDAsync(CancellationToken ct = default) { return SendCommandAndReadAsync("*IDN?", ct); } /// /// 恢复出厂设置,不清除错误队列 /// public Task SendResetAsync(CancellationToken ct = default) { return SendAsync("*RST", ct); } /// /// 存储当前仪器状态到指定位置(0~9) /// public Task SaveStateAsync(int slot, CancellationToken ct = default) { if (slot < 0 || slot > 9) throw new ArgumentOutOfRangeException(nameof(slot)); return SendAsync($"*SAV {slot}", ct); } /// /// 调用指定位置的仪器状态(0~9) /// public Task RecallStateAsync(int slot, CancellationToken ct = default) { if (slot < 0 || slot > 9) throw new ArgumentOutOfRangeException(nameof(slot)); return SendAsync($"*RCL {slot}", ct); } /// /// 操作完成标记,发送命令等待操作完成 /// public Task SendOPCAsync(CancellationToken ct = default) { return SendAsync("*OPC", ct); } /// /// 查询操作完成标记,返回 "1" 表示完成 /// public async Task QueryOPCAsync(CancellationToken ct = default) { var result = await SendCommandAndReadAsync("*OPC?", ct); return result == "1"; } /// /// 清除状态寄存器与错误队列 /// public Task ClearStatusAsync(CancellationToken ct = default) { return SendAsync("*CLS", ct); } /// /// 查询状态字节(STB),返回状态值 /// public async Task QueryStatusByteAsync(CancellationToken ct = default) { var result = await SendCommandAndReadAsync("*STB?", ct); return int.TryParse(result, out var value) ? value : 0; } /// /// 通用方法:发送命令并读取响应 /// private async Task SendCommandAndReadAsync(string command, CancellationToken ct = default) { await SendAsync($"{command}\r\n", ct); return await ReadAsync("\n", ct); } #endregion #region 通道与输出控制命令 /// /// 选择操作通道 /// /// 通道号 1 或 2 public 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); } /// /// 开启/关闭输出 /// /// true 表示开,false 表示关 /// 通道列表,如 "1", "1:2" public Task SetOutputStateAsync(bool state, string channels = "1", CancellationToken ct = default) { if (string.IsNullOrWhiteSpace(channels)) throw new ArgumentNullException(nameof(channels)); string cmd = $"OUTP {(state ? "ON" : "OFF")}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 输出上升延迟设置 /// /// 延迟时间 0~3600 秒 /// 通道列表,如 "1", "1:2" public Task SetOutputRiseDelayAsync(double delay, string channels = "1", CancellationToken ct = default) { if (delay < 0 || delay > 3600) throw new ArgumentOutOfRangeException(nameof(delay)); string cmd = $"OUTP:DEL:RISE {delay}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 输出下降延迟设置 /// /// 延迟时间 0~3600 秒 /// 通道列表,如 "1", "1:2" public Task SetOutputFallDelayAsync(double delay, string channels = "1", CancellationToken ct = default) { if (delay < 0 || delay > 3600) throw new ArgumentOutOfRangeException(nameof(delay)); string cmd = $"OUTP:DEL:FALL {delay}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置串/并联模式 /// /// OFF(独立)、SER(串联)、PAR(并联) public Task SetOutputPairModeAsync(string mode, CancellationToken ct = default) { if (mode != "OFF" && mode != "SER" && mode != "PAR") throw new ArgumentException("模式必须为 OFF, SER, PAR", nameof(mode)); return SendAsync($"OUTP:PAIR {mode}\r\n", ct); } /// /// 通道耦合控制 /// /// ALL(全耦合)、NONE(无耦合)、或指定通道,如 @1:2 public Task SetChannelCoupleAsync(string channelList, CancellationToken ct = default) { if (string.IsNullOrWhiteSpace(channelList)) throw new ArgumentNullException(nameof(channelList)); return SendAsync($"OUTP:COUP:CHAN {channelList}\r\n", ct); } #endregion #region 电压 / 电流参数设置命令 /// /// 设置立即电压(单通道或多通道) /// public Task SetVoltageAsync(double voltage, string channels = "1", CancellationToken ct = default) { if (voltage < 0 || voltage > 30.9) throw new ArgumentOutOfRangeException(nameof(voltage)); string cmd = $"SOUR:VOLT {voltage}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置立即电流(单通道或多通道) /// public Task SetCurrentAsync(double current, string channels = "1", CancellationToken ct = default) { if (current < 0 || current > 20.6) throw new ArgumentOutOfRangeException(nameof(current)); string cmd = $"SOUR:CURR {current}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置触发电压(步进/序列模式使用) /// public Task SetTriggeredVoltageAsync(double voltage, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:TRIG {voltage}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置触发电流(步进/序列模式使用) /// public Task SetTriggeredCurrentAsync(double current, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:CURR:TRIG {current}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置电压模式(FIX/STEP/LIST) /// public Task SetVoltageModeAsync(string mode, string channels = "1", CancellationToken ct = default) { if (mode != "FIX" && mode != "STEP" && mode != "LIST") throw new ArgumentException("模式必须为 FIX, STEP, LIST", nameof(mode)); string cmd = $"SOUR:VOLT:MODE {mode}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置电流模式(FIX/STEP/LIST) /// public Task SetCurrentModeAsync(string mode, string channels = "1", CancellationToken ct = default) { if (mode != "FIX" && mode != "STEP" && mode != "LIST") throw new ArgumentException("模式必须为 FIX, STEP, LIST", nameof(mode)); string cmd = $"SOUR:CURR:MODE {mode}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置过压保护 OVP(110% 最大电压内) /// public Task SetOVPAsync(double voltage, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:PROT {voltage}, (@{channels})\r\n"; return SendAsync(cmd, ct); } /// /// 设置过流保护 OCP(110% 最大电流内) /// public Task SetOCPAsync(double current, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:CURR:PROT {current}, (@{channels})\r\n"; return SendAsync(cmd, ct); } #endregion #region 测量与状态查询命令 /// /// 测量指定通道的实际电压 /// public async Task MeasureVoltageAsync(string channels = "1", CancellationToken ct = default) { string cmd = $"MEAS:VOLT? (@{channels})\r\n"; string result = await SendAsync(cmd, ct).ContinueWith(_ => ReadAsync(ct: ct)).Unwrap(); return double.TryParse(result, out var voltage) ? voltage : 0; } /// /// 测量指定通道的实际电流 /// public async Task MeasureCurrentAsync(string channels = "1", CancellationToken ct = default) { string cmd = $"MEAS:CURR? (@{channels})\r\n"; string result = await SendAsync(cmd, ct).ContinueWith(_ => ReadAsync(ct: ct)).Unwrap(); return double.TryParse(result, out var current) ? current : 0; } /// /// 查询错误队列(FIFO 返回下一个错误) /// public async Task QueryNextErrorAsync(CancellationToken ct = default) { string cmd = "SYST:ERR? \r\n"; return await SendAsync(cmd, ct).ContinueWith(_ => ReadAsync(ct: ct)).Unwrap(); } /// /// 查询 OVP(过压保护)状态,返回 true 表示触发 /// public async Task QueryOVPTrippedAsync(string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:PROT:TRIP? (@{channels})\r\n"; string result = await SendAsync(cmd, ct).ContinueWith(_ => ReadAsync(ct: ct)).Unwrap(); return result == "1"; } /// /// 查询 OCP(过流保护)状态,返回 true 表示触发 /// public async Task QueryOCPTrippedAsync(string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:CURR:PROT:TRIP? (@{channels})\r\n"; string result = await SendAsync(cmd, ct).ContinueWith(_ => ReadAsync(ct: ct)).Unwrap(); return result == "1"; } /// /// 查询远程 / 本地模式,返回 LOC / REM / RWL /// public async Task QueryRemoteLocalStateAsync(CancellationToken ct = default) { string cmd = "SYST:COMM:RLST?\r\n"; return await SendAsync(cmd, ct).ContinueWith(_ => ReadAsync(ct: ct)).Unwrap(); } #endregion #region 电压/电流序列设置与触发 /// /// 设置通道的电压序列 /// /// 电压序列,逗号分隔 /// 通道列表,如 "1" 或 "1:2" public async Task SetVoltageListAsync(double[] voltages, string channels = "1", CancellationToken ct = default) { string values = string.Join(",", voltages); string cmd = $"SOUR:LIST:VOLT {values}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 设置通道的电流序列 /// public async Task SetCurrentListAsync(double[] currents, string channels = "1", CancellationToken ct = default) { string values = string.Join(",", currents); string cmd = $"SOUR:LIST:CURR {values}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 设置每步的 dwell 时间序列 /// public async Task SetDwellListAsync(double[] dwellTimes, string channels = "1", CancellationToken ct = default) { string values = string.Join(",", dwellTimes); string cmd = $"SOUR:LIST:DWEL {values}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 设置序列循环次数 /// /// 循环次数,1~9999 或 "INF" public async Task SetSequenceCountAsync(string count, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:LIST:COUN {count}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 启动序列触发 /// public async Task StartSequenceAsync(string channels = "1", CancellationToken ct = default) { string cmd = $"INIT (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 设置序列触发源 /// /// IMMediate、BUS、PIN1、PIN2、PIN3 public async Task SetTriggerSourceAsync(string source, string channels = "1", CancellationToken ct = default) { string cmd = $"TRIG:SOUR {source}, (@{channels})\r\n"; await SendAsync(cmd, ct); } #endregion #region 特殊功能命令 /// /// 设置远端 sensing 模式 /// /// INTernal(本地2线)、EXTernal(远端4线) /// 通道列表,如 "1" 或 "1:2" public async Task SetRemoteSensingAsync(string mode, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:SENS {mode}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 设置电压上升斜率 /// /// 单位 V/s /// 通道列表 public async Task SetVoltageRiseSlewAsync(double slewRate, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:SLEW:RIS {slewRate}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 设置电压下降斜率 /// public async Task SetVoltageFallSlewAsync(double slewRate, string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:SLEW:FALL {slewRate}, (@{channels})\r\n"; await SendAsync(cmd, ct); } /// /// 启动数据日志 /// /// 日志文件路径,如 Internal:/log1.dlog public async Task StartDataLogAsync(string filename, CancellationToken ct = default) { string cmd = $"INIT:DLOG \"{filename}\"\r\n"; await SendAsync(cmd, ct); } /// /// 清除保护状态(OVP/OCP) /// /// 通道列表 public async Task ClearProtectionAsync(string channels = "1", CancellationToken ct = default) { string cmd = $"SOUR:VOLT:PROT:CLE (@{channels})\r\n"; await SendAsync(cmd, ct); } #endregion } }