-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIedConfigurationWizardWindow.xaml
More file actions
298 lines (282 loc) · 24.5 KB
/
Copy pathIedConfigurationWizardWindow.xaml
File metadata and controls
298 lines (282 loc) · 24.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
<Window x:Class="Ari61850Bridge.IedConfigurationWizardWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="IED Configuration Wizard" Height="800" Width="1240"
MinHeight="730" MinWidth="1120"
WindowStartupLocation="CenterOwner" Background="{StaticResource Bg}"
FontFamily="Aptos, Segoe UI Variable Text, Segoe UI, Calibri" Icon="Assets/app-icon.ico">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,14">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Width="46" Height="46" CornerRadius="14" ClipToBounds="True" Margin="0,0,14,0">
<Image Source="Assets/app-icon.png" Width="46" Height="46" RenderOptions.BitmapScalingMode="HighQuality"/>
</Border>
<StackPanel Grid.Column="1" VerticalAlignment="Center">
<TextBlock Text="Configure IED" FontSize="25" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Guided workflow: select IEC 61850 tags → choose report plan → build Modbus/MQTT gateway runtime" FontSize="12.8" Foreground="{StaticResource Muted}" Margin="0,4,0,0"/>
</StackPanel>
<Button Grid.Column="2" Content="×" Width="42" Height="42" Style="{StaticResource SoftButton}" Click="Cancel_Click"/>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition Width="16"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Selectable wizard navigation. These are real workflow steps, not decorative cards. -->
<Border Grid.Column="0" Style="{StaticResource Card}" Padding="10">
<StackPanel>
<Button Tag="0" Click="StepNav_Click" Style="{StaticResource SoftButton}" Margin="0,0,0,10" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="1 Select IEC Signals" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Choose SCADA-ready MMS objects. Raw attributes stay available for advanced use." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
<Button Tag="1" Click="StepNav_Click" Style="{StaticResource SoftButton}" Margin="0,0,0,10" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="2 Modbus Binding" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Map selected signals into DI / IR / HR addresses without overlap." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
<Button Tag="2" Click="StepNav_Click" Style="{StaticResource SoftButton}" Margin="0,0,0,10" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="3 Report Plan" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Choose BRCB/URCB and DataSet once during engineering. Runtime keeps the plan." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
<Button Tag="3" Click="StepNav_Click" Style="{StaticResource SoftButton}" Padding="14,12">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="4 Add to Runtime" FontSize="13.4" FontWeight="SemiBold"/>
<TextBlock Text="Validate and save the IED configuration to Explorer, Modbus and MQTT." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="11.6" Margin="0,5,0,0"/>
</StackPanel>
</Button>
</StackPanel>
</Border>
<Border Grid.Column="2" Style="{StaticResource Card}" Padding="12">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding StepTitle}" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="{Binding StepSubtitle}" FontSize="12.4" Foreground="{StaticResource Muted}" Margin="0,3,0,0"/>
</StackPanel>
<TextBlock Grid.Column="1" Text="{Binding VisibleSignalCountText}" Foreground="{StaticResource Muted}" FontSize="12.2" VerticalAlignment="Bottom"/>
</Grid>
<!-- STEP 1: IEC SIGNAL SELECTION -->
<Grid Grid.Row="1" Visibility="{Binding Step1Visibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" MinWidth="350" Margin="0,0,12,0" ToolTip="Search by LN, signal name, IEC object reference, type, or category"/>
<WrapPanel Grid.Column="1" VerticalAlignment="Center">
<Button Content="⛓ Position" Tag="Pos stVal CSWI XCBR XSWI" Style="{StaticResource MiniChipButton}" Click="QuickFilter_Click" Margin="0,0,6,0"/>
<Button Content="🛡 Protection" Tag="PTOC PTRC PDIF PDIS Op general Tr general Str general" Style="{StaticResource MiniChipButton}" Click="QuickFilter_Click" Margin="0,0,6,0"/>
<Button Content="〽 MMXU cVal" Tag="MMXU cVal mag f" Style="{StaticResource MiniChipButton}" Click="QuickFilter_Click" Margin="0,0,6,0"/>
<Button Content="✓ Select Recommended" Style="{StaticResource MiniChipButton}" Click="SelectRecommended_Click" Margin="0,0,6,0"/>
<Button Content="⚡ Probe Selected" Style="{StaticResource MiniChipButton}" Click="ProbeSelected_Click" Margin="0,0,6,0"/>
<Button Content="× Clear Selection" Style="{StaticResource MiniChipButton}" Click="ClearSelection_Click" Margin="0,0,6,0"/>
<CheckBox Content="Advanced raw" IsChecked="{Binding ShowRaw}" VerticalAlignment="Center" Margin="5,0,10,0"/>
<Button Content="⌫ Clear Filter" Style="{StaticResource MiniChipButton}" Click="ClearFilter_Click"/>
</WrapPanel>
</Grid>
<DataGrid Grid.Row="1" ItemsSource="{Binding SignalsView}" Style="{StaticResource ModernDataGrid}" ToolTip="Select a row and press Ctrl+C to copy it for debugging.">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Use" Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" Width="54"/>
<DataGridTextColumn Header="IEC Reference" Binding="{Binding ObjectReference}" Width="360" MinWidth="280" IsReadOnly="True"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="120" IsReadOnly="True"/>
<DataGridTextColumn Header="Timestamp" Binding="{Binding DeviceTimestamp}" Width="140" IsReadOnly="True"/>
<DataGridTextColumn Header="Quality" Binding="{Binding Quality}" Width="120" IsReadOnly="True"/>
<DataGridTextColumn Header="Probe" Binding="{Binding ProbeStatus}" Width="130" IsReadOnly="True"/>
<DataGridTextColumn Header="Type" Binding="{Binding DataType}" Width="85" IsReadOnly="True"/>
<DataGridTextColumn Header="RCB Plan" Binding="{Binding ReportPlan}" Width="150" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<!-- STEP 2: MODBUS BINDING -->
<Grid Grid.Row="1" Visibility="{Binding Step2Visibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Selected signals are converted to a clean Modbus map. Position first, protection second, measurement last." Foreground="{StaticResource Muted}" FontSize="12.4" VerticalAlignment="Center"/>
<WrapPanel Grid.Column="1">
<Button Content="↻ Rebuild Binding" Style="{StaticResource PrimaryButton}" Click="RebuildBinding_Click" Margin="0,0,8,0"/>
<Button Content="− Remove Binding" Style="{StaticResource SoftButton}" Click="RemoveBinding_Click" Margin="0,0,8,0"/>
<Button Content="✓ Validate" Style="{StaticResource SoftButton}" Click="Validate_Click"/>
</WrapPanel>
</Grid>
<DataGrid Grid.Row="1" ItemsSource="{Binding Bindings}" SelectedItem="{Binding SelectedBinding, Mode=TwoWay}" Style="{StaticResource ModernDataGrid}" ToolTip="Select a row and press Ctrl+C to copy it for debugging.">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="On" Binding="{Binding IsEnabled, UpdateSourceTrigger=PropertyChanged}" Width="48"/>
<DataGridTextColumn Header="Signal" Binding="{Binding SignalName, UpdateSourceTrigger=PropertyChanged}" Width="190"/>
<DataGridTextColumn Header="IEC Reference" Binding="{Binding IecReference}" Width="360" MinWidth="280" IsReadOnly="True"/>
<DataGridTextColumn Header="Area" Binding="{Binding ModbusArea, UpdateSourceTrigger=PropertyChanged}" Width="120"/>
<DataGridTextColumn Header="Address" Binding="{Binding ModbusAddress, UpdateSourceTrigger=PropertyChanged}" Width="82"/>
<DataGridTextColumn Header="Type" Binding="{Binding ModbusDataType, UpdateSourceTrigger=PropertyChanged}" Width="85"/>
<DataGridTextColumn Header="Unit" Binding="{Binding Unit, UpdateSourceTrigger=PropertyChanged}" Width="70"/>
<DataGridTextColumn Header="Value" Binding="{Binding CurrentValue}" Width="110" IsReadOnly="True"/>
<DataGridTextColumn Header="Quality" Binding="{Binding Quality}" Width="82" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<!-- STEP 3: REPORT PLAN SELECTION -->
<Grid Grid.Row="1" Visibility="{Binding StepReportVisibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="Pick the reporting plan during configuration. Runtime will only monitor/use the saved plan." Foreground="{StaticResource Muted}" FontSize="12.4" TextWrapping="Wrap"/>
<TextBlock Text="{Binding ReportPlanStatus}" Foreground="{StaticResource Accent}" FontSize="12.3" FontWeight="SemiBold" Margin="0,4,0,0" TextWrapping="Wrap"/>
</StackPanel>
<WrapPanel Grid.Column="1" VerticalAlignment="Center">
<Button Content="Probe Selected RCB" Style="{StaticResource PrimaryButton}" Click="ProbeSelectedReportControl_Click" Margin="0,0,8,0"/>
<Button Content="Use Selected RCB" Style="{StaticResource SoftButton}" Click="UseSelectedReportControl_Click" Margin="0,0,8,0"/>
<Button Content="Polling Only" Style="{StaticResource SoftButton}" Click="UsePollingOnly_Click"/>
</WrapPanel>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.05*"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="0.85*"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="1.15*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Background="#F8FAFC" CornerRadius="16" Padding="10" BorderBrush="{StaticResource Line}" BorderThickness="1">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Margin="0,0,0,8">
<TextBlock Text="Report Control Blocks" FontSize="14.5" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Choose one BRCB/URCB. Probe is read-only; no RptEna or reservation write is sent here." FontSize="11.8" Foreground="{StaticResource Muted}" TextWrapping="Wrap"/>
</StackPanel>
<DataGrid ItemsSource="{Binding ReportControls}" SelectedItem="{Binding SelectedReportControl, Mode=TwoWay}" IsReadOnly="True" Style="{StaticResource ModernDataGrid}" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Binding="{Binding Mode}" Width="62"/>
<DataGridTextColumn Header="RCB" Binding="{Binding Reference}" Width="250*" MinWidth="230"/>
<DataGridTextColumn Header="DataSet" Binding="{Binding DataSetReference}" Width="230*" MinWidth="180"/>
<DataGridTextColumn Header="RptEna" Binding="{Binding EnabledState}" Width="78"/>
<DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="126"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Border>
<Border Grid.Column="2" Background="#F8FAFC" CornerRadius="16" Padding="10" BorderBrush="{StaticResource Line}" BorderThickness="1">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Margin="0,0,0,8">
<TextBlock Text="DataSets" FontSize="14.5" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Online discovery may show names only. SCL import can give stronger FCDA coverage." FontSize="11.8" Foreground="{StaticResource Muted}" TextWrapping="Wrap"/>
</StackPanel>
<DataGrid ItemsSource="{Binding DataSets}" SelectedItem="{Binding SelectedDataSet, Mode=TwoWay}" IsReadOnly="True" Style="{StaticResource ModernDataGrid}" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridTextColumn Header="DataSet" Binding="{Binding Reference}" Width="250*" MinWidth="230"/>
<DataGridTextColumn Header="LN" Binding="{Binding LogicalNode}" Width="74"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="105"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Border>
<Border Grid.Column="4" Background="#F8FAFC" CornerRadius="16" Padding="10" BorderBrush="{StaticResource Line}" BorderThickness="1">
<DockPanel>
<StackPanel DockPanel.Dock="Top" Margin="0,0,0,8">
<TextBlock Text="Selected DataSet / Coverage" FontSize="14.5" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="{Binding SelectedDataSetSummary}" FontSize="11.8" Foreground="{StaticResource Muted}" TextWrapping="Wrap"/>
<TextBlock Text="{Binding SelectedReportControlSummary}" FontSize="11.8" Foreground="{StaticResource Muted}" TextWrapping="Wrap" Margin="0,2,0,0"/>
</StackPanel>
<DataGrid ItemsSource="{Binding DataSetMembers}" IsReadOnly="True" Style="{StaticResource ModernDataGrid}" ScrollViewer.HorizontalScrollBarVisibility="Auto">
<DataGrid.Columns>
<DataGridTextColumn Header="IEC Object" Binding="{Binding DisplayObject}" Width="280*" MinWidth="250"/>
<DataGridTextColumn Header="Type" Binding="{Binding DataType}" Width="76"/>
<DataGridTextColumn Header="Coverage" Binding="{Binding Coverage}" Width="190"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Border>
</Grid>
<Border Grid.Row="2" CornerRadius="14" Background="#EEF4FF" Padding="12,8" BorderBrush="#D7E3F7" BorderThickness="1" Margin="0,10,0,0">
<TextBlock Text="Report planning is a configuration task. Runtime will still use safe MMS polling until explicit report activation is implemented, then selected RCB will become the event lane with polling fallback." Foreground="{StaticResource Muted}" FontSize="12.2" TextWrapping="Wrap"/>
</Border>
</Grid>
<!-- STEP 4: REVIEW / ADD TO RUNTIME -->
<Grid Grid.Row="1" Visibility="{Binding Step3Visibility}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Columns="3" Margin="0,0,0,12">
<Border Background="#F8FAFC" CornerRadius="16" Padding="16" BorderBrush="{StaticResource Line}" BorderThickness="1" Margin="0,0,8,0">
<StackPanel>
<TextBlock Text="Selected IEC Signals" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="{Binding SelectedSignalCount}" FontSize="25" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
</StackPanel>
</Border>
<Border Background="#F8FAFC" CornerRadius="16" Padding="16" BorderBrush="{StaticResource Line}" BorderThickness="1" Margin="4,0">
<StackPanel>
<TextBlock Text="Modbus Bindings" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="{Binding BindingCount}" FontSize="25" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
</StackPanel>
</Border>
<Border Background="#F8FAFC" CornerRadius="16" Padding="16" BorderBrush="{StaticResource Line}" BorderThickness="1" Margin="8,0,0,0">
<StackPanel>
<TextBlock Text="Validation" Foreground="{StaticResource Muted}" FontSize="12"/>
<TextBlock Text="{Binding ValidationState}" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Accent}" Margin="0,6,0,0"/>
</StackPanel>
</Border>
</UniformGrid>
<Border Grid.Row="1" Background="#F8FAFC" CornerRadius="18" Padding="18" BorderBrush="{StaticResource Line}" BorderThickness="1">
<StackPanel>
<TextBlock Text="Ready to add this IED configuration to runtime workspace" FontSize="18" FontWeight="SemiBold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="Save will update the IEC 61850 Explorer with the selected live signals and update the Modbus Server publish map. Runtime viewing stays clean; editing stays inside this wizard." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="13" Margin="0,8,0,0"/>
<TextBlock Text="Tip: Only selected signals become MMS polling targets. The chosen RCB/DataSet plan is saved with the IED and will be used later by the reporting engine; no runtime re-selection is required." TextWrapping="Wrap" Foreground="{StaticResource Muted}" FontSize="12.5" Margin="0,18,0,0"/>
</StackPanel>
</Border>
</Grid>
</Grid>
</Border>
</Grid>
<Grid Grid.Row="2" Margin="0,14,0,0">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="{Binding StatusMessage}" Foreground="{StaticResource Accent}" FontWeight="SemiBold" FontSize="12.4"/>
<TextBlock Text="Viewing and editing are separated. This wizard changes configuration; Explorer and Modbus tabs stay lightweight runtime views." Foreground="{StaticResource Muted}" FontSize="12" Margin="0,3,0,0"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<Button Content="‹ Back" Style="{StaticResource SoftButton}" Click="Back_Click" Margin="0,0,8,0"/>
<Button Content="Cancel" Style="{StaticResource SoftButton}" Click="Cancel_Click" Margin="0,0,8,0"/>
<Button Content="{Binding PrimaryActionText}" Style="{StaticResource PrimaryButton}" Click="NextOrSave_Click"/>
</StackPanel>
</Grid>
</Grid>
</Window>