OPC UA学习心得 — 4 OPC编程实现,基于Python

OPC UA编程实现 — 基于Python

FreeOpcUa,是使用Python开发基于OPC统一架构的优选第三方库,项目链接:https://github.com/FreeOpcUa/python-opcua

创建一个OPC服务器的步骤非常简单:

from opcua import Server

server = Server()    # 实例化一个UA服务器
server.set_endpoint("opc.tcp://0.0.0.0:48400/freeopcua/server/")    # 设定服务器URI
server.start()    # 启动UA服务器

测试所创建的UA服务器,建议可以使用UaExpert,它可以实现UA客户端的功能,下载链接:https://www.unified-automation.com

  1. 软件打开后,右键“Servers”,添加新连接

OPC UA学习心得 — 4 OPC编程实现,基于Python_第1张图片

  1. 在“Custom Discovery”下双击,并填入上面代码中设定的服务器URI
    OPC UA学习心得 — 4 OPC编程实现,基于Python_第2张图片
    上步添加完URI后,会扫描到Python中创建的UA服务器,选择“Anonymous”,建立连接
    在这里插入图片描述
  2. 连接成功后在主页面能够看到OPC UA规范定义的标准地址空间结构
    OPC UA学习心得 — 4 OPC编程实现,基于Python_第3张图片
    对于如何通过FreeOpcUa,创建自己的地址空间,项目源代码Examples文件夹下的server-example.py文件进行了举例。这里要介绍的是如何通过XML文件来编辑地址空间。

在XML文件中创建节点和分配引用,是非常非常棒的一种方法。

编写XML文件,首先添加命名空间,主要包括节点类、数据类型以及W3C标准。




1. 创建对象节点


    
    
    
        
    

  1. 填写正确的NodeId,用于明确标识节点
  2. 填写BrowseName,作为浏览地址空间时的非本地化名称
  3. 填写ParentNodeId,在实例化时非常关键,与ModelParent相关,如果不对实例声明进行明确指定,会导致无法实例化
  4. 分配引用,需要注意每种引用可以使用的次数(在节点类学习心得中进行了总结中)

2. 创建变量节点


    
    
    
        
    
    

  1. AccessLevel,设定访问方式,可读可写或其他
  2. Value,定义节点Value属性

一个简单的例子

from opcua import Server

server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:48400/freeopcua/server/")    # 设定服务器URI
server.import_xml("custom_nodes.xml")    # 导入XML文件
server.start()

OPC UA学习心得 — 4 OPC编程实现,基于Python_第4张图片



    
        A custom folder.
        
            i=61
            i=85
        
    

    
        A custom object node.
        
            i=58
            i=30001
        
    

    
        
            i=63
            i=30002
        
        StringValue
    

    
        
            i=68
            i=30002
        
        76
    

  1. 在上例中,首先添加了一个类型为文件夹的对象节点MyXMLFolder,通过HasTypeDefinition设定其类型为FolderType,用于组织地址空间中的节点,并使用Organizes引用将它组织到Root下的Objects节点下
  2. 然后在文件夹节点下添加了一个名为MyXMLObject的对象节点,通过HasTypeDefinition引用设定其类型为BaseObjectType,并使用Organizes引用将它组织到MyXMLFolder节点下
  3. 在MyXMLObject对象节点下创建一个变量MyXMLVariable,数据类型设定为字符串型,节点类型为BaseVariableType,设定Value属性来赋予初始值“StringValue”
  4. 在MyXMLObject对象节点下添加一个特性MyXMLProperty,需要使用HasProperty引用,节点类型设定为PropertyType,数据类型为32位的UInt,并赋予初始值76

OPC UA学习心得 — 4 OPC编程实现,基于Python_第5张图片
一个复杂的例子
创建一个自定义的对象类型节点,然后通过实例化该类型节点得到一个复杂的对象节点。
OPC UA学习心得 — 4 OPC编程实现,基于Python_第6张图片

from opcua import Server

server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:48400/freeopcua/server/")    # 设定服务器URI
uri = 'http://examples.freeopcua.github.io'
idx = server.register_namespace(uri)    # 注册地址空间

server.import_xml("test.xml")    # 导入自定义的节点类型

my_sensor_type = server.get_root_node().get_child([
    "0:Types", "0:ObjectTypes", "0:BaseObjectType", "0:TemperatureSensorType"]).nodeid
my_sensor = server.nodes.objects.add_object(idx, "TemperatureSensor", my_sensor_type)

server.start()

在XML文件中创建自定义的类型定义节点MyTemperatureSensorType
OPC UA学习心得 — 4 OPC编程实现,基于Python_第7张图片
编程实例化该节点,得到地址空间结构如图:
OPC UA学习心得 — 4 OPC编程实现,基于Python_第8张图片
XML文件代码:



    
        MyTemperatureSensorType
        温度传感器类型
        
            i=58    
        
    

    
        配置
        
            i=58    
            i=78    
            i=30000
        
    

    
        EngineeringUnit
        温度工程单位
        
            i=63    
            i=78    
            i=30001
        
        
    

    
        温度测试
        
            i=58    
            i=78    
            i=30000
        
    

    
        Temperature
        温度
        
            i=63    
            i=78    
            i=30003
        
        0.0
    

    
        EngineeringUnit
        温度工程单位
        
            i=68    
            i=78    
            i=30004
        
        
    

如有错误,欢迎指正 [email protected]

你可能感兴趣的:(OPC,UA)