[WIP] Status bar
This commit is contained in:
@@ -21,6 +21,11 @@ namespace PamhagenSysCtrl.Helpers {
|
|||||||
FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown
|
FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown, FillState.Unknown
|
||||||
], default);
|
], default);
|
||||||
|
|
||||||
|
public string? PlcPortName => Plc?.PortName;
|
||||||
|
public T1.Status? LastPlcStatus => Plc?.LastPlcStatus;
|
||||||
|
public T1Error? LastPlcError => Plc?.LastPlcError;
|
||||||
|
public long? LastRttNs { get; private set; }
|
||||||
|
|
||||||
public bool IsValveOpen(int n) => !IsValveClosed(n);
|
public bool IsValveOpen(int n) => !IsValveClosed(n);
|
||||||
public bool IsValveClosed(int n) => Sensors.GetDS(n);
|
public bool IsValveClosed(int n) => Sensors.GetDS(n);
|
||||||
public bool WantValveClosed(int n) => !WantValveOpen(n);
|
public bool WantValveClosed(int n) => !WantValveOpen(n);
|
||||||
@@ -133,14 +138,17 @@ namespace PamhagenSysCtrl.Helpers {
|
|||||||
|
|
||||||
protected async void BackgroundLoop(object? parameters) {
|
protected async void BackgroundLoop(object? parameters) {
|
||||||
while (IsRunning && Plc != null) {
|
while (IsRunning && Plc != null) {
|
||||||
|
var start = DateTime.Now;
|
||||||
try {
|
try {
|
||||||
if (ActuatorsChanged) {
|
if (ActuatorsChanged) {
|
||||||
await Plc.WriteOutputs(Actuators);
|
await Plc.WriteOutputs(Actuators);
|
||||||
ActuatorsChanged = false;
|
ActuatorsChanged = false;
|
||||||
}
|
}
|
||||||
Sensors = await Plc.ReadInputs();
|
Sensors = await Plc.ReadInputs();
|
||||||
|
LastRttNs = (long)(DateTime.Now - start).TotalNanoseconds;
|
||||||
RaiseUpdateEvent(new());
|
RaiseUpdateEvent(new());
|
||||||
} catch (Exception exc) {
|
} catch (Exception exc) {
|
||||||
|
LastRttNs = null;
|
||||||
var str = "Bei der SPS ist ein Fehler aufgetreten:\n\n" + exc.Message;
|
var str = "Bei der SPS ist ein Fehler aufgetreten:\n\n" + exc.Message;
|
||||||
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
|
||||||
MessageBox.Show(str, "SPS-Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBox.Show(str, "SPS-Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ namespace PamhagenSysCtrl.Helpers {
|
|||||||
|
|
||||||
protected readonly T1 Plc;
|
protected readonly T1 Plc;
|
||||||
|
|
||||||
|
public string PortName => Plc.PortName;
|
||||||
|
public T1.Status LastPlcStatus => Plc.LastStatus;
|
||||||
|
public T1Error LastPlcError => Plc.LastError;
|
||||||
|
|
||||||
public PamhagenPlc(string portName, Parity parity = Parity.Odd) {
|
public PamhagenPlc(string portName, Parity parity = Parity.Odd) {
|
||||||
Plc = new T1(portName, parity);
|
Plc = new T1(portName, parity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,12 +10,16 @@ namespace PamhagenSysCtrl.Helpers {
|
|||||||
|
|
||||||
protected SerialPort Serial;
|
protected SerialPort Serial;
|
||||||
|
|
||||||
|
public string PortName => Serial.PortName;
|
||||||
|
public Status LastStatus { get; private set; }
|
||||||
|
public T1Error LastError { get; private set; }
|
||||||
|
|
||||||
public T1(string portName, Parity parity = Parity.Odd) {
|
public T1(string portName, Parity parity = Parity.Odd) {
|
||||||
Serial = new SerialPort(portName, 9600, parity, 8, StopBits.One) {
|
Serial = new SerialPort(portName, 9600, parity, 8, StopBits.One) {
|
||||||
Handshake = Handshake.None,
|
Handshake = Handshake.None,
|
||||||
NewLine = "\r",
|
NewLine = "\r",
|
||||||
ReadTimeout = 1000,
|
ReadTimeout = 500,
|
||||||
WriteTimeout = 1000,
|
WriteTimeout = 500,
|
||||||
DtrEnable = true,
|
DtrEnable = true,
|
||||||
RtsEnable = true,
|
RtsEnable = true,
|
||||||
Encoding = Encoding.ASCII,
|
Encoding = Encoding.ASCII,
|
||||||
@@ -97,14 +101,16 @@ namespace PamhagenSysCtrl.Helpers {
|
|||||||
public async Task<Status> StatusRead() {
|
public async Task<Status> StatusRead() {
|
||||||
await SendCommand("ST", checksum: false);
|
await SendCommand("ST", checksum: false);
|
||||||
var (_, res) = await ReceiveResponse("ST");
|
var (_, res) = await ReceiveResponse("ST");
|
||||||
return new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0'));
|
LastStatus = new Status((Mode)(res[3] - '0'), ((res[0] - '0') << 4) | (res[1] - '0'));
|
||||||
|
return LastStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<T1Error> ErrorStatusRead() {
|
public async Task<T1Error> ErrorStatusRead() {
|
||||||
await SendCommand("ER", checksum: false);
|
await SendCommand("ER", checksum: false);
|
||||||
var (_, res) = await ReceiveResponse("ER");
|
var (_, res) = await ReceiveResponse("ER");
|
||||||
var code = Convert.ToInt32(res, 10);
|
var code = Convert.ToInt32(res, 10);
|
||||||
return Enum.IsDefined(typeof(T1Error), code) ? (T1Error)code : T1Error.UNKNOWN_ERROR;
|
LastError = Enum.IsDefined(typeof(T1Error), code) ? (T1Error)code : T1Error.UNKNOWN_ERROR;
|
||||||
|
return LastError;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<ushort[]> DataRead(string register, int length) {
|
public Task<ushort[]> DataRead(string register, int length) {
|
||||||
|
|||||||
@@ -227,7 +227,44 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<StatusBar Grid.Row="2" BorderThickness="0,1,0,0" BorderBrush="Gray">
|
<StatusBar Grid.Row="2" BorderThickness="0,1,0,0" BorderBrush="Gray">
|
||||||
|
<StatusBar.ItemsPanel>
|
||||||
|
<ItemsPanelTemplate>
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="2*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="3*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="1*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="2*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
</Grid>
|
||||||
|
</ItemsPanelTemplate>
|
||||||
|
</StatusBar.ItemsPanel>
|
||||||
|
<StatusBarItem>
|
||||||
|
<TextBlock>
|
||||||
|
SPS-Verbindung: <Run x:Name="Status_Connection" Text="-"/>
|
||||||
|
</TextBlock>
|
||||||
|
</StatusBarItem>
|
||||||
|
<Separator Grid.Column="1"/>
|
||||||
|
<StatusBarItem Grid.Column="2">
|
||||||
|
<TextBlock>
|
||||||
|
SPS-Status: <Run x:Name="Status_Plc" Text="-"/>
|
||||||
|
</TextBlock>
|
||||||
|
</StatusBarItem>
|
||||||
|
<Separator Grid.Column="3"/>
|
||||||
|
<StatusBarItem Grid.Column="4">
|
||||||
|
<TextBlock>
|
||||||
|
Druckluft: <Run x:Name="Status_CompressedAir" Text="-"/>
|
||||||
|
</TextBlock>
|
||||||
|
</StatusBarItem>
|
||||||
|
<Separator Grid.Column="5"/>
|
||||||
|
<StatusBarItem Grid.Column="6">
|
||||||
|
<TextBlock>
|
||||||
|
Ventile offen: <Run x:Name="Status_ValvesOpen" Text="-"/>
|
||||||
|
</TextBlock>
|
||||||
|
</StatusBarItem>
|
||||||
</StatusBar>
|
</StatusBar>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
|
|||||||
@@ -502,6 +502,8 @@ namespace PamhagenSysCtrl.Windows {
|
|||||||
foreach (var n in Graph.Nodes) {
|
foreach (var n in Graph.Nodes) {
|
||||||
if (n is Pump p) {
|
if (n is Pump p) {
|
||||||
p.Highlight = null;
|
p.Highlight = null;
|
||||||
|
} else if (n is PipeJoin j) {
|
||||||
|
j.Highlight = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -593,7 +595,12 @@ namespace PamhagenSysCtrl.Windows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void OnUpdate(object? sender, PlantEventArgs? evt) {
|
public void OnUpdate(object? sender, PlantEventArgs? evt) {
|
||||||
if (sender is not PamhagenPlant plant) return;
|
if (App.Plant is PamhagenPlant p) {
|
||||||
|
Status_Connection.Text = $"Ja ({p.PlcPortName}" + (p.LastRttNs != null ? $", {p.LastRttNs / 1000000.0:N0} ms" : "") + ")";
|
||||||
|
Status_Plc.Text = $"{p.LastPlcStatus?.Mode} ({p.LastPlcStatus?.Flags:X3}) / {p.LastPlcError?.GetName()} ({(int?)p.LastPlcError:0000})";
|
||||||
|
Status_CompressedAir.Text = Enumerable.Range(1, 57).Any(p.IsValveClosed) ? "Ein" : Enumerable.Range(1, 57).Any(p.WantValveClosed) ? "Aus" : "?";
|
||||||
|
Status_ValvesOpen.Text = Enumerable.Range(1, 57).Count(p.IsValveOpen) + " / " + Enumerable.Range(1, 57).Count(p.WantValveOpen) + " / 57";
|
||||||
|
}
|
||||||
UpdateScheme(Mouse.GetPosition(SchemeCanvas), Mouse.LeftButton == MouseButtonState.Pressed);
|
UpdateScheme(Mouse.GetPosition(SchemeCanvas), Mouse.LeftButton == MouseButtonState.Pressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user