diff --git a/MainWindow.IedBrowser.cs b/MainWindow.IedBrowser.cs
index cd58ea5a6..fd277a8c7 100644
--- a/MainWindow.IedBrowser.cs
+++ b/MainWindow.IedBrowser.cs
@@ -287,7 +287,7 @@ private async void IedBrowserReadValues_Click(object sender, RoutedEventArgs e)
}
var model = device.LiveDiscoveryModel ?? device.SclWorkspace?.DesignModel;
var currentPage = _iedBrowserNavigation.Current;
- var selectedDo = !readAll &&
+ var selectedDo = !readAll && sender is not Button { Tag: "LN" } &&
ReferenceEquals(_iedBrowserRenderedPage, currentPage) &&
currentPage?.Payload is LiveIedLogicalNodeModel
? _iedBrowserSelectedDoReference : null;
@@ -463,6 +463,15 @@ await _runtime.ReadBrowserValuesAsync(device, targets,
}
+ private void IedBrowserGooseSubscribe_Click(object sender, RoutedEventArgs e)
+ {
+ if (SelectedDevice is not { IsDemo: false } device ||
+ _iedBrowserRenderedPage?.Kind != "GoCB")
+ return;
+ // Shared Npcap-based subscriber, no second GOOSE receive/decoder path.
+ OpenIedGooseSubscriber(device);
+ }
+
private void RefreshIedBrowserReadButtons()
{
if (IedBrowserReadPageButton == null) return;
@@ -476,6 +485,16 @@ private void RefreshIedBrowserReadButtons()
// Opening a browsed SCL is always offline-safe. Explicit Read can then
// open a cached-model MMS association; no background connect or polling.
var selectedKind = IedBrowserReadPlan.SelectionKind(_iedBrowserNavigation.Current);
+ if (IedBrowserGooseSubscribeButton is not null)
+ {
+ IedBrowserGooseSubscribeButton.Visibility =
+ _iedBrowserRenderedPage?.Kind == "GoCB"
+ ? Visibility.Visible : Visibility.Collapsed;
+ IedBrowserGooseSubscribeButton.IsEnabled =
+ device is { IsDemo: false } && _iedBrowserReadOperation == null;
+ IedBrowserGooseSubscribeButton.Content = IsGooseCapturing
+ ? "View GOOSE Capture" : "Subscribe GOOSE";
+ }
IedBrowserReadPageButton.Content = selectedKind == IedBrowserReadSelectionKind.ReadOnlyRcb
? "Inspect RCB"
: connected ? "Read" : "Connect & Read";
@@ -490,6 +509,25 @@ private void RefreshIedBrowserReadButtons()
: connected
? "Read this model-verified object through bounded MMS reads."
: "Connect using this IED model and read selected values on demand; no RCB or cyclic polling.";
+ var focusedDo = selectedKind == IedBrowserReadSelectionKind.FcAttributes &&
+ _iedBrowserNavigation.Current?.Payload is LiveIedLogicalNodeModel &&
+ !string.IsNullOrWhiteSpace(_iedBrowserSelectedDoReference);
+ if (IedBrowserReadLnButton is not null)
+ {
+ IedBrowserReadLnButton.Visibility =
+ focusedDo ? Visibility.Visible : Visibility.Collapsed;
+ IedBrowserReadLnButton.IsEnabled = ready;
+ }
+ if (focusedDo)
+ {
+ IedBrowserReadPageButton.Content = "Read DO";
+ IedBrowserReadPageButton.ToolTip = "Read only " +
+ _iedBrowserSelectedDoReference +
+ "; choose Read LN for the entire Logical Node.";
+ }
+ else if (selectedKind == IedBrowserReadSelectionKind.FcAttributes &&
+ _iedBrowserNavigation.Current?.Payload is LiveIedLogicalNodeModel)
+ IedBrowserReadPageButton.Content = "Read LN";
IedBrowserReadPageButton.IsEnabled = ready;
IedBrowserReadAllButton.IsEnabled = ready;
IedBrowserCancelReadButton.IsEnabled = _iedBrowserReadOperation != null;
@@ -1209,9 +1247,7 @@ private void IedBrowserDetailRow_MouseUp(
_iedBrowserNavigation.Current?.Payload is LiveIedLogicalNodeModel)
{
_iedBrowserSelectedDoReference = detail.ReadObjectReference;
- IedBrowserReadPageButton.ToolTip =
- "Read all model-proven safe FC attributes in selected DO " +
- detail.ReadObjectReference + "; no writes or automatic polling.";
+ RefreshIedBrowserReadButtons(); // expose separate Read DO and Read LN scope
}
if (!detail.HasChildren) return;
ToggleIedBrowserDetails(detail);
@@ -1392,6 +1428,7 @@ private void RenderIedBrowserSelection(
connected, SelectedDevice?.SclWorkspace?.DesignModel));
_iedBrowserLastLiveVersion = -1;
RefreshIedBrowserVisibleValues();
+ RefreshIedBrowserReadButtons();
// Folder entry opens at its first child, regardless of the scroll
// position in the previously inspected RCB, LN or DataSet.
if (_iedBrowserDetails.Rows.Count > 0)
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 47027820e..2bcd87084 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -1983,10 +1983,18 @@
Style="{StaticResource SoftButton}" Margin="0,0,6,0"
Click="IedBrowserReadValues_Click"
ToolTip="Read values for the current Browser object over MMS. Live monitoring uses the report stream."/>
+
+