首先介绍下本人使用opc的场景:有客户使用了某厂商的空调(及其他设备)自动化控制系统(为甲方做楼宇节能方案)。现在客户想要让空调根据房间的使用情况进行自动控制,客户每个房间的使用情况是在OA里面设置的,所以解决方案就是:每天从OA系统拿到每个房间的使用时间段,然后同步给自动化控制系统。由于该自动化控制系统很老久,只支持OPC协议(还是我万能的http好用),所以只能去踩OPC的坑了。
名词解释
OPC是什么
网上搜下就知道这个东西是为了解决硬件设备之间没有通用协议造成数据无法互通的问题,由某某标准化组织基于微软的COM/DCOM组件开发的一种通用协议。当我知道是基于COM/DCOM之类的东西,瞬间觉得这玩意是上个世纪的东西 真是老古董了。。。OPC如何工作的
OPC分为server端和client端。server端只是用于定义数据点位Item(有没有做数据持久化就不知道了),该数据点位可以接收client端传过来的数据。client端首先要创建group(group只存在于客户端,每个客户端自己维护group),然后在group中添加点位Item(该点位必须在server端有定义,否则无法监听),添加后即可监听到该点位的数据变化,也可对该点位数据进行写入。假如有两个client端监听的同一个点位,那任何一个client端对该点位的修改都会被另一个client端读取到(应该是定时拉取的)。这个工作方式有点像发布订阅模式。
出现的问题
我是用java开发客户端的,网上能找到的包就是jeasyopc和utgard。jeasyopc只能用于32位的操作系统,而我自己开发机是64的所以直接放弃用了utgard。opc server用的是MatrikonOpc Server for Simulation。
问题1:如何添加自定义点位
打开MatrikonOPC Server for Simulation and Testing,在Alias Configuration中即可添加自定义点位。右键点击Alias Configuration节点,选择Insert Group完成group创建,然后在右侧增加相应的Item。问题2:utgard中使用的clsid哪里去找
开始我是使用progid来尝试连接,progid直接设置成Matrikon.OPC.Simulation.1 发现怎么都连不上。后面直接用clsid(F8582CF2-88FB-11D0-B850-00C0F0104305 如果用的是MatrikonOpc server 那么这个值是固定的)就能连上了。至于不是这个server的,网上有查找方法 这里不再赘述。问题3:使用utgard无法对自定义点位进行写入
当时用opc客户端工具如MatrikonOPC Explorer是可以正常监听自定义点位,并且对数据进行修改。但是用utgard死活没办法正常监听,最后发现是windows版本的问题。我用的win10,后面用我同事的win7就能正常访问了 这个真是巨坑,一般人想不到。。。问题4:用本机的client无法连接到远程的server
这个解决办法简单粗暴,把自己电脑的用户名密码改成更远程电脑的一样并且要用这个用户登录,关闭远程电脑的防火墙,这样就能正常连接了。