本小节主要介绍了OPC DA到OPC UA之间的关系,更多详细的信息参考OPC基金会官网。首先,我们使用 python-opcua 组件模拟构建一个Tank4C9的反应罐OPC UA服务器,然后,演示OPC UA的Objects是如何构建的。最后,展示opcua-client连接这个OPCUA服务器并订阅数据变化是如何的显示效果。下一节我们将用演示监控如何迁移到OPC UA数据通信协议。

前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的 OPC UA 。OPC作为早期的工业通信规范,是基于 COM/DCOM 的技术实现的,用于设备和软件之间交换数据,最初, OPC 标准仅限于 Windows 操作系统。 OPC OLE for Process Control 的缩写(中文意思:用于过程控制的 OLE )。

OPC规范包括了 3 大部分:

  • OPC DA: OPC 实时数据访问规范,定义了包括数据值,更新时间与数据品质信息的相关标准。前面实战2我们使用openOPC获取的 tag 位号值就属于 OPC DA ,通过 OPC DA 读取底层设备的状态、工业参数等位号的实时数据。
  • OPC HDA: OPC 历史数据访问规范,定义了查询、分析历史数据和含有时标的数据的方法。
  • OPC AE: OPC 报警事件访问规范,定义了报警与时间类型的消息类信息,以及状态变化管理等相关标准。
  • 由于基于COM/DCOM的技术有着不能跨平台的根本缺点,随着技术的发展, OPC 基金会在 2008 年发布了新的规范: OPC UA OPC Unified Architecture OPC 统一框架。

    1. OPC UA 是什么

    2008年发布的OPC统一架构(UA)将各个OPC Classic规范的所有功能集成到一个可扩展的框架中,独立于平台并且面向服务。OPC UA规范不再是基于COM/DCOM技术,因此OPC UA不仅能在Windows平台上实现,更可以在Linux,以及其它的嵌入式平台中实现。

    这种多层方法实现了最初设计 UA规范时的目标:

  • 功能对等性:所有 COM OPC Classic规范都映射到UA
  • 平台独立性:从嵌入式微控制器到基于云的基础设施
  • 安全性:信息加密、身份验证和审核
  • 可扩展性:添加新功能而不影响现有应用程序的能力
  • 综合信息建模:用于定义复杂信息
  • 2. OPC UA 相对于传统 OPC 的变化

    功能对等性

    OPC UA不仅支持传统OPC的所有功能,更支持更多新的功能:

  • 发现:在本地 PC和/或网络上查找可用的OPC服务器
  • 地址空间:所有数据都是分层表示的(例如文件和文件夹),允许 OPC客户端发现、利用简单和复杂的数据结构
  • 按需:基于访问权限读取和写入数据 /信息
  • 订阅:监视数据 /信息,并且当值变化超出客户端的设定时报告异常
  • 事件:基于客户端的设定通知重要信息
  • 方法:客户端可以基于在服务器上定义的方法来执行程序等
  • OPC UA产品和OPC Classic产品之间的集成可以通过COM/Proxy Wrappers轻松实现。
  • 平台独立性

    鉴于市场上有各种各样的硬件平台和操作系统,平台独立性就显得至关重要。 OPC UA 包含但不限于以下平台及系统:

    硬件平台:传统 PC 硬件、云服务器、 PLC 、微控制器( ARM 等)

    操作系统: Microsoft Windows Apple OSX Android 或任何 Linux 发行版本等

    OPC UA 为企业之间的互操作性提供必要的 M2M M2E 及两者之间的基础架构。

    最大的变化是 OPC UA 可以通过任何单一端口(经管理员开放后)进行通信,这使得 OPC 通信不再会由于防火墙受到大量的限制,实现 Internet 通讯。

    综合信息建模

    OPC UA 信息建模框架将数据转换为信息。通过完全面向对象的功能,即使是最复杂的多级结构也可以建模和扩展。数据类型和结构在配置文件中定义。 例如,现有的 OPC Classic 规范被建模为 UA 配置文件,也可以由其他组织扩展:

    更详细的内容请参阅 OPC基金会官网: http://opcfoundation.cn/

    3. 安装 python-opcua 组件

    pip 安装: pip install opcua

    组件按照完毕后,我们可以在python 环境 执行 uadiscover 命令 查看效果:

    由于运行电脑上没有运行的 opcua 服务端,命令没有发现任何 opcua 服务。下面通过运行 opcua 上最新的服务端代码再来看看效果。

  • C:\Python\Python36-32\Scripts\ 下创建 examples 目录;
  • Copy opcua 源码下的 server-minimal.py C:\Python\Python36-32\Scripts\examples
  • C:\Python\Python36-32 目录下运行命令,如下图:
  • python C:\Python\Python36-32\Scripts\examples\server-minimal.py
  • 重新运行 uadiscover 命令,结果如下:

    现在连接到 OPCUA Sever 的模拟器提供的 OPC UA 服务了。

    4. 创建一个 4C9 反应罐的 OPCUA Server 模拟器

    4.1. Solution 上添加一个 Python Application Project Tank4C9Svr

    打开 Tank4C9Svr.py 文件,修改 Example 里的 server-minimal.py 文件里代码,模拟 4C9 反应罐如下:

    import sys
    sys.path.insert(0, "..")
    import time
    import random
    from opcua import ua, Server
    if __name__ == "__main__":
        # setup our server
        server = Server()
        server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
        # setup our own namespace, not really necessary but should as spec
        uri = "http://examples.freeopcua.github.io"
        idx = server.register_namespace(uri)
        # get Objects node, this is where we should put our nodes
        objects = server.get_objects_node()
        # populating our address space
        myobj = objects.add_object(idx, "Tank4C9")
        status = myobj.add_variable(idx, "Status", 0)
        overheadFlow = myobj.add_variable(idx, "OverheadFlow", 0)
        buttomsFlow = myobj.add_variable(idx, "ButtomsFlow", 0)
        power = myobj.add_variable(idx, "Power", 0)
        #myVar.set_writable()    # Set MyVariable to be writable by clients
        # starting!
        server.start()
        try:
            count = 0
            while True:
                time.sleep(5)
                count = count + 1
                print(count%4)
                if count%4>0:
                    status.set_value(1)
                else:
                    status.set_value(0)
                a= random.randint(100,500)
                print("OverheadFlow:"+str(a))
                overheadFlow.set_value(a)
                buttomsFlow.set_value(random.randint(50,500))
                power.set_value(random.randint(1000,5000))
        finally:
            #close connection, remove subcsriptions, etc
            server.stop()

    我们把Tank4C9Svr 设置成 solution 默认启动项目后, F5 调试运行 Tank4C9Svr ,如下图:

    5. opcua-client 浏览 4C9 opcua 服务器

    安装: pip install opcua-client

    cmd 窗口 C:\Python\Python36-32\Scripts 目录下执行 opcua-client.exe 命令,如下图:

    地址栏输入 opc.tcp://localhost:4840 点击连接按钮,就能看见我们构建的Tank4C9设备和对于的tag变量了,如下图:

    我们可以在变量上右键来订阅数据变化的读取最新的数据值。

    6. 小结

    本小节主要介绍了 OPC DA OPC UA 之间的关系,更多详细的信息参考 OPC 基金会官网。首先,我们使用 python-opcua 组件 模拟构建一个 Tank4C9 的反应罐 OPC UA 服务器,然后,演示 OPC UA Objects 是如何构建的。最后,展示 opcua-client 连接这个 OPCUA 服务器并订阅数据变化是如何的显示效果。下一节我们将用演示监控如何迁移到OPC UA数据通信协议。