BOB/DeviceCommand/Device/PSB11000.cs

324 lines
11 KiB
C#

using Common.Attributes;
using DeviceCommand.Base;
using Logger;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class PSB11000 : Tcp
{
public PSB11000(string IpAddress, int port, int SendTimeout, int ReceiveTimeout)
{
ConfigureDevice(IpAddress, 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 (true);
}
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
// 查询设备信息
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($"*IDN?\r\n", "\n", ct: ct);
}
// 重置设备
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"*RST\r\n", ct);
}
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"OUTPut:PROTection:CLEar\r\n", ct);
}
// 打开输出
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"OUTPut ON\r\n", ct);
}
// 关闭输出
public virtual async Task (CancellationToken ct = default)
{
await SendAsync($"OUTPut OFF\r\n", ct);
}
// 设置远程控制
public virtual async Task (bool , CancellationToken ct = default)
{
await SendAsync($"SYSTem:LOCK {(激活 ? "ON" : "OFF")}\r\n", ct);
}
// 查询远程控制状态
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($"SYSTem:LOCK:OWNer?\r\n", "\n", ct: ct);
}
// 设置电压
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:VOLTage {电压}V\r\n", ct);
}
// 设置电流
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:CURRent {电流}A\r\n", ct);
}
// 设置功率
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:POWer {功率}W\r\n", ct);
}
// 设置电阻
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:RESistance {电阻}Ω\r\n", ct);
}
// 设置过压保护
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:VOLTage:PROTection {电压}V\r\n", ct);
}
// 设置过流保护
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:CURRent:PROTection {电流}A\r\n", ct);
}
// 设置过功率保护
public virtual async Task (double , CancellationToken ct = default)
{
await SendAsync($"SOURce:POWer:PROTection {功率}W\r\n", ct);
}
// 查询电压
public virtual async Task<double> (CancellationToken ct = default)
{
var str = await WriteReadAsync($"MEASure:VOLTage?\r\n", "\n", ct: ct);
return Convert.ToDouble(str);
}
// 查询电流
public virtual async Task<double> (CancellationToken ct = default)
{
var str = await WriteReadAsync($"MEASure:CURRent?\r\n", "\n", ct: ct);
return Convert.ToDouble(str);
}
// 查询功率
public virtual async Task<double> (CancellationToken ct = default)
{
var str = await WriteReadAsync($"MEASure:POWer?\r\n", "\n", ct: ct);
return Convert.ToDouble(str);
}
// 批量查询电压、电流、功率
public virtual async Task<(double , double , double )> (CancellationToken ct = default)
{
var str = await WriteReadAsync($"MEASure:ARRay?\r\n", "\n", ct: ct);
var values = str.Split(',');
return (
Convert.ToDouble(values[0]),
Convert.ToDouble(values[1]),
Convert.ToDouble(values[2])
);
}
// 查询标称电压
public virtual async Task<double> (CancellationToken ct = default)
{
var str = await WriteReadAsync($"SYSTem:NOMinal:VOLTage?\r\n", "\n", ct: ct);
return Convert.ToDouble(str);
}
// 查询标称电流
public virtual async Task<double> (CancellationToken ct = default)
{
var str = await WriteReadAsync($"SYSTem:NOMinal:CURRent?\r\n", "\n", ct: ct);
return Convert.ToDouble(str);
}
#region
// 激活指定通道
public virtual async Task (int , CancellationToken ct = default)
{
await SendAsync($"INST:SEL CH{通道号}\r\n", ct);
}
// 查询当前激活的通道
public virtual async Task<string> (CancellationToken ct = default)
{
return await WriteReadAsync($"INST:SEL?\r\n", "\n", ct);
}
// 激活所有通道
public virtual async Task (CancellationToken ct = default)
{
await SendAsync("INST:SEL ALL\r\n", ct);
}
// 设置指定通道电压
public virtual async Task (int , double , CancellationToken ct = default)
{
await SendAsync($"CH{通道号}:VOLT {电压}V\r\n", ct);
}
// 设置指定通道电流
public virtual async Task (int , double , CancellationToken ct = default)
{
await SendAsync($"CH{通道号}:CURR {电流}A\r\n", ct);
}
// 设置指定通道功率
public virtual async Task (int , double , CancellationToken ct = default)
{
await SendAsync($"CH{通道号}:POW {功率}W\r\n", ct);
}
// 设置指定通道 Sink 模式电流
public virtual async Task Sink电流(int , double , CancellationToken ct = default)
{
await SendAsync($"CH{通道号}:SINK:CURR {电流}A\r\n", ct);
}
// 启动指定通道输出
public virtual async Task (int , CancellationToken ct = default)
{
await SendAsync($"CH{通道号}:OUTP ON\r\n", ct);
}
// 关闭指定通道输出
public virtual async Task (int , CancellationToken ct = default)
{
await SendAsync($"CH{通道号}:OUTP OFF\r\n", ct);
}
// 同时启停所有通道输出
public virtual async Task (CancellationToken ct = default)
{
await SendAsync("INST:ALL:OUTP ON\r\n", ct);
}
public virtual async Task (CancellationToken ct = default)
{
await SendAsync("INST:ALL:OUTP OFF\r\n", ct);
}
// 查询指定通道的电压、电流和功率(批量)
public virtual async Task<(double , double , double )> (int , CancellationToken ct = default)
{
var str = await WriteReadAsync($"CH{通道号}:MEAS:ARR?\r\n", "\n", ct);
var values = str.Split(',');
return (
Convert.ToDouble(values[0]), // 电压
Convert.ToDouble(values[1]), // 电流
Convert.ToDouble(values[2]) // 功率
);
}
#endregion
}
}