BOB/DeviceCommand/Device/E36233A.cs
2025-12-02 15:43:08 +08:00

261 lines
8.0 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;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class E36233A : Tcp
{
public E36233A(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 ();
}
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
#region
/// <summary>
/// 设置当前操作通道
/// </summary>
public async Task (int , CancellationToken ct = default)
{
await SendAsync($"INST:NSEL {通道}\n", ct);
}
/// <summary>
/// 查询当前通道
/// </summary>
public async Task<string> (CancellationToken ct = default)
{
await SendAsync("INST:NSEL?\n", ct);
return await ReadAsync(ct: ct);
}
public async Task (CancellationToken ct = default)
{
await SendAsync("OUTP:PROT:CLE\n", ct);
}
public async Task (bool , CancellationToken ct = default)
{
await SendAsync($"OUTP {(开关 ? "ON" : "OFF")}\n", ct);
}
public async Task (CancellationToken ct = default)
{
await SendAsync("SYST:REM\n", ct);
}
public async Task (CancellationToken ct = default)
{
await SendAsync("SYST:BEEP\n", ct);
}
public async Task (double , CancellationToken ct = default)
{
await SendAsync($"CURR {电流}\n", ct);
}
public async Task OCP电流(double , CancellationToken ct = default)
{
await SendAsync($"CURR:PROT {电流}\n", ct);
}
public async Task OCP开关(bool , CancellationToken ct = default)
{
await SendAsync($"CURR:PROT:STAT {(开关 ? "ON" : "OFF")}\n", ct);
}
public async Task (double , CancellationToken ct = default)
{
await SendAsync($"VOLT {电压}\n", ct);
}
public async Task OVP电压(double , CancellationToken ct = default)
{
await SendAsync($"VOLT:PROT {电压}\n", ct);
}
public async Task OVP开关(bool , CancellationToken ct = default)
{
await SendAsync($"VOLT:PROT:STAT {(开关 ? "ON" : "OFF")}\n", ct);
}
public async Task (double , CancellationToken ct = default)
{
await SendAsync($"POW:PROT {功率值}\n", ct);
}
public async Task (bool , CancellationToken ct = default)
{
await SendAsync($"POW:PROT:STAT {(开关 ? "ON" : "OFF")}\n", ct);
}
public async Task (double , double , CancellationToken ct = default)
{
await SendAsync($"CURR:SLEW:UP {上升斜率}\n", ct);
await SendAsync($"CURR:SLEW:DOWN {下降斜率}\n", ct);
}
public async Task (double , double , CancellationToken ct = default)
{
await SendAsync($"VOLT:SLEW:UP {上升斜率}\n", ct);
await SendAsync($"VOLT:SLEW:DOWN {下降斜率}\n", ct);
}
public async Task (string , CancellationToken ct = default)
{
await SendAsync($"{指令}\n", ct);
}
/// <summary>
/// 查询设备基本信息
/// </summary>
public async Task<string> (CancellationToken ct = default)
{
await SendAsync("*IDN?\n", ct);
return await ReadAsync(ct: ct);
}
#endregion
#region
/// <summary>
/// 查询当前电压测量值
/// </summary>
public async Task<double> (CancellationToken ct = default)
{
await SendAsync("MEAS:VOLT?\n", ct);
string result = await ReadAsync(ct: ct);
return double.Parse(result);
}
/// <summary>
/// 查询当前电流测量值
/// </summary>
public async Task<double> (CancellationToken ct = default)
{
await SendAsync("MEAS:CURR?\n", ct);
string result = await ReadAsync(ct: ct);
return double.Parse(result);
}
/// <summary>
/// 查询当前功率测量值
/// </summary>
public async Task<double> (CancellationToken ct = default)
{
await SendAsync("MEAS:POW?\n", ct);
string result = await ReadAsync(ct: ct);
return double.Parse(result);
}
#endregion
}
}