using Opc.Ua.Client; using Opc.Ua; using System; using Opc.Ua.Configuration; namespace HH.WCS.Mobox3.DSZSH.device { internal class OpcUaHelper { private static Opc.Ua.Client.Session session; static OpcUaHelper() { CreateUpcSession(); } /// /// 连接OPC服务 /// internal static async void CreateUpcSession() { try { // 创建一个应用配置对象,用于设置应用名称、唯一标识、类型、证书和安全策略 var config = new ApplicationConfiguration() { ApplicationName = "MyClient", ApplicationUri = Utils.Format(@"urn:{0}:MyClient", System.Net.Dns.GetHostName()), ApplicationType = ApplicationType.Client, SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = "MyClientSubjectName" }, 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, RejectSHA1SignedCertificates = false, MinimumCertificateKeySize = 1024, NonceLength = 32, }, TransportConfigurations = new TransportConfigurationCollection(), TransportQuotas = new TransportQuotas { OperationTimeout = 15000 }, ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }, TraceConfiguration = new TraceConfiguration() }; // 验证应用配置对象 await config.Validate(ApplicationType.Client); // 设置证书验证事件,用于自动接受不受信任的证书 if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) { config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); }; } // 创建一个应用实例对象,用于检查证书 var application = new ApplicationInstance(config); // 检查应用实例对象的证书 bool check = await application.CheckApplicationInstanceCertificate(false, 2048); // 创建一个会话对象,用于连接到 OPC UA 服务器 EndpointDescription endpointDescription = CoreClientUtils.SelectEndpoint("opc.tcp://172.16.57.41:4840", true); EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(config); ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration); session = await Session.Create(config, endpoint, false, false, "DataCollector", 60000, new UserIdentity(), null); if (session != null && session.Connected) { Console.WriteLine("The session is connected to the OPC UA server."); LogHelper.Info($"创建OPC连接成功", "OPC"); } else { Console.WriteLine("The session is not connected to the OPC UA server."); LogHelper.Info($"创建OPC连接失败", "OPC"); } } catch (Exception e) { LogHelper.Info($"连接OPC服务异常" + e.Message, "OPC"); } } /// /// 读取OPC节点数据 /// /// internal static object ReadOpcValue(string nodeId) { try { if (session != null && session.Connected) { // 读取数据节点 DataValue item = session.ReadValue(nodeId: nodeId); LogHelper.Info($"OPC读取:nodeid:{nodeId},value:{item.Value}", "OPC"); return item.Value; } else { Console.WriteLine("The session is not connected to the OPC UA server."); LogHelper.Info($"OPC连接失败", "OPC"); CreateUpcSession(); } } catch (Exception e) { LogHelper.Info($"读取OPC数据异常" + e.Message, "OPC"); } return null; } /// /// 写OPC节点数据 /// /// /// internal static void WriteOpcValue(string nodeId,bool val) { try { if (session != null && session.Connected) { // 写入数据到节点 WriteValue writeValue = new WriteValue { NodeId = new NodeId(nodeId), AttributeId = Attributes.Value, Value = new DataValue(val) }; StatusCodeCollection results; DiagnosticInfoCollection diagnosticInfos; session.Write(null, new WriteValueCollection { writeValue }, out results, out diagnosticInfos); Console.WriteLine($"Write Status for {nodeId}: {results[0]}"); LogHelper.Info($"OPC写入:nodeid:{nodeId},value:{val}", "OPC"); } else { Console.WriteLine("The session is not connected to the OPC UA server."); LogHelper.Info($"OPC连接失败", "OPC"); CreateUpcSession(); } } catch (Exception e) { LogHelper.Info($"写入OPC数据异常" + e.Message, "OPC"); } } /// /// 写OPC节点数据 /// /// /// internal static void WriteOpcValue(string nodeId, int val) { try { if (session != null && session.Connected) { // 写入数据到节点 WriteValue writeValue = new WriteValue { NodeId = new NodeId(nodeId), AttributeId = Attributes.Value, Value = new DataValue(val) }; StatusCodeCollection results; DiagnosticInfoCollection diagnosticInfos; session.Write(null, new WriteValueCollection { writeValue }, out results, out diagnosticInfos); Console.WriteLine($"Write Status for {nodeId}: {results[0]}"); LogHelper.Info($"OPC写入:nodeid:{nodeId},value:{val}", "OPC"); } else { Console.WriteLine("The session is not connected to the OPC UA server."); LogHelper.Info($"OPC连接失败", "OPC"); CreateUpcSession(); } } catch (Exception e) { LogHelper.Info($"写入OPC数据异常" + e.Message, "OPC"); } } } }