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

208 lines
7.4 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.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class IT6724CReverse : Serial_Port
{
public IT6724CReverse(string COMPort, int BaudRate, int DataBits, StopBits stopBits, Parity parity, int ReadTimeout, int ReceiveTimeout)
{
ConfigureDevice(COMPort, BaudRate, DataBits, stopBits, parity, ReadTimeout, 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 (SerialPort.IsOpen)
SerialPort.Close();
SerialPort.PortName = PortName;
SerialPort.BaudRate = BaudRate;
SerialPort.DataBits = DataBits;
SerialPort.StopBits = StopBits;
SerialPort.Parity = Parity;
SerialPort.ReadTimeout = ReadTimeout;
SerialPort.WriteTimeout = WriteTimeout;
if (SerialPort.IsOpen) return true;
SerialPort.Open();
IsActive = true;
StartHeartbeat();
return true;
}
finally
{
commLock.Release();
}
}
public override void Close()
{
StopHeartbeat();
if (SerialPort.IsOpen) SerialPort.Close();
}
public void StartHeartbeat()
{
if (_heartbeatTask != null && !_heartbeatTask.IsCompleted)
return;
_cancellationTokenSource?.Cancel();
_cancellationTokenSource?.Dispose();
_cancellationTokenSource = new CancellationTokenSource();
_heartbeatTask = Task.Run(() => HeartbeatLoop(_cancellationTokenSource.Token));
}
public void StopHeartbeat()
{
try
{
IsActive = false;
_cancellationTokenSource.Cancel();
_heartbeatTask = null;
}
catch { }
_heartbeatTask = null;
}
private async Task HeartbeatLoop(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
await Task.Delay(HeartbeatInterval, ct);
try
{
await (ct);
}
catch (Exception ex)
{
IsActive = false;
ReConnectionAttempts++;
if (ReConnectionAttempts > MaxReconnectAttempts)
{
LoggerHelper.InfoWithNotify("IT6724C重连多次失败");
StopHeartbeat();
return;
}
await ReconnectDevice(ct);
}
}
}
private async Task ReconnectDevice(CancellationToken ct)
{
try
{
bool ok = await ConnectAsync(ct);
if (ok)
ReConnectionAttempts = 0;
}
catch { }
}
#endregion
#region
public virtual async Task (CancellationToken ct = default)
=>await SendAsync("PROTection:CLEar\r\n", ct);
public virtual async Task (bool , CancellationToken ct = default)
=>await SendAsync($"OUTPut {(开关 ? 1 : 0)}\r\n", ct);
public virtual async Task (CancellationToken ct = default)
=>await SendAsync("SYSTem:REMote\r\n", ct);
public virtual async Task (CancellationToken ct = default)
=>await SendAsync("SYSTem:BEEPer\r\n", ct);
public virtual async Task (double , CancellationToken ct = default)
=>await SendAsync($"CURRent {电流}\r\n", ct);
public virtual async Task OCP电流(double , CancellationToken ct = default)
=>await SendAsync($"CURRent:PROTection {电流}\r\n", ct);
public virtual async Task OCP开关(bool , CancellationToken ct = default)
=>await SendAsync($"CURRent:PROTection:STATe {(开关 ? 1 : 0)}\r\n", ct);
public virtual async Task (double , CancellationToken ct = default)
=>await SendAsync($"VOLTage {电压}\r\n", ct);
public virtual async Task OVP电压(double , CancellationToken ct = default)
=>await SendAsync($"VOLT:PROTection {电压}\r\n", ct);
public virtual async Task OVP开关(bool , CancellationToken ct = default)
=>await SendAsync($"VOLT:PROTection:STATe {(开关 ? 1 : 0)}\r\n", ct);
public virtual async Task (double , CancellationToken ct = default)
=>await SendAsync($"POWer:PROTection {电压}\r\n", ct);
public virtual async Task (bool , CancellationToken ct = default)
=>await SendAsync($"POWer:PROTection:STATe {(开关 ? 1 : 0)}\r\n", ct);
public virtual async Task (double , double , CancellationToken ct = default)
=>await SendAsync($"CURRent:SLEW {上升斜率},{下降斜率}\r\n", ct);
public virtual async Task (double , double , CancellationToken ct = default)
=>await SendAsync($"VOLTage:SLEW {上升斜率},{下降斜率}\r\n", ct);
public virtual async Task (string , CancellationToken ct = default)
=>await SendAsync($"{指令}\r\n", ct);
public virtual async Task<string> (CancellationToken ct = default)
{
await SendAsync("*IDN?\r\n", ct);
return await ReadAsync(ct: ct);
}
/// <summary>
/// 查询实际输出电流单位A
/// </summary>
public virtual async Task<double> (CancellationToken ct = default)
{
await SendAsync("MEASure:CURRent?\r\n", ct);
var result = await ReadAsync(ct: ct);
return Convert.ToDouble(result);
}
/// <summary>
/// 查询实际输出电压单位V
/// </summary>
public virtual async Task<double> (CancellationToken ct = default)
{
await SendAsync("MEASure:VOLTage?\r\n", ct);
var result = await ReadAsync(ct: ct);
return Convert.ToDouble(result);
}
/// <summary>
/// 查询实际输出功率单位W
/// </summary>
public virtual async Task<double> (CancellationToken ct = default)
{
await SendAsync("MEASure:POWer?\r\n", ct);
var result = await ReadAsync(ct: ct);
return Convert.ToDouble(result);
}
#endregion
}
}