Add cross-platform OPC UA client stack: shared library, CLI tool, and Avalonia UI

Implements Client.Shared (IOpcUaClientService with connection lifecycle, failover,
browse, read/write, subscriptions, alarms, history, redundancy), Client.CLI (8 CliFx
commands mirroring tools/opcuacli-dotnet), and Client.UI (Avalonia desktop app with
tree browser, read/write, subscriptions, alarms, and history tabs). All three target
.NET 10 and are covered by 249 unit tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-03-30 15:49:42 -04:00
parent 50b85d41bd
commit a2883b82d9
109 changed files with 8571 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:ZB.MOM.WW.LmxOpcUa.Client.UI.ViewModels"
x:Class="ZB.MOM.WW.LmxOpcUa.Client.UI.Views.AlarmsView"
x:DataType="vm:AlarmsViewModel">
<DockPanel Margin="8">
<!-- Controls -->
<StackPanel DockPanel.Dock="Top" Spacing="8">
<TextBlock Text="Alarm Monitoring" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBox Text="{Binding MonitoredNodeIdText}" Width="250" Watermark="Source Node ID (optional)" />
<NumericUpDown Value="{Binding Interval}" Minimum="100" Maximum="60000" Width="120" />
<Button Content="Subscribe" Command="{Binding SubscribeCommand}" />
<Button Content="Unsubscribe" Command="{Binding UnsubscribeCommand}" />
<Button Content="Refresh" Command="{Binding RefreshCommand}" />
</StackPanel>
</StackPanel>
<!-- Alarm Events -->
<DataGrid ItemsSource="{Binding AlarmEvents}"
AutoGenerateColumns="False"
IsReadOnly="True"
Margin="0,8,0,0">
<DataGrid.Columns>
<DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="180" />
<DataGridTextColumn Header="Source" Binding="{Binding SourceName}" Width="120" />
<DataGridTextColumn Header="Condition" Binding="{Binding ConditionName}" Width="120" />
<DataGridTextColumn Header="Severity" Binding="{Binding Severity}" Width="80" />
<DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="200" />
<DataGridCheckBoxColumn Header="Active" Binding="{Binding ActiveState}" Width="60" />
<DataGridCheckBoxColumn Header="Acked" Binding="{Binding AckedState}" Width="60" />
<DataGridCheckBoxColumn Header="Retain" Binding="{Binding Retain}" Width="60" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</UserControl>