与OPC服务器握手

时间:2013-09-19 13:30:03

标签: client-server communication handshake opc

我正在使用Interop.OPCAutomation.DLL(OPC DA Automation Wrapper 2.02)并与Kepware server连接,{{3}}配置为与某些远程I / O通信。当一切正常工作时,客户端处理通信就好了,但是不够聪明,无法判断连接是否丢失(机器的以太网电缆已拔掉等等)。

我猜我获得远程I / O状态的唯一选择是订阅ConnectedGroup_DataChange并监控OPC Item质量信息,但是有更简单的方法吗?像“ -ping - 你好远程I / O这样的东西,你还在吗?”

同样,我需要一种方法来检查服务器是否还活着甚至存在 -ping - 你有服务器吗?)现在,我不知道有任何形式的握手,我的客户端用两条简单的线连接到服务器:

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

我已经创建了一个函数来返回服务器状态,但是即使在我退出KEPServerEX之后,它似乎总是返回1。 编辑:我发现退出程序实际上并没有关闭服务器。使用sysinternals套件中的Process explorer,我找到了服务器并暂停了它。这样做使我的应用程序挂在.Connect行上。在我实际连接之前获取服务器状态是不可能的,所以如何在尝试连接之前检查服务器是否存在?

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通信,因此我实现了一种线程安全的方式来将日志记录事件报告回主线程。

就是这样。希望它可以帮到某人。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

您只能通过OPC项目,同步读取或数据更改回调来监控与数据源的连接。