我正在开发一个OPC客户端,需要一个免费的OPC服务器,可以模拟值和设置值静态.有这样的服务器免费提供吗?
在.NET中通过OPC进行通信的应用程序开始的好地方在哪里?
假设我有多个分布式复杂机器。每台机器包含多个 cpplex 设备。每个设备都有自己的 OPC UA 服务器来监控设备组件。通过 OPC UA 客户端,我想读取 OPC UA 服务器的所有数据项。
现在我不知道如何建立信息模型。我设计了一个全局信息模型,其中包含所有机器、其设备以及设备的内部组件。从全球的角度来看,这是有道理的。但是我是否还必须为每个服务器创建一个本地信息模型?或者本地 OPC UA 服务器是否使用全局信息模型,但服务器仅为该服务器实现相关对象(基于全局信息模型)?
更新:
这是一个示例设置:
在示例中,您可以看到三个层 - 机器层、构建层和工厂层。
这是我对如何对此类设置进行建模的理解。有一个整体的 OPC UA 信息模型,它描述了所有类型等。每个 OPC UA 服务器都知道该信息模型和所有包含的类型描述。
现在,根据现实世界的设置,我可以创建一个对象模型。机器层的 OPC UA 服务器包含来自底层系统的所有对象,在本例中为设备。
通过构建层的 OPC UA 客户端,我可以从机器连接到 OPC UA 服务器,并且可以从机器内部的设备读取所有数据项。
工厂层的 OPC UA 客户端可以从建筑物连接到 OPC UA 服务器。建筑级别的OPC UA服务器可以提供更多对象:
来自工厂外部的 OPC UA 客户端可以看到对象模型的全貌:
但是如何通过服务器从工厂外部获取设备数据呢?我是否必须在构建层中再次从机器层创建对象模型?又在下一个更高级别的层等等?
或者每一层的任何 OPC UA 服务器都知道整个对象模型(如信息模型)吗?
我正在尝试 OPC UA 基金会 GitHub 页面OPC-UA.net Standard中的 SampleApplication NetCoreConsoleClient ,在此过程中我遇到了几个问题。
我想使用这个库来简单地读取服务器发送的数据(我正在使用 Prosys OPC UA 服务器)并将其写在控制台中。我一直在努力获取与服务器发送的实际数据变量。我设法连接到它并订阅,但无法使用该方法写出所需的 MonitoredItem 值onNotification。
Console.WriteLine("6 - Add a list of items (server current time and status) to the subscription.");
exitCode = ExitCode.ErrorMonitoredItem;
var list = new List<MonitoredItem>
{
new MonitoredItem(subscription.DefaultItem)
{
DisplayName = "ServerStatusCurrentTime", StartNodeId = "i="+Variables.Server_ServerStatus_CurrentTime.ToString()
}
};
list.ForEach(i => i.Notification += OnNotification);
subscription.AddItems(list);
Run Code Online (Sandbox Code Playgroud)
此处示例将一个新的 MonitoredItem 添加到列表中。当我尝试添加自己的项目时,即使服务器始终发送更改的值,我也从未收到任何响应,因此它应该触发该onNotification方法。
我从这部分获取所需值的 DisplayName 和 StartNodeId:
foreach (var rd in references)
{
Console.WriteLine(" {0}, {1}, {2}", …Run Code Online (Sandbox Code Playgroud) 我一直无法找到解决问题的解决方案,因此我正在开设一个新主题.
Utgard(http://openscada.org/projects/utgard)对我来说似乎是一个非常有用的工具.在这个阶段,我只想通过Eclipse在Windows 8操作系统上本地访问TOP OPC服务器.但是,在尝试运行他们的教程时,我最终得到了"访问被拒绝".我不认为我在用户名,密码等方面犯了任何错误.
Exele OPC DA测试客户端不会返回任何错误.我可以连接,检索和重写值.
请注意,我是OPC和OpenSCADA的新手.任何帮助将不胜感激.
package org.openscada.opc.tutorial;
import java.util.concurrent.Executors;
import org.jinterop.dcom.common.JIException;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.DataCallback;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;
public class UtgardTutorial1 {
public static void main(String[] args) throws Exception {
// create connection information
final ConnectionInformation ci = new ConnectionInformation();
//final ConnectionInformation connectionInformation = new ConnectionInformation();
ci.setHost("127.0.0.1");
//ci.setDomain("");
ci.setUser("Me");
ci.setPassword("Password");
ci.setProgId("SWToolbox.TOPServer.V5");
//ci.setClsid("680DFBF7-C92D-484D-84BE-06DC3DECCD68"); // if ProgId is not working, try it using the Clsid instead
// create an id …Run Code Online (Sandbox Code Playgroud) 我正在编写OPC客户端,所以我使用Python OpenOPC库。
问题是每次我阅读OPC项目列表时,我的应用都会消耗内存。
例如,以下代码每次迭代消耗约100ko:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import OpenOPC
import time
import gc
gc.set_debug(gc.DEBUG_LEAK)
client = OpenOPC.client()
while True:
client.connect('CODESYS.OPC.DA')
dataList = client.list("PLC2.Application.GVL.*")
res = client.read(dataList)
client.close()
print gc.collect()
print gc.garbage
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
然后垃圾收集器返回:
0
[]
Run Code Online (Sandbox Code Playgroud)
当我关闭应用程序时,内存被释放。
所以我不明白为什么我的应用程序会泄漏内存以及如何避免这种情况。
你有什么主意吗?谢谢
问题:
我成功地在代理上调用 CoSetProxyBlanket(如果这是正确的术语),然后在同一个代理上调用 QueryInterface,但收到的结果为 0x80070005(“访问被拒绝”)。但是,如果我首先使用相同的凭据调用 CoInitializeSecurity (我试图避免),那么调用就会成功。
问题:
如何在不调用CoInitializeSecurity的情况下成功获取我需要的接口?据我了解,一个进程只能调用此方法一次,因此它与制作 dll 不兼容,通常可以用对 CoSetProxyBlanket 的调用来代替。
细节:
我正在尝试构建自己的 OPC 客户端,该客户端可以与在不同域上运行的计算机进行通信,而无需匹配用户帐户。
首先,我创建一个身份结构,其中包含在服务器上有效的域、用户名和密码:
COAUTHINFO authInfo;
COAUTHIDENTITY authIdentity;
authIdentity.Domain = (unsigned short *) w_domain;
authIdentity.DomainLength = wcslen( w_domain);
authIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
authIdentity.Password = (unsigned short *) w_password;
authIdentity.PasswordLength = wcslen(w_password);
authIdentity.User = (unsigned short *) w_username;
authIdentity.UserLength = wcslen(w_username);
authInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CALL;
authInfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;
authInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE;
authInfo.dwCapabilities = EOAC_NONE;
authInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
authInfo.pAuthIdentityData = &authIdentity;
authInfo.pwszServerPrincName = NULL;
ServerInfo.pAuthInfo = &authInfo; …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,需要将数据从 PLC 读取到数据库中,并且需要开发自己的应用程序来执行此操作。我只需要从 PLC 读取 5 个值并将其记录到 DB 中。我有一个正在运行的演示 OPC 服务器,可以通过 UA 或 DA 访问它。
在研究了许多不同的方法之后,我决定使用 OPC 服务器连接到 PLC,然后编写 OPC 客户端来连接 OPC 服务器,然后将数据从我的应用程序写入数据库。我选择的语言是带有 .Net 的 C#,我能够支付的唯一许可费是来自 PLC 供应商的 OPC 服务器。
然而,我发现极其令人沮丧的是如何获取有关 OPC 的正确信息来开始使用。我不想购买任何堆栈,但更喜欢开源堆栈。信息看起来非常碎片化,而且到处都是。大多数有关 OPC 的信息似乎都在宣传它的易用性等。
我能找到的 Stackoverflow 上最好的帖子是:OPC 新手指南:如何编写 C# Hello World 客户端?并且某些链接不再有效。
因此,我的问题是,是否有任何好的教程展示如何在 .net 中从头开始构建 OPC 客户端,以及无需购买供应商堆栈即可使用的最佳开源 SDK 是什么?
DA也值得学习还是应该坚持UA?
最大的问题是,为什么 OPC 宣传得如此简单却如此令人沮丧?
如果能有一本关于建立客户所需了解的理论的高级指南,那就太好了。我确实意识到,随着时间的推移,最终有可能从可用的资源中找出这一点,但在有限的时间内理解所有分散的资源,更快的指南将会有所帮助。
我有一个西门子 TP1200 Comfort 面板,我已将其配置为 OPC AU 服务器。该面板有一些标签(节点),我想从中获取 C# 应用程序的值。
我已阅读 OPC UA github 项目的示例: https: //github.com/OPCFoundation/UA-.NETStandard。
我能够连接到面板并获取根,但是如果我调试并检查根的结构,我看不到该值的任何属性,也没有看到子节点的集合,所以我不知道如何通过名称查找节点。
有没有类似 GetNodeVale(NodeName); 的方法
我没有显示任何代码,因为我真的迷失了 OPC,这是我第一次尝试实现一个简单的客户端,我想在其中读取节点(标签)的代码,但我无法做到这一点。
谢谢。
我正在尝试创建自己的 OPC UA 客户端。我正在使用 Nuget 包 OPCFoundation.NetStandard.Opc.Ua。为此,我使用了以下代码示例:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Opc.Ua; // Install-Package OPCFoundation.NetStandard.Opc.Ua
using Opc.Ua.Client;
using Opc.Ua.Configuration;
using System.Threading;
namespace Test_OPC_UA
{
public partial class Form1 : Form
{
//creating a object that encapsulates the netire OPC UA Server related work
OPCUAClass myOPCUAServer;
//creating a dictionary of Tags that would be captured from the OPC UA Server
Dictionary<String, Form1.OPCUAClass.TagClass> TagList = new Dictionary<String, Form1.OPCUAClass.TagClass>();
public Form1()
{
InitializeComponent();
//Add tags to the Tag List, For …Run Code Online (Sandbox Code Playgroud) opc ×10
opc-ua ×4
c# ×3
.net ×1
asp.net-core ×1
automation ×1
c++ ×1
com ×1
dcom ×1
industrial ×1
iot ×1
java ×1
memory-leaks ×1
model ×1
plc ×1
python ×1
siemens ×1
simulation ×1
simulator ×1