本节目标:
1)安装软件,搭建虚拟OPC UA服务器;
2)使用UaExpert,读取OPC UA服务器中的变量;
3)编写Winform程序,读写服务器中变量值,创建订阅触发事件;
下图是根据上面的要求最终的运行结果,可以读写PLC寄存器,OPC UA Simulation Server中的Trigger值变化会主动触发一个显示变化后值的弹窗。
1.1 环境配置
下载两个软件:OPC UA Simulation Server 和 UaExpert
Prosys OPC UA Simulation Server
OPC UA Clients - Unified Automation
1.1.1 OPC UA Simulation Server
1)安装完成后,打开软件OPC UA Simulation Server
选择专家模式
2)新建变量Trigger
3)设置匿名登录
设置完成后重启软件。
1.1.2 UaExpert使用
1)打开UaExpert,此为OPC客户端,用于测试服务器
点击加号
2)创建连接
输入URL,这个是根据前面的虚拟服务器定的。
选择匿名登录
3)连接
4)将变量拉入到显示界面处。
可以看到变量的值,同时也可以修改值。后面需要根据上面的Node Id来进行编程。
1.2 编程
新建Winform项目,OpcUaClient_example。
思维导图如下:
1.2.1 界面设计
4个TextBox(txtServerUrl、txtNode、txtReadData、txtWriteData);
3个按钮(btn_Connect、btn_Read、btn_Write);
5个Label(显示状态lblStatus);
1.2.2 程序设计
主界面的程序流程图如下所示:
1)添加依赖包
项目->管理NuGet程序包,输入OpcUaHelper,下载依赖包。
2)添加命名空间
using Opc.Ua;
using Opc.Ua.Client;
using OpcUaHelper;
3)变量
//实例化
OpcUaClient m_OpcUaClient = new OpcUaClient();
4)连接按钮事件
private async void btnConnect_Click(object sender, EventArgs e)
{if (btn_Connect.Text == "Connect"){m_OpcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());//匿名链接try{await m_OpcUaClient.ConnectServer(txtServerUrl.Text.ToString());//链接服务器m_OpcUaClient.AddSubscription("AA", "ns=3;s=Trigger", SubCallback);//订阅节点,值变化即触发事件lblStatus.Text = "连接成功!";}catch (Exception ex){ClientUtils.HandleException("Connected Failed", ex);}btn_Connect.Text = "Disconnect";}else{m_OpcUaClient.RemoveSubscription("AA");//取消订阅m_OpcUaClient.Disconnect();//断开连接lblStatus.Text = "断开连接!";btn_Connect.Text = "Connect";}}
5)订阅回调函数
private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args)
{if (InvokeRequired){Invoke(new Action<string, MonitoredItem, MonitoredItemNotificationEventArgs>(SubCallback), key, monitoredItem, args);return;}if (key == "AA"){// 如果有多个的订阅值都关联了当前的方法,可以通过key和monitoredItem来区分MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;if (notification != null){MessageBox.Show("Trigger变量值变化:"+notification.Value.WrappedValue.Value.ToString()); //获取变化的值}}
}
6)读取按钮事件
private void btnRead_Click(object sender, EventArgs e)
{try{double value = m_OpcUaClient.ReadNode<double>(txtNode.Text);//读取单个节点值txtReadData.Text = value.ToString();}catch (Exception ex){ClientUtils.HandleException(this.Text, ex);}
}
7)写入按钮事件
private void btnWrite_Click(object sender, EventArgs e)
{try{m_OpcUaClient.WriteNode(txtNode.Text, Convert.ToDouble(txtWriteData.Text));//写入单个节点值}catch (Exception ex){ClientUtils.HandleException(this.Text, ex);}
}
1.3 运行
编译完成后,运行程序。点击Connect按钮,连接OPC UA服务器完成。
分别点击写入和读取按钮,可以看到OPC UA Simulation Server的Random值在变化。
在OPC UA Simulation Server修改Trigger的值,winform程序会弹窗,显示修改后的值。
该节展现的内容是通用OPC UA的连接、读写、事件订阅等功能的展示,可以作为需要OPC通讯集成项目的参考。