You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.0 KiB
145 lines
4.0 KiB
|
2 weeks ago
|
# Power Supply Related Code
|
||
|
|
|
||
|
|
This file is a reference-only extraction. It is not compiled by the Housing app.
|
||
|
|
|
||
|
|
## Source Files
|
||
|
|
|
||
|
|
- `Services/EquipmentMeasurementSettings.cs`
|
||
|
|
- `Services/EquipmentMeasurementService.cs`
|
||
|
|
- `Services/IScpiClient.cs`
|
||
|
|
- `Services/TcpScpiClient.cs`
|
||
|
|
- `Services/SerialScpiClient.cs`
|
||
|
|
- `Services/VisaScpiClient.cs`
|
||
|
|
|
||
|
|
## Hardware.ini Keys
|
||
|
|
|
||
|
|
```ini
|
||
|
|
[Equipment]
|
||
|
|
Timeout=5000
|
||
|
|
SettleMilliseconds=300
|
||
|
|
PreBoardCommand=VOLT 5, (@2);OUTP ON, (@2)
|
||
|
|
PreBoardDelayMilliseconds=2000
|
||
|
|
LogoutCommand=OUTP OFF, (@1)
|
||
|
|
|
||
|
|
; E36233A Power Supply
|
||
|
|
CurrentConnection=LAN
|
||
|
|
CurrentResource=
|
||
|
|
CurrentIdnMatch=E36233A
|
||
|
|
CurrentHost=192.168.10.12
|
||
|
|
CurrentPort=5025
|
||
|
|
CurrentPortName=
|
||
|
|
CurrentBaudRate=9600
|
||
|
|
CurrentTerminator=LF
|
||
|
|
CurrentSetupCommand=OUTP ON, (@1)
|
||
|
|
CurrentCleanupCommand=OUTP OFF, (@1)
|
||
|
|
CurrentReadCommand=MEAS:CURR? (@1)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Settings Load Code
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
PreBoardCommand = GetString(values, "PreBoardCommand", string.Empty);
|
||
|
|
PreBoardDelayMilliseconds = GetInt(values, "PreBoardDelayMilliseconds", 0);
|
||
|
|
LogoutCommand = GetString(values, "LogoutCommand", string.Empty);
|
||
|
|
Current = LoadChannel(values, "Current", "MEAS:CURR? CH1", "E362");
|
||
|
|
```
|
||
|
|
|
||
|
|
## Pre-Board Output Control
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
public async Task<string> RunPreBoardCommandAsync()
|
||
|
|
{
|
||
|
|
var log = new StringBuilder();
|
||
|
|
if (IsDisabled(_settings.Current) || string.IsNullOrWhiteSpace(_settings.PreBoardCommand))
|
||
|
|
{
|
||
|
|
return string.Empty;
|
||
|
|
}
|
||
|
|
|
||
|
|
using var client = await CreateClientAsync("CURRENT", _settings.Current);
|
||
|
|
log.AppendLine($"> CURRENT PRE-BOARD CONNECT: {DescribeClient(client, _settings.Current)}");
|
||
|
|
log.AppendLine($"> CURRENT PRE-BOARD SETUP: {_settings.PreBoardCommand}");
|
||
|
|
await SendCommandListAsync(client, _settings.PreBoardCommand);
|
||
|
|
return log.ToString();
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Current Read Flow
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
if (!IsDisabled(_settings.Current) && !string.IsNullOrWhiteSpace(_settings.Current.SetupCommand))
|
||
|
|
{
|
||
|
|
currentClient = await CreateClientAsync("CURRENT", _settings.Current);
|
||
|
|
log.AppendLine($"> CURRENT PRE-READ CONNECT: {DescribeClient(currentClient, _settings.Current)}");
|
||
|
|
log.AppendLine($"> CURRENT PRE-READ SETUP: {_settings.Current.SetupCommand}");
|
||
|
|
await SendCommandListAsync(currentClient, _settings.Current.SetupCommand);
|
||
|
|
}
|
||
|
|
|
||
|
|
var current = currentClient is null
|
||
|
|
? await ReadChannelAsync("CURRENT", _settings.Current, log)
|
||
|
|
: await ReadChannelWithClientAsync("CURRENT", _settings.Current, currentClient, log, skipSetupCommand: true);
|
||
|
|
```
|
||
|
|
|
||
|
|
## Cleanup And Logout
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
private static async Task SendCleanupCommandAsync(IScpiClient? client, ScpiChannelSettings channel, StringBuilder log)
|
||
|
|
{
|
||
|
|
if (client is null || string.IsNullOrWhiteSpace(channel.CleanupCommand))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
log.AppendLine($"> CURRENT CLEANUP: {channel.CleanupCommand}");
|
||
|
|
await SendCommandListAsync(client, channel.CleanupCommand);
|
||
|
|
}
|
||
|
|
catch (Exception ex)
|
||
|
|
{
|
||
|
|
log.AppendLine($"> CURRENT CLEANUP FAILED: {ex.Message}");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
public async Task<string> RunLogoutCommandAsync()
|
||
|
|
{
|
||
|
|
var log = new StringBuilder();
|
||
|
|
if (IsDisabled(_settings.Current) || string.IsNullOrWhiteSpace(_settings.LogoutCommand))
|
||
|
|
{
|
||
|
|
return string.Empty;
|
||
|
|
}
|
||
|
|
|
||
|
|
using var client = await CreateClientAsync("CURRENT", _settings.Current);
|
||
|
|
log.AppendLine($"> CURRENT LOGOUT CONNECT: {DescribeClient(client, _settings.Current)}");
|
||
|
|
log.AppendLine($"> CURRENT LOGOUT: {_settings.LogoutCommand}");
|
||
|
|
await SendCommandListAsync(client, _settings.LogoutCommand);
|
||
|
|
return log.ToString();
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Protected Power-Off Command Guard
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
private static async Task SendCommandListAsync(IScpiClient client, string commands)
|
||
|
|
{
|
||
|
|
foreach (var command in SplitCommands(commands))
|
||
|
|
{
|
||
|
|
if (IsProtectedPowerOffCommand(command))
|
||
|
|
{
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
await client.SendAsync(command);
|
||
|
|
await Task.Delay(100);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
```csharp
|
||
|
|
private static bool IsProtectedPowerOffCommand(string command)
|
||
|
|
{
|
||
|
|
return Regex.IsMatch(command, @"^\s*OUTP(?:UT)?\s+OFF\s*,?\s*\(@2\)\s*$", RegexOptions.IgnoreCase);
|
||
|
|
}
|
||
|
|
```
|