问题:
我成功地在代理上调用 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 宣传得如此简单却如此令人沮丧?
如果能有一本关于建立客户所需了解的理论的高级指南,那就太好了。我确实意识到,随着时间的推移,最终有可能从可用的资源中找出这一点,但在有限的时间内理解所有分散的资源,更快的指南将会有所帮助。
我正在使用opc基础的.NET API编写opc客户端.
在样本中我只看到,项目的名称是硬编码的,如:
items[0] = new Opc.Da.Item();
items[0].ItemName = "blahblahblah";
Run Code Online (Sandbox Code Playgroud)
我想要的不是用手写下所有物品的名字.我想从服务器加载所有项目,例如树.我该怎么做?
一般来说,如果我有一个W类型的自定义文件,并且想要使用自定义应用程序/编辑器X打开/查看它,当我想编辑/查看文件时,如何设置Hg来调用应用程序X?
具体示例:我正在使用TortoiseHg来跟踪由自定义应用程序创建的一组文件,这是一个名为Kepserver的OPC服务器应用程序.Kepserver创建.OPF文件,而Hg可以判断文件何时发生了变化,我想使用Kepserver应用程序查看Hg Workbench中的文件.
我看到一个允许我设置编辑器的设置.我指定了Kepserver应用程序的路径,但是当我点击工作台中的文件时,它尝试使用Kdiff3进行二进制差异,如何为特定存储库指定编辑器?
在我的公司,我们有许多分布式站点,每个站点使用一个单一的Scada系统供应商(一个使用Wincc,其他地方使用另一个......),这个系统使用几乎相同类型的信息.
我们需要从这些系统中检索一些通用数据,因此我想知道OPC UA是否可以处理它.
是否有可能购买或开发OPC UA服务器,通过Web服务从Scada系统检索数据到客户端?
我是.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# .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) 这是我的情况:
我们有一个软件用于监控开发的太阳能发电厂.我必须引入OPC作为从物理设备本身获取数据的新方法,这就是为什么我最终试图了解opc,这到目前为止令人沮丧.
我已经安装了Matrikon模拟器并使用Matrikon浏览器,我可以看到正在模拟数据.我现在需要的是创建一个非常基本的概念证明,我可以连接到它并使用C#打印一些东西.据我了解,我必须使用一些专有的API/SDK.我只测试一些东西,所以我不想承诺专有的方式来做现在的事情.是不是创建了OPC来完全避免这种情况?
是否有一个简单的Opensource DLL可用于连接到OPC服务器,支持DA,HDA和AE,允许我工作而不用担心供应商/ sdks?
为了增加混乱,我找到了OPC Xi和OPC UA ....而且我还没有找到一个来自gound零的教程,这就是我正在寻找的.
我正在尝试构建OPC UA客户端应用程序。
我希望能够在OPC树中唯一标识一个UA节点。
我知道在OPC DA中,标准节点ID是带有“。”的字符串。作为我可以用来识别节点的分度符。
在OPC UA中,节点ID不必是字符串,但是我仍然希望能够构建映射到特定节点的唯一字符串。
我正在考虑将其基于节点名称。例如:Demo.MyNode.MyValue。
但恐怕节点名称可能包含诸如“。”之类的字符。这会使我的ID不唯一。
有没有可以用作分隔符的字符?
有没有更好的方法将节点ID表示为字符串(包括其路径)?
我面临的任务是从 OPC 系统中提取历史数据,然后将这些数据存储到我们 BI 团队的独立数据库中。
虽然我是一名经验丰富的开发人员,但我以前从未使用过 OPC UA。我在这里找到了OPC基金会提供的最新库:
https://github.com/OPCFoundation/UA-.NETStandardLibrary
此存储库中有一个示例控制台客户端应用程序。然而,我没有找到HDA(历史数据访问)的任何线索。那么,有人可以帮忙吗?
而且,我实际上是公司里唯一有IT背景的人。经理告诉我,还有另一个人正在使用一些第 3 方应用程序维护 OPC 系统,因此我认为没有必要实现任何有关 OPC 服务器的操作。换句话说,我想我只需要实现一个 OPC 客户端连接到一些可以在该 OPC 应用程序中找到的 URL。我的假设正确吗?
总结起来,有两个问题:
任何帮助将不胜感激。
opc ×10
c# ×4
opc-ua ×3
.net ×2
automation ×1
c#-4.0 ×1
c++ ×1
casting ×1
com ×1
dcom ×1
mercurial ×1
node-opcua ×1
scada ×1
tortoisehg ×1