opc协议

 

opc 协议

非opc协议-驱动

 

应用程序使用驱动程序来直接与设备通讯。

缺点:

  • 引用的驱动程序多(上图中每个应用程序都要引用四种驱动,每个驱动的使用方式也不一样)
  • 产品的不断升级给应用端带来巨大的工作负担

 

使用opc协议

 

OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从低层的开发中脱离出来。对于软件开发商而言,不再费神于开发各种硬件设备的驱动程序,而是把精力和时间集中在增加和完善软件的功能上,使自己的软件更易被用户接受和使用。对于硬件设备制造商,再也不必担心自己的产品因为没有为某些软件提供驱动程序而被用户所忽视或放弃。一次编写的驱动程序(OPC服务器),可以被所有的应用软件所用。不仅节省了各种I/O驱动程序的开发费用,而且可以让制造商集中精力生产更易于用户使用的、功能完善的硬件。

OPC服务模式

 

OPC服务可以通过OPC组来管理同步一种协议类型的设备,如:上面的场景监视应用只需要对拥有这四个设备的OPC组进行通讯就可以了。

 

OPC接口类型

 OPC服务器通常支持两种类型的访问接口,它们分别为不同的编程语言环境提供访问机制。这两种接口是:自动化接口(Automation interface);自定义接口(Custom interface)。自动化接口通常是为基于脚本编程语言而定义的标准接口,可以使用VisualBasic、Delphi、PowerBuilder等编程语言开发OPC服务器的客户应用。而自定义接口是专门为C++等高级编程语言而制定的标准接口。OPC现已成为工业界系统互联的缺省方案,为工业监控编程带来了便利,用户不用为通讯协议的难题而苦恼。任何一家自动化软件解决方案的提供者,如果它不能全方位地支持OPC,则必将被历史所淘汰。

 

OPC 优缺点

OPC的优点和不足

与早期的现场设备接口相比, OPC 具有如下几个优点:

( 1) 减少了重复开发;

( 2) 降低了数据设备间的不兼容;

( 3) 降低了系统集成商的开发成本;

( 4) 改善性能。

OPC 存在的不足

虽然OPC 接口具有种种优势, 但是如果直接通过OPC 连接实时数据库依然存在一些问题:

( 1) 虽然OPC 标准中包含了OPC History 标准, 但是多数OPC 服务器并未给予支持, 所以难以为实时数据库提供数据缓存功能。

( 2) OPC 服务器无法提供一些常用的计算功能, 如累计、滤波和几个位号相加的综合计算功能, 增加了实时数据库的负担, 影响了实时数据库的稳定性和鲁棒性。

( 3) OPC 基于微软的COM/DCOM体系, 在分布式应用中其所用的RPC 方式常常与企业级的防火墙发生冲突。不能通过防火墙。

OPC体系结构

 

 

 

OLE(Active X)/COM

Active X/COM技术定义各种不同的软件部件如何交互使用和分享数据。OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点。

 

工作原理

 

 

 

详细原理图

 

 

 

OPC服务器

如果我的控制硬件供应商说他们支持OPC,那么为什么我还需要OPC服务器?

当硬件供应商表示他们支持OPC时,通常并不意味着他们直接将OPC服务器嵌入到他们的硬件中。他们的意思是他们拥有OPC服务器软件,该软件在某个基于Windows的计算机上运行,该计算机与其硬件对话并使用一个或多个OPC标准公开数据。此外,对于某些硬件供应商,可能需要额外的许可费才能启用此OPC服务器功能。我们经常听到用户对这一点感到困惑。其实只是为了在销售时更好听一点,才会说“我们支持OPC”,所以在此需要澄清一下供应商所说的内容。

现在,一些供应商开始利用多平台功能,并将OPC UA服务器直接嵌入到他们的PLC中。如果你的 HMI或SCADA软件支持OPC UA,那么这可能会非常方便。如果你的客户端应用程序不支持OPC UA,那么则可以使用OPC网关应用程序来帮助你从OPC UA 连接到 DA。

OPC服务器必须在Server类计算机和操作系统上运行吗?

OPC服务器不需要服务器类硬件或操作系统。有些供应商可能会针对其具体实施要求这样做,但OPC标准并没有规定这一点。OPC服务器软件通常相当轻巧,可以轻松地与台式PC上的其他软件应用程序共存。你可以咨询你的OPC服务器供应商,了解你的具体应用要求。(以Software Toolbox的产品为例,在它的每个产品网站区域都有一个规格页面,虽然他们的OPC服务器通常不需要服务器级硬件或操作系统。)

2个OPC服务器如何相互通信?而2个OPC客户端又如何相互通信?

在OPC世界中,通常客户端是与服务器通信的。但是好消息是OPC服务器可以与其他OPC服务器通信,OPC客户端也可以使用相同的方式。

为什么两个OPC服务器需要通信?你可以想象一下,你有PLC供应商A和PLC供应商B,并且有一个OPC服务器需要使用两个不同的PLC供应商的特定设备协议与每个服务器进行通信。你希望将数据从PLC A移动到PLC B,这意味着2个不同的OPC服务器需要相互通信。你可以使用OPC Bridging(OPC桥)软件应用程序执行此操作。OPC桥接软件应用程序是OPC客户端应用程序,可以连接到许多不同的OPC服务器,然后允许你映射两个OPC服务器之间的数据移动,指定方向,数据转换等

 

 

  • OPC客户端与OPC服务器(OPC数据访问服务器、OPC历史数据访问服务器或OPC报警与事件服务器)的通信
  1. 服务器是利用Microsoft Windows的 COM/DCOM技术作为数据交换的方式。这就是说服务器必须安装在支持Microsoft Windows操作系统的PC。一个OPC服务器可以同时跟多于一个的 OPC客户端 通讯。


 

  • OPC服务器 – 数据传译器
  1. 服务器的一个关键作用就是将以数据源输出形式传送的数据, 翻译成支持之前提到的某一或多于一种的OPC数据访问规范形式!!!(比如说, OPC实时数据访问规范)。OPC数据规范群只是定义了OPC服务器的OPC通讯模块, 所以数据形式翻译模块的准确性和高效性就完全取决于OPC服务器供应商的开发方式
  • OPC服务器与数据源的通信 OPC服务器和数据源用数据源支持的数据形式通信。数据源可以是某个硬件设备, 某个控制器或者是某个应用程序。因为数据源可以各种各样, 而每一个不同形式的数据源又都用自己的通讯协议或者API可以通过多个物理通信方式(串行RS485, RS232, 以太网, 无线通讯等)通信, 所以OPC数据规范群并没有定义OPC服务器和数据源之间的交流法则。 两个关于OPC服务器和数据源通讯的最普遍的例子就是:
  • API;通过一个可以是专属于某一个数据源(请参见MatrikonOPC 霍尼韦尔TPS服务器), 也可也是开放式(请参见MatrikonOPC Modbus服务器)的通信协议。

 

OPC服务器所兼容的设备分类

  • 硬件设备:DCS,PLC,扫描仪,电子设备…
  • 应用软件:HMI,历史数据库,震动检测器…
  • 通讯协议:DDE,Modbus,ODBC,GenCS…
  • 操作系统:Windows,UNIX,VMS,Macintosh,嵌入式OS…

即OPC服务器可以从上面任何一种形式的数据产生实体中读取数据。这个实体可以是霍尼韦尔PHD的Application,也可以是Modbus的通讯协议,还可以是一种PLC,也就是一种Device(硬件设备),或者是一种Platform。

 

Matrikon公司的OPCServer Simulator

简单,单文件注册后,各种数据类型,各种点类型(只读点,只写点,读写点)都有了,更好的一点是,如果想做大规模的测试,10万点,那么只需要在它的Random下添加任意名称即可,OPCServer会自动给你建出对应的测点,还是随机数变化。

配置时的几个关键概念

Alias Group(Group) ——对Items的分类管理,自定义的。类似于Java中的包。

Alias (Item) ——一个Item代表与服务器进行通信的PLC或其它硬件设备上的一个地址。与Kepware中的一样。

配置顺序如下(在Alias Configuration下):

New AliasGroup/Alias --> Inset Alias

Kepware公司的OPCServer

一个商业软件,需要花费金钱购买License的,但Kepware公司的OPCServer需要花钱的不是OPCServer本身,而是采集驱动。不过Kepware公司的OPCServer提供了不花钱的仿真驱动,用来测试上非常好的。

缺点就是太庞大,不简单,学习成本较高。但为了能满足OPC这类产品的各种测试,它真的是最佳选择。可以去它的官方网站下载。

配置时的几个关键概念

Chanel——通道是一个从PC到一个或多个外部设备之间的传播媒介。一个通道可以用来代表一个串行端口(一个安装在个人电脑上的卡或是以太网接口)。

Device——设备代表了与服务器进行通信的PLC或其他硬件。它受限于Channel所选择的设备驱动程序(Device driver)。

Group——对tags的分类管理,自定义的。类似于Java中的包。

Tag——一个Tag代表与服务器进行通信的PLC或其它硬件设备上的一个地址。服务器允许动态标签(客户端自定义创建)和用户定义的静态标签(服务端管理人员创建的标签)。动态标签是直接进入了OPC客户端和指定设备存取数据。静态标签在服务器被创建的且支持标签扩展,他们可以从OPC客户浏览,支持标签浏览。

配置顺序如下:

New Channel -->New Device --> New Group/Tag --> New Tag

OPC客户端

Matrikon公司的OPCClient

标准,稳定,单文件,通讯过程的信息还比较丰富,我是比较喜欢用它在创建OPC组时定义同步方式或异步方式来验证远程计算机的OPC配置是否正确。缺点就是大了点,2M多。

Kepware公司的OPCClient

功能很强大,标准,稳定,日志信息很丰富,最推荐的功能是支持对OPCServer中点名的条件过滤,支持点表的导入导出,支持自动导入OPCServer的所有点,根据点表识别好点坏点,按照列排序,用它可以弥补很多国产组态软件不能在线遍历OPCServer点表的功能、不能过滤OPCServer点的功能、不能识别OPCServer中好点坏点的功能等。缺点就是非单文件。

OPC Client和OPC Server配置的安全策略

下表是对 OPC Client 和 OPC Server 所在操作系统之间的安全策略的配置对应说明:

 

 

Java实现OPC客户端

有两种开源包,分别是JeasyOpc和utgard(Openscada),他们的区别如下:

 

经对比分析,我们采用Utgard(Openscada)开源技术,Openscada可以很好的实现与OPC服务器的链接及读写数据等功能,还可以随时获取和修改OPC的Server和Item的属性状态信息。所以它能够很好的满足我们的需求,建议使用Openscada。

OPC客户端开发大致步骤

  1. COM组件初始化;
  2. 创建服务器Server对象;
  3. 创建组Group对象;
  4. 创建项Item对象;
  5. 添加Item到Group中;
  6. 添加Group到Server对象中;
  7. 连接服务器(这里的顺序与具体实现有关),完成相应操作;
  8. COM组件关闭


 

数据类型

 

 

Openscada链接配置方法

OPC数据存取服务器由三个对象组成:服务器对象(Server)、组对象(Group)和项对象(Item)。

按说明配置好OPC Server 与 OPC Client 所在电脑的组件服务配置和防火墙设置(windows7直接关闭就行了)注意一定要把本机希望链接OPC服务的用户或用户组添加到DCOM配置列表中,否则链接会失败。

如果其他都配置好了,运行程序还是连接不上的话,首先常看防火墙是否配置(或关闭)。

OPC对象——服务器(OPC Server)、组(OPC Group)、项(OPC Item)。

Openscada开源项目:

 ConnectionInformation中:

 Host——本地主机/网络主机IP (示例:localhost(默认)、127.0.0.1)

 Domain——域(默认为localhost)

 User——用户名

 Password——用户登录密码

 Clsid——应用在注册表中相对应的CLSID值

 Grogid——应用在注册表中对应的程序名称

 【Clsid 和 Grogid 作用相同,只要设置一个就可以了,如果两个都设置了,程序会优先选择Clsid。我们建议使用Clsid,因为使用Grogid时,Openscada的内部处理还是会通过JISystem.getClsidFromProgId( progId )方法将其转换为Clsid,并且还需要进行服务器上用户的权限的高级配置才可以使用。查找Clsid和Grogid的方法:打开注册表(regedit)—》在HKEY_CLASSES_ROOT下找到相应的OPC服务器名称,该名称就是Grogid,在其目录下的CLSID的值(右边区域)就是Clsid】

开发

1.MatrikonOPC模拟检测点添加

 

2.关闭防火墙 3代码

public static void main(String[] args) throws Exception {
    // 连接信息
    final ConnectionInformation ci = new ConnectionInformation();
    ci.setHost("localhost");         // 电脑IP
    ci.setDomain("");                  // 域,为空就行
    ci.setUser("OPCServer");         // 电脑上自己建好的用户名 注意:用管理用户
    ci.setPassword("123456");          // 用户名的密码
     ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305"); // MatrikonOPC的注册表ID,可以在“组件服务”里看到
     final String itemId = "test.a";    // 项的名字按实际


    // 启动服务
    final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
 
    try {
        // 连接到服务
        server.connect();
        // add sync access, poll every 500 ms,启动一个同步的access用来读取地址上的值,线程池每500ms读值一次
        // 这个是用来循环读值的,只读一次值不用这样
        final AccessBase access = new SyncAccess(server, 500);
        // 这是个回调函数,就是读到值后执行这个打印,是用匿名类写的,当然也可以写到外面去
        access.addItem(itemId, new DataCallback() {
            @Override
            public void changed(Item item, ItemState itemState) {
                int type = 0;
   try {
      type = itemState.getValue().getType(); // 类型实际是数字,用常量定义的
   } catch (JIException e) {
      e.printStackTrace();
   }
                System.out.println("监控项的数据类型是:-----" + type);
                System.out.println("监控项的时间戳是:-----" + itemState.getTimestamp().getTime());
                System.out.println("监控项的详细信息是:-----" + itemState);

                // 如果读到是short类型的值
                if (type == JIVariant.VT_I2) {
                    short n = 0;
      try {
         n = itemState.getValue().getObjectAsShort();
      } catch (JIException e) {
         e.printStackTrace();
      }
                    System.out.println("-----short类型值: " + n);
                }

                // 如果读到是字符串类型的值
                if(type == JIVariant.VT_BSTR) {  // 字符串的类型是8
                    JIString value = null;
      try {
         value = itemState.getValue().getObjectAsString();
      } catch (JIException e) {
         e.printStackTrace();
      } // 按字符串读取
                    String str = value.getString(); // 得到字符串
                    System.out.println("-----String类型值: " + str);
                }
            }
        });
        // start reading,开始读值
        access.bind();
        // wait a little bit,有个10秒延时
        Thread.sleep(10 * 1000);
        // stop reading,停止读取
        access.unbind();
    } catch (final JIException e) {
        System.out.println(String.format("%08X: %s", e.getErrorCode(), server.getErrorMessage(e.getErrorCode())));
    }
}

4测试

write values-测试数据

 

代码结果

 

总结

 

OPC就是为了不同供应厂商的设备和应用程序之间的接口标准化,使其间的数据交换更加简单化的目的而提出的。作为结果,从而可以向用户提供不依靠于特定开发语言和开发环境的可以自由组合使用的过程控制软件组件产品。OPC的设计目的最重要的是即插即用,也就是采用标准方式配置硬件和软件接口。一个设备可以很容易地加入现有系统并立即投入使用,不需要复杂的配置,且不会影响现有的系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值