我正在使用 Interop.OPCAutomation.DLL (OPC DA Automation Wrapper 2.02) 并与配置为与某些远程 I/O通信的Kepware 服务器连接。当一切正常时,客户端可以很好地处理通信,但它不够聪明,无法判断连接是否丢失(机器的以太网电缆已被拔下等)
我猜想获得远程 I/O 状态的唯一选择是订阅 ConnectedGroup_DataChange 并监控 OPC 项目质量信息,但有更简单的方法吗?类似“ -ping- hello 远程 I/O,你还在吗?”
同样,我需要一种方法来检查服务器是否处于活动状态甚至是否存在(-ping-你在服务器吗?)就目前而言,我没有任何类型的握手,我的客户端通过两条简单的线路连接到服务器:
ConnectedOPCServer = New OPCAutomation.OPCServer
ConnectedOPCServer.Connect(OPCServerName, OPCNodeName)
我创建了一个函数来返回服务器状态,但似乎总是返回 1,即使在我退出 KEPServerEX 之后也是如此。编辑:我发现退出程序实际上并没有关闭服务器。使用 sysinternals 套件中的进程资源管理器,我找到了服务器并将其挂起。这样做会使我的应用程序挂在 .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 通信,因此我实现了一种线程安全的方式来将日志事件报告回主线程。
而已。希望它可以帮助某人。