标签: opc

使用自定义身份调用 QueryInterface

问题:

我成功地在代理上调用 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)

c++ com dcom opc

5
推荐指数
1
解决办法
973
查看次数

轻松构建免费的 .net OPC 客户端(UA 或 DA)

我有一个应用程序,需要将数据从 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 宣传得如此简单却如此令人沮丧?

如果能有一本关于建立客户所需了解的理论的高级指南,那就太好了。我确实意识到,随着时间的推移,最终有可能从可用的资源中找出这一点,但在有限的时间内理解所有分散的资源,更快的指南将会有所帮助。

opc

5
推荐指数
1
解决办法
1万
查看次数

C#opc-client .net api

我正在使用opc基础的.NET API编写opc客户端.

在样本中我只看到,项目的名称是硬编码的,如:

items[0] = new Opc.Da.Item();
items[0].ItemName = "blahblahblah";
Run Code Online (Sandbox Code Playgroud)

我想要的不是用手写下所有物品的名字.我想从服务器加载所有项目,例如树.我该怎么做?

c# opc

4
推荐指数
1
解决办法
1万
查看次数

在Mercurial中指定编辑器

一般来说,如果我有一个W类型的自定义文件,并且想要使用自定义应用程序/编辑器X打开/查看它,当我想编辑/查看文件时,如何设置Hg来调用应用程序X?

具体示例:我正在使用TortoiseHg来跟踪由自定义应用程序创建的一组文件,这是一个名为Kepserver的OPC服务器应用程序.Kepserver创建.OPF文件,而Hg可以判断文件何时发生了变化,我想使用Kepserver应用程序查看Hg Workbench中的文件.

我看到一个允许我设置编辑器的设置.我指定了Kepserver应用程序的路径,但是当我点击工作台中的文件时,它尝试使用Kdiff3进行二进制差异,如何为特定存储库指定编辑器?

mercurial automation tortoisehg opc

4
推荐指数
1
解决办法
2148
查看次数

OPC UA是从许多Scada系统获取数据的最佳方式吗?

在我的公司,我们有许多分布式站点,每个站点使用一个单一的Scada系统供应商(一个使用Wincc,其他地方使用另一个......),这个系统使用几乎相同类型的信息.

我们需要从这些系统中检索一些通用数据,因此我想知道OPC UA是否可以处理它.

是否有可能购买或开发OPC UA服务器,通过Web服务从Scada系统检索数据到客户端?

scada opc opc-ua

4
推荐指数
1
解决办法
5118
查看次数

c#OPC Automation提供80040154

我是.Net开发人员.OPC的新手.当我尝试一些OPC客户端样本时,所有这些样本都会出现此错误.似乎DLL似乎没有注册.但我不知道如何以及在何处注册.

error: retrieving the COM class factory for component with CLSID failed due to the following error: 80040154
Run Code Online (Sandbox Code Playgroud)

即使我试过这个

regsvr32 Interop.OPCAutomation.dll", 
Run Code Online (Sandbox Code Playgroud)

但它也会抛出错误

The module "Interop.OPCAutomation.dll" was loaded but the entry-point DllRegisterServeer was not found.
Make sure that "Interop.OPCAutomation.dll" is a valid DLL or OCX file and then try again.
Run Code Online (Sandbox Code Playgroud)

我经历了这么多现有的论坛.他们中的很多人都表示将平台目标更改为x86,但我仍然遇到同样的问题.仅供参考,我只能在"项目属性"的"构建"选项卡顶部的"平台"选项中看到"活动(任何CPU)".

这是我的环境细节:

.Net 2005
OPCAutomation Weapper
Windows 7 64-bit OS
Dell Inspiron 1525 (I hope this is not a 64bit machine, but my engineer installed 64bit OS somehow).
Run Code Online (Sandbox Code Playgroud)

请帮我.

提前致谢!

c# opc

4
推荐指数
1
解决办法
1万
查看次数

无法将对象类型“System.String[*]”转换为类型“System.String[]”

大家好,我在 C# .NET 中遇到了一个问题,我正在使用 DLL 连接到 OPC 服务器,该 DLL 在 VB.NET 项目中使用,并且工作完全没有问题。

我试图在 ListBox 中显示可用服务器的列表,VB.NET 中使用的代码(并且有效)是这样的:

Dim AllOPCServers As Object
AllOPCServers = AnOPCServer.GetOPCServers

' Load the list returned into the List box for user selection
Dim i As Short
For i = LBound(AllOPCServers) To UBound(AllOPCServers)
    AvailableOPCServerList.Items.Add(AllOPCServers(i))
Next i
Run Code Online (Sandbox Code Playgroud)

我写这个是为了在 C# 应用程序中使用

try
{
    var _listOPCServer = _OPCServer.GetOPCServers();
    foreach(var i in _listOPCServer)
    {
        string serverName = (string)i;
        listServers.Items.Add(serverName);
    }             
}
catch (Exception exc)
{
    lstMsg.Items.Add(DateTime.Now + " Error al Obtener Lista …
Run Code Online (Sandbox Code Playgroud)

.net c# casting visual-studio-2010 opc

4
推荐指数
1
解决办法
8194
查看次数

OPC的Noob指南:如何编写C#Hello World客户端?

这是我的情况:

我们有一个软件用于监控开发的太阳能发电厂.我必须引入OPC作为从物理设备本身获取数据的新方法,这就是为什么我最终试图了解opc,这到目前为止令人沮丧.

我已经安装了Matrikon模拟器并使用Matrikon浏览器,我可以看到正在模拟数据.我现在需要的是创建一个非常基本的概念证明,我可以连接到它并使用C#打印一些东西.据我了解,我必须使用一些专有的API/SDK.我只测试一些东西,所以我不想承诺专有的方式来做现在的事情.是不是创建了OPC来完全避免这种情况?

是否有一个简单的Opensource DLL可用于连接到OPC服务器,支持DA,HDA和AE,允许我工作而不用担心供应商/ sdks?

为了增加混乱,我找到了OPC Xi和OPC UA ....而且我还没有找到一个来自gound零的教程,这就是我正在寻找的.

.net opc c#-4.0

4
推荐指数
2
解决办法
2万
查看次数

OPC UA唯一ID

我正在尝试构建OPC UA客户端应用程序。
我希望能够在OPC树中唯一标识一个UA节点。
我知道在OPC DA中,标准节点ID是带有“。”的字符串。作为我可以用来识别节点的分度符。

在OPC UA中,节点ID不必是字符串,但是我仍然希望能够构建映射到特定节点的唯一字符串。
我正在考虑将其基于节点名称。例如:Demo.MyNode.MyValue。
但恐怕节点名称可能包含诸如“。”之类的字符。这会使我的ID不唯一。

有没有可以用作分隔符的字符?
有没有更好的方法将节点ID表示为字符串(包括其路径)?

opc opc-ua node-opcua

4
推荐指数
1
解决办法
3254
查看次数

OPC UA-.NETStandardLibrary:访问历史数据的最简单方法

我面临的任务是从 OPC 系统中提取历史数据,然后将这些数据存储到我们 BI 团队的独立数据库中。

虽然我是一名经验丰富的开发人员,但我以前从未使用过 OPC UA。我在这里找到了OPC基金会提供的最新库:

https://github.com/OPCFoundation/UA-.NETStandardLibrary

此存储库中有一个示例控制台客户端应用程序。然而,我没有找到HDA(历史数据访问)的任何线索。那么,有人可以帮忙吗?

而且,我实际上是公司里唯一有IT背景的人。经理告诉我,还有另一个人正在使用一些第 3 方应用程序维护 OPC 系统,因此我认为没有必要实现任何有关 OPC 服务器的操作。换句话说,我想我只需要实现一个 OPC 客户端连接到一些可以在该 OPC 应用程序中找到的 URL。我的假设正确吗?

总结起来,有两个问题:

  1. 如何实现 OPC UA 客户端以使用 OPC UA-.NETStandardLibrary 提取历史数据
  2. 鉴于当前的 OPC 系统运行在第 3 方应用程序之上,这是否意味着我不需要编写有关“服务器”的任何代码?

任何帮助将不胜感激。

c# opc opc-ua

4
推荐指数
1
解决办法
4596
查看次数