在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → opc ua client

opc ua client

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:1.42M
  • 下载次数:310
  • 浏览次数:4703
  • 发布时间:2018-07-18
  • 实例类别:C#语言基础
  • 发 布 人:wanping
  • 文件格式:.zip
  • 所需积分:2
 相关标签: c Client t opc a

实例介绍

【实例简介】

【实例截图】

from clipboard


from clipboard

【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Opc.Ua;
using Opc.Ua.Client;
using Siemens.OpcUA;

namespace Siemens.OpcUA.SimpleClient
{
    public partial class MainForm : Form
    {

        #region Construction
        public MainForm()
        {
            InitializeComponent();

            m_Server = new Server();

            m_Server.CertificateEvent  = new certificateValidation(m_Server_CertificateEvent);
        }

        void m_Server_CertificateEvent(CertificateValidator validator, CertificateValidationEventArgs e)
        {
            // Accept all certificate -> better ask user
            e.Accept = true;
        }
        #endregion

        #region Fields
        private Server m_Server = null;
        private Subscription m_Subscipition;
        private Subscription m_SubscipitionBlock;
        private UInt16 m_NameSpaceIndex = 0;
        private object currentValue1;
        private object currentValue2;
        #endregion

        /// <summary>
        /// Connect to the UA server and read the namespace table.
        /// The connect is based on the Server URL entered in the Form
        /// The read of the namespace table is used to detect the namespace index
        /// of the namespace URI entered in the Form and used for the variables to read
        /// </summary>
        private void btnConnect_Click(object sender, EventArgs e)
        {
            // Connect to the server
            try
            {
                // Connect with URL from Server URL text box
                m_Server.Connect(txtServerUrl.Text);

                // Toggle enable flag of buttons
                toggleButtons(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Connect failed:\n\n"   ex.Message);
                return;
            }

            // Read Namespace Table
            try
            {
                NodeIdCollection nodesToRead = new NodeIdCollection();
                DataValueCollection results;

                nodesToRead.Add(Variables.Server_NamespaceArray);

                // Read the namespace array
                m_Server.ReadValues(nodesToRead, out results);

                if ( (results.Count != 1) || (results[0].Value.GetType() != typeof(string[])) )
                {
                    throw new Exception("Reading namespace table returned unexptected result");
                }

                // Try to find the namespace URI entered by the user
                string[] nameSpaceArray = (string[])results[0].Value;
                ushort i;
                for (i = 0; i < nameSpaceArray.Length; i  )
                {
                    if (nameSpaceArray[i] == txtNamespaceUri.Text)
                    {
                        m_NameSpaceIndex = i;
                    }
                }

                // Check if the namespace was found
                if ( m_NameSpaceIndex == 0 )
                {
                    throw new Exception("Namespace "   txtNamespaceUri.Text   " not found in server namespace table");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Reading namespace table failed:\n\n"   ex.Message);
            }
        }

        /// <summary>
        /// Disconnect from the UA server.
        /// </summary>
        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            try
            {
                if (m_Subscipition != null)
                {
                    btnMonitor_Click(null, null);
                }

                if (m_SubscipitionBlock != null)
                {
                    btnMonitorBlock_Click(null, null);
                }

                // Disconnect from Server
                m_Server.Disconnect();

                // Toggle enable flag of buttons
                toggleButtons(false);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Disconnect failed:\n\n"   ex.Message);
            }
        }

        /// <summary>
        /// Reads the values of the two variables entered in the From.
        /// The NodeIds used for the Read are constructed from the identifier entered 
        /// in the Form and the namespace index detected in the connect method
        /// </summary>
        private void btnRead_Click(object sender, EventArgs e)
        {
            try
            {
                NodeIdCollection nodesToRead = new NodeIdCollection();
                DataValueCollection results;

                // Add the two variable NodeIds to the list of nodes to read
                // NodeId is constructed from 
                // - the identifier text in the text box
                // - the namespace index collected during the server connect
                nodesToRead.Add(new NodeId(txtIdentifier1.Text, m_NameSpaceIndex));
                nodesToRead.Add(new NodeId(txtIdentifier2.Text, m_NameSpaceIndex));

                // Read the values
                m_Server.ReadValues(nodesToRead, out results);

                if ( results.Count != 2 )
                {
                    throw new Exception("Reading value returned unexptected number of result");
                }

                // Print result for first variable - check first the result code
                if (StatusCode.IsBad(results[0].StatusCode))
                {
                    // The node failed - print the symbolic name of the status code
                    txtRead1.Text = StatusCode.LookupSymbolicId(results[0].StatusCode.Code);
                    txtRead1.BackColor = Color.Red;
                }
                else
                {
                    // The node succeeded - print the value as string
                    txtRead1.Text = results[0].Value.ToString();
                    txtRead1.BackColor = Color.White;
                    currentValue1 = results[0].Value;
                }

                // Print result for second variable - check first the result code
                if (StatusCode.IsBad(results[1].StatusCode))
                {
                    // The node failed - print the symbolic name of the status code
                    txtRead2.Text = StatusCode.LookupSymbolicId(results[1].StatusCode.Code);
                    txtRead2.BackColor = Color.Red;
                }
                else
                {
                    // The node succeeded - print the value as string
                    txtRead2.Text = results[1].Value.ToString();
                    txtRead2.BackColor = Color.White;
                    currentValue2 = results[1].Value;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Read failed:\n\n"   ex.Message);
            }
        }

        /// <summary>
        /// Starts the monitoring of the values of the two variables entered in the From.
        /// The NodeIds used for the monitoring are constructed from the identifier entered 
        /// in the Form and the namespace index detected in the connect method
        /// </summary>
        private void btnMonitor_Click(object sender, EventArgs e)
        {
            // Check if we have a subscription 
            //  - No  -> Create a new subscription and create monitored items
            //  - Yes -> Delete Subcription
            if (m_Subscipition == null)
            {
                try
                {
                    // Handle is not stored since we delete the whole subscription
                    object monitoredItemServerHandle = null;

                    // Create subscription
                    m_Subscipition = m_Server.AddSubscription(100);
                    btnMonitor.Text = "Stop";

                    // Create first monitored item
                    m_Subscipition.AddDataMonitoredItem(
                        new NodeId(txtIdentifier1.Text, m_NameSpaceIndex),
                        txtMonitored1,
                        ClientApi_ValueChanged,
                        100,
                        out monitoredItemServerHandle);

                    // Create second monitored item
                    m_Subscipition.AddDataMonitoredItem(
                        new NodeId(txtIdentifier2.Text, m_NameSpaceIndex),
                        txtMonitored2,
                        ClientApi_ValueChanged,
                        100,
                        out monitoredItemServerHandle);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Establishing data monitoring failed:\n\n"   ex.Message);
                }
            }
            else
            {
                try
                {
                    m_Server.RemoveSubscription(m_Subscipition);
                    m_Subscipition = null;

                    btnMonitor.Text = "Monitor";
                    txtMonitored1.Text = "";
                    txtMonitored2.Text = "";
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Stopping data monitoring failed:\n\n"   ex.Message);
                }
            }
        }

        /// <summary>
        /// Callback method for data changes from the monitored variables.
        /// The text boxes for the output of the values or status information are passed 
        /// to the client API as clientHandles and contained in the callback
        /// </summary>
        private void ClientApi_ValueChanged(object clientHandle, DataValue value)
        {
            try
            {
                // We have to call an invoke method 
                if (this.InvokeRequired)
                {
                    // Asynchronous execution of the valueChanged delegate
                    this.BeginInvoke(new valueChanged(ClientApi_ValueChanged), clientHandle, value);
                    return;
                }

                if (clientHandle.GetType() == typeof(TextBox))
                {
                    // Get the according item
                    TextBox txtMonitoredValue = (TextBox)clientHandle;

                    // Print data change information for variable - check first the result code
                    if (StatusCode.IsBad(value.StatusCode))
                    {
                        // The node failed - print the symbolic name of the status code
                        txtMonitoredValue.Text = StatusCode.LookupSymbolicId(value.StatusCode.Code);
                        txtMonitoredValue.BackColor = Color.Red;
                    }
                    else
                    {
                        // The node succeeded - print the value as string
                        txtMonitoredValue.Text = value.Value.ToString();
                        txtMonitoredValue.BackColor = Color.White;
                    }
                }
                else
                {
                    // Print result for block - check first the result code
                    if (StatusCode.IsBad(value.StatusCode))
                    {
                        // The node failed - print the symbolic name of the status code
                        txtReadBlock.Text = StatusCode.LookupSymbolicId(value.StatusCode.Code);
                        txtReadBlock.BackColor = Color.Red;
                    }
                    else
                    {
                        if (value.Value.GetType() != typeof(byte[]))
                        {
                            throw new Exception("Value change for block did not send byte array");
                        }

                        byte[] rawValue = (byte[])value.Value;
                        string stringValue = "";
                        int lineLength = 0;

                        for (int i = 0; i < rawValue.Count(); i  )
                        {
                            stringValue  = string.Format("{0:X2} ", rawValue[i]);
                            lineLength  ;
                            if (lineLength > 25)
                            {
                                stringValue  = "\n";
                                lineLength = 0;
                            }
                        }

                        // The node succeeded - print the value as string
                        txtReadBlock.Text = stringValue;
                        txtReadBlock.BackColor = Color.White;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unexpected error in the data change callback:\n\n"   ex.Message);
            }
        }

        /// <summary>
        /// Write the value of the first variable entered in the From.
        /// The NodeId used for the Write is constructed from the identifier entered 
        /// in the Form and the namespace index detected in the connect method
        /// </summary>
        private void btnWrite1_Click(object sender, EventArgs e)
        {
            writeNewValue(
                new NodeId(txtIdentifier1.Text, m_NameSpaceIndex),  // NodeId = identifier   namespace index
                txtWrite1.Text, // Value to write as string
                currentValue1); // Current value from Read used to convert the string to the target type
        }

        /// <summary>
        /// Write the value of the second variable entered in the From.
        /// The NodeId used for the Write is constructed from the identifier entered 
        /// in the Form and the namespace index detected in the connect method
        /// </summary>
        private void btnWrite2_Click(object sender, EventArgs e)
        {
            writeNewValue(
                new NodeId(txtIdentifier2.Text, m_NameSpaceIndex), // NodeId = identifier   namespace index
                txtWrite2.Text, // Value to write as string
                currentValue1); // Current value from Read used to convert the string to the target type
        }

        /// <summary>
        /// Helper function to writing a value to a variable.
        /// The function 
        /// - reads the data type of the variable
        /// - converts the passed string to the data type
        /// - writes the value to the variable
        /// </summary>
        private void writeNewValue(NodeId nodeToWrite, string valueToWrite, object currentValue)
        {
            try
            {
                NodeIdCollection nodesToWrite = new NodeIdCollection();
                DataValueCollection values = new DataValueCollection();
                StatusCodeCollection results;
                Variant value = new Variant(Convert.ChangeType(valueToWrite, currentValue.GetType()));
                
                nodesToWrite.Add(nodeToWrite);
                values.Add(new DataValue(value));

                m_Server.WriteValues(
                    nodesToWrite,
                    values,
                    out results);

                if (StatusCode.IsBad(results[0]))
                {
                    throw new Exception(StatusCode.LookupSymbolicId(results[0].Code));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Writing new value failed:\n\n"   ex.Message);
            }
        }

        private void btnMonitorBlock_Click(object sender, EventArgs e)
        {
            // Check if we have a subscription 
            //  - No  -> Create a new subscription and create monitored item
            //  - Yes -> Delete Subcription
            if (m_SubscipitionBlock == null)
            {
                try
                {
                    // Handle is not stored since we delete the whole subscription
                    object monitoredItemServerHandle = null;

                    // Create subscription
                    m_SubscipitionBlock = m_Server.AddSubscription(100);
                    btnMonitorBlock.Text = "Stop";

                    // Create first monitored item
                    m_SubscipitionBlock.AddDataMonitoredItem(
                        new NodeId(txtIdentifierBlockRead.Text, m_NameSpaceIndex),
                        txtReadBlock,
                        ClientApi_ValueChanged,
                        100,
                        out monitoredItemServerHandle);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Establishing block monitoring failed:\n\n"   ex.Message);
                }
            }
            else
            {
                try
                {
                    m_Server.RemoveSubscription(m_SubscipitionBlock);
                    m_SubscipitionBlock = null;

                    btnMonitorBlock.Text = "Monitor Block";
                    txtReadBlock.Text = "";
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Stopping block monitoring failed:\n\n"   ex.Message);
                }
            }
        }

        private void btnWriteBlock1_Click(object sender, EventArgs e)
        {
            int writeLength = (int)Convert.ChangeType(txtWriteLength.Text, typeof(int));
            byte[] rawValue = new byte[writeLength];
            byte currentValue = 0;
            object writeValue;

            for (int i = 0; i < rawValue.Count(); i  )
            {
                rawValue[i] = currentValue;
                currentValue  ;
            }

            writeValue = rawValue;

            writeNewBlockValue(
                new NodeId(txtIdentifierBlockWrite.Text, m_NameSpaceIndex), // NodeId = identifier   namespace index
                writeValue); // Value to write as byte array
        }

        private void btnWriteBlock2_Click(object sender, EventArgs e)
        {
            int writeLength = (int)Convert.ChangeType(txtWriteLength.Text, typeof(int));
            byte[] rawValue = new byte[writeLength];
            byte currentValue = 255;
            object writeValue;

            for (int i = 0; i < rawValue.Count(); i  )
            {
                rawValue[i] = currentValue;
                currentValue--;
            }

            writeValue = rawValue;

            writeNewBlockValue(
                new NodeId(txtIdentifierBlockWrite.Text, m_NameSpaceIndex), // NodeId = identifier   namespace index
                writeValue); // Value to write as byte array
        }

        /// <summary>
        /// Helper function to writing a value to a variable.
        /// The function 
        /// - reads the data type of the variable
        /// - converts the passed string to the data type
        /// - writes the value to the variable
        /// </summary>
        private void writeNewBlockValue(NodeId nodeToWrite, object valueToWrite)
        {
            try
            {
                NodeIdCollection nodesToWrite = new NodeIdCollection();
                DataValueCollection values = new DataValueCollection();
                StatusCodeCollection results;
                Variant value = new Variant(valueToWrite);

                nodesToWrite.Add(nodeToWrite);
                values.Add(new DataValue(value));

                m_Server.WriteValues(
                    nodesToWrite,
                    values,
                    out results);

                if (StatusCode.IsBad(results[0]))
                {
                    throw new Exception(StatusCode.LookupSymbolicId(results[0].Code));
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Writing new block value failed:\n\n"   ex.Message);
            }
        }

        private void toggleButtons(bool isConnected)
        {
            // Toggle Connect / Disconnect buttons
            btnConnect.Enabled = !isConnected;
            btnDisconnect.Enabled = isConnected;

            // Toggle Textboxes
            txtServerUrl.Enabled = !isConnected;
            txtNamespaceUri.Enabled = !isConnected;

            // Toggle action buttons
            btnMonitor.Enabled = isConnected;
            btnRead.Enabled = isConnected;
            btnWrite1.Enabled = isConnected;
            btnWrite2.Enabled = isConnected;
            btnMonitorBlock.Enabled = isConnected;
            btnWriteBlock1.Enabled = isConnected;
            btnWriteBlock2.Enabled = isConnected;
        }
    }
}


标签: c Client t opc a

实例下载地址

opc ua client

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 tangyu77 发表于: 2019-06-10 12:27 01
为什么我用vs2015打开报错, 错误 CS0006 Metadata file 'OPC_UA_CODE_v10\OPC_UA_CODE_v10\Backup\ClientAPI\bin\Debug\Siemens.OpcUA.dll' could not be found UAClient E:\兰剑材料\OPC_UA_CODE_v10\OPC_UA_CODE_v10\Backup\UAClient\CSC 把文件拷贝到指定目录下,再生成它就把那个dll自己删除了,接着报同样的错

支持(0) 盖楼(回复)

第 2 楼 ddd123 发表于: 2019-06-30 21:57 28
迅雷怎么下载不动啊???

支持(0) 盖楼(回复)

第 3 楼 zikywu 发表于: 2021-07-23 10:23 17
下载了打不开,有很多DLL没引用。别中招

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有3条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警