修复OPC连接成功前不显示列表
This commit is contained in:
@@ -28,6 +28,9 @@ public partial class OpcUaImportDialogViewModel : ObservableObject
|
|||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private bool _selectAllVariables;
|
private bool _selectAllVariables;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private bool _isConnected;
|
||||||
|
|
||||||
private Session _session;
|
private Session _session;
|
||||||
|
|
||||||
public OpcUaImportDialogViewModel()
|
public OpcUaImportDialogViewModel()
|
||||||
@@ -49,86 +52,9 @@ public partial class OpcUaImportDialogViewModel : ObservableObject
|
|||||||
_session = null;
|
_session = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*ApplicationInstance application = new ApplicationInstance
|
IsConnected = false;
|
||||||
{
|
OpcUaNodes.Clear();
|
||||||
ApplicationName = "PMSWPF OPC UA Client",
|
SelectedNodeVariables.Clear();
|
||||||
ApplicationType = ApplicationType.Client,
|
|
||||||
ConfigSectionName = "PMSWPF.OpcUaClient"
|
|
||||||
};
|
|
||||||
|
|
||||||
ApplicationConfiguration config = await application.LoadApplicationConfiguration(false);
|
|
||||||
|
|
||||||
// var config = new ApplicationConfiguration()
|
|
||||||
// {
|
|
||||||
// ApplicationName = application.ApplicationName,
|
|
||||||
// ApplicationUri = $"urn:{System.Net.Dns.GetHostName()}:OpcUADemoClient",
|
|
||||||
// ApplicationType = application.ApplicationType,
|
|
||||||
// SecurityConfiguration = new SecurityConfiguration
|
|
||||||
// {
|
|
||||||
// ApplicationCertificate = new CertificateIdentifier { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/MachineDefault", SubjectName = application.ApplicationName },
|
|
||||||
// TrustedIssuerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/UA Certificate Authorities" },
|
|
||||||
// TrustedPeerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/UA Applications" },
|
|
||||||
// RejectedCertificateStore = new CertificateTrustList { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/RejectedCertificates" },
|
|
||||||
// AutoAcceptUntrustedCertificates = true // 自动接受不受信任的证书 (仅用于测试)
|
|
||||||
// },
|
|
||||||
// TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
|
|
||||||
// ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 },
|
|
||||||
// TraceConfiguration = new TraceConfiguration { OutputFilePath = "./Logs/OpcUaClient.log", DeleteOnLoad = true, TraceMasks = Utils.TraceMasks.Error | Utils.TraceMasks.Security }
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// bool haveAppCertificate = await application.CheckApplicationInstanceCertificate(false, 0);
|
|
||||||
// if (!haveAppCertificate)
|
|
||||||
// {
|
|
||||||
// throw new Exception("Application instance certificate invalid!");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// EndpointDescription selectedEndpoint
|
|
||||||
// = CoreClientUtils.SelectEndpoint(application.ApplicationConfiguration, EndpointUrl, false);
|
|
||||||
// EndpointConfiguration endpointConfiguration
|
|
||||||
// = EndpointConfiguration.Create(application.ApplicationConfiguration);
|
|
||||||
// ConfiguredEndpoint configuredEndpoint
|
|
||||||
// = new ConfiguredEndpoint(null, selectedEndpoint, endpointConfiguration);
|
|
||||||
// var config = new ApplicationConfiguration()
|
|
||||||
// {
|
|
||||||
// ApplicationName = application.ApplicationName,
|
|
||||||
// ApplicationUri = $"urn:{System.Net.Dns.GetHostName()}:OpcUADemoClient",
|
|
||||||
// ApplicationType = application.ApplicationType,
|
|
||||||
// SecurityConfiguration = new SecurityConfiguration
|
|
||||||
// {
|
|
||||||
// ApplicationCertificate = new CertificateIdentifier { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/MachineDefault", SubjectName = application.ApplicationName },
|
|
||||||
// TrustedIssuerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/UA Certificate Authorities" },
|
|
||||||
// TrustedPeerCertificates = new CertificateTrustList { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/UA Applications" },
|
|
||||||
// RejectedCertificateStore = new CertificateTrustList { StoreType = "Directory", StorePath = "%CommonApplicationData%/OPC Foundation/CertificateStores/RejectedCertificates" },
|
|
||||||
// AutoAcceptUntrustedCertificates = true // 自动接受不受信任的证书 (仅用于测试)
|
|
||||||
// },
|
|
||||||
// TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
|
|
||||||
// ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 },
|
|
||||||
// TraceConfiguration = new TraceConfiguration { OutputFilePath = "./Logs/OpcUaClient.log", DeleteOnLoad = true, TraceMasks = Utils.TraceMasks.Error | Utils.TraceMasks.Security }
|
|
||||||
// };
|
|
||||||
|
|
||||||
bool haveAppCertificate = await application.CheckApplicationInstanceCertificate(false, 0);
|
|
||||||
if (!haveAppCertificate)
|
|
||||||
{
|
|
||||||
throw new Exception("Application instance certificate invalid!");
|
|
||||||
}
|
|
||||||
|
|
||||||
EndpointDescription selectedEndpoint
|
|
||||||
= CoreClientUtils.SelectEndpoint(application.ApplicationConfiguration, EndpointUrl, false);
|
|
||||||
EndpointConfiguration endpointConfiguration
|
|
||||||
= EndpointConfiguration.Create(application.ApplicationConfiguration);
|
|
||||||
ConfiguredEndpoint configuredEndpoint
|
|
||||||
= new ConfiguredEndpoint(null, selectedEndpoint, endpointConfiguration);
|
|
||||||
|
|
||||||
_session = await Session.Create(
|
|
||||||
config,
|
|
||||||
configuredEndpoint,
|
|
||||||
false,
|
|
||||||
"PMSWPF OPC UA Session",
|
|
||||||
60000,
|
|
||||||
new UserIdentity(new AnonymousIdentityToken()),
|
|
||||||
null);
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// 1. 创建应用程序配置
|
// 1. 创建应用程序配置
|
||||||
var application = new ApplicationInstance
|
var application = new ApplicationInstance
|
||||||
@@ -202,12 +128,14 @@ public partial class OpcUaImportDialogViewModel : ObservableObject
|
|||||||
null);
|
null);
|
||||||
|
|
||||||
NotificationHelper.ShowSuccess($"已连接到 OPC UA 服务器: {EndpointUrl}");
|
NotificationHelper.ShowSuccess($"已连接到 OPC UA 服务器: {EndpointUrl}");
|
||||||
|
IsConnected = true;
|
||||||
|
|
||||||
// 浏览根节点
|
// 浏览根节点
|
||||||
await BrowseNodes(OpcUaNodes, ObjectIds.ObjectsFolder);
|
await BrowseNodes(OpcUaNodes, ObjectIds.ObjectsFolder);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
IsConnected = false;
|
||||||
NlogHelper.Error($"连接 OPC UA 服务器失败: {EndpointUrl} - {ex.Message}", ex);
|
NlogHelper.Error($"连接 OPC UA 服务器失败: {EndpointUrl} - {ex.Message}", ex);
|
||||||
NotificationHelper.ShowError($"连接 OPC UA 服务器失败: {EndpointUrl} - {ex.Message}", ex);
|
NotificationHelper.ShowError($"连接 OPC UA 服务器失败: {EndpointUrl} - {ex.Message}", ex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,20 @@
|
|||||||
ItemsSource="{Binding OpcUaNodes}"
|
ItemsSource="{Binding OpcUaNodes}"
|
||||||
Margin="0,0,10,0"
|
Margin="0,0,10,0"
|
||||||
SelectedItemChanged="TreeView_SelectedItemChanged">
|
SelectedItemChanged="TreeView_SelectedItemChanged">
|
||||||
|
<TreeView.Style>
|
||||||
|
<Style TargetType="TreeView"
|
||||||
|
BasedOn="{StaticResource {x:Type TreeView}}">
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="Collapsed" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding IsConnected}"
|
||||||
|
Value="True">
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="Visible" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</TreeView.Style>
|
||||||
<TreeView.ItemTemplate>
|
<TreeView.ItemTemplate>
|
||||||
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
|
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
|
||||||
<TextBlock Text="{Binding DisplayName}" />
|
<TextBlock Text="{Binding DisplayName}" />
|
||||||
@@ -59,6 +73,20 @@
|
|||||||
SelectionChanged="Selector_OnSelectionChanged"
|
SelectionChanged="Selector_OnSelectionChanged"
|
||||||
AutoGenerateColumns="False"
|
AutoGenerateColumns="False"
|
||||||
IsReadOnly="True">
|
IsReadOnly="True">
|
||||||
|
<DataGrid.Style>
|
||||||
|
<Style TargetType="DataGrid"
|
||||||
|
BasedOn="{StaticResource {x:Type DataGrid}}">
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="Collapsed" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding IsConnected}"
|
||||||
|
Value="True">
|
||||||
|
<Setter Property="Visibility"
|
||||||
|
Value="Visible" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</DataGrid.Style>
|
||||||
<DataGrid.Columns>
|
<DataGrid.Columns>
|
||||||
<DataGridTemplateColumn>
|
<DataGridTemplateColumn>
|
||||||
<DataGridTemplateColumn.HeaderTemplate>
|
<DataGridTemplateColumn.HeaderTemplate>
|
||||||
|
|||||||
Reference in New Issue
Block a user