与 OPC 服务器握手



我正在使用Interop.OPCAutomation.DLL(OPC DA Automation Wrapper 2.02)并与配置为与某些远程I/O通信的Kepware服务器连接。当一切正常时,客户端可以很好地处理通信,但不够智能,无法判断连接是否丢失(机器的以太网电缆已被拔下等)。

猜我获取远程 I/O 状态的唯一选择是订阅 ConnectedGroup_DataChange 并监控 OPC 项目质量信息,但有没有更简单的方法?类似"-ping- 你好远程 I/O,你还在吗?

同样,我需要一种方法来检查服务器是否处于活动状态甚至存在(-ping-您有服务器吗?就目前而言,我没有任何类型的握手,我的客户端通过两条简单的行连接到服务器:

ConnectedOPCServer = New OPCAutomation.OPCServer
ConnectedOPCServer.Connect(OPCServerName, OPCNodeName)

我创建了一个函数来返回服务器状态,但似乎总是返回 1,即使我退出了 KEPServerEX。编辑:我发现退出程序实际上并没有关闭服务器。使用系统内部套件中的进程资源管理器,我找到了服务器并将其挂起。这样做使我的应用程序挂在.连接线。在我实际连接之前无法获取服务器状态,那么在尝试连接之前如何检查服务器是否存在?

Public Function GetServerState() As String
    Dim state As String = ConnectedOPCServer.ServerState.ToString
    Return state
End Function

更新

以为我会分享最终项目的相关部分。我最终用 C# 编写了一个新的 Interop.OPCAutomation dll 包装器类。

由于 OPCAutomation dll 的 COM 对象性质,如果通信出现任何问题,它将引发异常。因此,我已经为 OPC 通信类中的每个函数实现了异常捕获。我查找特定的错误消息并采取相应的措施。
它胜过使应用程序崩溃,以获得可以轻松恢复的愚蠢事物。
对于 ServerState,我什至不在乎消息是什么,所以我不会捕获异常对象。

这是我的状态函数:

public bool GetServerState()
{
    try
    {
        int state = ConnectedOPCServer.ServerState;
        return true;
    }
    catch
    {
        // If server is unavailable, exception is thrown.
        CrossThreadLoggingEvent(
            Properties.Resources.MSG_Error_OPC08, optional_Lvl:3);
        return false; 
    }
}

如您所见,我懒得对"int state"做任何事情,因为它总是会返回"1",或者抛出异常。

由于我在线程上执行所有 OPC 通信,因此我实现了一种线程安全的方式来将日志记录事件报告回主线程。

就是这样。希望它对某人有所帮助。

如果服务器安装和配置正确,它将在您访问它时自动启动(或者它可能始终作为服务运行)。因此,除非服务器未安装或未正确启动,否则您将始终可以访问它,并且它将以"正在运行"状态响应 GetServerStatus。如果未安装,则无法获取服务器对象。

只能通过 OPC 项、同步读取或数据更改回调监视与数据源的连接。

服务器对象应该有一个可以定期调用的"GetServerStatus"方法。如果该调用失败,或者服务器返回指示问题的状态,则可能无法获取数据。

相关内容

  • 没有找到相关文章

最新更新