using System; using APS7100TestTool.Models; using APS7100TestTool.Services; namespace APS7100TestTool.Controllers { /// /// PSW250-4.5 DC 可编程电源控制器 /// public class PSW250Controller : IPowerSupplyController { private readonly ScpiDevice _device; public DeviceType DeviceType => DeviceType.PSW250; public DeviceInfo DeviceInfo => DeviceInfo.GetDeviceInfo(DeviceType.PSW250); public PSW250Controller(ScpiDevice device) { _device = device ?? throw new ArgumentNullException(nameof(device)); } #region 基本操作 /// /// 获取设备识别信息 /// public string GetIdentification() { return _device.Query("*IDN?"); } /// /// 重置设备 /// public void Reset() { _device.SendCommand("*RST"); System.Threading.Thread.Sleep(1000); } /// /// 清除状态 /// public void ClearStatus() { _device.SendCommand("*CLS"); } #endregion #region 输出控制 /// /// 设置输出开关 /// public void SetOutput(bool enable) { _device.SendCommand(enable ? "OUTP ON" : "OUTP OFF"); } /// /// 获取输出状态 /// public bool GetOutputState() { string result = _device.Query("OUTP?"); return result.Trim() == "1" || result.ToUpper().Contains("ON"); } #endregion #region 电压控制 /// /// 设置输出电压 (V) /// public void SetVoltage(double voltage) { _device.SendCommand($"SOUR:VOLT {voltage}"); } /// /// 获取电压设定值 (V) /// public double GetVoltage() { string result = _device.Query("SOUR:VOLT?"); return double.Parse(result); } #endregion #region 电流控制 /// /// 设置输出电流 (A) /// public void SetCurrent(double current) { _device.SendCommand($"SOUR:CURR {current}"); } /// /// 获取电流设定值 (A) /// public double GetCurrent() { string result = _device.Query("SOUR:CURR?"); return double.Parse(result); } #endregion #region 测量 /// /// 测量实际输出电压 (V) /// public double MeasureVoltage() { string result = _device.Query("MEAS:VOLT?"); return double.Parse(result); } /// /// 测量实际输出电流 (A) /// public double MeasureCurrent() { string result = _device.Query("MEAS:CURR?"); return double.Parse(result); } /// /// 测量输出功率 (W) /// public double MeasurePower() { string result = _device.Query("MEAS:POW?"); return double.Parse(result); } #endregion #region AC电源独有功能(PSW不支持) /// /// 设置频率 - DC电源不支持 /// public void SetFrequency(double frequency) { throw new NotSupportedException("DC 电源不支持频率设置"); } /// /// 获取频率 - DC电源不支持 /// public double GetFrequency() { throw new NotSupportedException("DC 电源不支持频率设置"); } /// /// 测量频率 - DC电源不支持 /// public double MeasureFrequency() { throw new NotSupportedException("DC 电源不支持频率测量"); } /// /// 测量功率因数 - DC电源不支持 /// public double MeasurePowerFactor() { throw new NotSupportedException("DC 电源不支持功率因数测量"); } /// /// 设置波形 - DC电源不支持 /// public void SetWaveform(Waveform waveform) { throw new NotSupportedException("DC 电源不支持波形设置"); } /// /// 获取波形 - DC电源不支持 /// public Waveform GetWaveform() { throw new NotSupportedException("DC 电源不支持波形设置"); } /// /// 设置电压量程 - DC电源不支持(或命令不同) /// public void SetVoltageRange(VoltageRange range) { throw new NotSupportedException("DC 电源不支持该命令"); } /// /// 获取电压量程 - DC电源不支持 /// public VoltageRange GetVoltageRange() { throw new NotSupportedException("DC 电源不支持该命令"); } #endregion #region PSW250 独有功能 /// /// 设置输出控制优先级模式 /// 注意:这不是切换 CV/CC 状态,而是设置控制优先级和动态响应策略 /// CV/CC 是运行结果,取决于负载,不是手动切换的 /// public void SetOutputMode(PSWOutputMode mode) { string modeStr = mode switch { PSWOutputMode.CVHS => "CVHS", // 恒压优先(高速响应) PSWOutputMode.CCHS => "CCHS", // 恒流优先(高速响应) PSWOutputMode.CVLS => "CVLS", // 恒压优先(斜率/平滑变化) PSWOutputMode.CCLS => "CCLS", // 恒流优先(斜率/平滑变化) _ => "CVHS" }; _device.SendCommand($"OUTP:MODE {modeStr}"); } /// /// 获取输出控制优先级模式 /// public PSWOutputMode GetOutputMode() { string result = _device.Query("OUTP:MODE?").Trim().ToUpper(); // 处理数字返回值 (0-3) 或字符串返回值 return result switch { "0" or "CVHS" => PSWOutputMode.CVHS, "1" or "CCHS" => PSWOutputMode.CCHS, "2" or "CVLS" => PSWOutputMode.CVLS, "3" or "CCLS" => PSWOutputMode.CCLS, _ => PSWOutputMode.CVHS }; } /// /// 判断当前运行状态是否为 CC(恒流)模式 /// 注意:CV/CC 是运行结果,取决于负载 /// 通过比较实际电流和设定电流来判断 /// public bool IsInCCMode() { try { double setCurrent = GetCurrent(); // 设定电流(限制值) double actualCurrent = MeasureCurrent(); // 实际电流 // 如果实际电流 >= 设定电流的 98%,认为处于 CC 模式 return setCurrent > 0.01 && actualCurrent >= setCurrent * 0.98; } catch { return false; } } // 保留旧方法以兼容(标记为过时) [Obsolete("请使用 SetOutputMode 和 GetOutputMode,CV/CC 是运行结果不是可切换模式")] public void SetMode(PSWMode mode) { } [Obsolete("请使用 IsInCCMode() 判断运行状态,或使用 GetOutputMode() 获取控制优先级")] public PSWMode GetMode() => PSWMode.ConstantVoltage; /// /// 设置过压保护值 (V) /// public void SetOVP(double voltage) { _device.SendCommand($"SOUR:VOLT:PROT {voltage}"); } /// /// 获取过压保护值 (V) /// public double GetOVP() { string result = _device.Query("SOUR:VOLT:PROT?"); return double.Parse(result); } /// /// 设置过流保护值 (A) /// public void SetOCP(double current) { _device.SendCommand($"SOUR:CURR:PROT {current}"); } /// /// 获取过流保护值 (A) /// public double GetOCP() { string result = _device.Query("SOUR:CURR:PROT?"); return double.Parse(result); } #endregion #region 远程控制模式 /// /// 进入远程控制模式 /// public void SetRemoteMode() { _device.SendCommand("SYST:REM"); } /// /// 返回本地控制模式 /// public void SetLocalMode() { _device.SendCommand("SYST:COMM:RLST LOCAL"); } /// /// 锁定/解锁前面板按键 - PSW250 不支持此功能 /// /// /// PSW250 不支持面板锁定命令,此方法仅保持接口兼容 /// public void SetPanelLock(bool locked) { // PSW250 不支持 SYST:RWLOCK 命令,忽略此操作 // 如需严格检查,可以抛出 NotSupportedException } /// /// 查询当前是否为远程模式 /// public bool IsRemoteMode() { try { string result = _device.Query("SYST:REM?"); return result.Trim() == "1" || result.ToUpper().Contains("ON") || result.ToUpper().Contains("REM"); } catch { return true; } } #endregion #region 自定义命令 /// /// 发送自定义 SCPI 命令 /// public void SendCustomCommand(string command) { _device.SendCommand(command); } /// /// 发送自定义 SCPI 查询 /// public string SendCustomQuery(string command) { return _device.Query(command); } #endregion } /// /// PSW250 工作模式(已废弃,保留兼容) /// [Obsolete("CV/CC 是运行结果,请使用 PSWOutputMode 设置控制优先级")] public enum PSWMode { ConstantVoltage, // 恒压模式 ConstantCurrent // 恒流模式 } /// /// PSW250 输出控制优先级模式 /// 注意:这是控制优先级和动态响应策略,不是 CV/CC 运行状态 /// public enum PSWOutputMode { /// 恒压优先(高速响应) CVHS, /// 恒流优先(高速响应) CCHS, /// 恒压优先(斜率/平滑变化) CVLS, /// 恒流优先(斜率/平滑变化) CCLS } }