2015-06-01 47 views
5

मैं OPC यूए फाउंडेशन एसडीके का उपयोग कर रहा एक छोटा सा ग्राहक को विकसित करने के रूट नोड ब्राउज़ करता।OPC यूए: कम से कम कोड है कि एक सर्वर

  • कनेक्ट एक सर्वर
  • ब्राउज़ रूट नोड
  • प्रिंट तत्काल बच्चों के BrowseNames
  • छोड़ो: क्या करने के लिए कम से कम सी # कोड हो सकता है?

मुझे सर्वर एंडपॉइंट (कोई खोज नहीं), सुरक्षा कोई नहीं दिया गया है।

कोड config फ़ाइलों का कोई उपयोग नहीं करते हैं, और न ही एक एसटीए की आवश्यकता होती है चाहिए।

किसी भी मदद के लिए इस पर सराहना की तुलना में अधिक होगा।

+0

आप नींव ढेर, सही मतलब है? कौन सी (कौन सी भाषा)? –

+0

सी #। सवाल संपादित करना –

उत्तर

17

संपादित 4/2017:

OPC यूए नेट स्टैंडर्ड लाइब्रेरी अतुल्यकालिक जा रहा है। अद्यतन नमूना देखें here.

संपादित 9/2016:

हर कोई नया OPC UA .Net Standard Library देखना चाहिए।

आप सभी आम प्लेटफार्मों पर चलने वाले ऐप्स आज उपलब्ध लिनक्स, आईओएस, एंड्रॉयड (Xamarin के माध्यम से) और Windows सहित विकसित कर सकते हैं,।

और आप इस पोस्ट से प्रेरित एक नमूना सहित कई नमूने, पा सकते हैं। फ़ोल्डर नमूना अनुप्रयोग/नमूने/NetCoreConsoleClient फ़ोल्डर के लिए देखो।

मूल पोस्ट:

होमवर्क के साथ सहायता, शायद?

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

होमवर्क की तरह लगता है, लेकिन यह नहीं है। मैं कुछ निर्भरता से भरे ओपीसी UA कोड को उलझाने की कोशिश कर रहा हूं, और मुझे यूनिट परीक्षण लिखने के लिए प्रोग्रामेटिक रूप से कम से कम एप्लिकेशन कॉन्फ़िगरेशन बनाने में बड़ी समस्या थी। –

+0

एक आकर्षण की तरह काम करता है। धन्यवाद। –

+0

आपको बहुत बहुत धन्यवाद! प्रदान किया गया नमूना कोड (नमूना क्लाइंट) बहुत खराब था .. आपके उदाहरण ने मुझे बहुत मदद की! –

संबंधित मुद्दे