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