Создайте клиент OP C UA с помощью Unity3D - PullRequest
0 голосов
/ 27 мая 2020

На самом деле просил об этом один раз, но похоже, что никто не дал мне ожидаемого ответа :( Я пытаюсь создать OP C UA-клиент в Unity3D. Чтобы быть более конкретным c, это будет примерно так: простая сцена только с текстом. Этот текст показывает значение переменной, считанной с сервера OP C 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 запускается и подключается к моему серверу OP C UA, затем оно считывает значение переменной с сервера и отображает это значение в тексте. что я делаю, так это создаю проект Unity -> сцену -> холст -> текст, скрипт C# (код выше). Но когда я добавляю скрипт на холст, это уведомление вроде: не могу добавьте скрипт, убедитесь, что нет ошибок компилятора и совпадают имя файла и имя класса. Думаю, я уже проверил их все, но ошибок нет.
Вы можете предложить мне какое-то решение моих проблем?
P / S: код взят из этой ветки: Создайте очень простой клиент OP C в Unity3d с op c ua. net library

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Я создал рабочий клиент op c ua для единства с примером из OP C UA: минимальный код, который просматривает узел root сервера

Но также мне нравится идея @ M.List с его Rest-OP C UA-Gateway, потому что у unity есть собственная библиотека для REST-Communication.

Но если это требование для вас использовать op c ua, после краткого объяснения, как я могу запустить его в своем проекте, я сначала попробовал этот пример в обычном консольном приложении в Visual Studio. После успешного тестирования я скопировал все DLL моего консольного приложения в созданную мной папку плагинов в единстве. Если вы создаете в своем проекте Unity папку с именем Plugins, вы можете поместить туда библиотеки DLL, которые Unity Autonomous включает в свой проект для использования. Вам понадобятся все эти библиотеки. После этого я создал сценарий «opcUaClient» с кодом из примера. Метод запуска Unity является основным методом, а метод обновления - методом OnNotification в примере. До сих пор я мог выполнить sh только для запуска этого клиента в единстве при нажатии кнопки воспроизведения. Не смог развернуть на android или гололенс.

Но самый простой способ - это OP C UA-Client от games4automation в магазине Unity asset. Я попробовал, и он отлично работает.

С уважением, Стефан

0 голосов
/ 27 мая 2020

Одним из решений может быть запуск клиента op c -ua и выполнение запросов REST, если вы не знакомы с op c -ua. Этого можно добиться с помощью переводчика op c -ua для отдыха, такого как Konektilo (https://konektilo.de/), и клиента отдыха для unity (https://assetstore.unity.com/packages/tools/network/rest-client-for-unity-102501).

Я также убедился, что некоторые клиенты op c -ua не работают на всех платформах, на которых можно запускать приложения Unity.

...