• 大小: 6.22M
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2020-12-26
  • 语言: C#
  • 标签: OPC  UA  SIMATIC  

资源简介

本实例,用于SIMATIC plc 通信,但修改实例可以与其他PLC进行通信,绝对可以运行!

DEMO1



DEMO2



【核心代码】

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.UAClientHelper;

namespace Siemens.OpcUA.SimpleClient
{
    public partial class MainForm : Form
    {
        #region Construction
        public MainForm()
        {
            InitializeComponent();

            m_Server = new UAClientHelperAPI();
            m_Server.CertificateValidationNotification  = new CertificateValidationEventHandler(m_Server_CertificateEvent);
        }

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

        #region Fields
        private UAClientHelperAPI m_Server = null;
        private Subscription m_Subscription;
        private Subscription m_SubscriptionBlock;
        private UInt16 m_NameSpaceIndex = 0;
        #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, "none", MessageSecurityMode.None, false, "", "");

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

            // Read Namespace Table
            try
            {
                List<string> nodesToRead = new List<string>();
                List<string> results = new List<string>();

                nodesToRead.Add("ns=0;i="   Variables.Server_NamespaceArray.ToString());

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

                if (results.Count != 1)
                {
                    throw new Exception("Reading namespace table returned unexptected result");
                }

                // Try to find the namespace URI entered by the user
                string[] nameSpaceArray = results[0].Split(';');
                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_Subscription != null)
                {
                    btnMonitor_Click(null, null);
                }

                if (m_SubscriptionBlock != 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
            {
                List<string> nodesToRead = new List<string>();
                List<string> results = new List<string>();

                // 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).ToString());
                nodesToRead.Add(new NodeId(txtIdentifier2.Text, m_NameSpaceIndex).ToString());

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

                txtRead1.Text = results[0];
                txtRead2.Text = results[1];
            }
            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_Subscription == null)
            {
                try
                {
                    // Create subscription
                    m_Subscription = m_Server.Subscribe(1000);
                    m_Server.ItemChangedNotification  = new MonitoredItemNotificationEventHandler(ClientApi_ValueChanged);
                    btnMonitor.Text = "Stop";

                    // Create first monitored item
                    m_Server.AddMonitoredItem(m_Subscription, new NodeId(txtIdentifier1.Text, m_NameSpaceIndex).ToString(), "item1", 100);


                    // Create second monitored item
                    m_Server.AddMonitoredItem(m_Subscription, new NodeId(txtIdentifier2.Text, m_NameSpaceIndex).ToString(), "item2", 100);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Establishing data monitoring failed:\n\n"   ex.Message);
                }
            }
            else
            {
                try
                {
                    m_Server.RemoveSubscription(m_Subscription);
                    m_Subscription = 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(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e)
        {
            try
            {
                if (this.InvokeRequired)
                {
                    this.BeginInvoke(new MonitoredItemNotificationEventHandler(ClientApi_ValueChanged), monitoredItem, e);
                    return;
                }
                MonitoredItemNotification notification = e.NotificationValue as MonitoredItemNotification;
                if (notification == null)
                {
                    return;
                }

                if (monitoredItem.DisplayName == "item1")
                {
                    // Get the according item
                    txtMonitored1.Text = notification.Value.WrappedValue.ToString();
                }

                if (monitoredItem.DisplayName == "item2")
                {
                    // Get the according item
                    txtMonitored2.Text = notification.Value.WrappedValue.ToString();
                }

                if (monitoredItem.DisplayName == "itemBlock1")
                {
                    // Get the according item
                    txtReadBlock.Text = notification.Value.WrappedValue.ToString();
                }
            }
            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
        }

        /// <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
        }

        /// <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)
        {
            try
            {
                List<string> nodesToWrite = new List<string>();
                List<string> values = new List<string>();

                nodesToWrite.Add(nodeToWrite.ToString());
                values.Add(valueToWrite);

                m_Server.WriteValues(values, nodesToWrite);
            }
            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_SubscriptionBlock == null)
            {
                try
                {
                    // Create subscription
                    m_SubscriptionBlock = m_Server.Subscribe(1000);
                    btnMonitorBlock.Text = "Stop";

                    // Create first monitored item
                    m_Server.AddMonitoredItem(m_SubscriptionBlock, new NodeId(txtIdentifierBlockRead.Text, m_NameSpaceIndex).ToString(), "itemBlock1", 100);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Establishing block monitoring failed:\n\n"   ex.Message);
                }
            }
            else
            {
                try
                {
                    m_Server.RemoveSubscription(m_SubscriptionBlock);
                    m_SubscriptionBlock = 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
            {
                List<string> nodesToWrite = new List<string>();
                List<string> values = new List<string>();

                nodesToWrite.Add(nodeToWrite.ToString());
                values.Add(valueToWrite.ToString());

                m_Server.WriteValues(values, nodesToWrite);
            }
            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;
        }
    }
}


资源截图

代码片段和文件信息

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.UAClientHelper;

namespace Siemens.OpcUA.SimpleClient
{
    public partial class MainForm : Form
    {
        #region Construction
        public MainForm()
        {
            InitializeComponent();

            m_Server = new UAClientHelperAPI();
            m_Server.CertificateValidationNotification += new CertificateValidationEventHandler(m_Server_CertificateEvent);
        }

        void m_Server_CertificateEvent(CertificateValidator validator CertificateValidationEventArgs e)
        {
            // Accept all certificat

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-12-20 17:10  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\
     目录           0  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\
     目录           0  2017-12-20 13:12  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\AdditionalFiles\
     目录           0  2017-12-20 13:12  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\AdditionalFiles\PLCM\
     文件           4  2017-11-30 15:45  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\AdditionalFiles\PLCM\plcmArchive.pma
     文件           4  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\AdditionalFiles\PLCM\plcmArchive.pma14_1
     目录           0  2017-12-20 13:12  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\
     目录           0  2018-06-01 13:59  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\HMI\
     文件          16  2018-06-01 15:12  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\HMI\DeviceFolders.dat
     目录           0  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\
     文件      615706  2018-06-18 16:29  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\_5q.cfs
     文件          14  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\_5q_1.del
     文件        4276  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\_5s.cfs
     文件         447  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\_5t.cfs
     文件          20  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\segments.gen
     文件         392  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\segments_3i
     文件         563  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SearchIndex\segments_3j
     目录           0  2017-12-20 13:12  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SPL\
     文件        1499  2018-06-25 12:39  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\IM\SPL\options
     目录           0  2017-12-20 13:12  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\
     文件        3493  2017-11-30 15:41  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ConversionLog.xml
     文件       24212  2017-11-30 15:59  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ConversionLog_13.0.1.0_to_14.0.0.0.xml
     文件        6814  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ConversionLogFile.xsl
     文件         693  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoActionRequest.png
     文件         693  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoDecision.png
     文件         544  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoDecisionCritical.png
     文件         581  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoError.png
     文件         609  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoErrorCritical.png
     文件         608  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoInformation.png
     文件         693  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoInputRequired.png
     文件         713  2017-11-30 15:47  42014088_OPC_UAClient_CODE_V12\OPC_UA_STEP7_CODE_V12\OPC_UA_STEP7_CODE_V12\Logs\ICO_PE_InfoSuccess.png
............此处省略438个文件信息

评论

共有 条评论