实际上要求过一次,但是似乎没人给我期望的答案:( 我正在尝试在Unity3D中创建OPC UA客户端。更具体地说,它将是这样的:一个只有文本的简单场景。该文本显示了从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服务器,然后,它从Server读取变量的值,并在Text中显示该值。所以我要做的是创建一个Unity项目->一个场景->一个画布->一个文本,一个C#脚本(上面的代码)。但是,当我将脚本添加到Canvas时,它发出如下通知:无法添加脚本,请确保没有编译器错误,并且文件名和类名匹配。我想我已经检查了所有这些,但是没有任何错误。
你能建议我一些解决方案吗?
P / S:代码来自以下线程:Create a very simple OPC client in Unity3d with opc ua .net library
答案 0 :(得分:0)
一种解决方案是踢起opc-ua客户端并在您不熟悉opc-ua的情况下发出REST请求。这可以通过opc-ua来完成,例如Konektilo(https://konektilo.de/)的休息翻译者和用于统一的{https://assetstore.unity.com/packages/tools/network/rest-client-for-unity-102501的休息顾客)。
我还体验到,某些opc-ua客户端不能在可以运行统一应用程序的所有平台上运行。
答案 1 :(得分:0)
我使用OPC UA : minimal code that browses the root node of a server
中的示例创建了一个工作的opc ua客户端,以实现统一但是我也喜欢@ M.List及其Rest-OPC UA-Gateway的想法,因为统一对REST通信具有自己的库。
但是,如果要求您使用opc ua,请在简短说明后说明如何在我的项目中运行它 我首先在Visual Studio中的普通控制台应用程序中尝试了该示例。在成功测试之后,我将控制台应用程序的所有dll复制到一个自己创建的plugins文件夹中。如果在统一项目中创建一个名为Plugins的文件夹,则可以在其中放置dll,其中universe自治文件包含在项目中以供使用。您需要所有这些dll 之后,我使用示例中的代码创建了一个脚本“ opcUaClient”。示例的主要方法是Unity的启动方法,而更新方法是OnNotification方法 直到现在,我只能在按下“播放”按钮时才能统一运行此客户端。我无法将其部署到android或hololens。
但是最简单的方法是从统一资产商店中的games4automation到OPC UA-Client。我尝试过,效果很好。
问候 斯蒂芬