这篇文章比较长,是我多年工作经验的一个总结。我做了10年的工业自动化,做过很多PLC、DCS系统,也做过很多的工业通讯。我也写过不少opc、modbus等协议的通讯代码。我相信我这篇文章很有现实指导意义。如果觉得文章太长没有时间看,可以先收藏,以后有时间了再看。
下面的我会按照opc da通讯连接过程,说明一下在连接过程中可能出现的通讯问题。列表的顺序就是opc da建立通讯连接的顺序。
OPC Client连接OPC Server分两种情况:连接本地OPC Server和连接远程OPC Server。
当OPC Client连接本地OPC Server时(OPC Client和OPC Server在同一台电脑),OPC Client可以通过OPCEnum.exe枚举到本地已经注册的OPC Server,OPC Client也可以通过注册表查找本地的OPC Server。
当OPC Client连接远程OPC Server时(OPC Server与OPC Client不在同一台电脑),情况将变得复杂。在windows操作系统中,RPC(Remote Procedure Call)是通过135端口进行通讯的。OPC Client枚举远程电脑上的OPC Server时,要调用远程电脑上的OPCEnum.exe。这就涉及到了防护墙和DCOM配置。如果有以下问题,那么OPC Client无法枚举到OPC Server:
注意:ping是有一定的欺骗性的。ping是通的代表网络可达。ping不通不代表网络不可达。因为防火墙可能会阻止ICMP回应。当ping不通时,要通过其他的方式配合确定网络是否可达,比如端口开放检测工具。
测试端口是不是通,常用的工具有telnet、nmap、tcping。在工作中,这三个工具我都会用。但是就检测端口来说,我更喜欢tcping这个工具,简单又直观。nmap过于强大,所以就会比较复杂。telnet又过于简陋。tcping工具的官方站点:https://www.elifulkerson.com/projects/tcping.php。tcping的使用非常简单,就像ping工具一样。下图是tcping最简单的用法,tcping 后面跟随两个参数,第一个参数为目的ip,也就是OPC Server所在电脑的IP地址。第二个参数为端口号,下图我测试的是135端口。下图的测试结果表示192.168.56.1的135端口是通的。
如果检测到135端口不通,那么应该去排查硬件防火墙或者windows防火墙。windows防火墙应该开放TCP135端口。网络中的硬件防火墙(如果有的话)也应该允许OPC Client和OPC Server之间的135端口互访。
网络上不少DCOM配置的教程。基本上就是将administrators、everyone、anonymous、sytem、interactive、network几个账户添加到COM安全配置中。以后有时间我会再写一个DCOM配置的文章。我目前经常使用的是脚本,我自己写的一个DCOM配置脚本,因为我比较懒,实在是不想总是鼠标点来点去的。这里是脚本的地址:https://gitee.com/Zer0Day/opc-da-dcom-script
不同版本的windows,默认安全策略是不同的。应该尽量让OPC Client和OPC Server的安全策略相同。尤其是“网络访问:本地账户共享和安全模型”,直接影响账户的验证方式。有些OPC Server,需要开启Guest才能正常通讯。最容易导致问题的就是下面三图选中的选项。
这个就安装opc 运行环境吧。
默认情况下,windows7以后的系统中,OPCEnum是注册为windows服务的,并且已经集成到windows系统中。安装一个全新的系统,默认就安装了OPCEnum服务。已经被注册为服务的DCOM组件,强烈建议将标识设置为“系统账户(仅用于服务)”。尽量不要选择“下列用户”,更不建议将OPCEnum反注册以后设置为“交互式用户”。网络上有很多文章说要把OPCEnum的标识设置为“交互式用户”,甚至有很多文章为了把OPCEnum的标识设置为“交互式用户”,不惜把OPCEnum反注册以后再重新注册。我的建议是:没事别动系统服务。
经过第一步枚举以后,如果OPC Client能枚举到OPC Server,那么一定能连接上OPC Server吗?答案是不一定。导致能枚举到OPC Server而无法连接OPC Server的问题非常多。最常见的原因有以下点:
要仔细检查一下DCOM的配置有没有问题,有没有遗漏。另外DCOM配置以后通常需要重启电脑。
这个问题和上面的OPCEnum标识错误一样的。OPC Server可能以COM方式注册,也可能以服务方式注册。如果OPC Server是以服务方式注册的,那么标识尽量选择“系统账户(仅用于服务)”。如果OPC Server是以COM方式注册的,那么尽量选择“交互式用户”。
OPC Server通常都是依赖数据源的,一般数据源是DCS系统或者组态软件之类的。可能因为依赖关系导致OPC Server无法启动。或者因为安装配置错误,导致OPC Server无法启动。也可能是因为其他的原因导致OPC Server处于假死状态。
在创建数据点的过程中可能无法遍历OPC Item的情况。也就是列出OPC Serve的点时出错或者无法显示。这个通常是因为OPC Server自身的原因导致的。如果只是无法列出点,但是能在OPC Client创建点,也能读取,那么这个问题可以不予理会。如果无法在OPC Client创建点,那么需要检查OPC Server。
一般来说OPC Server都是依赖其他数据源的。出现无法列出OPC Item的情况,很可能是OPC Server无法读取数据源或者是因为依赖的数据源没有启动、启动顺序不对等原因造成的。通常重启软件或者电脑能解决问题。
终于来到了读写这一步。理论上,上面的每一步都走通了,读写数据应该是水到渠成吧?然而,这一步不出问题还好,出了问题就是非常头大的问题。有些问题非常奇怪,让人都无从下手。我列一个我遇到过的问题:
这个问题困扰了我很久,有好几天找不到原因。同步通讯时,是客户端发起请求,服务端响应。而异步通讯时,客户端订阅了一些点,服务端会在未来某个时刻连接客户端发送数据。也就是说OPC Client侧135端口要打开,DCOM要配置正确,安全策略要配置正确,双方的用户名和密码也要正确。这样才能保证OPC Server能正常的发送数据给OPC Client。以上任何一个有问题都会导致OPC Server无法将订阅数据发送给OPC Client。我当时遇到的问题就是因为安全策略导致的。