Labview进阶04:Labview与OPC UA设备通信(dll版)
本节目标:
1)本节区别于进阶01内容,使用c#编写的dll进行OpcUa通信,不需要安装(Labview OPC UA工具包),该工具包需要下载收费,可以减少开发成本;
2)安装软件,搭建虚拟OPC UA服务器;
3)使用UaExpert,读取OPC UA服务器中的变量;
4)使用C#编写用于OpcUa通信的dll;
5)编写Labview程序,读写服务器中变量值,创建订阅触发事件;
下图是根据上面的要求最终的运行结果,可以读写模拟服务器中的寄存器,OPC UA Simulation Server中的Trigger值变化会主动触发一个显示变化后值的弹窗。

运行配置:
Labview 2020(32位)
1.1 OPC服务器模拟
1)下载两个软件:OPC UA Simulation Server 和 UaExpert
Prosys OPC UA Simulation Server
OPC UA Clients - Unified Automation
2)安装完成后,打开软件OPC UA Simulation Server
选择专家模式


3)新建变量Trigger

3)设置匿名登录


设置完成后重启软件。
4)打开UaExpert,此为OPC客户端,用于测试服务器
点击加号


输入URL

选择匿名登录

连接


将变量拉入到显示界面处。

可以看到变量的值,同时也可以修改值。
1.2 创建OPC UA通信dll
1)新建项目

2)现在依赖包
下载OpcUaHelper,用于OpcUa通信。

下载Costura.Fody包,可以将多个dll合并到一个dll中,让文件变得更加简洁。

3)添加程序
OpcUaConnector.cs中如下;
具体讲解可以参考博文:进阶01:Labview与OPC UA设备通信_labview opc ua-CSDN博客
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpcUaHelper;
using Opc.Ua;
using Opc.Ua.Client;namespace OpcUaDll
{public class OpcUaConnector{private string ServerUrl;private OpcUaClient m_OpcUaClient;public event EventHandler<TEventArgs> OnSubscription;public struct TEventArgs{public string key;public object value;}public OpcUaConnector(string url){ServerUrl = url;m_OpcUaClient = new OpcUaClient();}public bool Connect(){m_OpcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());//匿名链接try{m_OpcUaClient.ConnectServer(ServerUrl);//链接服务器 }catch (Exception ex){Console.WriteLine("Connect failed!!");return false;}return true;}public object ReadTag(string tag){object val;try{val = m_OpcUaClient.ReadNode<object>(tag);}catch{return false;} return val;}public object[] ReadTags(string[] tags){List<object> val1 = m_OpcUaClient.ReadNodes<object>(tags);object[] result = new object[val1.Count];int i = 0;foreach(object obj in val1){result[i] = obj;i++;}return result;}public bool WriteTag(string tag, object val){try{var var1 = m_OpcUaClient.WriteNode<object>(tag, val);}catch(Exception ex){Console.WriteLine("Write failed!!");return false;}return true;}public bool WriteTags(string[] tags, object[] vals){try{var var1 = m_OpcUaClient.WriteNodes(tags, vals);}catch (Exception ex){Console.WriteLine("Write failed!!");return false;}return true;}public bool AddSubscription(string key,string tag){if (m_OpcUaClient.Connected){m_OpcUaClient.AddSubscription(key, tag, SubCallback);return true;}elsereturn false;}public bool AddSubscriptions(string[] keys, string[] tags){if (m_OpcUaClient.Connected){for (int i = 0; i < tags.Length;i++ )m_OpcUaClient.AddSubscription(keys[i], tags[i], SubCallback);return true;}elsereturn false;}private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args){MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;//notification.Value.WrappedValue.Value;TEventArgs ww = new TEventArgs();ww.key = key;ww.value = notification.Value.WrappedValue.Value;OnSubscription.Invoke(this, ww);}public bool RemoveSubscription(string key){if (m_OpcUaClient.Connected){m_OpcUaClient.RemoveSubscription(key);return true;}elsereturn false;}public bool RemoveAllSubscription(){if (m_OpcUaClient.Connected){try{m_OpcUaClient.RemoveAllSubscription();}catch{return false;}return true;}elsereturn false;}public bool Disconnect(){if (m_OpcUaClient.Connected){m_OpcUaClient.RemoveAllSubscription();m_OpcUaClient.Disconnect();}return true;}}
}
程序编辑完成后,编译,可在debug文件夹中生成dll文件。

1.3 Labvie程序
1.3.1 新建OpcUaHelper类
新建OpcUaHelper类如下,在类中新建多个子vi,该类用于集成OpcUa的通信。

将OpcUaDll.dll拷贝到类的文件夹OpcUaDll下。
1)新建OpcUaConnect.vi
用于连接OpcUa服务器;

其中,构造器中内容如下;

2)新建OpcUaDisconnect.vi
用于断开OpcUa通信,同时可以将订阅等关掉;

3)新建OpcUaReadNode.vi
读取一个节点的变量值;

4)新建OpcUaReadNodes.vi
用于读取多个节点的值;

5)新建OpcUaWriteNode.vi
用于写入单个节点的值;

6)新建OpcUaWriteNodes.vi
用于写入多个节点的值;

7)新建OpcUaAddSubscription.vi
用于添加多个订阅;

回调SubCallback.vi

8)新建OpcUaRemoveSubscription.vi
去除单个节点订阅;

1.3.2 调用OpcUaHelper类
1)新建OpcUaClient_example,前面板如下

2)程序框图
主界面的程序流程图如下所示:

3)连接事件


4)读取事件

5)写入事件

6)停止按钮

7)用户事件

1.3.3 运行
点击连接,可以连接到OPC服务器,使用写入和读取按钮也可以很好的进行读写操作,修改Trigger的值,就会弹出对话框显示修改后的值,订阅功能没有问题。

本节区别于进阶01内容,使用c#编写的dll进行OpcUa通信,不需要安装Labview OPC UA工具包,因为该工具包需要下载收费,这样可以减少开发成本,直接将上面的OpcUaHelper.lvclass拷贝到开发程序中就可以使用。
