C#使用开发OPC UA客户端

时间:2025-02-13 16:12:08

OpcUa作为客户端测试代码

1、打开服务端,使用开源代码GitHub - OPCFoundation/: OPC Unified Architecture .NET Standard中启动服务端

2、运行打印结果如下

测试标准OPC UA
Session_KeepAlive
2023/9/27 21:09:39Connected, loading complex type system.
ReadNode查询到这个Node的属性
data value : 55

3、测试启动

MyOpcUaServer myOpcUaServer = new MyOpcUaServer();

4、连接服务端测试类,引用NuGet:

using System;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using .Asn1.X509;

namespace 标准OPC_UA
{
    internal class MyOpcUaClient
    {
        public string OpcUaName = "My Opc ua";

        private ApplicationConfiguration m_configuration;
        private Session m_session;
        private SessionReconnectHandler m_reconnectHandler;
        private CertificateValidationEventHandler m_CertificateValidation;
        //private Dictionary<Uri, EndpointDescription> m_endpoints;


        public MyOpcUaClient(string uri = "://lplsszsz4435n:62541/Quickstarts/ReferenceServer", bool useSecurity = false, int sessionTimeout = 1000) {
            InitConfiguration();

            // 连接测试
            Connect(uri, useSecurity, sessionTimeout);
            //Read();

            ConfiguredEndpointCollection configuredEndpoints = new ConfiguredEndpointCollection();
            List<ConfiguredEndpoint> list = ("://lplsszsz4435n:62541/Quickstarts/ReferenceServer");

            if (m_session != null)
            {
                // 读取属性和值
                Node node = m_session.ReadNode("ns=7;s=");
                if (node != null)
                {
                    ("ReadNode查询到这个Node的属性");
                }

                WriteValueCollection nodesToWrite = new WriteValueCollection();
                WriteValue writeValue = new WriteValue();
                 = "ns=7;s=";           // 看下属性是否是可写
                 = 13u;                               // 不定义无法正常设置
                 = new DataValue(new Variant(55));          // 设置值
                (writeValue);
                StatusCodeCollection statusCodes = new StatusCodeCollection();
                DiagnosticInfoCollection diagnosticInfos = new DiagnosticInfoCollection();
                ResponseHeader rep = m_session.Write(null, nodesToWrite, out statusCodes, out diagnosticInfos);

                DataValue value = m_session.ReadValue("ns=7;s=");
                if(value != null)
                {
                    ("data value : " + ());
                }
            }

            //TranslateBrowsePathsToNodeIds();
        }
        void InitConfiguration()
        {
            var certificateValidator = new CertificateValidator();
             += (sender, eventArgs) =>
            {
                if (())
                     = true;
                else if ( == )
                     = true;
                else
                    throw new Exception(("Failed to validate certificate with error code {0}: {1}", , ));
            };

            SecurityConfiguration securityConfigurationcv = new SecurityConfiguration
            {
                AutoAcceptUntrustedCertificates = true,
                RejectSHA1SignedCertificates = false,
                MinimumCertificateKeySize = 1024,
            };
            (securityConfigurationcv);

            // Build the application configuration
            var configuration = new ApplicationConfiguration
            {
                ApplicationName = OpcUaName,
                ApplicationType = ,
                CertificateValidator = certificateValidator,
                ApplicationUri = "urn:MyClient", //Kepp this syntax
                ProductUri = "OpcUaClient",

                ServerConfiguration = new ServerConfiguration
                {
                    MaxSubscriptionCount = 100000,
                    MaxMessageQueueSize = 1000000,
                    MaxNotificationQueueSize = 1000000,
                    MaxPublishRequestCount = 10000000,
                },

                SecurityConfiguration = new SecurityConfiguration
                {
                    AutoAcceptUntrustedCertificates = true,
                    RejectSHA1SignedCertificates = false,
                    MinimumCertificateKeySize = 1024,
                    SuppressNonceValidationErrors = true,

                    ApplicationCertificate = new CertificateIdentifier
                    {
                        StoreType = CertificateStoreType.X509Store,
                        StorePath = "CurrentUser\\My",
                        SubjectName = OpcUaName,
                    },
                    TrustedIssuerCertificates = new CertificateTrustList
                    {
                        StoreType = CertificateStoreType.X509Store,
                        StorePath = "CurrentUser\\Root",
                    },
                    TrustedPeerCertificates = new CertificateTrustList
                    {
                        StoreType = CertificateStoreType.X509Store,
                        StorePath = "CurrentUser\\Root",
                    }
                },

                TransportQuotas = new TransportQuotas
                {
                    OperationTimeout = 6000000,
                    MaxStringLength = ,
                    MaxByteStringLength = ,
                    MaxArrayLength = 65535,
                    MaxMessageSize = 419430400,
                    MaxBufferSize = 65535,
                    ChannelLifetime = -1,
                    SecurityTokenLifetime = -1
                },
                ClientConfiguration = new ClientConfiguration
                {
                    DefaultSessionTimeout = -1,
                    MinSubscriptionLifetime = -1,
                },
                DisableHiResClock = true
            };

            ();
            m_configuration = configuration;
        }

        async void Connect(string uri = "://lplsszsz4435n:62541/Quickstarts/ReferenceServer", bool useSecurity = false, int sessionTimeout = 1000)
        {
            if (m_session != null)
            {
                m_session.KeepAlive -= Session_KeepAlive;
                m_session.Close(10000);
                m_session = null;
            }
            // select the best endpoint.
            var endpointDescription = (m_configuration, uri, useSecurity, sessionTimeout);
            var endpointConfiguration = (m_configuration);
            var endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);

            m_session = await (
                m_configuration,
                //connection,
                endpoint,
                false,
                //true,        //DisableDomainCheck
                "Quickstart Reference Client", //((SessionName)) ? m_configuration.ApplicationName : SessionName,
                (uint)sessionTimeout,
                null,       //UserIdentity,
                null);      //PreferredLocales

            // set up keep alive callback.
            m_session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);

            // set up reconnect handler.
            m_reconnectHandler = new SessionReconnectHandler(true, 10 * 1000);

            try
            {
                ( + "Connected, loading complex type system.");
                var typeSystemLoader = new ComplexTypeSystem(m_session);
                await ();
            }
            catch (Exception e)
            {
                ( + "Connected, failed to load complex type system.");
                (e, "Failed to load complex type system.");
            }
        }

        bool Read()
        {
            DataValueCollection dataValues = new DataValueCollection();
            DiagnosticInfoCollection diagnosticInfos = new DiagnosticInfoCollection();
            ResponseHeader resp = m_session.Read(null, 0, , null, out dataValues, out diagnosticInfos);
            return true;
        }
        void TranslateBrowsePathsToNodeIds()
            //RequestHeader requestHeader,
            //BrowsePathCollection browsePaths)
            //out BrowsePathResultCollection results,
            //out DiagnosticInfoCollection diagnosticInfos)
        {
            //m_session.TranslateBrowsePathsToNodeIds(null, "://lplsszsz4435n:62541/Quickstarts/ReferenceServer");
            BrowsePathResultCollection results;
            DiagnosticInfoCollection diagnosticInfos;
            var startNodeId = new NodeId();
            var browsePaths1 = new BrowsePathCollection
            {
                new BrowsePath
                {
                    RelativePath = ("Objects", m_session.TypeTree, m_session.NamespaceUris, m_session.NamespaceUris),
                    StartingNode = startNodeId
                }
            };
            ResponseHeader resp = m_session.TranslateBrowsePathsToNodeIds(null, browsePaths1, out results, out diagnosticInfos);

        }

        private void ChangeSession(Session session, bool refresh)
        {
            //m_session = session;

            //if (AttributesControl != null)
            //{
            //    (session);
            //}

            //();

            //if (m_session != null)
            //{
            //    INode node = m_session.(m_rootId);

            //    if (node != null)
            //    {
            //        TreeNode root = new TreeNode(());
            //         = (m_session, , , false);
            //         = (m_session, , , true);

            //        ReferenceDescription reference = new ReferenceDescription();
            //         = ;
            //         = ;
            //         = ;
            //         = ;
            //         = ;
            //         = reference;

            //        (new TreeNode());
            //        (root);
            //        ();
            //         = root;
            //    }
            //}
        }

        private void Session_KeepAlive(ISession session, KeepAliveEventArgs e)
        {
            ("Session_KeepAlive");
        }

    }
}

相关文章