通过Unity3D创建一个OPC UA客户端

问题描述 投票:-2回答:2

其实曾经问过这个问题,但好像没有人给我预期的答案:(我想在Unity3D中创建一个OPC UA客户端。更具体地说,它将是这样的:一个简单的场景,只有一个Text。这个Text显示了从OPC UA服务器上读取的一个变量的值.我添加了这个代码(在stackoverflow上找到的),但它没有工作。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Opc.Ua; 
using Opc.Ua.Client;
using Opc.Ua.Configuration;

public class main : MonoBehaviour
{

private async void Start()
{
    Console.WriteLine("Step 1 - Create a config.");
    var config = new ApplicationConfiguration()
    {
        ApplicationName = "test-opc",
        ApplicationType = ApplicationType.Client,
        SecurityConfiguration = new SecurityConfiguration { ApplicationCertificate = new CertificateIdentifier() },
        TransportConfigurations = new TransportConfigurationCollection(),
        TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
        ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 }
    };
    await config.Validate(ApplicationType.Client);
    if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates)
    {
        config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); };
    }

    Console.WriteLine("Step 2 - Create a session with your server.");
    using (var session = await Session.Create(config, new ConfiguredEndpoint(null, new EndpointDescription("opc.tcp://localhost:4841")), true, "", 60000, null, null))
    {
        Console.WriteLine("Step 3 - Browse the server namespace.");
        ReferenceDescriptionCollection refs;
        byte[] cp;
        session.Browse(null, null, ObjectIds.ObjectsFolder, 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out cp, out refs);
        Console.WriteLine("DisplayName: BrowseName, NodeClass");
        foreach (var rd in refs)
        {
            Console.WriteLine(rd.DisplayName + ": " + rd.BrowseName + ", " + rd.NodeClass);
            ReferenceDescriptionCollection nextRefs;
            byte[] nextCp;
            session.Browse(null, null, ExpandedNodeId.ToNodeId(rd.NodeId, session.NamespaceUris), 0u, BrowseDirection.Forward, ReferenceTypeIds.HierarchicalReferences, true, (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out nextCp, out nextRefs);
            foreach (var nextRd in nextRefs)
            {
                Console.WriteLine("+ " + nextRd.DisplayName + ": " + nextRd.BrowseName + ", " + nextRd.NodeClass);
            }
        }

        Console.WriteLine("Step 4 - Create a subscription. Set a faster publishing interval if you wish.");
        var subscription = new Subscription(session.DefaultSubscription) { PublishingInterval = 1000 };

        Console.WriteLine("Step 5 - Add a list of items you wish to monitor to the subscription.");
        var list = new List<MonitoredItem> {
            new MonitoredItem(subscription.DefaultItem) { DisplayName = "aaatime", StartNodeId = "i=10004" } };
        list.ForEach(i => i.Notification += OnNotification);
        subscription.AddItems(list);

        Console.WriteLine("Step 6 - Add the subscription to the session.");
        session.AddSubscription(subscription);
        subscription.Create();

        Console.WriteLine("Finished client initialization");
    }
}

private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e)
{
    foreach (var value in item.DequeueValues())
    {
        Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
    }
}
}

我的期望是:当我按下Play键时,Unity应用运行并连接到我的OPC UA服务器,然后,它从服务器上读取一个变量的值,并将该值显示在Text中。所以我所做的是创建一个Unity项目-&gt;一个场景-&gt;一个画布-&gt;一个文本,一个C#脚本(上面的代码)。但是当我把这个脚本添加到Canvas中时,却出现了这样的通知:无法添加脚本,请确认没有编译器错误,文件名和类名匹配。我想我已经全部检查过了,但没有任何错误。你能给我一些解决我的问题的方法吗?PS:代码来自这个帖子。在Unity3d中用opc ua .net库创建一个非常简单的OPC客户端。

c# unity3d opc-ua
2个回答
0
投票

一个解决方案是,如果你不熟悉opc-ua,可以踢掉opc-ua客户端并提出REST请求。这可以通过一个像Konektilo这样的opc-ua到rest的翻译器来实现(https:/konektilo.de)和unity的休息客户端()和unity的休息客户端(https:/assetstore.unity.comackagestoolsnetworkrest-client-for-unity-102501。).

我也有过这样的经历,一些opc-ua客户端并不能在所有平台上运行unity应用程序。


0
投票

我为unity创建了一个工作的opc ua客户端,例子来自于 OPC UA:浏览服务器根节点的最小代码。

但我也喜欢@M.List的想法,他的Rest-OPC UA-Gateway,因为unity有一个自己的REST-Communication库。

但是,如果你需要使用opc ua,以下是一个简短的解释,我如何能让它在我的项目中运行,我首先在visual studio的一个普通的控制台应用程序中尝试了这个例子。经过成功的测试,我把我的控制台应用程序的所有dll复制到一个自己创建的插件文件夹中的unity。如果你在你的unity项目中创建一个名为Plugins的文件夹,你可以把unity自主包含的dll放到你的项目中使用。你需要所有这些dll,然后我用例子中的代码创建了一个脚本 "opcUaClient"。Unity的启动方法是主方法,更新方法是例子中的OnNotification方法。我无法将其部署到android或hololens上。

但最简单的方法是在unity资产商店中的games4automation的OPC UA客户端。我试了一下,效果很好。

RegardsStefan

© www.soinside.com 2019 - 2024. All rights reserved.