private void renewSessionThread() { while (!ClassDisposing) { if ((DateTime.Now - LastTimeSessionRenewed).TotalMinutes > SessionRenewalPeriodMins || (DateTime.Now - LastTimeOPCServerFoundAlive).TotalSeconds > 60) { Console.WriteLine("Renewing Session"); try { OPCSession.Close(); OPCSession.Dispose(); } catch { } InitializeOPCUAClient(); LastTimeSessionRenewed = DateTime.Now; } Thread.Sleep(2000); } }
public void InitializeOPCUAClient() { //Console.WriteLine("Step 1 - Create application configuration and certificate."); var config = new ApplicationConfiguration() { ApplicationName = MyApplicationName, ApplicationUri = Utils.Format(@"urn:{0}:" + MyApplicationName + "", ServerAddress), ApplicationType = ApplicationType.Client, SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = Utils.Format(@"CN={0}, DC={1}", MyApplicationName, ServerAddress) }, 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, AddAppCertToTrustedStore = true }, TransportConfigurations = new TransportConfigurationCollection(), TransportQuotas = new TransportQuotas { OperationTimeout = 15000 }, ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }, TraceConfiguration = new TraceConfiguration() }; config.Validate(ApplicationType.Client).GetAwaiter().GetResult(); if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) { config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); }; } var application = new ApplicationInstance { ApplicationName = MyApplicationName, ApplicationType = ApplicationType.Client, ApplicationConfiguration = config }; application.CheckApplicationInstanceCertificate(false, 2048).GetAwaiter().GetResult(); //string serverAddress = Dns.GetHostName(); string serverAddress = ServerAddress;; var selectedEndpoint = CoreClientUtils.SelectEndpoint("opc.tcp://" + serverAddress + ":" + ServerPortNumber + "", useSecurity: SecurityEnabled, operationTimeout: 15000); // Console.WriteLine($"Step 2 - Create a session with your server: {selectedEndpoint.EndpointUrl} "); OPCSession = Session.Create(config, new ConfiguredEndpoint(null, selectedEndpoint, EndpointConfiguration.Create(config)), false, "", 60000, null, null).GetAwaiter().GetResult(); { //Console.WriteLine("Step 4 - Create a subscription. Set a faster publishing interval if you wish."); var subscription = new Subscription(OPCSession.DefaultSubscription) { PublishingInterval = 1000 }; //Console.WriteLine("Step 5 - Add a list of items you wish to monitor to the subscription."); var list = new List <MonitoredItem> { }; //list.Add(new MonitoredItem(subscription.DefaultItem) { DisplayName = "M0404.CPU945.iBatchOutput", StartNodeId = "ns=2;s=M0404.CPU945.iBatchOutput" }); list.Add(new MonitoredItem(subscription.DefaultItem) { DisplayName = "ServerStatusCurrentTime", StartNodeId = "i=2258" }); foreach (KeyValuePair <string, TagClass> td in TagList) { list.Add(new MonitoredItem(subscription.DefaultItem) { DisplayName = td.Value.DisplayName, StartNodeId = "ns=" + OPCNameSpace + ";s=" + td.Value.NodeID + "" }); } list.ForEach(i => i.Notification += OnTagValueChange); subscription.AddItems(list); //Console.WriteLine("Step 6 - Add the subscription to the session."); OPCSession.AddSubscription(subscription); subscription.Create(); } }