近段时间,遇到不少人都被opcclient与opcserver之间的通讯搞得头大,通过几次远程协助后,总结了opcclient和opcserver在windows上运行方式的恩怨,希望对各位有用。
目前市场上的opcclient和opcserver软件在windows上的运行方式有windows 桌面程序和windows nt服务。本来也没啥。但由于opcclient是一个厂家的软件,而opcserver是另外一个厂家的软件,由于软件的多样性,也就导致了如下一些现象:
1. opcclient连接目标opcserver,发现无法连接,但在opcserver计算机上明明看见opcserver进程已经启动。
2. opcclient连接目标opcserver,能连接,也能看见测点,但无法获取到数据。
经过多次现场的积累后,发现此类问题多出现在opcclient和opcserver软件在windows上的运行方式不同导致的。也就是说,opcclient和opcserver软件的运行方式不一样。譬如,opcclient是windows nt服务方式,而opcserver是桌面程序方式(多是组态软件的opcserver都是桌面程序方式吧!!)。而当opcclient是windows 桌面程序方式,opcserver时windows nt服务时,发现上面的现象基本不出现。这是为什么呢?
原因如下:
opcclient和opcserver都是基于dcom的应用,dcom的特点是opcserver无需先运行或启动,等待opcclient请求时,由操作系统在将opcserver拽起来。这种机制的好处就是随用随启。但这种机制如果处理不好吧,就会导致一些问题。当opcclient是windows nt服务时,opcserver被拽起来后,是运行在system这个系统账户下面的。相对于windows的桌面用户来说,是另外一个隔离开的空间。因此当桌面运行类型的opcserver被windows nt服务方式的opcclient拽起来后,被运行在system这个系统账户的空间。而如果这个opcserver程序又做了全局唯一进程运行的限制或与数据库只允许一个tcp连接时,上述的两种现象基本就会出现。这就是这段时间好几个朋友遇到的opc通讯故障现象。
如果让自己开发的opc程序兼容性更好呢?
1. 当开发opcclient程序时,最好使用windows桌面程序方式,这种方式可兼容opcserver程序运行在windows桌面程序方式和windows nt服务方式。
2. 当开发opcserver程序时,最好使用windows nt服务方式,这种方式可兼容opcclient程序运行在windows桌面程序方式和windows nt服务方式。
如果很不幸遇到了windows nt服务的opcclient去采集windows 桌面程序的opcserver(加上opcserver本身的全局唯一限制),那么你可以去windows nt服务的管理器中将windows nt服务的opcclient更改为指定的系统用户运行,大多数情况下可以解决问题。