SSPC-Tester/SSPCTester.Devices/Config/DeviceOptions.cs

150 lines
5.6 KiB
C#
Raw Normal View History

using SSPCTester.Devices.Interfaces;
namespace SSPCTester.Devices.Config;
/// <summary>
/// 根设备配置节点。对应 appsettings.json 中的 "Devices" 段。
/// </summary>
public sealed class DeviceOptions
{
public const string SectionName = "Devices";
/// <summary>旧版全局开关,仅用于兼容读取旧配置。</summary>
public bool MockMode { get; set; }
public SspcOptions Sspc { get; set; } = new();
public PowerSupplyOptions PowerSupply { get; set; } = new();
public LoadOptions Load { get; set; } = new();
public DaqOptions Daq { get; set; } = new();
public Pci2312Options Pci2312 { get; set; } = new();
}
/// <summary>
/// SSPC24 路 = 3 模块 × 8 路)的串口与 Modbus 配置。
/// </summary>
public sealed class SspcOptions
{
public bool UseMock { get; set; }
public bool AutoConnect { get; set; } = true;
public string PortName { get; set; } = "COM1";
public int BaudRate { get; set; } = 9600;
public int DataBits { get; set; } = 8;
public string Parity { get; set; } = "None";
public string StopBits { get; set; } = "One";
public int ReadTimeoutMs { get; set; } = 500;
public int Retry { get; set; } = 2;
public string DeviceProfilePath { get; set; } = "Config/device-profile.json";
public bool CloseAllRelaysOnDisconnect { get; set; }
public bool LogRawFrames { get; set; } = true;
// 旧字段保留用于兼容历史 appsettings业务通道数固定为 24。
public byte[] ModuleAddresses { get; set; } = new byte[] { 1, 2, 3 };
public int ChannelsPerModule { get; set; } = 8;
}
public sealed class PowerSupplyOptions
{
public bool UseMock { get; set; }
public bool AutoConnect { get; set; } = true;
public string PortName { get; set; } = "COM2";
public int BaudRate { get; set; } = 9600;
public string Host { get; set; } = "192.168.6.5";
public int Port { get; set; } = 5025;
public double TimeoutSeconds { get; set; } = 2;
public bool RequirePingBeforeConnect { get; set; } = true;
public string Terminator { get; set; } = "\n";
public string IdnCommand { get; set; } = "*IDN?";
public string VoltageCommand { get; set; } = "MEASure:VOLTage?";
public string CurrentCommand { get; set; } = "MEASure:CURRent?";
public string SetVoltageCommand { get; set; } = "VOLT {0}";
public string SetCurrentLimitCommand { get; set; } = "CURR {0}";
public string OutputStateCommand { get; set; } = "OUTP?";
public string ErrorCommand { get; set; } = "SYST:ERR?";
}
public enum LoadQueryMode
{
Combined,
Separate
}
public sealed class LoadOptions
{
public bool UseMock { get; set; }
public bool AutoConnect { get; set; } = true;
public string PortName { get; set; } = "COM3";
public int BaudRate { get; set; } = 9600;
public string Host { get; set; } = "192.168.200.100";
public int Port { get; set; } = 30000;
public double TimeoutSeconds { get; set; } = 3;
public string Terminator { get; set; } = "\n";
public int Channel { get; set; } = 1;
public bool UseFetch { get; set; } = true;
public LoadQueryMode QueryMode { get; set; } = LoadQueryMode.Combined;
public string SetModeCommand { get; set; } = "";
public string SetValueCommand { get; set; } = "{0} {1}";
public string ResetCommand { get; set; } = "*RST";
public string InputStateCommand { get; set; } = "INP?";
public string ErrorCommand { get; set; } = "SYST:ERR?";
}
public sealed class DaqOptions
{
public bool UseMock { get; set; }
public bool AutoConnect { get; set; } = true;
public int LogicalDeviceId { get; set; }
public int ChannelCount { get; set; } = 1;
public string InputRange { get; set; } = "PlusMinus5V";
public int ClockDivider { get; set; } = 1_000;
public double PreTriggerMs { get; set; } = 3;
public double PostTriggerMs { get; set; } = 100;
public List<DaqChannelOptions> Channels { get; set; } =
Enumerable.Range(0, 8).Select(i => new DaqChannelOptions
{
PhysicalChannel = i,
Role = i == 0 ? nameof(DaqChannelRole.OutputVoltage) : nameof(DaqChannelRole.Unconfigured),
Name = i == 0 ? "输出电压" : $"CH{i}",
IsCalibrated = i == 0
}).ToList();
[System.Text.Json.Serialization.JsonIgnore]
public int DeviceIndex { get => LogicalDeviceId; set => LogicalDeviceId = value; }
[System.Text.Json.Serialization.JsonIgnore]
public int SampleRateHz
{
get => (int)Math.Round(ActualSampleRateHz);
set => ClockDivider = value > 0
? Math.Max(1, (int)Math.Round(100_000_000.0 / value))
: 1_000;
}
[System.Text.Json.Serialization.JsonIgnore]
public double DurationSec => (PreTriggerMs + PostTriggerMs) / 1_000.0;
[System.Text.Json.Serialization.JsonIgnore]
public double ActualSampleRateHz => 100_000_000.0 / Math.Max(1, ClockDivider);
}
public sealed class DaqChannelOptions
{
public int PhysicalChannel { get; set; }
public string Role { get; set; } = "Unconfigured";
public string Name { get; set; } = "";
public double Scale { get; set; } = 1;
public double Offset { get; set; }
public bool IsCalibrated { get; set; }
}
public sealed class Pci2312Options
{
public bool Enabled { get; set; } = true;
public bool UseMock { get; set; }
public bool AutoConnect { get; set; } = true;
public int DeviceId { get; set; }
public int EmergencyInputChannel { get; set; }
public bool EmergencyInputActiveHigh { get; set; } = true;
public int AlarmOutputChannel { get; set; }
public bool AlarmOutputActiveHigh { get; set; } = true;
public int PollIntervalMs { get; set; } = 100;
}