using Common; using Common.Attributes; using DeviceCommand.Base; using Model.Models; using System; using System.Globalization; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace DeviceCommand.Device { /// /// 功率分析仪(型号:HIOKI PW8001) 一拖三,支持多通道电压/电流/功率及谐波测量 /// [ACPCommand] public class PW8001 : Tcp { /// /// 构造函数:SCPI 通信使用端口 23 /// public PW8001(TcpConfig config) : base(config) { } /// /// 执行引擎注入的设备实例会话键 /// public string? SessionKey { get; set; } /// /// 从设备返回的 SCPI 响应字符串中提取数值部分并转换为 double。 /// 支持科学计数法(如 2.48E-03),结果保留两位小数。 /// /// 设备返回的原始字符串 /// 提取到的数值(保留两位小数),解析失败时返回 0 private static double ExtractDouble(string raw) { if (string.IsNullOrWhiteSpace(raw)) return 0; // 从响应中提取第一个数值(含正负号、小数点、科学计数法),可自动忽略单位后缀与命令头 var match = Regex.Match(raw, @"[+-]?(?:\d+\.?\d*|\.\d+)(?:[Ee][+-]?\d+)?"); return match.Success && double.TryParse(match.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double val) ? Math.Round(val, 2) : 0; } #region 1. IEEE 488.2 基础标准命令 /// /// 查询仪器识别信息 (*IDN? 指令) /// /// 取消令牌 /// 设备标识字符串 (制造商, 型号, 序列号, 固件版本) public virtual async Task 查询机器信息(CancellationToken ct = default) { return await WriteReadAsync("*IDN?\r\n", "\n", ct); } /// /// 查询仪器已安装的硬件选件 (*OPT? 指令) /// /// 取消令牌 /// 硬件选件列表字符串 public virtual async Task 查询硬件选项(CancellationToken ct = default) { return await WriteReadAsync("*OPT?\r\n", "\n", ct); } /// /// 复位仪器到默认状态 (*RST 指令) /// /// 取消令牌 public virtual async Task 复位仪器(CancellationToken ct = default) { await SendAsync("*RST\r\n", ct); } /// /// 清除状态寄存器和错误队列 (*CLS 指令) /// /// 取消令牌 public virtual async Task 清除状态(CancellationToken ct = default) { await SendAsync("*CLS\r\n", ct); } #endregion #region 2. 仪器系统与测试模式设置设置 (System & Mode) /// /// 设置测试模式为 WIDE 宽带测量模式 (:MODE WIDE 指令) /// /// 取消令牌 public virtual async Task 设置测试模式_WIDE(CancellationToken ct = default) { await SendAsync(":MODE WIDE\r\n", ct); } /// /// 设置测试模式为 IEC 标准测量模式 (:MODE IEC 指令) /// /// 取消令牌 public virtual async Task 设置测试模式_IEC(CancellationToken ct = default) { await SendAsync(":MODE IEC\r\n", ct); } /// /// 查询当前测试模式 (:MODE? 指令) /// /// 取消令牌 /// 测试模式字符串 (WIDE / IEC) public virtual async Task 查询测试模式(CancellationToken ct = default) { return await WriteReadAsync(":MODE?\r\n", "\n", ct); } /// /// 设置同步源 (:SYNC:SOURce 指令) /// /// 同步源标识 /// 取消令牌 public virtual async Task 设置同步源(string 源, CancellationToken ct = default) { await SendAsync($":SYNC:SOURce {源}\r\n", ct); } /// /// 查询当前同步源 (:SYNC:SOURce? 指令) /// /// 取消令牌 /// 同步源标识字符串 public virtual async Task 查询同步源(CancellationToken ct = default) { return await WriteReadAsync(":SYNC:SOURce?\r\n", "\n", ct); } /// /// 设置零点调整状态 (:ZERO 指令) /// /// 零点调整状态 (ON / OFF) /// 取消令牌 public virtual async Task 设置零点调整(string 状态, CancellationToken ct = default) { await SendAsync($":ZERO {状态}\r\n", ct); } /// /// 查询零点调整状态 (:ZERO? 指令) /// /// 取消令牌 /// 零点调整状态字符串 (ON / OFF) public virtual async Task 查询零点调整(CancellationToken ct = default) { return await WriteReadAsync(":ZERO?\r\n", "\n", ct); } /// /// 设置零点抑制状态 (:ZSP 指令) /// /// 零点抑制状态 (ON / OFF) /// 取消令牌 public virtual async Task 设置零点抑制(string 状态, CancellationToken ct = default) { await SendAsync($":ZSP {状态}\r\n", ct); } /// /// 查询零点抑制状态 (:ZSP? 指令) /// /// 取消令牌 /// 零点抑制状态字符串 (ON / OFF) public virtual async Task 查询零点抑制(CancellationToken ct = default) { return await WriteReadAsync(":ZSP?\r\n", "\n", ct); } /// /// 设置响应消息头开关 (:HEADer 指令) /// /// 消息头开关状态 (ON / OFF) /// 取消令牌 public virtual async Task 设置响应消息头(string 状态, CancellationToken ct = default) { await SendAsync($":HEADer {状态}\r\n", ct); } /// /// 查询响应消息头开关状态 (:HEADer? 指令) /// /// 取消令牌 /// 消息头开关状态字符串 (ON / OFF) public virtual async Task 查询响应消息头(CancellationToken ct = default) { return await WriteReadAsync(":HEADer?\r\n", "\n", ct); } /// /// 设置按键锁定状态 (:KLOCk 指令) /// /// 按键锁定状态 (ON / OFF) /// 取消令牌 public virtual async Task 设置按键锁定(string 状态, CancellationToken ct = default) { await SendAsync($":KLOCk {状态}\r\n", ct); } /// /// 查询按键锁定状态 (:KLOCk? 指令) /// /// 取消令牌 /// 按键锁定状态字符串 (ON / OFF) public virtual async Task 查询按键锁定(CancellationToken ct = default) { return await WriteReadAsync(":KLOCk?\r\n", "\n", ct); } #endregion #region 3. 积分控制 (Integration) /// /// 设置积分控制模式 (:INTEG:CONTROL 指令) /// /// 积分控制模式 /// 取消令牌 public virtual async Task 设置积分控制(string 模式, CancellationToken ct = default) { await SendAsync($":INTEG:CONTROL {模式}\r\n", ct); } /// /// 查询积分控制模式 (:INTEG:CONTROL? 指令) /// /// 取消令牌 /// 积分控制模式字符串 public virtual async Task 查询积分控制(CancellationToken ct = default) { return await WriteReadAsync(":INTEG:CONTROL?\r\n", "\n", ct); } /// /// 设置指定通道的积分模式 (:INTEG:MODE 指令) /// /// 通道编号 /// 积分模式 /// 取消令牌 public virtual async Task 设置积分模式(string 通道号, string 模式, CancellationToken ct = default) { await SendAsync($":INTEG:MODE{通道号} {模式}\r\n", ct); } /// /// 查询指定通道的积分模式 (:INTEG:MODE? 指令) /// /// 通道编号 /// 取消令牌 /// 积分模式字符串 public virtual async Task 查询积分模式(string 通道号, CancellationToken ct = default) { return await WriteReadAsync($":INTEG:MODE{通道号}?\r\n", "\n", ct); } #endregion #region 4. 测量值查询 (Measurement Query) // ---------------- 基础测量(不含变比) ---------------- /// /// 查询指定通道的电压测量值(不含变比) (:MEAS:U? 指令) /// /// 通道编号 /// 取消令牌 /// 电压测量值 (单位: V,保留两位小数) public virtual async Task 查询电压_不含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:U{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电流测量值(不含变比) (:MEAS:I? 指令) /// /// 通道编号 /// 取消令牌 /// 电流测量值 (单位: A,保留两位小数) public virtual async Task 查询电流_不含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:I{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的功率测量值(不含变比) (:MEAS:P? 指令) /// /// 通道编号 /// 取消令牌 /// 功率测量值 (单位: W,保留两位小数) public virtual async Task 查询功率_不含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:P{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } // ---------------- 基础测量(含变比 CT) ---------------- /// /// 查询指定通道的电压测量值(含变比) (:MEAS:U:CT? 指令) /// /// 通道编号 /// 取消令牌 /// 电压测量值 (单位: V,保留两位小数) public virtual async Task 查询电压_含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:U{通道号}:CT?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电流测量值(含变比) (:MEAS:I:CT? 指令) /// /// 通道编号 /// 取消令牌 /// 电流测量值 (单位: A,保留两位小数) public virtual async Task 查询电流_含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:I{通道号}:CT?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的功率测量值(含变比) (:MEAS:P:CT? 指令) /// /// 通道编号 /// 取消令牌 /// 功率测量值 (单位: W,保留两位小数) public virtual async Task 查询功率_含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:P{通道号}:CT?\r\n", "\n", ct); return ExtractDouble(resp); } // ---------------- 其他高阶参数测量 ---------------- /// /// 查询指定通道的有功功率积分值 (:MEAS:WP? 指令) /// /// 通道编号 /// 取消令牌 /// 有功功率积分值 (单位: Wh,保留两位小数) public virtual async Task 查询有功功率积分(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:WP{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电压总谐波失真 (THD) (:MEAS:UTHD? 指令) /// /// 通道编号 /// 取消令牌 /// 电压 THD 值 (单位: %,保留两位小数) public virtual async Task 查询电压THD(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:UTHD{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电流总谐波失真 (THD) (:MEAS:ITHD? 指令) /// /// 通道编号 /// 取消令牌 /// 电流 THD 值 (单位: %,保留两位小数) public virtual async Task 查询电流THD(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:ITHD{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询线电压 U12 (:MEAS:U12? 指令) /// /// 取消令牌 /// 线电压 U12 值 (单位: V,保留两位小数) public virtual async Task 查询线电压U12(CancellationToken ct = default) { string resp = await WriteReadAsync(":MEAS:U12?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询三相总功率 P123 (:MEAS:P123? 指令) /// /// 取消令牌 /// 三相总功率值 (单位: W,保留两位小数) public virtual async Task 查询总功率P123(CancellationToken ct = default) { string resp = await WriteReadAsync(":MEAS:P123?\r\n", "\n", ct); return ExtractDouble(resp); } // ---------------- 整流平均值 ---------------- /// /// 查询指定通道的电压整流平均值(不含变比) (:MEAS:UMN? 指令) /// /// 通道编号 /// 取消令牌 /// 电压整流平均值 (单位: V,保留两位小数) public virtual async Task 查询电压整流平均值(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:UMN{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电流整流平均值(不含变比) (:MEAS:IMN? 指令) /// /// 通道编号 /// 取消令牌 /// 电流整流平均值 (单位: A,保留两位小数) public virtual async Task 查询电流整流平均值(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:IMN{通道号}?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电压整流平均值(含变比) (:MEAS:UMN:CT? 指令) /// /// 通道编号 /// 取消令牌 /// 电压整流平均值 (单位: V,保留两位小数) public virtual async Task 查询电压整流平均值_含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:UMN{通道号}:CT?\r\n", "\n", ct); return ExtractDouble(resp); } /// /// 查询指定通道的电流整流平均值(含变比) (:MEAS:IMN:CT? 指令) /// /// 通道编号 /// 取消令牌 /// 电流整流平均值 (单位: A,保留两位小数) public virtual async Task 查询电流整流平均值_含变比(int 通道号, CancellationToken ct = default) { string resp = await WriteReadAsync($":MEAS:IMN{通道号}:CT?\r\n", "\n", ct); return ExtractDouble(resp); } #endregion #region 5. 自定义透传指令 /// /// 发送自定义命令(透传任意 SCPI 指令) /// /// 自定义命令字符串 /// 取消令牌 public virtual async Task 发送自定义命令(string 命令, CancellationToken ct = default) { await SendAsync($"{命令}\r\n", ct); } #endregion } }