资源简介
本实例,用于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.xm
文件 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.xm
文件 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个文件信息
相关资源
- Beginning C# 7 Programming with Visual Studio
- Visual C#.NET串口通信及测控应用典型实
- C#Visual Studio窗体开发案例教程
- Visual C#从入门到精通.第8版.John Sharp
- TeeChart for .NET 2017 Evaluation 4.1.2017.031
- Visual C# 2010从入门到精通(周靖).p
- Intrusion Detection Evaluation Dataset (CICI
- C# OPC 数据采集 .rar
- C#操作OPC包含KepServer4.5软件 OPCAutomat
- Visual C# 2013从入门到精通_英夏普著_清
- 最新User-Agent有18000个最新2019年4月最新
- Visual C#从入门到精通(第8版).pdf
- Visual Studio 2015(C#) Windows数据库项目
- visual C#从入门到精通第八版
- 图书管理系统C#、visual Studio、SQL Ser
- Visual C#+SQL Server数据库开发与光盘
- 工业OPC客户端读取,并存SQL
- C# PLC OPC 通讯统一方式
- C# 2015最新版NMODBUS4.0源码支持TCP/IPRT
- visual studio 2010 Theme 主题包
- C#贪吃蛇游戏源代码开发环境visual s
- QuadTree四叉树实现代码 C#
- Visual.C#2010从入门到精通 光盘源码
- C#编写modbus上位机
- 用Visual C#打造多页面网页浏览器
- C#编写的通讯录管理系统C#源代码程序
- PIC18F UART Bootloader (C# 上位机)
- C#的ListView在VirtualMode模式下带CheckBo
- C#桌面右下角弹出提示窗
- C#版本opc da 源码最低分分享
川公网安备 51152502000135号
评论
共有 条评论