2015-06-01 16 views
5

Ich verwende das OPC UA Foundation SDK, um einen kleinen Client zu entwickeln. Was wäre die minimale C# -Code:OPC UA: Minimaler Code, der den Wurzelknoten eines Servers durchsucht

  • Verbindung zu einem Server
  • Durchsuchen der Wurzelknoten
  • Drucken Sie die unmittelbaren Kinder BrowseNames
  • Quit?

Ich bin der Server Endpunkt (keine Entdeckung), Sicherheit keine gegeben.

Der Code sollte keine Konfigurationsdateien verwenden und keine STA erfordern.

Jede Hilfe zu diesem wäre mehr als geschätzt.

+0

Sie meinen den Fundamentstapel, richtig? Welcher (welche Sprache)? –

+0

C#. Bearbeiten der Frage –

Antwort

17

bearbeiten 4/2017:

OPC UA .NET Standard Library asynchron wird. Sehen Sie die aktualisierte Probe here.

bearbeiten 9/2016:

Jeder sollte die neue OPC UA .Net Standard Library sehen.

Sie können Anwendungen entwickeln, die auf allen gängigen Plattformen laufen, einschließlich Linux, iOS, Android (über Xamarin) und Windows.

Und Sie können viele Beispiele finden, einschließlich einer Probe von diesem Beitrag inspiriert. Suchen Sie nach dem Ordner SampleApplications/Samples/NetCoreConsoleClient.

Original-Beitrag:

Hilfe bei den Hausaufgaben, vielleicht?

using Opc.Ua; 
using Opc.Ua.Client; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Net; 
using System.Net.Security; 

namespace MyHomework 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Step 1 - Create a config."); 
      var config = new ApplicationConfiguration() 
      { 
       ApplicationName = "MyHomework", 
       ApplicationType = ApplicationType.Client, 
       SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier { StoreType = @"Windows", StorePath = @"CurrentUser\My", SubjectName = Utils.Format(@"CN={0}, DC={1}", "MyHomework", System.Net.Dns.GetHostName()) }, TrustedPeerCertificates = new CertificateTrustList { StoreType = @"Windows", StorePath = @"CurrentUser\TrustedPeople", }, NonceLength = 32, AutoAcceptUntrustedCertificates = true }, 
       TransportConfigurations = new TransportConfigurationCollection(), 
       TransportQuotas = new TransportQuotas { OperationTimeout = 15000 }, 
       ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 } 
      }; 
      config.Validate(ApplicationType.Client); 
      if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) 
      { 
       config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); }; 
      } 

      Console.WriteLine("Step 2 - Create a session with your server."); 
      using (var session = Session.Create(config, new ConfiguredEndpoint(null, new EndpointDescription("opc.tcp://" + Dns.GetHostName() + ":62541")), true, "", 60000, null, null)) 
      { 
       Console.WriteLine("Step 3 - Browse the server namespace."); 
       ReferenceDescriptionCollection refs; 
       Byte[] cp; 
       session.Browse(null, null, ObjectIds.ObjectsFolder, 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out cp, out refs); 
       Console.WriteLine("DisplayName: BrowseName, NodeClass"); 
       foreach (var rd in refs) 
       { 
        Console.WriteLine("{0}: {1}, {2}", rd.DisplayName, rd.BrowseName, rd.NodeClass); 
        ReferenceDescriptionCollection nextRefs; 
        byte[] nextCp; 
        session.Browse(null, null, ExpandedNodeId.ToNodeId(rd.NodeId, session.NamespaceUris), 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out nextCp, out nextRefs); 
        foreach (var nextRd in nextRefs) 
        { 
         Console.WriteLine("+ {0}: {1}, {2}", nextRd.DisplayName, nextRd.BrowseName, nextRd.NodeClass); 
        } 
       } 

       Console.WriteLine("Step 4 - Create a subscription. Set a faster publishing interval if you wish."); 
       var subscription = new Subscription(session.DefaultSubscription) { PublishingInterval = 1000 }; 

       Console.WriteLine("Step 5 - Add a list of items you wish to monitor to the subscription."); 
       var list = new List<MonitoredItem> { new MonitoredItem(subscription.DefaultItem) { DisplayName = "ServerStatusCurrentTime", StartNodeId = "i=2258" } }; 
       list.ForEach(i => i.Notification += OnNotification); 
       subscription.AddItems(list); 

       Console.WriteLine("Step 6 - Add the subscription to the session."); 
       session.AddSubscription(subscription); 
       subscription.Create(); 

       Console.WriteLine("Press any key to remove subscription..."); 
       Console.ReadKey(true); 
      } 

      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(true); 
     } 

     private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e) 
     { 
      foreach (var value in item.DequeueValues()) 
      { 
       Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode); 
      } 
     } 

    } 

} 
+3

Klingt nach Hausaufgaben, ist es aber nicht. Ich versuche, einige abhängigkeitsgesteuerte OPC-UA-Code zu entwirren, und ich hatte große Probleme programmatisch eine minimale ApplicationConfiguration zu erstellen, um einen Komponententest zu schreiben. –

+0

Funktioniert wie ein Charme. Vielen Dank. –

+0

Vielen Dank! Der mitgelieferte Beispielcode (Beispielclient) war sehr schlecht .. Ihr Beispiel hat mir sehr geholfen! –