OPC的诞生及历史:软件进行开发时需要与各种不同的协议进行对接,例如Modbus协议等,当设备很多,协议很多的情况下,上位机与硬件的沟通就会变得很麻烦,所以就有了将这些协议抽象出一个标准接口,对于软件人员就无需和协议对接,只需要对接接口即可,因此OPC就诞生了
最早由于Windows系统是作为主流,因此OPC依赖于Windows的COM和DCOM技术,依赖上述早期技术就产生了OPCDA
,OPCDA也可以看做一个标准
后来就有了OPC基金会,很多企业和协议加入进来,就可以使用相应的标准
随着时间的发展,OPCDA通信的问题研究暴露出来了,两台电脑之间,假设有A和B两台电脑,A作为服务器,B作为客户端,如果A、B都在一个局域网就可以进行通信,但实际上不能直接通信,需要做一些配置,这些配置也就成为DCOM配置,DCOM配置除了麻烦,也会造成安全性很差
为了OPCDA的缺点,OPC基金会就去做了优化,因此产生了OPCUA
因此OPCUA就可以看做OPCDA的产品升级,不再依赖DCOM,也就不依赖Windows平台可以实现跨平台的架构,而是基于以太网,最底层也就是基于Socket的,安全性上也得到了提升(秘钥管理等),现在及以后主流肯定是OPCUA,由于历史原因OPCDA还在使用,也是工业4.0落地的协议
但是OPCUA是需要授权的,也就是需要收费的,有可能OPCUA的客户端免费,服务器是收费的
无论是 OPC DA 还是 OPC UA,都遵从 OPC 标准,因此在某些方面是类似,这里主要针对 OPC的读写方式进行说明。OPC 读写方式主要有三种,分别是同步方式
、异步方式
及订阅方式
,订阅方式仅针对读取有效
。
OPC 同步方式 :同步方式是指当客户端发送请求后,必须等到服务器响应全部完成后才能返回,期间将一直处于等待状态,因此当多客户端向服务器操作时,客户端程序产生阻塞,同步通讯适用于客户端较少,数据量较小的场合,同步方式的工作流程如下图所示:
发送请求call之后,需要等一个replay回应,就跟Modbus通信是类似的,一发一回之后,再发再回,
OPC 异步方式 :异步方式是指当客户端发送请求后立即返回,不需要等待服务器的响应,可以进行其他操作,当服务器完成响应后会自动通知客户端,因此相对于同步通讯,异步通讯的效率更高,异步方式的工作流程如下图所示:
发送完call之后,不需要等,继续发第二个call,等第一个call完成之后会通过事件告知客户端,后边的call的处理方式也是一样
OPC 订阅方式 :订阅方式在初始化时,就需要订阅相应的通信组 Group
,这样当服务器的 Group组内有数据发生变化时,就会自动刷新客户端数据,客户端只需要向服务器发送一次请求,因此订阅方式的效率是非常高的,订阅方式的工作流程如下图所示:
订阅的方式只针对读取,写入可以使用同步和异步,
前面我们介绍过PLC通过ModbusTCP与上位机直接通信,下面将会以实例再次进行介绍。
以已经建在局域网内的以下PLC为例,可以使用Modbus TCP进行通信
以下为写到台达PLC中的程序
为了读取对应的值,可以采用Modbus TCP通信进行,以读取D33
为例
如下图直接在Modbus Poll中输入D33
就可以直接读到数据
ModbusTCP:PC作为ModbusTCP客户端,PLC作为ModbusTCP服务器,两者直接通信
ModbusTCP通信是采用直接方式进行通信,用OPC的方式如何去做呢?
OPC是间接方式,OPC通信方式是:PLC作为ModbusTCP服务器,用KepServer作为ModbusTCP客户端,同时作为OPC服务器,PC作为OPC客户端
单个设备上述OPC通信方式比较麻烦的,且是收费的,但好处是当设备比较多,协议多的时候OPC通信优势就会很明显。
OPC具有以下应用场景:
为什么OPC这种通信方式可以实现上述的功能呢?
这是因为KepServer中集成了很多驱动,所以你只管做配置
OPC 通信基于服务器-客户端模型,因此需要实现OPC客户端通信之前,需要搭建一个 OPC 服务器环境,这里我们采用比较主流的 KepServer 软件,硬件以台达PLC通过ModbusTCP为例,关于 KepServer的安装授权过程,这里就不做过多赘述了。
打开 KepServer 软件后,通过菜单新建一个项目,然后按照下图进行操作:
下图为查看KepServer中集成的驱动种类,以下以台达PLC通过ModbusTCP为例,通道类型选择对应的ModbusTCP通信。
创建台达PLC设备
输入PLC地址和设备地址
以上面读取的D33
为例创建标记
以下就是创建了一个标记,当需要读取更多的变量的时候,就可以通过添加更多标记的方式进行
保存配置
运行->连接
启动监控后对应的值就读取过来
此处的OPC Quick Client
相当于客户端,在KepServer上进行配置之后就可以实现与PLC的通信
上述的过程就是:PLC作为ModbusTCP服务器,用KepServer作为ModbusTCP客户端
同时作为OPC服务器有没有开启呢?
在关闭了KepServer后,使用OPC客户端进行连接,如果可以连接上,那就代表服务器是打开的
打开如下OPC DA客户端软件(模拟上位机),并如下图所示进行选择:
可以看到读到了对应的变量值
这说明服务器所提供的服务是一直在打开的
上述过程介绍的是OPC DA的过程,在KepServer中也是集成进去了,在右下角有一个图标是关于OPC UA的,进去后的界面如下:
这里的49320
是?
上面讲过OPC UA是基于socket,OPC UA服务器其实就是TCP服务器,OPC UA是应用层协议,加载到TCP中,类似于Modbus TCP
如果是基于TCP的,那么就可以使用网络调试助手
连接到,下图显示是连接上了
所以KepServer本质上就是一个TCP服务器,可以同时打开OPC DA和OPC UA的服务器
如果要连接OPC UA服务器,可以使用OPC UA客户端,常用的有UaExperter
,具体操作如下:
可以看到数据已经读到
绘制一个框架图进行理解,DVP32是台达PLC,通过以太网接口连接到交换机,PC也是连接到交换机上的,也就是在一个局域网内,通过KepServer创建OPC UA服务器,利用OPC UA客户端就可以实现与PLC的的交互(读取与修改PLC变量),下图红色即为OPC UA通信的数据流
先用官方提供的客户端软件进行通信测试接口正常,再自己去写。
新建项目,加载dll库(利用COM技术写的)
添加引用,查看到其中包含了众多方法
其中OPCGroups继承于IOPCGroups接口
PLC中数据读取程序可以按照以下层次进行读取:OPCServer >> OPCGroups >> OPCGroup >> OPCItems >> OPCItem(标记/变量,最终要读取的)
OPC客户端和服务器不一定在一台电脑,一般会用一台电脑作为服务器,这个电脑就是一个Node,再在电脑中找ServerName,也就是下图中的Prog ID
连接的对应代码如下:
运行结果:
连接之后进行配置
按照OPCServer >> OPCGroups >> OPCGroup >> OPCItems >> OPCItem(标记/变量,最终要读取的)
结构进行变量的读取
这里只是单个设备单个变量的值读取,可以参考下篇读取多个设备多个变量值的方法
4.学习视频地址:
OPC框架搭建及实现原理分析1;OPC框架搭建及实现原理分析2;OPC框架搭建及实现原理分析3;OPC框架搭建及实现原理分析4
本篇是比较基础和简要的介绍,作为补充请查看OPC通信从入门到精通_2_OPC通信详解和C#客户端编程