Qt OPCDA添加组报错 1011

使用网站上Qt OPCDA的开发包开发OPC客户端,发现连接本地KEPServer建立的服务器,添加组和项、读写都正常,但是与组态王本地建立的OPC服务器在添加组的时候,调用这段
hResult = _pIConnectionPoint->Advise(m_OPCDataCallback, &m_Cookie)
会报错 1011 opcdatacallback set faild, Cookie值为0, hResult为-2147417851,屏蔽这段语句虽然显示成功,但在同步读和异步写都不成功,请教出现上述问题是组态王设置的问题还是别的问题。

写入的时候,报错:parameter is not passed,通常是什么原因呢?

可能与多种因素有关,包括你的OPC客户端设置、组态王OPC服务器的设置,以及你的开发环境。首先,你需要确保以下几点:

组态王OPC服务器的设置:确保组态王OPC服务器已经正确配置,并且允许远程连接。对于组态王,你可能需要在“系统配置”或“OPC配置”中启用OPC DA服务器,并确保服务器运行在正确的模式下(例如,一定要选择“异步”模式)。
OPC客户端设置:你的Qt OPCDA客户端可能需要正确的配置才能连接到组态王OPC服务器。例如,你需要确保你的客户端使用了正确的OPC服务器名称、正确的项ID,以及正确的数据更新频率。
开发环境:请检查你的开发环境是否支持组态王OPC服务器。例如,你需要确认你的Qt OPCDA开发包是否与组态王OPC服务器版本兼容。
Advise方法的使用:在你的问题中,_pIConnectionPoint->Advise(m_OPCDataCallback, &m_Cookie)这行代码报错。这个错误可能与你的回调对象m_OPCDataCallback有关。请检查这个对象是否被正确初始化,是否实现了所有必要的接口方法。

如果是组态王设置的问题,应该如何修改设置?或者出现上述问题的原因是什么,如何解决?

你的问题确实与代码开发和程序运行有关,所以我会尝试帮助你解决这个问题。

首先,从问题描述来看,你使用Qt OPCDA开发包连接KEPServer建立的服务器没有问题,但在连接组态王本地建立的OPC服务器时出现问题。这可能是因为组态王OPC服务器的设置或者与其它OPC服务器的兼容性问题。

错误代码 -2147417851 通常表示 E_NOINTERFACE,这可能是因为组态王OPC服务器没有实现Qt OPCDA开发包需要的某个接口。

以下是一些可能的解决方案:

  1. 检查组态王OPC服务器的设置:确保组态王OPC服务器的设置允许外部连接,并且使用了与Qt OPCDA开发包兼容的OPC接口。
  2. 检查兼容性:Qt OPCDA开发包可能与组态王OPC服务器不兼容。你可以尝试使用另一个OPC客户端库(例如:FreeOPCUA、EasyOPC等)来测试是否可以成功连接到组态王OPC服务器。
  3. 查看文档和支持:查阅Qt OPCDA开发包和组态王OPC服务器的文档,看看是否有关于彼此兼容性的说明或限制。也可以尝试联系开发者或供应商的技术支持获取帮助。
  4. 调试问题:使用调试工具(如Visual Studio、Qt Creator等)逐步执行代码,查看在调用_pIConnectionPoint->Advise(m_OPCDataCallback, &m_Cookie)时发生的情况,也许能找到更具体的问题原因。
  5. 尝试不同的方法:如果Advise方法失败,也许可以尝试使用其他方法或库来实现相同的功能。

希望以上建议能帮助你解决问题。如果问题仍然存在或者需要更具体的帮助,请提供更多细节或错误信息,我会尽量提供进一步的支持。

引用 皆我百晓生 小程序回复内容作答:
错误代码 1011 表示 OPC 服务器无法连接到远程服务器。根据你的描述,与 KEPServer 建立的服务器能够正常工作,但与组态王本地建立的 OPC 服务器出现问题。这可能是由于组态王的设置问题或其他问题导致的。

首先,你可以检查以下几个方面来解决该问题:

  1. 确认连接信息:确保你在连接组态王的 OPC 服务器时使用了正确的连接信息,包括服务器地址、端口号或其他必要的连接参数。检查这些信息是否与实际配置一致。

  2. 防火墙设置:确保防火墙没有阻止对组态王 OPC 服务器的访问。检查你的防火墙设置,并允许相应的通信端口通过。

  3. OPC Server 配置:确保组态王 OPC 服务器的配置正确。可以尝试重新配置或重新安装组态王以确保服务器设置正确。

  4. OPCDA 版本兼容性:检查你使用的 Qt OPCDA 开发包的版本是否与组态王 OPC 服务器的版本兼容。有时不同版本的 OPCDA 可能会导致不兼容问题。

如果以上方法无法解决问题,建议你查阅组态王 OPC 服务器的官方文档或咨询支持团队,以获取更详细的故障排除步骤和支持。此外,你还可以尝试在其他 OPC 客户端软件中尝试连接和使用该组态王 OPC 服务器,以确认服务器本身是否正常工作。

希望这些提示对你有所帮助,并帮助你解决 OPC 客户端与组态王 OPC 服务器连接问题。如果你还有其他问题,请随时提问。

以下是一些可能导致问题的原因和解决方法:

  1. 确保组态王本地建立的OPC服务器已正确配置并正在运行。检查服务器的状态和连接设置,确保它与你的客户端应用程序兼容。

  2. 确保你的客户端应用程序与组态王本地建立的OPC服务器使用相同的OPC规范和版本。不同的OPC规范和版本可能具有不同的功能和支持,因此确保它们匹配是很重要的。

  3. 检查组态王本地建立的OPC服务器的安全设置。有些OPC服务器可能要求客户端应用程序具有特定的安全权限才能与其建立连接和进行通信。确保你的应用程序具有适当的权限。

  4. 尝试使用其他OPC客户端工具(如OPC客户端测试工具)连接到组态王本地建立的OPC服务器,以确认是否存在与Qt OPCDA开发包相关的问题。如果其他客户端也无法正常连接和通信,那么可能需要进一步检查组态王设置或服务器配置。

  5. 如果可能,查看组态王本地建立的OPC服务器的日志文件或错误消息,以获取更多关于连接失败的详细信息。这可能有助于确定问题的根本原因。

根据您提供的信息,根据错误消息,产生错误代码1011和Cookie值为0,以及 hResult 的值 -2147417851,这表示出现了COM错误。

COM (Component Object Model) 是一种用于在Windows操作系统中实现组件间通信的技术。这个错误通常与COM对象的注册或使用有关。

造成这个问题的可能原因有:

  1. 组态王设置问题:某些情况下,OPC服务器的配置或设置可能不正确,可能导致无法正常连接或通信。请确保在组态王中正确配置和启用了OPC服务器,并注意OPC服务器的权限和访问设置。

  2. 组件注册问题:可能存在与组态王相关的组件没有正确注册的问题。您可以尝试重新安装组态王软件并确保所有相关组件都正确注册。

  3. 版本兼容性:可能存在组态王的版本与QtOPCDA的开发包之间的不兼容性。请确保您使用的QtOPCDA开发包与组态王版本兼容,并根据需要进行更新或升级。

为了更准确地解决问题,建议您采取以下步骤:

  1. 检查组态王OPC服务器的配置,并确保它已正确安装和启动。查看组态王文档以获取更多有关OPC设置和配置的信息。

  2. 确认您使用的QtOPCDA开发包与组态王的版本兼容。查看QtOPCDA文档以获取与组态王集成的具体说明和要求。

  3. 在出现问题的地方进行详细的调试和日志记录。检查系统事件日志和应用程序日志以获取更多关于COM错误的详细信息。

  4. 如果问题仍然存在,向QtOPCDA开发包的供应商或支持团队报告该问题,并提供详细的错误信息和调试日志,以便他们能够更好地帮助您解决问题。

希望这些建议能够帮助您解决问题。如有其他问题,欢迎继续提问。

异步执行有问题吧。

问题出在与组态王本地建立的OPC服务器的通信上。错误代码 -2147417851 对应的错误消息通常是 "The server threw an exception.",这意味着服务器在处理你的请求时抛出了异常
确认组态王本地建立的OPC服务器是否支持 OPC Data Access(OPC DA)规范。有些服务器可能不完全符合规范,导致与客户端的通信问题。确保组态王本地建立的OPC服务器已正确配置并正在运行。检查服务器的日志以查看是否有任何错误或异常信息。

OPC常见问题解决
可以参考下


OPC DA数据采集过程中所有数据为空问题分析_opc连接成功但数据为0_guolisong的博客-CSDN博客 OPC通讯过程中连接正常,但是数据全为空问题分析_opc连接成功但数据为0 https://blog.csdn.net/guolisong/article/details/124419786

结合GPT给出回答如下请题主参考
首先,在使用Qt OPCDA开发包开发OPC客户端时,需要先确保已经正确安装了KEPServer并且已经启动了OPC服务器。

然后,在添加组时,需要按照以下步骤进行操作:

  1. 创建一个QOpcDaGroup对象,用于表示要添加的组。
QOpcDaGroup *group = new QOpcDaGroup("Group1", true, 100, this);
  1. 调用QOpcDaClient的addGroup()函数将组添加到客户端中。
hresult = client->addGroup(group);
if (FAILED(hresult))
{
    qDebug() << "Failed to add group:" << hresult;
    return;
}

其中,client是一个已经创建好的QOpcDaClient对象,表示OPC客户端。

  1. 在组添加成功后,可以调用QOpcDaGroup的addItem()函数来添加项。
QOpcDaItemProperties properties;
QList<QOpcDaItem*> items;
properties.setType(QOpcDa::ItemType::Item);
properties.setItemId("Channel1.Device1.Tag1");
QOpcDaItem *item = group->addItem(properties, &hresult);
if (FAILED(hresult))
{
    qDebug() << "Failed to add item:" << hresult;
    return;
}
items.append(item);

其中,properties是一个QOpcDaItemProperties对象,表示要添加的项的属性,如类型、ID等。item是一个QOpcDaItem对象,表示已经添加成功的项。

如果在调用addItem()函数时返回了错误码1011,表示添加组失败。这个错误码的描述为:

OLE转换失败。您提交的 VARIANT 可能是过度递归的 VARIANT。如果问题仍然存在,请检查 VARIANT 中的类型使用是否正确并且 VARIANT 中的结构是否正确。

这个错误码通常是由于添加的项的ID格式不正确或者没有权限等原因导致的。可以通过使用正确的ID格式或者检查权限来解决。

根据你提供的信息,出现上述问题可能有几个原因:

  1. 组态王设置问题:组态王本地建立的OPC服务器可能没有正确配置或者存在某些限制导致无法正常与客户端建立连接和通信。请确保组态王的OPC服务器已经正确配置,并且可以与其他OPC客户端正常通信。

  2. 权限问题:检查你的程序是否以管理员权限运行,或者是否具有足够的权限访问和操作OPC服务器。有时,权限不足会导致建立连接失败或读写失败。

  3. 通信协议问题:确保你使用的通信协议与组态王的OPC服务器一致。OPC服务器通常支持多种通信协议(如OPC DA、OPC UA等),请确认你选择的是正确的协议,并根据协议要求进行相应的配置和操作。

关于异步写入时报错"parameter is not passed",这可能是由于未正确传递参数引起的。请仔细检查你的写入代码,确保你正确传递了所有必要的参数,并且参数类型和格式与OPC服务器的要求相匹配。如果可能,你可以参考组态王的文档或示例代码,以确保你的写入操作符合服务器的要求。

如果你无法解决问题,请尝试联系组态王的技术支持或开发者社区,他们可能能够提供更具体的帮助和指导。

该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


错误码-2147417851对应的含义是RPC_E_SERVERFAULT,表示在服务器上发生了不可恢复的错误。可能是组态王本身存在问题,也可能是其他因素导致的。建议先检查一下组态王的设置是否正确,并且确认连接本地KEPServer的代码是否可复用于连接组态王的OPC服务器。

至于写入时报错“parameter is not passed”,这通常是因为传入的参数出现问题,可能是参数格式不正确、参数类型不匹配等原因导致的。需要检查一下写入的参数是否正确。


Qt开发OPCDA客户端_m_piopcserver->addgroup向服务器请求的刷新速率是0_程序life的博客-CSDN博客 最近工作遇到需要利用C++开发一个OPC客户端读写OPC服务端数据,笔者自然而然,开始百度,CSDN博客上有许多了解OPC开发的博客,在此,仅仅记入一下自己在开发中遇到的问题及自己的一个OPCclient源代码。1、OPC客户端开发流程笔者安装的OPC服务端是KEPServerEX 6 ,安装后会提供关于OPC客户端访问的接口文件,这个就不说了,主要的头文件包含#include "opc..._m_piopcserver->addgroup向服务器请求的刷新速率是0 https://blog.csdn.net/m0_37726615/article/details/103203378

https://gtrush.com/2022/01/09/Qt%E8%B0%83%E7%94%A8open62541%E7%BC%96%E5%86%99opcua%E7%A8%8B%E5%BA%8F%E7%9A%84%E6%9C%80%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95/

报错:parameter is not passed,通常是:
参数类型不正确;
参数值未定义或为NULL;
参数被引用但未被初始化;
参数是COM对象,未被正确释放。