实例介绍
【实例简介】
【实例截图】
【核心代码】
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; } } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)