From 30f5f6f8d64d58b9d778df53e7688a54ab95dd81 Mon Sep 17 00:00:00 2001 From: hsc Date: Wed, 12 Aug 2026 10:33:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E7=A8=8B=E5=BA=8F=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ADP/App.xaml.cs | 4 +- Command/Command.csproj | 1 + Common/Common.csproj | 1 + DeviceCommand/DeviceCommand.csproj | 1 + DeviceCommand/Devices/GantryControlTcp.cs | 32 ++ DeviceCommand/Devices/IT7800E.cs | 177 +++++++ DeviceCommand/Devices/N36200.cs | 77 ++- DeviceCommand/Devices/N36600.cs | 71 ++- DeviceCommand/Devices/N69200.cs | 449 ++++++++++++++++++ DeviceCommand/Devices/SDS2000X_HD.cs | 55 ++- DeviceCommand/Devices/SPAW7000.cs | 33 +- .../ViewModels/CommandTreeViewModel.cs | 128 ++++- TestingModule/Views/CommandTree.xaml | 3 +- TestingModule/Views/SingleStepEdit.xaml | 4 +- UIShare/UIViewModel/InstructionNodeVM.cs | 7 + ZLGUSBCANFD/USBCANFD.cs | 3 + 16 files changed, 1020 insertions(+), 26 deletions(-) diff --git a/ADP/App.xaml.cs b/ADP/App.xaml.cs index 080d5e0..bc61c49 100644 --- a/ADP/App.xaml.cs +++ b/ADP/App.xaml.cs @@ -84,8 +84,8 @@ namespace ADP return; } - string strUserSn = "ACA89B2C1194650D4E93D97BE189FFCC"; - string strApiKey = "C6D01BCD442347822876F8232245DE9422643C167B8C61CE4DF6049990E7395588675A8FC6AA4BF7AD353D669C993236BEA83F77551753885A47AF34185CC3A7"; + string strUserSn = "ACC77E6F627236F3D02FA8EA1BE35794"; + string strApiKey = "9185203127F9DE4FB4BC2F073F6CC583D9BED1B6713EF00A0C06625EDD0FAE862164280F5B2AADC090C4878E96DDFE05DDE3952F9B6F1FA483A340FB34A5D83B"; Byte[] buffer = new Byte[256]; buffer = System.Text.Encoding.Default.GetBytes(strUserSn); diff --git a/Command/Command.csproj b/Command/Command.csproj index 0eabc2b..5b176ff 100644 --- a/Command/Command.csproj +++ b/Command/Command.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + true diff --git a/Common/Common.csproj b/Common/Common.csproj index 366108e..94a29c3 100644 --- a/Common/Common.csproj +++ b/Common/Common.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + true diff --git a/DeviceCommand/DeviceCommand.csproj b/DeviceCommand/DeviceCommand.csproj index ca7efa5..998d41b 100644 --- a/DeviceCommand/DeviceCommand.csproj +++ b/DeviceCommand/DeviceCommand.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + true diff --git a/DeviceCommand/Devices/GantryControlTcp.cs b/DeviceCommand/Devices/GantryControlTcp.cs index 9040925..b339ed9 100644 --- a/DeviceCommand/Devices/GantryControlTcp.cs +++ b/DeviceCommand/Devices/GantryControlTcp.cs @@ -85,6 +85,8 @@ namespace DeviceCommand.Devices /// 轴使能控制 /// /// 轴编号 (1 - 6) + /// true: 使能轴, false: 禁用轴 + /// 取消令牌 public async Task SetAxisEnableAsync(int axis, bool enable, CancellationToken ct = default) { ushort address = axis switch @@ -105,6 +107,8 @@ namespace DeviceCommand.Devices /// 读取指定轴的使能状态 /// /// 1: X轴, 2: Y轴, 3: Z轴 + /// 取消令牌 + /// true: 已使能, false: 未使能 public async Task GetAxisEnableAsync(int axis, CancellationToken ct = default) { ushort address = axis switch @@ -125,6 +129,7 @@ namespace DeviceCommand.Devices /// X轴原点位置 (范围: 0 ~ 50000) /// Y轴原点位置 (范围: 0 ~ 50000) /// Z轴原点位置 (范围: 0 ~ 20000) + /// 取消令牌 public async Task SetHomePositionAsync(int xPos, int yPos, int zPos, CancellationToken ct = default) { if (xPos < 0 || xPos > 50000) @@ -144,6 +149,7 @@ namespace DeviceCommand.Devices /// /// 批量查询当前 X、Y、Z 三轴设定的原点位置值 /// + /// 取消令牌 /// 返回包含三轴原点位置的元组 (X, Y, Z) public async Task<(int X, int Y, int Z)> GetHomePositionAsync(CancellationToken ct = default) { @@ -163,6 +169,8 @@ namespace DeviceCommand.Devices /// /// 设置回原点定位速度(带 0 - 100000 范围检查) /// + /// 回原点定位速度 (范围: 0 - 100000) + /// 取消令牌 public async Task SetHomePositionSpeedAsync(int speed, CancellationToken ct = default) { if (speed < 0 || speed > 100000) @@ -174,6 +182,8 @@ namespace DeviceCommand.Devices /// /// 查询当前设定的回原点定位速度 /// + /// 取消令牌 + /// 当前回原点定位速度值 public async Task GetHomePositionSpeedAsync(CancellationToken ct = default) { ushort[] registers = await ReadHoldingRegistersAsync(_slaveAddress, ADDR_HD_HOME_POS_SPEED, 2, ct); @@ -188,6 +198,8 @@ namespace DeviceCommand.Devices /// 设置指定轴的运行速度(带 0 - 100000 范围检查) /// /// 1: X轴, 2: Y轴, 3: Z轴 + /// 运行速度 (范围: 0 - 100000) + /// 取消令牌 public async Task SetAxisSpeedAsync(int axis, int speed, CancellationToken ct = default) { if (speed < 0 || speed > 100000) @@ -207,6 +219,9 @@ namespace DeviceCommand.Devices /// /// 读取指定轴当前设定的运行速度 /// + /// 1: X轴, 2: Y轴, 3: Z轴 + /// 取消令牌 + /// 当前设定的运行速度值 public async Task GetAxisSpeedAsync(int axis, CancellationToken ct = default) { ushort address = axis switch @@ -227,6 +242,9 @@ namespace DeviceCommand.Devices /// /// 写入指定轴的目标位置(动态安全校验:目标位置不能超过 [轴最大物理极限 - 当前轴原点设置值]) /// + /// 1: X轴, 2: Y轴, 3: Z轴 + /// 目标位置 + /// 取消令牌 public async Task SetAxisTargetPositionAsync(int axis, int targetPos, CancellationToken ct = default) { var (xHome, yHome, zHome) = await GetHomePositionAsync(ct); @@ -272,6 +290,9 @@ namespace DeviceCommand.Devices /// /// 读取指定轴当前设定的目标指定位置 /// + /// 1: X轴, 2: Y轴, 3: Z轴 + /// 取消令牌 + /// 当前设定的目标位置值 public async Task GetAxisTargetPositionAsync(int axis, CancellationToken ct = default) { ushort address = axis switch @@ -293,6 +314,8 @@ namespace DeviceCommand.Devices /// /// 设置系统紧停锁定状态 (true: 锁定激活, false: 解除锁定) /// + /// true: 锁定激活, false: 解除锁定 + /// 取消令牌 public async Task SetEStopStateAsync(bool state, CancellationToken ct = default) { await WriteSingleCoilAsync(_slaveAddress, ADDR_M_ESTOP, state, ct); @@ -301,6 +324,9 @@ namespace DeviceCommand.Devices /// /// 设置指定轴的停止控制状态 (true: 持续输出停止信号, false: 释放停止信号) /// + /// 1: X轴, 2: Y轴, 3: Z轴 + /// true: 持续输出停止信号, false: 释放停止信号 + /// 取消令牌 public async Task SetStopStateAsync(int axis, bool state, CancellationToken ct = default) { ushort address = axis switch @@ -317,6 +343,7 @@ namespace DeviceCommand.Devices /// /// 全局回零(安全校验版:先检查回原点速度是否为 0,为0则拒绝触发) /// + /// 取消令牌 public async Task HomeAsync(CancellationToken ct = default) { int currentSpeed = await GetHomePositionSpeedAsync(ct); @@ -331,6 +358,7 @@ namespace DeviceCommand.Devices /// 单轴指定位置启动(含速度判定、使能自动补齐、动作目标位置独立范围校验) /// /// 1: X轴, 2: Y轴, 3: Z轴 + /// 取消令牌 public async Task StartSingleAxisAsync(int axis, CancellationToken ct = default) { ushort startAddress; @@ -388,6 +416,7 @@ namespace DeviceCommand.Devices /// /// 三轴同时启动(全开:严格校验全部运行轴速度、批量检测与补正1~6号轴使能、联动校验三轴目标范围极限) /// + /// 取消令牌 public async Task StartAllAxesAsync(CancellationToken ct = default) { // 1. 一次性读取三轴速度,严禁任何一轴速度为 0 @@ -493,6 +522,8 @@ namespace DeviceCommand.Devices /// 读取指定轴的绝对位置(相对原点的实时位置,只读) /// /// 轴编号 (1-6) + /// 取消令牌 + /// 指定轴的绝对位置值 public async Task GetAbsolutePositionAsync(int axis, CancellationToken ct = default) { ushort address = axis switch @@ -516,6 +547,7 @@ namespace DeviceCommand.Devices /// /// 批量读取 1-6 轴的绝对位置(一次性读取 22 个寄存器,高效) /// + /// 取消令牌 /// 返回 6 轴绝对位置元组 public async Task<(int Axis1, int Axis2, int Axis3, int Axis4, int Axis5, int Axis6)> GetAllAbsolutePositionsAsync(CancellationToken ct = default) { diff --git a/DeviceCommand/Devices/IT7800E.cs b/DeviceCommand/Devices/IT7800E.cs index a0d8d01..666c2d7 100644 --- a/DeviceCommand/Devices/IT7800E.cs +++ b/DeviceCommand/Devices/IT7800E.cs @@ -38,6 +38,21 @@ namespace DeviceCommand.Devices CURRent } + /// + /// 设备相位/输出模式[cite: 2] + /// + public enum DevicePhaseMode + { + /// 单相模式 + ONE, + /// 三相模式 + THRee, + /// 反相模式 + DIFFerence, + /// 多通道模式 + MULTichannel + } + #endregion [ADPCommand] @@ -52,21 +67,39 @@ namespace DeviceCommand.Devices #region 1. IEEE 488.2 公共命令 + /// + /// 清除错误队列和状态字节 + /// + /// 取消令牌 public virtual async Task 清除错误队列和状态字节(CancellationToken ct = default) { await SendAsync($"*CLS{ScpiDelimiter}", ct); //[cite: 1] } + /// + /// 查询设备标识 + /// + /// 取消令牌 + /// 设备标识字符串(制造商, 产品型号, 序列号, 固件版本) public virtual async Task 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 重置设备 + /// + /// 取消令牌 public virtual async Task 重置设备(CancellationToken ct = default) { await SendAsync($"*RST{ScpiDelimiter}", ct); //[cite: 1] } + /// + /// 读取状态字节 + /// + /// 取消令牌 + /// 状态字节寄存器值 public virtual async Task 读取状态字节(CancellationToken ct = default) { return await WriteReadAsync($"*STB?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -79,6 +112,8 @@ namespace DeviceCommand.Devices /// /// 设置电源输出源的电气模式/工作耦合模式 (AC, DC, ACDC, DCAC)[cite: 1] /// + /// 电气耦合模式 (AC/DC/ACDC/DCAC) + /// 取消令牌 public virtual async Task 设置电源模式(PowerCouplingMode 模式, CancellationToken ct = default) { await SendAsync($":SOURce:FUNCtion {模式}{ScpiDelimiter}", ct); //[cite: 1] @@ -87,17 +122,29 @@ namespace DeviceCommand.Devices /// /// 查询电源当前的工作电气模式[cite: 1] /// + /// 取消令牌 + /// 当前工作电气模式字符串 public virtual async Task 查询电源模式(CancellationToken ct = default) { return await WriteReadAsync($":SOURce:FUNCtion?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 设置DC输出开关 + /// + /// true: 开启输出, false: 关闭输出 + /// 取消令牌 public virtual async Task 设置DC输出(bool 开启, CancellationToken ct = default) { string 参数 = 开启 ? "ON" : "OFF"; //[cite: 1] await SendAsync($":OUTPut {参数}{ScpiDelimiter}", ct); //[cite: 1] } + /// + /// 查询DC输出状态 + /// + /// 取消令牌 + /// 输出状态字符串(ON 或 OFF) public virtual async Task 查询DC输出状态(CancellationToken ct = default) { return await WriteReadAsync($":OUTPut?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -107,24 +154,44 @@ namespace DeviceCommand.Devices #region 3. 设定输出参数设置 (AC 电压/频率/DC 电压) + /// + /// 设置交流电压 + /// + /// 交流电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置交流电压(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:VOLTage {0:F2}{1}", 电压, ScpiDelimiter); //[cite: 1] await SendAsync(cmd, ct); } + /// + /// 设置直流电压 + /// + /// 直流电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置直流电压(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:VOLTage:DC {0:F2}{1}", 电压, ScpiDelimiter); //[cite: 1] await SendAsync(cmd, ct); } + /// + /// 设置频率 + /// + /// 频率设定值 (单位: Hz) + /// 取消令牌 public virtual async Task 设置频率(double 频率, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:FREQuency {0:F2}{1}", 频率, ScpiDelimiter); //[cite: 1] await SendAsync(cmd, ct); } + /// + /// 设置电流 + /// + /// 电流设定值 (单位: A) + /// 取消令牌 public virtual async Task 设置电流(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:CURRent {0:F3}{1}", 电流, ScpiDelimiter); //[cite: 1] @@ -135,34 +202,64 @@ namespace DeviceCommand.Devices #region 4. 测量与数据回测(高频数据轮询核心) + /// + /// 查询实际电压 + /// + /// 取消令牌 + /// 实际电压测量值 (单位: V) [Monitorable("交流电源电压")] public virtual async Task 查询实际电压(CancellationToken ct = default) { return await WriteReadAsync($":MEASure:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 查询实际电流 + /// + /// 取消令牌 + /// 实际电流测量值 (单位: A) [Monitorable("交流电源电流")] public virtual async Task 查询实际电流(CancellationToken ct = default) { return await WriteReadAsync($":MEASure:CURRent?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 查询实际功率 + /// + /// 取消令牌 + /// 实际有功功率测量值 (单位: W) [Monitorable("交流电源功率")] public virtual async Task 查询实际功率(CancellationToken ct = default) { return await WriteReadAsync($":MEASure:POWer?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 查询视在功率 + /// + /// 取消令牌 + /// 视在功率测量值 (单位: VA) public virtual async Task 查询视在功率(CancellationToken ct = default) { return await WriteReadAsync($":MEASure:POWer:APParent?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 查询实际频率 + /// + /// 取消令牌 + /// 实际频率测量值 (单位: Hz) public virtual async Task 查询实际频率(CancellationToken ct = default) { return await WriteReadAsync($":MEASure:FREQuency?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 查询功率因数 + /// + /// 取消令牌 + /// 功率因数测量值 public virtual async Task 查询功率因数(CancellationToken ct = default) { return await WriteReadAsync($":MEASure:POWer:PFACtor?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -172,33 +269,60 @@ namespace DeviceCommand.Devices #region 5. 保护参数设置与系统监控 + /// + /// 设置过流保护_OCP + /// + /// 过流保护阈值 (单位: A, RMS值) + /// 取消令牌 public virtual async Task 设置过流保护_OCP(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:CURRent:PROTection:RMS {0:F3}{1}", 电流, ScpiDelimiter); //[cite: 1] await SendAsync(cmd, ct); } + /// + /// 设置过压保护_OVP + /// + /// 过压保护阈值 (单位: V, 峰值) + /// 取消令牌 public virtual async Task 设置过压保护_OVP(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:VOLTage:PROTection:PEAK {0:F2}{1}", 电压, ScpiDelimiter); //[cite: 1] await SendAsync(cmd, ct); } + /// + /// 查询错误信息 + /// + /// 取消令牌 + /// 错误代码和描述信息 public virtual async Task 查询错误信息(CancellationToken ct = default) { return await WriteReadAsync($":SYSTem:ERRor?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] } + /// + /// 切换远程控制模式 + /// + /// 取消令牌 public virtual async Task 切换远程控制模式(CancellationToken ct = default) { await SendAsync($":SYSTem:REMote{ScpiDelimiter}", ct); //[cite: 1] } + /// + /// 切换本地控制模式 + /// + /// 取消令牌 public virtual async Task 切换本地控制模式(CancellationToken ct = default) { await SendAsync($":SYSTem:LOCal{ScpiDelimiter}", ct); //[cite: 1] } + /// + /// 清除保护告警 + /// + /// 取消令牌 public virtual async Task 清除保护告警(CancellationToken ct = default) { await SendAsync($":OUTPut:PROTection:CLEar{ScpiDelimiter}", ct); //[cite: 1] @@ -211,6 +335,7 @@ namespace DeviceCommand.Devices /// /// 清除最近的安时(Ah)与瓦时(Wh)统计数据[cite: 1] /// + /// 取消令牌 public virtual async Task 清除充放电电量统计(CancellationToken ct = default) { await SendAsync($"SENSe:AHOur:RESet{ScpiDelimiter}", ct); //[cite: 1] @@ -220,6 +345,8 @@ namespace DeviceCommand.Devices /// /// 读取当前充放电累计的安时值 (单位: Ah)[cite: 1] /// + /// 取消令牌 + /// 累计安时值 (单位: Ah) public virtual async Task 查询累计安时_Ah(CancellationToken ct = default) { return await WriteReadAsync($"FETCh:AHOur?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -228,6 +355,8 @@ namespace DeviceCommand.Devices /// /// 读取当前充放电累计的瓦时值 (单位: Wh)[cite: 1] /// + /// 取消令牌 + /// 累计瓦时值 (单位: Wh) public virtual async Task 查询累计瓦时_Wh(CancellationToken ct = default) { return await WriteReadAsync($"FETCh:WHOur?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -236,6 +365,8 @@ namespace DeviceCommand.Devices /// /// 读取充放电积分持续时间 (单位: 秒)[cite: 1] /// + /// 取消令牌 + /// 积分持续时间 (单位: 秒) public virtual async Task 查询积分时间(CancellationToken ct = default) { return await WriteReadAsync($"FETCh:ENERgy:TIME?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -244,6 +375,8 @@ namespace DeviceCommand.Devices /// /// 切换设备的操作模式 (VOLTage: 电源模式, LOAD: 负载模式/放电, CURRent: 电流源)[cite: 1] /// + /// 操作模式 (VOLTage/LOAD/CURRent) + /// 取消令牌 public virtual async Task 设置操作模式(DeviceOperationMode 模式, CancellationToken ct = default) { await SendAsync($"SYSTem:OPERation:MODE {模式}{ScpiDelimiter}", ct); //[cite: 1] @@ -252,6 +385,8 @@ namespace DeviceCommand.Devices /// /// 设置放电截止电压/电压下限 (单位: V,用于防止电池过放)[cite: 1] /// + /// 放电截止电压/电压下限 (单位: V) + /// 取消令牌 public virtual async Task 设置电压下限(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, ":SOURce:VOLTage:LIMit:LOW {0:F2}{1}", 电压, ScpiDelimiter); //[cite: 1] @@ -259,5 +394,47 @@ namespace DeviceCommand.Devices } #endregion + + #region 7. 相位输出模式设置 (单相/三相/反相)[cite: 2] + + /// + /// 设置电源相位输出模式 (ONE:单相 / THRee:三相 / DIFFerence:反相 / MULTichannel:多通道)[cite: 2] + /// + /// 相位输出模式 + /// 取消令牌 + public virtual async Task 设置输出模式(DevicePhaseMode 模式, CancellationToken ct = default) + { + await SendAsync($"SYSTem:FUNCtion {模式}{ScpiDelimiter}", ct); //[cite: 2] + } + + /// + /// 切换为单相模式 (SYST:FUNC ONE)[cite: 2] + /// + /// 取消令牌 + public virtual async Task 切换为单相模式(CancellationToken ct = default) + { + await SendAsync($"SYSTem:FUNCtion ONE{ScpiDelimiter}", ct); //[cite: 2] + } + + /// + /// 切换为反相模式 (SYST:FUNC DIFFerence)[cite: 2] + /// + /// 取消令牌 + public virtual async Task 切换为反相模式(CancellationToken ct = default) + { + await SendAsync($"SYSTem:FUNCtion DIFFerence{ScpiDelimiter}", ct); //[cite: 2] + } + + /// + /// 查询当前输出模式 (单相/三相/反相/多通道)[cite: 2] + /// + /// 取消令牌 + /// 返回 ONE, THRee, DIFFerence 或 MULTichannel[cite: 2] + public virtual async Task 查询输出模式(CancellationToken ct = default) + { + return await WriteReadAsync($"SYSTem:FUNCtion?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 2] + } + + #endregion } } \ No newline at end of file diff --git a/DeviceCommand/Devices/N36200.cs b/DeviceCommand/Devices/N36200.cs index 4144529..2ffe085 100644 --- a/DeviceCommand/Devices/N36200.cs +++ b/DeviceCommand/Devices/N36200.cs @@ -27,6 +27,7 @@ namespace DeviceCommand.Devices /// /// 3.1.1. 清除标准事件状态寄存器和错误队列 /// + /// 取消令牌 public virtual async Task 清除错误队列和状态字节(CancellationToken ct = default) { await SendAsync($"*CLS{ScpiDelimiter}", ct); @@ -35,6 +36,8 @@ namespace DeviceCommand.Devices /// /// 3.1.4. 读取直流电源相关信息(制造商、产品型号、系统 SN、软件版本号) /// + /// 取消令牌 + /// 设备标识字符串(制造商, 产品型号, 序列号, 固件版本) public virtual async Task 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -43,6 +46,7 @@ namespace DeviceCommand.Devices /// /// 3.1.7. 恢复出厂设置 (注意:设备重置保存数据大约需要 10 秒) /// + /// 取消令牌 public virtual async Task 重置设备(CancellationToken ct = default) { await SendAsync($"*RST{ScpiDelimiter}", ct); @@ -51,6 +55,8 @@ namespace DeviceCommand.Devices /// /// 3.1.8. 读取状态字节寄存器(只读寄存器,读取时不会清除位) /// + /// 取消令牌 + /// 状态字节寄存器值 public virtual async Task 读取状态字节(CancellationToken ct = default) { return await WriteReadAsync($"*STB?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -63,6 +69,8 @@ namespace DeviceCommand.Devices /// /// 3.2.1. 设定输出电压值 (单位: V) /// + /// 输出电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置电压(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:VOLTage {0:F3}{1}", 电压, ScpiDelimiter); @@ -72,6 +80,8 @@ namespace DeviceCommand.Devices /// /// 3.2.1. 查询输出电压设定值 (单位: V) /// + /// 取消令牌 + /// 输出电压设定值 (单位: V) public virtual async Task 查询电压设定(CancellationToken ct = default) { return await WriteReadAsync($"SOURce:VOLTage?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -80,6 +90,8 @@ namespace DeviceCommand.Devices /// /// 3.2.2. 设置输出限流值 (单位: A) /// + /// 输出限流设定值 (单位: A) + /// 取消令牌 public virtual async Task 设置电流(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:CURRent {0:F3}{1}", 电流, ScpiDelimiter); @@ -89,6 +101,8 @@ namespace DeviceCommand.Devices /// /// 3.2.2. 查询输出限流值设定值 (单位: A) /// + /// 取消令牌 + /// 输出限流设定值 (单位: A) public virtual async Task 查询电流设定(CancellationToken ct = default) { return await WriteReadAsync($"SOURce:CURRent?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -97,6 +111,8 @@ namespace DeviceCommand.Devices /// /// 3.2.3. 设置输出模拟内阻值 (单位: mΩ) /// + /// 模拟内阻设定值 (单位: mΩ) + /// 取消令牌 public virtual async Task 设置内阻(double 内阻, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:INTErnalres {0:F1}{1}", 内阻, ScpiDelimiter); @@ -106,6 +122,8 @@ namespace DeviceCommand.Devices /// /// 3.2.4. 保存当前测试参数到指定存储组 (范围: 1-10) /// + /// 存储组编号 (范围: 1-10) + /// 取消令牌 public virtual async Task 保存测试参数(int 组别, CancellationToken ct = default) { if (组别 < 1 || 组别 > 10) throw new ArgumentOutOfRangeException(nameof(组别), "组别有效范围为 1~10"); @@ -115,6 +133,8 @@ namespace DeviceCommand.Devices /// /// 3.2.5. 调用指定存储组的测试参数 (范围: 1-10) /// + /// 存储组编号 (范围: 1-10) + /// 取消令牌 public virtual async Task 调用测试参数(int 组别, CancellationToken ct = default) { if (组别 < 1 || 组别 > 10) throw new ArgumentOutOfRangeException(nameof(组别), "组别有效范围为 1~10"); @@ -128,6 +148,8 @@ namespace DeviceCommand.Devices /// /// 3.3.1. 控制电源输出开关 (True: 开启, False: 关闭) /// + /// true: 开启输出, false: 关闭输出 + /// 取消令牌 public virtual async Task 设置DC输出(bool 开启, CancellationToken ct = default) { string 参数 = 开启 ? "ON" : "OFF"; @@ -137,6 +159,8 @@ namespace DeviceCommand.Devices /// /// 3.3.1. 查询电源输出开关状态 (返回 "ON" 或 "OFF") /// + /// 取消令牌 + /// 输出开关状态字符串("ON" 或 "OFF") public virtual async Task 查询DC输出开关状态(CancellationToken ct = default) { return await WriteReadAsync($"OUTPut:ONOFF?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -146,6 +170,8 @@ namespace DeviceCommand.Devices /// 3.3.2. 设定电源工作模式 /// (NORMal: 普通模式, CHARge: 电池充电, SEQuence: 序列模式, CPOWer: 恒功率模式, CARWave: 汽车测试, APG: 外部编程) /// + /// 工作模式 (NORMal/CHARge/SEQuence/CPOWer/CARWave/APG) + /// 取消令牌 public virtual async Task 设置运行模式(string 模式, CancellationToken ct = default) { await SendAsync($"OUTPut:MODE {模式}{ScpiDelimiter}", ct); @@ -154,6 +180,8 @@ namespace DeviceCommand.Devices /// /// 3.3.2. 查询电源当前运行工作模式 /// + /// 取消令牌 + /// 当前运行工作模式字符串 public virtual async Task 查询运行模式(CancellationToken ct = default) { return await WriteReadAsync($"OUTPut:MODE?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -162,6 +190,8 @@ namespace DeviceCommand.Devices /// /// 3.3.11. 设置电源输出 CV/CC 优先权 (CV 或 CC) /// + /// 优先模式,只能为 "CV" 或 "CC" + /// 取消令牌 public virtual async Task 设置CVCC优先权(string 优先模式, CancellationToken ct = default) { if (优先模式 != "CV" && 优先模式 != "CC") throw new ArgumentException("优先模式只能为 'CV' 或 'CC'"); @@ -171,6 +201,8 @@ namespace DeviceCommand.Devices /// /// 3.3.12. 获取电源状态字(通过解析返回整数的二进制 Bit 位获取全状态环路及告警) /// + /// 取消令牌 + /// 电源状态字(整数字符串,通过二进制位标识各状态及告警) public virtual async Task 查询设备状态字(CancellationToken ct = default) { return await WriteReadAsync($"OUTPut:STATe?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -179,6 +211,8 @@ namespace DeviceCommand.Devices /// /// 3.3.13. 获取电源事件告警状态值 (返回整数通过位定义标识 UVP/OVP/OCP/OPP/OTP) /// + /// 取消令牌 + /// 事件告警状态值(整数字符串,通过位定义标识 UVP/OVP/OCP/OPP/OTP) public virtual async Task 查询事件告警状态(CancellationToken ct = default) { return await WriteReadAsync($"OUTPut:EVENT?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -187,6 +221,7 @@ namespace DeviceCommand.Devices /// /// 3.3.13. 清除当前的告警状态 /// + /// 取消令牌 public virtual async Task 清除告警(CancellationToken ct = default) { await SendAsync($"OUTPut:EVENT 0{ScpiDelimiter}", ct); @@ -195,6 +230,8 @@ namespace DeviceCommand.Devices /// /// 3.3.16. 打开/关闭设备定时关机功能 /// + /// true: 开启定时关机, false: 关闭定时关机 + /// 取消令牌 public virtual async Task 设置定时关机开关(bool 开启, CancellationToken ct = default) { string 参数 = 开启 ? "ON" : "OFF"; @@ -204,6 +241,8 @@ namespace DeviceCommand.Devices /// /// 3.3.17. 设定设备定时关机倒计时时间 (单位: s) /// + /// 定时关机倒计时时间 (单位: s) + /// 取消令牌 public virtual async Task 设置定时关机时间(double 秒数, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "OUTPut:TIMing:DWELI {0:F1}{1}", 秒数, ScpiDelimiter); @@ -213,6 +252,8 @@ namespace DeviceCommand.Devices /// /// 3.3.18. 控制泄放电路(Bleeder)开关状态 /// + /// true: 开启泄放电路, false: 关闭泄放电路 + /// 取消令牌 public virtual async Task 设置泄放电路开关(bool 开启, CancellationToken ct = default) { string 参数 = 开启 ? "ON" : "OFF"; @@ -226,6 +267,8 @@ namespace DeviceCommand.Devices /// /// 3.4.1. 回读通道输出端子上的实时测得电压值 (单位: V) /// + /// 取消令牌 + /// 实时测量电压值 (单位: V) [Monitorable("高压直流电源电压")] public virtual async Task 查询实际电压(CancellationToken ct = default) { @@ -235,6 +278,8 @@ namespace DeviceCommand.Devices /// /// 3.4.2. 回读通道输出端子上的实时测得电流值 (单位: A) /// + /// 取消令牌 + /// 实时测量电流值 (单位: A) [Monitorable("高压直流电源电流")] public virtual async Task 查询实际电流(CancellationToken ct = default) { @@ -244,6 +289,8 @@ namespace DeviceCommand.Devices /// /// 3.4.3. 回读通道输出端子上的实时测得功率值 (单位: W) /// + /// 取消令牌 + /// 实时测量功率值 (单位: W) [Monitorable("高压直流电源功率")] public virtual async Task 查询实际功率(CancellationToken ct = default) { @@ -253,6 +300,8 @@ namespace DeviceCommand.Devices /// /// 3.4.4. 回读电池充电模式下当前累计已充入的容量值 (单位: mAh) /// + /// 取消令牌 + /// 累计已充入容量值 (单位: mAh) public virtual async Task 查询已充电容量MAH(CancellationToken ct = default) { return await WriteReadAsync($"MEASure:MAH?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -261,6 +310,8 @@ namespace DeviceCommand.Devices /// /// 3.4.5. 获取当前电源的硬件额定电压上限值 (单位: V) /// + /// 取消令牌 + /// 硬件额定电压上限值 (单位: V) public virtual async Task 获取设备额定电压(CancellationToken ct = default) { return await WriteReadAsync($"MEASure:VOLTage:MAXimum?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -269,6 +320,8 @@ namespace DeviceCommand.Devices /// /// 3.4.6. 获取当前电源的硬件额定电流上限值 (单位: A) /// + /// 取消令牌 + /// 硬件额定电流上限值 (单位: A) public virtual async Task 获取设备额定电流(CancellationToken ct = default) { return await WriteReadAsync($"MEASure:CURRent:MAXimum?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -281,6 +334,8 @@ namespace DeviceCommand.Devices /// /// 3.5.1. 设置欠压保护门限值 (单位: V) /// + /// 欠压保护门限值 (单位: V) + /// 取消令牌 public virtual async Task 设置过欠压保护_UVP(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "PROTect:LESS:VOLTage {0:F3}{1}", 电压, ScpiDelimiter); @@ -290,6 +345,8 @@ namespace DeviceCommand.Devices /// /// 3.5.4. 设置过压保护门限值 (单位: V) /// + /// 过压保护门限值 (单位: V) + /// 取消令牌 public virtual async Task 设置过压保护_OVP(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "PROTect:OVER:VOLTage {0:F3}{1}", 电压, ScpiDelimiter); @@ -299,6 +356,8 @@ namespace DeviceCommand.Devices /// /// 3.5.6. 设置硬件硬件过流保护硬指标参数 (单位: A) /// + /// 过流保护硬指标参数 (单位: A) + /// 取消令牌 public virtual async Task 设置过流保护_OCP(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "PROTect:CURRent {0:F3}{1}", 电流, ScpiDelimiter); @@ -308,6 +367,8 @@ namespace DeviceCommand.Devices /// /// 3.5.8. 设置硬件过功率保护门限值 (单位: W) /// + /// 过功率保护门限值 (单位: W) + /// 取消令牌 public virtual async Task 设置过功率保护_OPP(double 功率, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "PROTect:POWer {0:F3}{1}", 功率, ScpiDelimiter); @@ -317,6 +378,8 @@ namespace DeviceCommand.Devices /// /// 3.5.12. 设置可调节的用户软输出电压下限值 (单位: V) /// + /// 输出电压下限值 (单位: V) + /// 取消令牌 public virtual async Task 设置电压下限(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:VOLTage:LEVel:LIMit:LOW {0:F3}{1}", 电压, ScpiDelimiter); @@ -326,6 +389,8 @@ namespace DeviceCommand.Devices /// /// 3.5.13. 设置可调节的用户软输出电压上限值 (单位: V) /// + /// 输出电压上限值 (单位: V) + /// 取消令牌 public virtual async Task 设置电压上限(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:VOLTage:LEVel:LIMit {0:F3}{1}", 电压, ScpiDelimiter); @@ -335,6 +400,8 @@ namespace DeviceCommand.Devices /// /// 3.5.14. 设置可调节的用户软输出电流下限值 (单位: A) /// + /// 输出电流下限值 (单位: A) + /// 取消令牌 public virtual async Task 设置电流下限(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:CURRent:LEVel:LIMit:LOW {0:F3}{1}", 电流, ScpiDelimiter); @@ -344,6 +411,8 @@ namespace DeviceCommand.Devices /// /// 3.5.15. 设置可调节的用户软输出电流上限值 (单位: A) /// + /// 输出电流上限值 (单位: A) + /// 取消令牌 public virtual async Task 设置电流上限(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "SOURce:CURRent:LEVel:LIMit {0:F3}{1}", 电流, ScpiDelimiter); @@ -357,6 +426,8 @@ namespace DeviceCommand.Devices /// /// 3.6.1. 设定恒功率工作模式下的限定电压值 (单位: V) /// + /// 恒功率模式限定电压值 (单位: V) + /// 取消令牌 public virtual async Task 设置恒功率模式电压(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "CPOWer:VOLTage {0:F3}{1}", 电压, ScpiDelimiter); @@ -366,6 +437,8 @@ namespace DeviceCommand.Devices /// /// 3.6.2. 设定恒功率工作模式下的限定电流值 (单位: A) /// + /// 恒功率模式限定电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置恒功率模式电流(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "CPOWer:CURRent {0:F3}{1}", 电流, ScpiDelimiter); @@ -375,6 +448,8 @@ namespace DeviceCommand.Devices /// /// 3.6.3. 设定恒功率工作模式下的运行功率目标值 (单位: W) /// + /// 恒功率模式运行功率目标值 (单位: W) + /// 取消令牌 public virtual async Task 设置恒功率模式功率(double 功率, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "CPOWer:POWer {0:F3}{1}", 功率, ScpiDelimiter); @@ -383,4 +458,4 @@ namespace DeviceCommand.Devices #endregion } -} \ No newline at end of file +} diff --git a/DeviceCommand/Devices/N36600.cs b/DeviceCommand/Devices/N36600.cs index 5520978..9e24038 100644 --- a/DeviceCommand/Devices/N36600.cs +++ b/DeviceCommand/Devices/N36600.cs @@ -30,6 +30,8 @@ namespace DeviceCommand.Devices /// /// 建立 TCP 连接,成功后自动激活心跳 /// + /// 取消令牌 + /// 连接是否成功 public new async Task ConnectAsync(CancellationToken ct = default) { bool isConnected = await base.ConnectAsync(ct); @@ -124,6 +126,8 @@ namespace DeviceCommand.Devices /// /// 3.1.1 读取电源的相关信息(制造商, 产品标号, 产品序列号, 软件版本号) /// + /// 取消令牌 + /// 设备标识字符串(制造商, 产品标号, 产品序列号, 软件版本号) public virtual async Task 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{SCPIDelimiter}", SCPIDelimiter, ct); @@ -132,6 +136,8 @@ namespace DeviceCommand.Devices /// /// 3.1.2 从指定的单位中恢复 *SAV 命令保存的设定值 (参数:1~99) /// + /// 存储组编号 (范围: 1~99) + /// 取消令牌 public virtual async Task 调用存储状态(int 组别, CancellationToken ct = default) { if (组别 < 1 || 组别 > 99) throw new ArgumentOutOfRangeException(nameof(组别), "组别有效范围为 1~99"); @@ -141,6 +147,8 @@ namespace DeviceCommand.Devices /// /// 3.1.3 将仪器当前系统状态保存到非易失性内存中 (参数:1~99) /// + /// 存储组编号 (范围: 1~99) + /// 取消令牌 public virtual async Task 保存当前状态(int 组别, CancellationToken ct = default) { if (组别 < 1 || 组别 > 99) throw new ArgumentOutOfRangeException(nameof(组别), "组别有效范围为 1~99"); @@ -150,6 +158,7 @@ namespace DeviceCommand.Devices /// /// 3.1.4 远程控制触发一次 /// + /// 取消令牌 public virtual async Task 远程触发(CancellationToken ct = default) { await SendAsync($"*TRG{SCPIDelimiter}", ct); @@ -158,6 +167,8 @@ namespace DeviceCommand.Devices /// /// 3.1.5 返回状态、采集电压、采集电流 (格式: 状态码,电压值,电流值) /// + /// 取消令牌 + /// 状态码,电压值,电流值的组合字符串 public virtual async Task 查询全部状态及采样(CancellationToken ct = default) { return await WriteReadAsync($"*ALL?{SCPIDelimiter}", SCPIDelimiter, ct); @@ -170,6 +181,9 @@ namespace DeviceCommand.Devices /// /// 3.2.1 设置输出电压和输出电流值 /// + /// 输出电压设定值 (单位: V) + /// 输出电流设定值 (单位: A) + /// 取消令牌 public virtual async Task 快捷设置电压电流(double 电压, double 电流, CancellationToken ct = default) { // 修正:去除前缀冒号,规范应用 APPL 短格式 @@ -180,6 +194,8 @@ namespace DeviceCommand.Devices /// /// 3.2.1 查询当前设定的输出电压和电流值 /// + /// 取消令牌 + /// 当前输出电压和电流设定值的组合字符串 public virtual async Task 查询快捷电压电流设定(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -193,6 +209,8 @@ namespace DeviceCommand.Devices /// /// 3.5.1 查询通道输出端子上测得的直流电流值 (A) /// + /// 取消令牌 + /// 实测直流电流值 (单位: A) [Monitorable("低压直流电源电流")] public virtual async Task 查询实际电流(CancellationToken ct = default) { @@ -203,6 +221,8 @@ namespace DeviceCommand.Devices /// /// 3.5.2 查询通道输出端子上测得的直流功率值 (W) /// + /// 取消令牌 + /// 实测直流功率值 (单位: W) [Monitorable("低压直流电源功率")] public virtual async Task 查询实际功率(CancellationToken ct = default) { @@ -213,6 +233,8 @@ namespace DeviceCommand.Devices /// /// 3.5.3 查询通道输出端子上测得的直流电压值 (V) /// + /// 取消令牌 + /// 实测直流电压值 (单位: V) [Monitorable("低压直流电源电压")] public virtual async Task 查询实际电压(CancellationToken ct = default) { @@ -223,6 +245,8 @@ namespace DeviceCommand.Devices /// /// 3.5.4 查询通道输出端子上测得的电压、电流和功率的组合值 /// + /// 取消令牌 + /// 电压、电流和功率的组合值字符串 public virtual async Task 查询电压电流功率数组(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -233,6 +257,8 @@ namespace DeviceCommand.Devices /// /// 3.5.5 查询通道输出端子上测得的输出时间长度 /// + /// 取消令牌 + /// 输出时间长度 public virtual async Task 查询总输出时间长度(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -246,6 +272,8 @@ namespace DeviceCommand.Devices /// /// 3.6.1 设置电源输出开关 /// + /// true: 开启输出, false: 关闭输出 + /// 取消令牌 public virtual async Task 设置DC输出(bool 开启, CancellationToken ct = default) { // 修正:去除前缀冒号,改用 OUTP 短格式 @@ -256,6 +284,8 @@ namespace DeviceCommand.Devices /// /// 3.6.1 查询通道输出状态 (返回 ON 或 OFF) /// + /// 取消令牌 + /// 通道输出状态字符串("ON" 或 "OFF") public virtual async Task 查询DC输出状态(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -265,6 +295,8 @@ namespace DeviceCommand.Devices /// /// 3.6.2 控制电源输出定时器的开关状态 /// + /// true: 开启定时器, false: 关闭定时器 + /// 取消令牌 public virtual async Task 设置定时器状态(bool 开启, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -275,6 +307,8 @@ namespace DeviceCommand.Devices /// /// 3.6.3 设定电源输出定时器的时间 (单位: s, 范围: 0.1 ~ 999999.9) /// + /// 定时器时间 (单位: s, 范围: 0.1 ~ 999999.9) + /// 取消令牌 public virtual async Task 设置定时器时间(double 秒数, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -285,6 +319,8 @@ namespace DeviceCommand.Devices /// /// 3.6.4 设定电源输出的模式优先权 (CV优先 或 CC优先) /// + /// true: CV优先, false: CC优先 + /// 取消令牌 public virtual async Task 设置输出模式优先(bool 是CV优先, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -299,6 +335,7 @@ namespace DeviceCommand.Devices /// /// 3.7.1.1 清除输出电流保护(OCP)电路状态 /// + /// 取消令牌 public virtual async Task 清除电流保护状态(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -308,6 +345,8 @@ namespace DeviceCommand.Devices /// /// 3.7.1.2 使能或禁止当前输出电流保护(OCP)电路 /// + /// true: 使能OCP, false: 禁止OCP + /// 取消令牌 public virtual async Task 设置电流保护使能(bool 启用, CancellationToken ct = default) { // 修正:去除前缀冒号,将 STATE 改为更常用的 STAT 简写 @@ -318,6 +357,8 @@ namespace DeviceCommand.Devices /// /// 3.7.1.4 设置输出电流保护(OCP)阀值 (A) /// + /// OCP 保护阀值 (单位: A) + /// 取消令牌 public virtual async Task 设置过流保护值(double 电流, CancellationToken ct = default) { // 修正:去除前缀冒号。按 NGI 通用指令树,加上层级限制或者直接作用于 CURR:PROT @@ -328,6 +369,8 @@ namespace DeviceCommand.Devices /// /// 3.7.1.7 设置电源的输出电流值 (A) /// + /// 输出电流设定值 (单位: A) + /// 取消令牌 public virtual async Task 设置电流(double 电流, CancellationToken ct = default) { // 修正:去除前缀冒号,改用标准 CURR 短格式 @@ -338,6 +381,7 @@ namespace DeviceCommand.Devices /// /// 3.7.2.1 清除输出电压保护(OVP)电路状态 /// + /// 取消令牌 public virtual async Task 清除电压保护状态(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -347,6 +391,8 @@ namespace DeviceCommand.Devices /// /// 3.7.2.2 使能或禁止当前输出电压保护(OVP)电路 /// + /// true: 使能OVP, false: 禁止OVP + /// 取消令牌 public virtual async Task 设置电压保护使能(bool 启用, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -357,6 +403,8 @@ namespace DeviceCommand.Devices /// /// 3.7.2.4 设置输出电压保护(OVP)阀值 (V) /// + /// OVP 保护阀值 (单位: V) + /// 取消令牌 public virtual async Task 设置过压保护值(double 电压, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -367,6 +415,8 @@ namespace DeviceCommand.Devices /// /// 3.7.2.7 设置电源的输出电压值 (V) /// + /// 输出电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置电压(double 电压, CancellationToken ct = default) { // 修正:去除前缀冒号,改用标准 VOLT 短格式 @@ -377,6 +427,8 @@ namespace DeviceCommand.Devices /// /// 3.7.2.8 设定电压输出范围的上限电压值 (V) /// + /// 上限电压值 (单位: V) + /// 取消令牌 public virtual async Task 设置电压上限限制(double 电压, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -386,14 +438,17 @@ namespace DeviceCommand.Devices /// /// 3.7.2.9 清除电压上限限制(恢复为设备物理允许的最大电压值) /// + /// 取消令牌 public virtual async Task 清除电压上限限制(CancellationToken ct = default) { - // 发送 MAXimum 设为最大值以达到“清除限制”的效果 + // 发送 MAXimum 设为最大值以达到"清除限制"的效果 await SendAsync($"VOLT:LIMIT MAX{SCPIDelimiter}", ct); // 对应手册 3.7.2.8 } /// /// 3.7.3.1 设置输出功率值 (W) /// + /// 输出功率设定值 (单位: W) + /// 取消令牌 public virtual async Task 设置功率(double 功率, CancellationToken ct = default) { // 修正:去除前缀冒号,改用标准 POW 短格式 @@ -404,6 +459,8 @@ namespace DeviceCommand.Devices /// /// 3.7.3.2 禁止或使能当前恒功率(CP)输出 /// + /// true: 使能恒功率输出, false: 禁止恒功率输出 + /// 取消令牌 public virtual async Task 设置恒功率输出使能(bool 启用, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -418,6 +475,8 @@ namespace DeviceCommand.Devices /// /// 3.9.1 控制蜂鸣器开关 /// + /// true: 开启蜂鸣器, false: 关闭蜂鸣器 + /// 取消令牌 public virtual async Task 设置蜂鸣器状态(bool 开启, CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -428,6 +487,7 @@ namespace DeviceCommand.Devices /// /// 3.9.2 使蜂鸣器强制鸣叫一声 /// + /// 取消令牌 public virtual async Task 蜂鸣器鸣叫(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -437,6 +497,8 @@ namespace DeviceCommand.Devices /// /// 3.9.4 查询仪器当前出错记录数量 (最大 18 组) /// + /// 取消令牌 + /// 当前出错记录数量(最大 18 组) public virtual async Task 查询错误记录数量(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -446,6 +508,8 @@ namespace DeviceCommand.Devices /// /// 3.9.5 读取仪器的出错信息 (成功返回 0,"No error") /// + /// 取消令牌 + /// 错误代码和描述信息(成功返回 0,"No error") public virtual async Task 查询错误信息(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -455,6 +519,7 @@ namespace DeviceCommand.Devices /// /// 3.9.7 设置电源为面板控制模式 (本地 Local 状态,前面板按键可用) /// + /// 取消令牌 public virtual async Task 切换本地控制模式(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -464,6 +529,7 @@ namespace DeviceCommand.Devices /// /// 3.9.8 设置电源为远程控制模式 (Remote 状态) /// + /// 取消令牌 public virtual async Task 切换远程控制模式(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -473,6 +539,7 @@ namespace DeviceCommand.Devices /// /// 3.9.9 通过通信接口设置电源为远程控制锁定模式 /// + /// 取消令牌 public virtual async Task 远程控制模式锁定(CancellationToken ct = default) { // 修正:去除前缀冒号 @@ -481,4 +548,4 @@ namespace DeviceCommand.Devices #endregion } -} \ No newline at end of file +} diff --git a/DeviceCommand/Devices/N69200.cs b/DeviceCommand/Devices/N69200.cs index 8787216..8002ae6 100644 --- a/DeviceCommand/Devices/N69200.cs +++ b/DeviceCommand/Devices/N69200.cs @@ -26,6 +26,7 @@ namespace DeviceCommand.Devices /// /// 清除状态命令。清除标准事件状态寄存器和错误队列 (*CLS) /// + /// 取消令牌 public virtual async Task 清除错误队列和状态字节(CancellationToken ct = default) { await SendAsync($"*CLS{ScpiDelimiter}", ct); @@ -33,6 +34,8 @@ namespace DeviceCommand.Devices /// /// 查询错误信息 /// + /// 取消令牌 + /// 错误代码和描述信息 public virtual async Task 查询错误信息(CancellationToken ct = default) { return await WriteReadAsync($":SYSTem:ERRor?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -41,6 +44,8 @@ namespace DeviceCommand.Devices /// /// 读取电子负载设备识别字符串 (*IDN?) /// + /// 取消令牌 + /// 设备标识字符串(制造商, 产品型号, 序列号, 固件版本) public virtual async Task 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -49,6 +54,7 @@ namespace DeviceCommand.Devices /// /// 复位命令。使电子负载恢复到出厂默认配置状态 (*RST) /// + /// 取消令牌 public virtual async Task 重置设备(CancellationToken ct = default) { await SendAsync($"*RST{ScpiDelimiter}", ct); @@ -57,6 +63,8 @@ namespace DeviceCommand.Devices /// /// 读取标准状态字节寄存器 (*STB?) /// + /// 取消令牌 + /// 标准状态字节寄存器值 public virtual async Task 读取状态字节(CancellationToken ct = default) { return await WriteReadAsync($"*STB?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -65,6 +73,8 @@ namespace DeviceCommand.Devices /// /// 保存当前系统参数到指定的存储单元 (1~100) /// + /// 存储单元编号 (范围: 1~100) + /// 取消令牌 public virtual async Task 保存当前状态(int 单元, CancellationToken ct = default) { if (单元 < 1 || 单元 > 100) @@ -76,6 +86,8 @@ namespace DeviceCommand.Devices /// /// 调用指定存储单元中保存的系统参数 (1~100) /// + /// 存储单元编号 (范围: 1~100) + /// 取消令牌 public virtual async Task 调用存储状态(int 单元, CancellationToken ct = default) { if (单元 < 1 || 单元 > 100) @@ -91,6 +103,8 @@ namespace DeviceCommand.Devices /// /// 控制电子负载的输入控制开关(INPut:STATe ) /// + /// true: 开启拉载, false: 关闭拉载 + /// 取消令牌 public virtual async Task 设置DC输入(bool 开启, CancellationToken ct = default) { string 参数 = 开启 ? "1" : "0"; @@ -100,6 +114,8 @@ namespace DeviceCommand.Devices /// /// 查询电子负载当前的拉载开关状态 (返回 0 或 1) /// + /// 取消令牌 + /// 拉载开关状态("0" 或 "1") public virtual async Task 查询DC输入状态(CancellationToken ct = default) { return await WriteReadAsync($"INPut:STATe?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -134,6 +150,11 @@ namespace DeviceCommand.Devices CPD, SZ } + /// + /// 设置负载模式 + /// + /// 电子负载工作模式枚举 (CC, CV, CR, CP 等) + /// 取消令牌 public virtual async Task 设置负载模式(DeviceWorkMode 模式, CancellationToken ct = default) { await SendAsync($"INPut:FUNCtion {Enum.GetName(模式)}{ScpiDelimiter}", ct); @@ -142,6 +163,8 @@ namespace DeviceCommand.Devices /// /// 查询电子负载当前处于何种工作模式 /// + /// 取消令牌 + /// 当前工作模式字符串 public virtual async Task 查询负载模式(CancellationToken ct = default) { return await WriteReadAsync($"INPut:FUNCtion?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -154,6 +177,8 @@ namespace DeviceCommand.Devices /// /// 设定恒电流模式(CC)大量程下的拉载电流目标值 (单位: A) /// + /// 拉载电流目标值 (单位: A) + /// 取消令牌 public virtual async Task 设置恒电流CC(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "STATic:CC:HIGH:LEVel {0:F4}{1}", 电流, ScpiDelimiter); @@ -163,6 +188,8 @@ namespace DeviceCommand.Devices /// /// 查询恒电流模式大量程下设定的拉载电流值 /// + /// 取消令牌 + /// 设定的拉载电流值 (单位: A) public virtual async Task 查询恒电流CC设定(CancellationToken ct = default) { return await WriteReadAsync($"STATic:CC:HIGH:LEVel?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -171,6 +198,8 @@ namespace DeviceCommand.Devices /// /// 设定恒电压模式(CV)大量程下的拉载电压目标值 (单位: V) /// + /// 拉载电压目标值 (单位: V) + /// 取消令牌 public virtual async Task 设置恒电压CV(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "STATic:CV:HIGH:LEVel {0:F3}{1}", 电压, ScpiDelimiter); @@ -180,6 +209,8 @@ namespace DeviceCommand.Devices /// /// 查询恒电压模式大量程下设定的拉载电压值 /// + /// 取消令牌 + /// 设定的拉载电压值 (单位: V) public virtual async Task 查询恒电压CV设定(CancellationToken ct = default) { return await WriteReadAsync($"STATic:CV:HIGH:LEVel?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -188,6 +219,8 @@ namespace DeviceCommand.Devices /// /// 设定恒功率模式(CP)大量程下的拉载功率目标值 (单位: W) /// + /// 拉载功率目标值 (单位: W) + /// 取消令牌 public virtual async Task 设置恒功率CP(double 功率, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "STATic:CP:HIGH:LEVel {0:F3}{1}", 功率, ScpiDelimiter); @@ -197,6 +230,8 @@ namespace DeviceCommand.Devices /// /// 查询恒功率模式大量程下设定的拉载功率值 /// + /// 取消令牌 + /// 设定的拉载功率值 (单位: W) public virtual async Task 查询恒功率CP设定(CancellationToken ct = default) { return await WriteReadAsync($"STATic:CP:HIGH:LEVel?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -205,6 +240,8 @@ namespace DeviceCommand.Devices /// /// 设定恒电阻模式(CR)大量程下的等效拉载电阻阻值 (单位: Ω) /// + /// 等效拉载电阻阻值 (单位: Ω) + /// 取消令牌 public virtual async Task 设置恒电阻CR(double 电阻, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "STATic:CR:HIGH:LEVel {0:F4}{1}", 电阻, ScpiDelimiter); @@ -214,6 +251,8 @@ namespace DeviceCommand.Devices /// /// 查询恒电阻模式大量程下设定的拉载电阻值 /// + /// 取消令牌 + /// 设定的拉载电阻值 (单位: Ω) public virtual async Task 查询恒电阻CR设定(CancellationToken ct = default) { return await WriteReadAsync($"STATic:CR:HIGH:LEVel?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -226,6 +265,8 @@ namespace DeviceCommand.Devices /// /// 回读电子负载输入端子上的实时测得电压值 (单位: V) /// + /// 取消令牌 + /// 实时测量电压值 (单位: V) [Monitorable("高压直流负载电压")] public virtual async Task 查询实际电压(CancellationToken ct = default) { @@ -235,6 +276,8 @@ namespace DeviceCommand.Devices /// /// 回读电子负载输入端子上的实时测得电流值 (单位: A) /// + /// 取消令牌 + /// 实时测量电流值 (单位: A) [Monitorable("高压直流负载电流")] public virtual async Task 查询实际电流(CancellationToken ct = default) { @@ -244,6 +287,8 @@ namespace DeviceCommand.Devices /// /// 回读电子负载输入端子上的实时测得功率值 (单位: W) /// + /// 取消令牌 + /// 实时测量功率值 (单位: W) [Monitorable("高压直流负载功率")] public virtual async Task 查询实际功率(CancellationToken ct = default) { @@ -257,6 +302,8 @@ namespace DeviceCommand.Devices /// /// 设置电子负载的电流软保护阈值 (单位: A, 设置为 0 表示关闭) /// + /// 电流软保护阈值 (单位: A, 0 表示关闭) + /// 取消令牌 public virtual async Task 设置过流保护值_OCP(double 电流, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "INPut:CURRent:PROTection {0:F3}{1}", 电流, ScpiDelimiter); @@ -266,6 +313,8 @@ namespace DeviceCommand.Devices /// /// 设置电子负载的功率软保护阈值 (单位: W, 设置为 0 表示关闭) /// + /// 功率软保护阈值 (单位: W, 0 表示关闭) + /// 取消令牌 public virtual async Task 设置过功率保护值_OPP(double 功率, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "INPut:POWer:PROTection {0:F3}{1}", 功率, ScpiDelimiter); @@ -275,6 +324,8 @@ namespace DeviceCommand.Devices /// /// 设置电子负载的电压软保护阈值 (单位: V, 设置为 0 表示关闭) /// + /// 电压软保护阈值 (单位: V, 0 表示关闭) + /// 取消令牌 public virtual async Task 设置过压保护值_OVP(double 电压, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "INPut:VOLTage:PROTection {0:F3}{1}", 电压, ScpiDelimiter); @@ -288,6 +339,8 @@ namespace DeviceCommand.Devices /// /// 读取负载报警/事件寄存器信息 (MEASure:EVENT?) /// + /// 取消令牌 + /// 报警/事件寄存器信息 public virtual async Task 查询报警事件信息(CancellationToken ct = default) { return await WriteReadAsync($"MEASure:EVENT?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -296,6 +349,7 @@ namespace DeviceCommand.Devices /// /// 清除负载当前的保护触发锁定状态 (INPut:CLearPROTect) /// + /// 取消令牌 public virtual async Task 清除保护告警(CancellationToken ct = default) { await SendAsync($"INPut:CLearPROTect{ScpiDelimiter}", ct); @@ -307,48 +361,123 @@ namespace DeviceCommand.Devices #region 组合测试 (COMBination:*) + /// + /// 设置组合量程_CVCC + /// + /// 量程编号 + /// 取消令牌 public virtual async Task 设置组合量程_CVCC(int 量程, CancellationToken ct = default) => await SendAsync($"COMBination:CVCC:RANGE {量程}{ScpiDelimiter}", ct); + /// + /// 设置恒压速率_CVCC + /// + /// 恒压上升速率 + /// 取消令牌 public virtual async Task 设置恒压速率_CVCC(int 速率, CancellationToken ct = default) => await SendAsync($"COMBination:CVCC:HIGH:RATE {速率}{ScpiDelimiter}", ct); + /// + /// 设置恒压大量程电压_CVCC + /// + /// 恒压大量程电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置恒压大量程电压_CVCC(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CVCC:HIGH:LEVel {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 设置限定电流_CVCC + /// + /// 限定电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置限定电流_CVCC(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CVCC:CLIMit {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置组合量程_CRCC + /// + /// 量程编号 + /// 取消令牌 public virtual async Task 设置组合量程_CRCC(int 量程, CancellationToken ct = default) => await SendAsync($"COMBination:CRCC:RANGE {量程}{ScpiDelimiter}", ct); + /// + /// 设置恒阻小量程电阻_CRCC + /// + /// 恒阻小量程电阻值 (单位: Ω) + /// 取消令牌 public virtual async Task 设置恒阻小量程电阻_CRCC(double 电阻, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CRCC:LOW:LEVel {0:F4}{1}", 电阻, ScpiDelimiter), ct); + /// + /// 设置限定电流_CRCC + /// + /// 限定电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置限定电流_CRCC(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CRCC:CLIMit {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置上升斜率_CRCC + /// + /// 电流上升斜率 (单位: A/μs) + /// 取消令牌 public virtual async Task 设置上升斜率_CRCC(double 斜率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CRCC:LOW:SLEWRate:RAIse {0:F1}{1}", 斜率, ScpiDelimiter), ct); + /// + /// 设置下降斜率_CRCC + /// + /// 电流下降斜率 (单位: A/μs) + /// 取消令牌 public virtual async Task 设置下降斜率_CRCC(double 斜率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CRCC:LOW:SLEWRate:FALL {0:F1}{1}", 斜率, ScpiDelimiter), ct); + /// + /// 设置组合量程_CPCC + /// + /// 量程编号 + /// 取消令牌 public virtual async Task 设置组合量程_CPCC(int 量程, CancellationToken ct = default) => await SendAsync($"COMBination:CPCC:RANGE {量程}{ScpiDelimiter}", ct); + /// + /// 设置恒功率小量程功率_CPCC + /// + /// 恒功率小量程功率值 (单位: W) + /// 取消令牌 public virtual async Task 设置恒功率小量程功率_CPCC(double 功率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CPCC:LOW:LEVel {0:F3}{1}", 功率, ScpiDelimiter), ct); + /// + /// 设置限定电流_CPCC + /// + /// 限定电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置限定电流_CPCC(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CPCC:CLIMit {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置组合量程_CVCR + /// + /// 量程编号 + /// 取消令牌 public virtual async Task 设置组合量程_CVCR(int 量程, CancellationToken ct = default) => await SendAsync($"COMBination:CVCR:RANGE {量程}{ScpiDelimiter}", ct); + /// + /// 设置恒压大量程电压_CVCR + /// + /// 恒压大量程电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置恒压大量程电压_CVCR(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CVCR:HIGH:LEVel {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 设置限定电阻_CVCR + /// + /// 限定电阻值 (单位: Ω) + /// 取消令牌 public virtual async Task 设置限定电阻_CVCR(double 电阻, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "COMBination:CVCR:CLIMit {0:F4}{1}", 电阻, ScpiDelimiter), ct); @@ -356,45 +485,115 @@ namespace DeviceCommand.Devices #region 瞬态测试 (DYNAmic:*) + /// + /// 设置瞬态运行方式_CC + /// + /// 运行方式 (0-连续, 1-单次, 2-A/B) + /// 取消令牌 public virtual async Task 设置瞬态运行方式_CC(int 模式, CancellationToken ct = default) => await SendAsync($"DYNAmic:CC:MODe {模式}{ScpiDelimiter}", ct); // 0-连续, 1-单次, 2-A/B + /// + /// 设置瞬态量程_CC + /// + /// 量程编号 + /// 取消令牌 public virtual async Task 设置瞬态量程_CC(int 量程, CancellationToken ct = default) => await SendAsync($"DYNAmic:CC:RANGE {量程}{ScpiDelimiter}", ct); + /// + /// 设置瞬态主值电流_CC + /// + /// 主值电流 (单位: A) + /// 取消令牌 public virtual async Task 设置瞬态主值电流_CC(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CC:HIGH:LEVel:MAIN {0:F4}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置瞬态瞬态值电流_CC + /// + /// 瞬态值电流 (单位: A) + /// 取消令牌 public virtual async Task 设置瞬态瞬态值电流_CC(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CC:HIGH:LEVel:TRANSient {0:F4}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置瞬态上升斜率_CC + /// + /// 电流上升斜率 (单位: A/μs) + /// 取消令牌 public virtual async Task 设置瞬态上升斜率_CC(double 斜率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CC:HIGH:SLEWRate:RAIse {0:F1}{1}", 斜率, ScpiDelimiter), ct); + /// + /// 设置瞬态下降斜率_CC + /// + /// 电流下降斜率 (单位: A/μs) + /// 取消令牌 public virtual async Task 设置瞬态下降斜率_CC(double 斜率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CC:HIGH:SLEWRate:FALL {0:F1}{1}", 斜率, ScpiDelimiter), ct); + /// + /// 设置瞬态主值脉宽_CC + /// + /// 主值脉宽 (单位: ms) + /// 取消令牌 public virtual async Task 设置瞬态主值脉宽_CC(double 时间_ms, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CC:WIDth:MAIN {0:F1}{1}", 时间_ms, ScpiDelimiter), ct); + /// + /// 设置瞬态瞬态脉宽_CC + /// + /// 瞬态脉宽 (单位: ms) + /// 取消令牌 public virtual async Task 设置瞬态瞬态脉宽_CC(double 时间_ms, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CC:WIDth:TRANSient {0:F1}{1}", 时间_ms, ScpiDelimiter), ct); + /// + /// 设置瞬态运行方式_CV + /// + /// 运行方式 + /// 取消令牌 public virtual async Task 设置瞬态运行方式_CV(int 模式, CancellationToken ct = default) => await SendAsync($"DYNAmic:CV:MODe {模式}{ScpiDelimiter}", ct); + /// + /// 设置瞬态量程_CV + /// + /// 量程编号 + /// 取消令牌 public virtual async Task 设置瞬态量程_CV(int 量程, CancellationToken ct = default) => await SendAsync($"DYNAmic:CV:RANGE {量程}{ScpiDelimiter}", ct); + /// + /// 设置瞬态主值电压_CV + /// + /// 主值电压 (单位: V) + /// 取消令牌 public virtual async Task 设置瞬态主值电压_CV(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CV:HIGH:LEVel:MAIN {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 设置瞬态瞬态值电压_CV + /// + /// 瞬态值电压 (单位: V) + /// 取消令牌 public virtual async Task 设置瞬态瞬态值电压_CV(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CV:HIGH:LEVel:TRANSient {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 设置瞬态主值脉宽_CV + /// + /// 主值脉宽 (单位: ms) + /// 取消令牌 public virtual async Task 设置瞬态主值脉宽_CV(double 时间_ms, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CV:WIDth:MAIN {0:F1}{1}", 时间_ms, ScpiDelimiter), ct); + /// + /// 设置瞬态瞬态脉宽_CV + /// + /// 瞬态脉宽 (单位: ms) + /// 取消令牌 public virtual async Task 设置瞬态瞬态脉宽_CV(double 时间_ms, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DYNAmic:CV:WIDth:TRANSient {0:F1}{1}", 时间_ms, ScpiDelimiter), ct); @@ -402,30 +601,75 @@ namespace DeviceCommand.Devices #region 充放电测试 (DISCHarge:* / CHARge:*) + /// + /// 设置放电电流 + /// + /// 放电电流设定值 (单位: A) + /// 取消令牌 public virtual async Task 设置放电电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DISCHarge:CURRent {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置放电终止电压 + /// + /// 放电终止电压 (单位: V) + /// 取消令牌 public virtual async Task 设置放电终止电压(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DISCHarge:VOLTage {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 设置放电终止时间 + /// + /// 放电终止时间 (单位: s) + /// 取消令牌 public virtual async Task 设置放电终止时间(double 时间_s, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DISCHarge:TIMe {0:F0}{1}", 时间_s, ScpiDelimiter), ct); + /// + /// 设置放电终止容量 + /// + /// 放电终止容量 (单位: Ah) + /// 取消令牌 public virtual async Task 设置放电终止容量(double 容量_Ah, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "DISCHarge:CAPacity {0:F3}{1}", 容量_Ah, ScpiDelimiter), ct); + /// + /// 查询放电实时时间 + /// + /// 取消令牌 + /// 当前放电已持续时间 (单位: s) public virtual async Task 查询放电实时时间(CancellationToken ct = default) => await WriteReadAsync($"DISCHarge:ECHO:TIMe?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 查询放电实时容量 + /// + /// 取消令牌 + /// 当前放电已输出的容量 (单位: Ah) public virtual async Task 查询放电实时容量(CancellationToken ct = default) => await WriteReadAsync($"DISCHarge:ECHo:CAPacity?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 设置充电电流 + /// + /// 充电电流设定值 (单位: A) + /// 取消令牌 public virtual async Task 设置充电电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "CHARge:CURRent {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置充电电压 + /// + /// 充电电压设定值 (单位: V) + /// 取消令牌 public virtual async Task 设置充电电压(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "CHARge:VOLTage {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 设置充电恒压时间 + /// + /// 恒压充电持续时间 (单位: s) + /// 取消令牌 public virtual async Task 设置充电恒压时间(int 时间_s, CancellationToken ct = default) => await SendAsync($"CHARge:TIMe {时间_s}{ScpiDelimiter}", ct); @@ -433,39 +677,99 @@ namespace DeviceCommand.Devices #region OCP / OPP 保护扫描测试 (OCP:* / OPP:*) + /// + /// 设置OCP初始电流 + /// + /// OCP扫描起始电流 (单位: A) + /// 取消令牌 public virtual async Task 设置OCP初始电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OCP:BCURrent {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置OCP步进电流 + /// + /// 每步递增电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置OCP步进电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OCP:SCURrent {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置OCP单步时间 + /// + /// 每步持续时间 (单位: s) + /// 取消令牌 public virtual async Task 设置OCP单步时间(double 时间_s, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OCP:Time {0:F1}{1}", 时间_s, ScpiDelimiter), ct); + /// + /// 设置OCP终止电压 + /// + /// 触发保护时的电压阈值 (单位: V) + /// 取消令牌 public virtual async Task 设置OCP终止电压(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OCP:EVOLtage {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 查询OCP状态 + /// + /// 取消令牌 + /// OCP扫描测试状态 public virtual async Task 查询OCP状态(CancellationToken ct = default) => await WriteReadAsync($"OCP:STAtus?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取OCP结果电流 + /// + /// 取消令牌 + /// OCP测试触发时的电流值 (单位: A) public virtual async Task 读取OCP结果电流(CancellationToken ct = default) => await WriteReadAsync($"OCP:RCURrent?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 设置OPP初始功率 + /// + /// OPP扫描起始功率 (单位: W) + /// 取消令牌 public virtual async Task 设置OPP初始功率(double 功率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OPP:BPOWer {0:F3}{1}", 功率, ScpiDelimiter), ct); + /// + /// 设置OPP步进功率 + /// + /// 每步递增功率值 (单位: W) + /// 取消令牌 public virtual async Task 设置OPP步进功率(double 功率, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OPP:SPOWer {0:F3}{1}", 功率, ScpiDelimiter), ct); + /// + /// 设置OPP单步时间 + /// + /// 每步持续时间 (单位: s) + /// 取消令牌 public virtual async Task 设置OPP单步时间(double 时间_s, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OPP:TIME {0:F1}{1}", 时间_s, ScpiDelimiter), ct); + /// + /// 设置OPP终止电压 + /// + /// 触发保护时的电压阈值 (单位: V) + /// 取消令牌 public virtual async Task 设置OPP终止电压(double 电压, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "OPP:EVOLtage {0:F3}{1}", 电压, ScpiDelimiter), ct); + /// + /// 查询OPP状态 + /// + /// 取消令牌 + /// OPP扫描测试状态 public virtual async Task 查询OPP状态(CancellationToken ct = default) => await WriteReadAsync($"OPP:STAtus?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取OPP结果功率 + /// + /// 取消令牌 + /// OPP测试触发时的功率值 (单位: W) public virtual async Task 读取OPP结果功率(CancellationToken ct = default) => await WriteReadAsync($"OPP:RPOWer?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -473,45 +777,115 @@ namespace DeviceCommand.Devices #region 扫频 SWEEP 与 波形拉载 WAVE (SWEEP:* / WAVE:*) + /// + /// 设置扫频最小电流 + /// + /// 扫频最小电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置扫频最小电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "SWEEP:TCURrent {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置扫频最大电流 + /// + /// 扫频最大电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置扫频最大电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "SWEEP:MCURrent {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置扫频起始频率 + /// + /// 扫频起始频率 (单位: Hz) + /// 取消令牌 public virtual async Task 设置扫频起始频率(double 频率_Hz, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "SWEEP:SFRequency {0:F1}{1}", 频率_Hz, ScpiDelimiter), ct); + /// + /// 设置扫频结束频率 + /// + /// 扫频结束频率 (单位: Hz) + /// 取消令牌 public virtual async Task 设置扫频结束频率(double 频率_Hz, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "SWEEP:EFRequency {0:F1}{1}", 频率_Hz, ScpiDelimiter), ct); + /// + /// 设置扫频单步时间 + /// + /// 每个频率点停留时间 (单位: ms) + /// 取消令牌 public virtual async Task 设置扫频单步时间(double 时间_ms, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "SWEEP:STPTime {0:F1}{1}", 时间_ms, ScpiDelimiter), ct); + /// + /// 设置扫频占空比 + /// + /// 占空比值 (单位: %) + /// 取消令牌 public virtual async Task 设置扫频占空比(double 占空比, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "SWEEP:DUTYcycle {0:F1}{1}", 占空比, ScpiDelimiter), ct); + /// + /// 读取扫频当前运行频率 + /// + /// 取消令牌 + /// 当前扫频运行频率 (单位: Hz) public virtual async Task 读取扫频当前运行频率(CancellationToken ct = default) => await WriteReadAsync($"SWEEP:CFRequency?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取扫频测试结果 + /// + /// 取消令牌 + /// 扫频测试结果 public virtual async Task 读取扫频测试结果(CancellationToken ct = default) => await WriteReadAsync($"SWEEP:RESult?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 设置波形量程 + /// + /// 波形量程编号 + /// 取消令牌 public virtual async Task 设置波形量程(int 量程, CancellationToken ct = default) => await SendAsync($"WAVE:RANGe {量程}{ScpiDelimiter}", ct); + /// + /// 设置波形类型 + /// + /// 波形类型 (0-正弦波, 1-方波, 2-三角波, 3-锯齿波, 4-自定义) + /// 取消令牌 public virtual async Task 设置波形类型(int 类型, CancellationToken ct = default) => await SendAsync($"WAVE:TYPe {类型}{ScpiDelimiter}", ct); // 0-正弦波, 1-方波, 2-三角波, 3-锯齿波, 4-自定义 + /// + /// 设置波形频率 + /// + /// 波形频率 (单位: Hz) + /// 取消令牌 public virtual async Task 设置波形频率(double 频率_Hz, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "WAVE:FREQuency {0:F1}{1}", 频率_Hz, ScpiDelimiter), ct); + /// + /// 设置波形幅值 + /// + /// 波形幅值 (单位: A) + /// 取消令牌 public virtual async Task 设置波形幅值(double 幅值, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "WAVE:SETValue {0:F3}{1}", 幅值, ScpiDelimiter), ct); + /// + /// 设置波形时间 + /// + /// 波形周期时间 (单位: ms) + /// 取消令牌 public virtual async Task 设置波形时间(double 时间_ms, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "WAVE:TIMe {0:F1}{1}", 时间_ms, ScpiDelimiter), ct); + /// + /// 设置波形叠加值 + /// + /// 直流叠加偏置值 (单位: A) + /// 取消令牌 public virtual async Task 设置波形叠加值(double 叠加值, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "WAVE:BVALue {0:F3}{1}", 叠加值, ScpiDelimiter), ct); @@ -519,21 +893,51 @@ namespace DeviceCommand.Devices #region 内阻测试 ESR (ESR:*) + /// + /// 设置ESR带载量程 + /// + /// 带载量程编号 + /// 取消令牌 public virtual async Task 设置ESR带载量程(int 量程, CancellationToken ct = default) => await SendAsync($"ESR:LOADRange {量程}{ScpiDelimiter}", ct); + /// + /// 设置ESR大量程带载电流 + /// + /// 带载电流值 (单位: A) + /// 取消令牌 public virtual async Task 设置ESR大量程带载电流(double 电流, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "ESR:CURRenthigh {0:F3}{1}", 电流, ScpiDelimiter), ct); + /// + /// 设置ESR测量方法 + /// + /// 测量方法 (0-方波平均法, 1-单脉冲法) + /// 取消令牌 public virtual async Task 设置ESR测量方法(int 方法, CancellationToken ct = default) => await SendAsync($"ESR:MODE {方法}{ScpiDelimiter}", ct); // 0-方波平均法, 1-单脉冲法 + /// + /// 设置ESR采样量程 + /// + /// 采样量程 (0-1000mV, 1-100mV, 2-10mV) + /// 取消令牌 public virtual async Task 设置ESR采样量程(int 量程, CancellationToken ct = default) => await SendAsync($"ESR:MEASurerange {量程}{ScpiDelimiter}", ct); // 0-1000mV, 1-100mV, 2-10mV + /// + /// 查询ESR状态 + /// + /// 取消令牌 + /// ESR测试状态 public virtual async Task 查询ESR状态(CancellationToken ct = default) => await WriteReadAsync($"ESR:STAtus?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取ESR结果 + /// + /// 取消令牌 + /// ESR测试结果 (单位: Ω) public virtual async Task 读取ESR结果(CancellationToken ct = default) => await WriteReadAsync($"ESR:RESult?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -541,30 +945,75 @@ namespace DeviceCommand.Devices #region MPPT 测试 (MPP:*) + /// + /// 设置MPPT步进电压 + /// + /// 步进电压值 (单位: V) + /// 取消令牌 public virtual async Task 设置MPPT步进电压(double 电压_V, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "MPP:BVOLtage {0:F3}{1}", 电压_V, ScpiDelimiter), ct); + /// + /// 设置MPPT步进时间 + /// + /// 每步停留时间 (单位: s) + /// 取消令牌 public virtual async Task 设置MPPT步进时间(double 时间_s, CancellationToken ct = default) => await SendAsync(string.Format(CultureInfo.InvariantCulture, "MPP:TIME {0:F1}{1}", 时间_s, ScpiDelimiter), ct); + /// + /// 设置MPPT模式 + /// + /// 工作模式 (0-扫描模式, 1-跟踪模式) + /// 取消令牌 public virtual async Task 设置MPPT模式(int 模式, CancellationToken ct = default) => await SendAsync($"MPP:MODE {模式}{ScpiDelimiter}", ct); // 0-扫描模式, 1-跟踪模式 + /// + /// 查询MPPT状态 + /// + /// 取消令牌 + /// MPPT测试状态 public virtual async Task 查询MPPT状态(CancellationToken ct = default) => await WriteReadAsync($"MPP:STATus?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取MPPT最大功率 + /// + /// 取消令牌 + /// 最大功率值 (单位: W) public virtual async Task 读取MPPT最大功率(CancellationToken ct = default) => await WriteReadAsync($"MPP:MPOWer?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取MPPT最大功率电压 + /// + /// 取消令牌 + /// 最大功率点对应电压 (单位: V) public virtual async Task 读取MPPT最大功率电压(CancellationToken ct = default) => await WriteReadAsync($"MPP:MVOLtage?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取MPPT最大功率电流 + /// + /// 取消令牌 + /// 最大功率点对应电流 (单位: A) public virtual async Task 读取MPPT最大功率电流(CancellationToken ct = default) => await WriteReadAsync($"MPP:MCURrent?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取MPPT开路电压 + /// + /// 取消令牌 + /// 开路电压值 (单位: V) public virtual async Task 读取MPPT开路电压(CancellationToken ct = default) => await WriteReadAsync($"MPP:OVOLtage?{ScpiDelimiter}", ScpiDelimiter, ct); + /// + /// 读取MPPT短路电流 + /// + /// 取消令牌 + /// 短路电流值 (单位: A) public virtual async Task 读取MPPT短路电流(CancellationToken ct = default) => await WriteReadAsync($"MPP:SCURrent?{ScpiDelimiter}", ScpiDelimiter, ct); diff --git a/DeviceCommand/Devices/SDS2000X_HD.cs b/DeviceCommand/Devices/SDS2000X_HD.cs index 73e509d..615934a 100644 --- a/DeviceCommand/Devices/SDS2000X_HD.cs +++ b/DeviceCommand/Devices/SDS2000X_HD.cs @@ -27,6 +27,7 @@ namespace DeviceCommand.Devices /// /// 清除标准事件状态寄存器和错误队列 /// + /// 取消令牌 public virtual async Task 清除状态(CancellationToken ct = default) { await SendAsync($"*CLS{ScpiDelimiter}", ct); @@ -34,6 +35,8 @@ namespace DeviceCommand.Devices /// /// 查询错误信息 /// + /// 取消令牌 + /// 错误代码和描述信息 public virtual async Task 查询错误信息(CancellationToken ct = default) { return await WriteReadAsync($":SYSTem:ERRor?{ScpiDelimiter}", ScpiDelimiter, ct); //[cite: 1] @@ -41,6 +44,8 @@ namespace DeviceCommand.Devices /// /// 读取示波器识别字符串(制造商、型号、序列号、固件版本) /// + /// 取消令牌 + /// 设备标识字符串(制造商, 型号, 序列号, 固件版本) public virtual async Task 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -49,6 +54,7 @@ namespace DeviceCommand.Devices /// /// 复位命令。使示波器恢复到默认的出厂设置 /// + /// 取消令牌 public virtual async Task 重置设备(CancellationToken ct = default) { await SendAsync($"*RST{ScpiDelimiter}", ct); @@ -57,6 +63,8 @@ namespace DeviceCommand.Devices /// /// 查询先前操作是否完成。 /// + /// 取消令牌 + /// true: 操作已完成, false: 操作仍在执行中 public virtual async Task 检查操作完成_OPC(CancellationToken ct = default) { string res = await WriteReadAsync($"*OPC?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -70,6 +78,7 @@ namespace DeviceCommand.Devices /// /// 控制示波器开始捕获波形 /// + /// 取消令牌 public virtual async Task 启动捕获_RUN(CancellationToken ct = default) { await SendAsync($":TRIGger:RUN{ScpiDelimiter}", ct); @@ -78,6 +87,7 @@ namespace DeviceCommand.Devices /// /// 停止捕获波形 /// + /// 取消令牌 public virtual async Task 停止捕获_STOP(CancellationToken ct = default) { await SendAsync($"TRIGger:STOP{ScpiDelimiter}", ct); @@ -86,6 +96,7 @@ namespace DeviceCommand.Devices /// /// 强制示波器进入单次触发捕获模式 /// + /// 取消令牌 public virtual async Task 单次触发_SINGLE(CancellationToken ct = default) { await SendAsync($":TRIGger:MODE SINGle{ScpiDelimiter}", ct); @@ -94,6 +105,7 @@ namespace DeviceCommand.Devices /// /// 触发一次波形采样 /// + /// 取消令牌 public virtual async Task 强制触发(CancellationToken ct = default) { await SendAsync($"::TRIGger:MODE FTRIG{ScpiDelimiter}", ct); @@ -136,6 +148,9 @@ namespace DeviceCommand.Devices /// /// 开启或关闭指定的模拟通道 (符合手册 57 页规范) /// + /// 通道号 (1 - 4) + /// true: 开启通道, false: 关闭通道 + /// 取消令牌 public virtual async Task 设置通道开关(int channel, bool enable, CancellationToken ct = default) { string state = enable ? "ON" : "OFF"; @@ -145,6 +160,9 @@ namespace DeviceCommand.Devices /// /// 设置指定通道的垂直电压档位 (Volts/Div) /// + /// 通道号 (1 - 4) + /// 电压档位 (Volts/Div) + /// 取消令牌 public virtual async Task 设置通道电压档位(int channel, double volts, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:VDIV {1:F4}{2}", channel, volts, ScpiDelimiter); @@ -154,6 +172,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道当前的电压档位 /// + /// 通道号 (1 - 4) + /// 取消令牌 + /// 当前电压档位值 (Volts/Div) public virtual async Task 查询通道电压档位(int channel, CancellationToken ct = default) { return await WriteReadAsync($"C{channel}:VDIV?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -162,6 +183,9 @@ namespace DeviceCommand.Devices /// /// 设置指定通道的垂直偏移量 (Offset) /// + /// 通道号 (1 - 4) + /// 垂直偏移量 (单位: V) + /// 取消令牌 public virtual async Task 设置通道垂直偏移(int channel, double offset, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "C{0}:OFST {1:F4}{2}", channel, offset, ScpiDelimiter); @@ -178,6 +202,13 @@ namespace DeviceCommand.Devices /// 1MΩ 阻抗 ONEM } + + /// + /// 设置指定通道的输入阻抗类型 + /// + /// 通道号 (1 - 4) + /// 阻抗类型枚举 (FIFty: 50Ω, ONEM: 1MΩ) + /// 取消令牌 public virtual async Task 设置通道阻抗(int channel, ImpedanceType impedance, CancellationToken ct = default) { // 例如发送:C1:IMPedance FIFty\n 或 C1:IMPedance ONEM\n @@ -192,6 +223,8 @@ namespace DeviceCommand.Devices /// /// 设置示波器的水平时基档位 (Time/Div) /// + /// 水平时基档位 (Time/Div) + /// 取消令牌 public virtual async Task 设置水平时基(double scale, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "TDIV {0:E6}{1}", scale, ScpiDelimiter); @@ -201,6 +234,8 @@ namespace DeviceCommand.Devices /// /// 设置示波器的触发水平延迟位置 (Horizontal Delay) /// + /// 水平延迟位置 (单位: s) + /// 取消令牌 public virtual async Task 设置水平延迟(double delay, CancellationToken ct = default) { string cmd = string.Format(CultureInfo.InvariantCulture, "TRDL {0:E6}{1}", delay, ScpiDelimiter); @@ -214,6 +249,8 @@ namespace DeviceCommand.Devices /// /// 设置边沿触发的电平值 (Trigger Level) /// + /// 触发电平值 (单位: V) + /// 取消令牌 public virtual async Task 设置触发电平(double level, CancellationToken ct = default) { @@ -224,6 +261,8 @@ namespace DeviceCommand.Devices /// /// 设置边沿触发的触发源 (例如: C1, C2, C3, C4, EX, LINE) /// + /// 触发源通道标识 (例如: "C1", "C2", "EX", "LINE") + /// 取消令牌 public virtual async Task 设置触发源(string source, CancellationToken ct = default) { await SendAsync($"TRSE EDGE,SR,{source.ToUpper()}{ScpiDelimiter}", ct); @@ -236,6 +275,10 @@ namespace DeviceCommand.Devices /// /// 查询指定通道自动测量项的当前实时测量数值 /// + /// 通道号 (1 - 4) + /// 测量参数名称 (如 "PKPK", "FREQ", "RMS" 等) + /// 取消令牌 + /// 测量参数的实时数值字符串 public virtual async Task 查询通道测量项参数(int channel, string paramName, CancellationToken ct = default) { string query = string.Format(CultureInfo.InvariantCulture, "C{0}:PAVA? {1}{2}", channel, paramName.ToUpper(), ScpiDelimiter); @@ -245,6 +288,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的电压峰峰值 (Vpp) /// + /// 通道号 (1 - 4) + /// 取消令牌 + /// 电压峰峰值 (Vpp) public virtual async Task 查询实际电压峰峰值(int channel, CancellationToken ct = default) { return await 查询通道测量项参数(channel, "PKPK", ct); @@ -253,6 +299,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的频率值 (Frequency) /// + /// 通道号 (1 - 4) + /// 取消令牌 + /// 频率值 (单位: Hz) public virtual async Task 查询实际频率(int channel, CancellationToken ct = default) { return await 查询通道测量项参数(channel, "FREQ", ct); @@ -261,6 +310,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的真均方根电压值 (Vrms) /// + /// 通道号 (1 - 4) + /// 取消令牌 + /// 真均方根电压值 (Vrms) public virtual async Task 查询实际电压均方根(int channel, CancellationToken ct = default) { return await 查询通道测量项参数(channel, "RMS", ct); @@ -269,6 +321,7 @@ namespace DeviceCommand.Devices #endregion #region 7. 屏幕截图导出子系统 + /// /// 【一键获取并保存截图】 /// 自动下发 :PRINt? PNG 指令,接收示波器返回的纯 PNG 二进制流并直接保存到指定路径。 /// @@ -323,4 +376,4 @@ namespace DeviceCommand.Devices #endregion } -} \ No newline at end of file +} diff --git a/DeviceCommand/Devices/SPAW7000.cs b/DeviceCommand/Devices/SPAW7000.cs index 07fe720..272c2d2 100644 --- a/DeviceCommand/Devices/SPAW7000.cs +++ b/DeviceCommand/Devices/SPAW7000.cs @@ -27,6 +27,7 @@ namespace DeviceCommand.Devices /// /// 清除状态命令。清除标准事件状态寄存器和错误队列 /// + /// 取消令牌 public virtual async Task 清除错误队列和状态字节(CancellationToken ct = default) { await SendAsync($"*CLS{ScpiDelimiter}", ct); @@ -42,6 +43,8 @@ namespace DeviceCommand.Devices /// /// 读取功率分析仪识别字符串(制造商、产品型号、系统 SN、软件版本号) /// + /// 取消令牌 + /// 设备标识字符串(制造商, 产品型号, 系统 SN, 软件版本号) public virtual async Task 查询设备标识(CancellationToken ct = default) { return await WriteReadAsync($"*IDN?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -50,6 +53,7 @@ namespace DeviceCommand.Devices /// /// 复位命令。使功率分析仪恢复到出厂默认配置状态 /// + /// 取消令牌 public virtual async Task 重置设备(CancellationToken ct = default) { await SendAsync($"*RST{ScpiDelimiter}", ct); @@ -58,6 +62,8 @@ namespace DeviceCommand.Devices /// /// 读取标准状态字节寄存器 /// + /// 取消令牌 + /// 标准状态字节寄存器值 public virtual async Task 读取状态字节(CancellationToken ct = default) { return await WriteReadAsync($"*STB?{ScpiDelimiter}", ScpiDelimiter, ct); @@ -70,6 +76,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的实时 RMS 电压值 (单位: V) /// + /// 通道号/单元号 + /// 取消令牌 + /// 实时 RMS 电压值 (单位: V) public virtual async Task 查询实际电压(int channel, CancellationToken ct = default) { // 1. 先配置 ITEM1 为指定通道的电压有效值 (URMS) @@ -84,6 +93,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的实时 RMS 电流值 (单位: A) /// + /// 通道号/单元号 + /// 取消令牌 + /// 实时 RMS 电流值 (单位: A) public virtual async Task 查询实际电流(int channel, CancellationToken ct = default) { // 1. 配置 ITEM1 为指定通道的电流有效值 (IRMS) @@ -98,6 +110,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的实时有功功率值 (单位: W) /// + /// 通道号/单元号 + /// 取消令牌 + /// 实时有功功率值 (单位: W) public virtual async Task 查询实际功率(int channel, CancellationToken ct = default) { // 1. 配置 ITEM1 为指定通道的有功功率 (P) @@ -112,6 +127,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的实时频率值 (单位: Hz) /// + /// 通道号/单元号 + /// 取消令牌 + /// 实时频率值 (单位: Hz) public virtual async Task 查询频率(int channel, CancellationToken ct = default) { // 1. 配置 ITEM1 为指定通道的电压频率 (FU) @@ -126,6 +144,9 @@ namespace DeviceCommand.Devices /// /// 查询指定通道的功率因数 (Power Factor) /// + /// 通道号/单元号 + /// 取消令牌 + /// 功率因数值 public virtual async Task 查询功率因数(int channel, CancellationToken ct = default) { // 1. 配置 ITEM1 为指定通道的功率因数 (LAMBda) @@ -204,6 +225,8 @@ namespace DeviceCommand.Devices /// /// 14. 查询仪器型号名称 /// + /// 取消令牌 + /// 仪器型号名称字符串 public virtual async Task 查询设备型号(CancellationToken ct = default) { return await WriteReadAsync($":SYSTem:MODel?{ScpiDelimiter}", ScpiDelimiter, ct); // @@ -212,6 +235,8 @@ namespace DeviceCommand.Devices /// /// 16. 查询仪器唯一序列号 /// + /// 取消令牌 + /// 仪器唯一序列号字符串 public virtual async Task 查询设备序列号(CancellationToken ct = default) { return await WriteReadAsync($":SYSTem:SERial?{ScpiDelimiter}", ScpiDelimiter, ct); // @@ -221,6 +246,7 @@ namespace DeviceCommand.Devices /// 15. 设置数值数据显示的分辨率 (5位或6位) /// /// 有效值只能为 5 或 6 + /// 取消令牌 public virtual async Task 设置显示分辨率(int resolution, CancellationToken ct = default) { if (resolution != 5 && resolution != 6) throw new ArgumentException("分辨率只能设置为 5 或 6 位"); @@ -230,6 +256,8 @@ namespace DeviceCommand.Devices /// /// 13. 设置或查询屏幕 LCD 的亮度级别 (1-10) /// + /// 亮度级别 (范围: 1 - 10) + /// 取消令牌 public virtual async Task 设置显示亮度(int brightness, CancellationToken ct = default) { if (brightness < 1 || brightness > 10) throw new ArgumentOutOfRangeException(nameof(brightness), "亮度范围必须在 1~10 之间"); @@ -239,6 +267,8 @@ namespace DeviceCommand.Devices /// /// 18. 设置或查询触摸锁的开/关状态 (锁定时防止人工误触触控屏) /// + /// true: 锁定触摸, false: 解锁触摸 + /// 取消令牌 public virtual async Task 设置屏幕触摸锁定(bool isLocked, CancellationToken ct = default) { string state = isLocked ? "ON" : "OFF"; @@ -249,6 +279,7 @@ namespace DeviceCommand.Devices /// 17. 设置或读取分析仪当前的系统内部时间 /// /// 格式必须为 "HH:MM:SS" + /// 取消令牌 public virtual async Task 设置系统时间(string timeStr, CancellationToken ct = default) { await SendAsync($":SYSTem:TIME \"{timeStr}\"{ScpiDelimiter}", ct); // @@ -256,4 +287,4 @@ namespace DeviceCommand.Devices #endregion } -} \ No newline at end of file +} diff --git a/TestingModule/ViewModels/CommandTreeViewModel.cs b/TestingModule/ViewModels/CommandTreeViewModel.cs index af240e0..938c7c2 100644 --- a/TestingModule/ViewModels/CommandTreeViewModel.cs +++ b/TestingModule/ViewModels/CommandTreeViewModel.cs @@ -192,21 +192,26 @@ namespace TestingModule.ViewModels var assembly = Assembly.LoadFrom(dllPath); Assemblies.Add(assembly); - // 加载对应的XML注释文件 (项目没有用到) - //string xmlPath = Path.ChangeExtension(dllPath, ".xml"); - //if (File.Exists(xmlPath)) - //{ - // try - // { - // XmlDocument xmlDoc = new XmlDocument(); - // xmlDoc.Load(xmlPath); - // _xmlDocumentCache[assembly.FullName!] = xmlDoc; - // } - // catch (Exception xmlEx) - // { - // LoggerHelper.WarnWithNotify($"加载XML注释失败: {Path.GetFileName(xmlPath)} - {xmlEx.Message}"); - // } - //} + //加载对应的XML注释文件 + string xmlPath = Path.ChangeExtension(dllPath, ".xml"); + if (File.Exists(xmlPath)) + { + try + { + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.Load(xmlPath); + XmlDocumentCache[assembly.FullName!] = xmlDoc; + LoggerHelper.Info($"[XML注释] 成功加载: {Path.GetFileName(xmlPath)} -> 程序集 [{assembly.FullName}]"); + } + catch (Exception xmlEx) + { + LoggerHelper.Warn($"加载XML注释失败: {Path.GetFileName(xmlPath)} - {xmlEx.Message}"); + } + } + else + { + LoggerHelper.Warn($"[XML注释] XML文件不存在: {xmlPath}"); + } } catch (Exception ex) { @@ -284,6 +289,7 @@ namespace TestingModule.ViewModels { Name = subProgram.Name, Tag = subProgram, + Tooltip = subProgram.FilePath }); } @@ -368,6 +374,7 @@ namespace TestingModule.ViewModels { Name = $"{method.Name}({paramText})", Tag = method, + Tooltip = GetMethodDocumentation(method), }; typeNode.Children.Add(methodNode); @@ -433,6 +440,95 @@ namespace TestingModule.ViewModels } } } + // 添加获取注释的方法 + private string? GetMethodDocumentation(MethodInfo method) + { + if (method.DeclaringType == null) return null; + + try + { + string assemblyName = method.DeclaringType.Assembly.FullName!; + if (!_xmlDocumentCache.TryGetValue(assemblyName, out XmlDocument? xmlDoc)) + { + LoggerHelper.Warn($"[XML注释] 缓存未命中: 程序集 [{assemblyName}],缓存包含 { _xmlDocumentCache.Count} 个条目: [{string.Join(", ", _xmlDocumentCache.Keys)}]"); + return null; + } + + // 生成XML文档中的成员ID + string memberName = $"M:{method.DeclaringType.FullName}.{method.Name}"; + var parameters = method.GetParameters(); + if (parameters.Length > 0) + { + memberName += "(" + string.Join(",", parameters.Select(p => p.ParameterType.FullName)) + ")"; + } + + // 查找注释节点 + XmlNode? memberNode = xmlDoc.SelectSingleNode($"//member[@name='{memberName}']"); + if (memberNode == null) + { + LoggerHelper.Warn($"[XML注释] 节点未找到: {memberName}"); + return null; + } + + // 获取摘要(summary) + var summaryNode = memberNode.SelectSingleNode("summary"); + string documentation = ""; + + if (summaryNode != null) + { + documentation += CleanXmlContent(summaryNode.InnerXml); + } + + // 获取参数注释(param) + var paramNodes = memberNode.SelectNodes("param"); + if (paramNodes != null && paramNodes.Count > 0) + { + documentation += "\n\n参数:"; + foreach (XmlNode paramNode in paramNodes) + { + string? paramName = paramNode.Attributes?["name"]?.Value; + if (!string.IsNullOrEmpty(paramName)) + { + documentation += $"\n • {paramName}: {CleanXmlContent(paramNode.InnerXml)}"; + } + } + } + + // 获取返回值注释(returns) + var returnsNode = memberNode.SelectSingleNode("returns"); + if (returnsNode != null) + { + documentation += $"\n\n返回值: {CleanXmlContent(returnsNode.InnerXml)}"; + } + + return string.IsNullOrWhiteSpace(documentation) + ? null + : System.Net.WebUtility.HtmlDecode(documentation.Trim()); + } + catch (Exception ex) + { + LoggerHelper.Warn($"获取注释失败: {method.Name} - {ex.Message}"); + return null; + } + } + + // 辅助方法:清理XML内容 + private string CleanXmlContent(string xmlContent) + { + return xmlContent + .Replace("", "") + .Replace("", "\n") + .Replace("", "") + .Replace("", "") + .Replace("", "") // 处理代码标签 + .Replace("", "") + .Replace("", "") + .Replace("", "") + .Trim(); + } + #endregion #region 指令添加 @@ -515,7 +611,7 @@ namespace TestingModule.ViewModels var newStep = new StepVM { Name = subProgram.Name, - StepType = "子程序" + StepType = "子程序", }; var jsonstr = File.ReadAllText($"{subProgram.FilePath}"); var tmp = JsonConvert.DeserializeObject(jsonstr); diff --git a/TestingModule/Views/CommandTree.xaml b/TestingModule/Views/CommandTree.xaml index 781144b..45bd7d3 100644 --- a/TestingModule/Views/CommandTree.xaml +++ b/TestingModule/Views/CommandTree.xaml @@ -53,7 +53,8 @@ - + + diff --git a/TestingModule/Views/SingleStepEdit.xaml b/TestingModule/Views/SingleStepEdit.xaml index cf3762c..8adf085 100644 --- a/TestingModule/Views/SingleStepEdit.xaml +++ b/TestingModule/Views/SingleStepEdit.xaml @@ -103,7 +103,7 @@ - + @@ -240,7 +240,7 @@ - + diff --git a/UIShare/UIViewModel/InstructionNodeVM.cs b/UIShare/UIViewModel/InstructionNodeVM.cs index 8d9617f..e280972 100644 --- a/UIShare/UIViewModel/InstructionNodeVM.cs +++ b/UIShare/UIViewModel/InstructionNodeVM.cs @@ -32,5 +32,12 @@ namespace UIShare.UIViewModel get => _tag; set => SetProperty(ref _tag, value); } + + private string? _tooltip; + public string? Tooltip + { + get => _tooltip; + set => SetProperty(ref _tooltip, value); + } } } \ No newline at end of file diff --git a/ZLGUSBCANFD/USBCANFD.cs b/ZLGUSBCANFD/USBCANFD.cs index fdc9fca..ac0a75a 100644 --- a/ZLGUSBCANFD/USBCANFD.cs +++ b/ZLGUSBCANFD/USBCANFD.cs @@ -358,6 +358,8 @@ namespace ZLGUSBCANFD /// 0 = 只发送一次;>0 = 按指定间隔循环发送(毫秒) /// 1 = CANFD,0 = CAN /// 是否成功启动/发送 + + [Browsable(false)] public virtual bool 发送DBC定义报文( uint 通道号, uint 帧ID, @@ -497,6 +499,7 @@ namespace ZLGUSBCANFD /// /// 单次发送 DBC 报文(调用方已持有通道锁)。 /// + [Browsable(false)] private bool 发送DBC定义报文单次(uint 通道号, uint 帧ID, Dictionary 信号物理值字典, int 是否使用CANFD) { uint chDbcHandle = _dbcHandles[通道号];