BOB/DeviceCommand/Device/PSB11000.cs
2025-11-21 17:11:06 +08:00

139 lines
5.6 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 System;
using System.Threading;
using System.Threading.Tasks;
namespace DeviceCommand.Device
{
[BOBCommand]
public class PSB11000 : ModbusTcp
{
public PSB11000(string IpAddress, int port, int SendTimeout, int ReceiveTimeout)
{
ConfigureDevice(IpAddress, port, SendTimeout, ReceiveTimeout);
}
public PSB11000() { }
#region
public virtual async Task SetRemoteControlAsync(bool activate, byte slaveAddress = 1, CancellationToken ct = default)
{
try
{
ushort value = (ushort)(activate ? 0xFF00 : 0x0000);
await WriteSingleRegisterAsync(slaveAddress, 402, value, ct);
}
catch (Exception) {
}
}
public virtual async Task SetOutputAsync(bool on, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(on ? 0xFF00 : 0x0000);
await WriteSingleRegisterAsync(slaveAddress, 405, value, ct);
}
public virtual async Task SetWorkModeAsync(bool useResistanceMode, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(useResistanceMode ? 0xFF00 : 0x0000);
await WriteSingleRegisterAsync(slaveAddress, 409, value, ct);
}
public virtual async Task ResetAlarmAsync(byte slaveAddress = 1, CancellationToken ct = default)
{
await WriteSingleRegisterAsync(slaveAddress, 411, 0xFF00, ct);
}
public virtual async Task<bool> QueryRemoteControlAsync(byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] result = await ReadHoldingRegistersAsync(slaveAddress, 402, 1, ct);
return result[0] == 0xFF00;
}
public virtual async Task<bool> QueryOutputAsync(byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] result = await ReadHoldingRegistersAsync(slaveAddress, 405, 1, ct);
return result[0] == 0xFF00;
}
public virtual async Task<bool> QueryWorkModeAsync(byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] result = await ReadHoldingRegistersAsync(slaveAddress, 409, 1, ct);
return result[0] == 0xFF00;
}
#endregion
#region ///
public virtual async Task SetVoltageAsync(double voltage, double ratedVoltage, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(voltage / ratedVoltage * 0xCCCC);
await WriteSingleRegisterAsync(slaveAddress, 500, value, ct);
}
public virtual async Task<double> GetVoltageAsync(double ratedVoltage, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] reg = await ReadHoldingRegistersAsync(slaveAddress, 500, 1, ct);
return reg[0] / (double)0xCCCC * ratedVoltage;
}
public virtual async Task SetCurrentAsync(double current, double ratedCurrent, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(current / ratedCurrent * 0xCCCC);
await WriteSingleRegisterAsync(slaveAddress, 501, value, ct);
}
public virtual async Task<double> GetCurrentAsync(double ratedCurrent, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] reg = await ReadHoldingRegistersAsync(slaveAddress, 501, 1, ct);
return reg[0] / (double)0xCCCC * ratedCurrent;
}
public virtual async Task SetPowerAsync(double power, double ratedPower, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(power / ratedPower * 0xCCCC);
await WriteSingleRegisterAsync(slaveAddress, 502, value, ct);
}
public virtual async Task<double> GetPowerAsync(double ratedPower, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] reg = await ReadHoldingRegistersAsync(slaveAddress, 502, 1, ct);
return reg[0] / (double)0xCCCC * ratedPower;
}
public virtual async Task SetResistanceAsync(double resistance, double maxResistance, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(resistance / maxResistance * 0xCCCC);
await WriteSingleRegisterAsync(slaveAddress, 503, value, ct);
}
public virtual async Task<double> GetResistanceAsync(double maxResistance, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] reg = await ReadHoldingRegistersAsync(slaveAddress, 503, 1, ct);
return reg[0] / (double)0xCCCC * maxResistance;
}
#endregion
// 后面三、四、五区域的所有方法也同样加上 virtual
// 例如:
public virtual async Task SetSinkPowerAsync(double power, double sinkRatedPower, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort value = (ushort)(power / sinkRatedPower * 0xCCCC);
await WriteSingleRegisterAsync(slaveAddress, 498, value, ct);
}
public virtual async Task<double> GetSinkPowerAsync(double sinkRatedPower, byte slaveAddress = 1, CancellationToken ct = default)
{
ushort[] reg = await ReadHoldingRegistersAsync(slaveAddress, 498, 1, ct);
return reg[0] / (double)0xCCCC * sinkRatedPower;
}
// 类似方法全部加上 virtual保证代理可以拦截
}
}