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
}
}