BOB/DeviceCommand/Device/SQ0030G1D.cs

257 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Common.Attributes;
using DeviceCommand.Base;
using Logger;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class SQ0030G1D : Tcp
{
public SQ0030G1D(string ip, int port, int sendTimeout, int receiveTimeout)
{
ConfigureDevice(ip, port, sendTimeout, receiveTimeout);
}
#region
private CancellationTokenSource _cancellationTokenSource;
private Task? _heartbeatTask;
private const int HeartbeatInterval = 3000;
public bool IsActive = false;
public int ReConnectionAttempts = 0;
public const int MaxReconnectAttempts = 10;
public override async Task<bool> ConnectAsync(CancellationToken ct = default)
{
await _commLock.WaitAsync(ct);
try
{
if (TcpClient != null && !TcpClient.Connected) TcpClient = new();
if (TcpClient.Connected)
{
return true;
}
await TcpClient.ConnectAsync(IPAddress, Port, ct);
IsActive = true;
StartHeartbeat();
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
_commLock.Release();
}
}
public override void Close()
{
if (!TcpClient.Connected)
{
throw new InvalidOperationException("TCP 没有连接成功");
}
if (TcpClient.Connected)
{
TcpClient.Close();
StopHeartbeat();
}
}
// 启动设备的心跳
public void StartHeartbeat()
{
if (_heartbeatTask != null)
return;
if (_cancellationTokenSource == null || _cancellationTokenSource.IsCancellationRequested)
_cancellationTokenSource = new();
_heartbeatTask = Task.Run(() => HeartbeatLoop(_cancellationTokenSource.Token));
}
// 停止设备的心跳
public void StopHeartbeat()
{
IsActive = false;
_cancellationTokenSource.Cancel();
_heartbeatTask = null;
}
private async Task HeartbeatLoop(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
await Task.Delay(HeartbeatInterval, ct);
try
{
await ();
}
catch (Exception ex)
{
IsActive = false;
ReConnectionAttempts++;
if (MaxReconnectAttempts < ReConnectionAttempts)
{
StopHeartbeat();
return;
}
await ReconnectDevice(ct);
}
}
}
private async Task ReconnectDevice(CancellationToken ct)
{
try
{
bool resultConnect = await ConnectAsync(ct);
if (resultConnect)
{
ReConnectionAttempts = 0;
}
}
catch (Exception ex)
{
}
}
#endregion
// ===================== 基础封装 =====================
protected virtual Task (string cmd, CancellationToken ct = default)
=> SendAsync(cmd + "\n", ct);
protected virtual async Task<string> (string cmd, CancellationToken ct = default)
{
await SendAsync(cmd + "\n", ct);
return await ReadAsync(ct: ct);
}
// ===================== 1. 基础控制 =====================
public async Task ()
{
await ($"OUTPut 1\n");
}
public async Task ()
{
await ($"OUTPut 0\n");
}
public virtual Task<string> ID(CancellationToken ct = default)
=> ("*IDN?", ct);
public virtual Task (CancellationToken ct = default)
=> ("*RST", ct);
public virtual Task (CancellationToken ct = default)
=> ("SYST:REM", ct);
public virtual Task (CancellationToken ct = default)
=> ("SYST:LOC", ct);
public virtual Task (bool on, CancellationToken ct = default)
=> ($"OUTP:STAT {(on ? "ON" : "OFF")}", ct);
public virtual async Task<bool> (CancellationToken ct = default)
=> (await ("OUTP:STAT?", ct)).Trim().ToUpper() == "ON";
// ===================== 2. 电压/频率控制 =====================
public virtual Task (double value, CancellationToken ct = default)
=> ($"VOLT {value}", ct);
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("VOLT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture);
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("FREQ?", ct)).Replace("Hz", ""), CultureInfo.InvariantCulture);
// ===================== 3. 保护 =====================
public virtual Task (double v, CancellationToken ct = default)
=> ($"VOLT:PROT {v}", ct);
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("VOLT:PROT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture);
public virtual Task (double a, CancellationToken ct = default)
=> ($"CURR:PROT {a}", ct);
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("CURR:PROT?", ct)).Replace("A", ""), CultureInfo.InvariantCulture);
public virtual Task (CancellationToken ct = default)
=> ("SYST:PROT:CLE", ct);
// ===================== 4. 测量 =====================
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("MEAS:VOLT?", ct)).Replace("V", ""), CultureInfo.InvariantCulture);
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("MEAS:CURR?", ct)).Replace("A", ""), CultureInfo.InvariantCulture);
public virtual async Task<double> (CancellationToken ct = default)
=> double.Parse((await ("MEAS:POW?", ct)).Replace("W", ""), CultureInfo.InvariantCulture);
public virtual async Task<(double volt, double curr, double pow)> (CancellationToken ct = default)
{
var parts = (await ("MEAS:ARR?", ct)).Split(',');
return (
double.Parse(parts[0].Replace("V", ""), CultureInfo.InvariantCulture),
double.Parse(parts[1].Replace("A", ""), CultureInfo.InvariantCulture),
double.Parse(parts[2].Replace("W", ""), CultureInfo.InvariantCulture)
);
}
// 切换到远程控制模式
public virtual Task (CancellationToken ct = default)
=> ("SYST:REM", ct);
// 切换到本地控制模式
public virtual Task (CancellationToken ct = default)
=> ("SYST:LOC", ct);
// 设定三相电压高低档
public virtual Task (int range, CancellationToken ct = default)
=> ($"OUTP:RANG {range}", ct); // 设定高低档166低档/333高档
// 设定通用输出电压
public virtual Task (double value, CancellationToken ct = default)
=> ($"VOLT {value}", ct);
// 设定三相输出电压
public virtual Task (double U, double V, double W, CancellationToken ct = default)
=> ($"VOLT:PHAS A, {U}, B, {V}, C, {W}", ct);
// 设定输出频率
public virtual Task (double freq, CancellationToken ct = default)
=> ($"FREQ {freq}", ct);
// 设定步阶输出电压
public virtual Task (double targetVoltage, double stepTime, CancellationToken ct = default)
=> ($"TRIG:TRAN:VOLT:STEP {targetVoltage}, {stepTime}", ct);
// 设定步阶输出频率
public virtual Task (double targetFrequency, double stepTime, CancellationToken ct = default)
=> ($"TRIG:TRAN:FREQ:STEP {targetFrequency}, {stepTime}", ct);
// 设定渐变输出电压
public virtual Task (double startVoltage, double endVoltage, double sweepTime, CancellationToken ct = default)
=> ($"TRIG:TRAN:VOLT:SWEEP {startVoltage}, {endVoltage}, {sweepTime}", ct);
// 设定渐变输出频率
public virtual Task (double startFreq, double endFreq, double sweepTime, CancellationToken ct = default)
=> ($"TRIG:TRAN:FREQ:SWEEP {startFreq}, {endFreq}, {sweepTime}", ct);
// 设定软件启动功能起始电压与额定电压
public virtual Task (double startVoltage, double ratedVoltage, CancellationToken ct = default)
=> ($"PON:VOLT {startVoltage}, {ratedVoltage}", ct);
// 设定软件启动功能起始电压与起始频率
public virtual Task (double startVoltage, double startFrequency, CancellationToken ct = default)
=> ($"PON:FREQ {startVoltage}, {startFrequency}", ct);
}
}