Python-opcua 编程(1)

news2025/2/13 12:54:36

     

      任何一项新标准如果不能充分应用是不可能推广的,最近看了一些国外网站,发现类似OPC UA 的应用以及比较广泛了,而且有许多课程。相比之下,我国OPCUA 标准的普及工作仍然停留在概述的阶段,为此,我将逐步介绍一些编写OPC UA 应用程序实例,同时也介绍一些OPCUA 的应用场合。为了避免程序设计的细节,我们采用Python Opcua。

     Python已经成为非常流行的程序设计语言,它在网络编程,数值运算和人工智能领域应用广泛。并且在这些领域的应用程序也非常多,使人们能够很块地进入人工智能,数值运算,图像处理等领域的程序设计。而OPCUA 是一个正在普及的工业自动化协议和信息模型系统,opcua 是进入OT领域的接口。

Python 在工业软件中的应用

     在工业软件中,使用Python并不多,人们更倾向C#,C++和Matlab、labview 等程序设计语言编程。不过,Python 在以数值技术为中心的应用中具备优势,例如,复杂的控制算法,视觉识别,数据分析,工业AI应用中使用python 更加适合,同时,如果你有一些想法,希望快速成型,验证。使用python 无疑是高效率的。

OPC UA  协议

       OPC UA 是一个在工业领域应用越来越广泛的通信协议。它主要采取服务器/客户端通信方式,也支持发布/订阅方式。OPC UA 协议中包含了构建信息模型的方法,并且不断地制定行业规范。工业4.0 和MTP等主要的协议都是基于OPCUA的。因此,采用OPC UA 作为产品和服务的接口协议能够实现兼容性,目前各种主流的PLC 已经支持OPCUA。

Python与OPC UA 消除IT/OT 的鸿沟

使用Python 编程,OPC UA 协议作为IT 连接OT 领域的PLC ,传感器,执行器的接口。这种方式为IT 行业的最新技术导入OT 是十分有效的方式,例如视觉识别,AI,数据分析等技术发展速度惊人。通过Python-Opcua 组合在算法研究,快速原型设计和新产品开发验证中带来的效率。

下面是一个应用实例

在这个例子中,使用python+OpenCV 完成视觉识别。它们可以在一个小型的Linux 控制器上运行。PLC 和视觉控制器之间通过网线连接,并且使用OPC UA 交互,PLC 是服务器端,视觉控制器是Client 端。

  

 实例

       Python 的OPCUA 模块是,python-opcua。使用它来编写OPCUA 的服务器和客户端程序要比C#的OPC Foundation .Net 容易的多。如果编写一些OPC UA 的小程序,正巧你有会使用python的话,强烈建议使用python。

     所有编程语言的文档都是十分枯燥的,最好的方式是通过实例来学习。在这一系列博文中,我们从实例的方式来介绍Python opcua的编程技巧。

实例(1)-简单的服务器

import sys
sys.path.insert(0, "..")
import time
from opcua import  Server

if __name__ == "__main__":

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://127.0.0.1:48400/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, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients

    # starting!
    server.start()
    
    try:
        count = 0
        while True:
            time.sleep(1)
            count += 0.1
            myvar.set_value(count)
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()

实例(2)-简单的客户端

import sys
sys.path.insert(0, "..")


from opcua import Client


if __name__ == "__main__":

    client = Client("opc.tcp://localhost:48400/freeopcua/server/")
    # client = Client("opc.tcp://admin@localhost:4840/freeopcua/server/") #connect using a user
    try:
        client.connect()

        # Client has a few methods to get proxy to UA nodes that should always be in address space such as Root or Objects
        root = client.get_root_node()
        print("Objects node is: ", root)

        # Node objects have methods to read and write node attributes as well as browse or populate address space
        print("Children of root are: ", root.get_children())

        # get a specific node knowing its node id
        #var = client.get_node(ua.NodeId(1002, 2))
        #var = client.get_node("ns=3;i=2002")
        #print(var)
        #var.get_data_value() # get value of node as a DataValue object
        #var.get_value() # get value of node as a python builtin
        #var.set_value(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type
        #var.set_value(3.9) # set node value using implicit data type

        # Now getting a variable node using its browse path
        myvar = root.get_child(["0:Objects", "2:MyObject", "2:MyVariable"])
        obj = root.get_child(["0:Objects", "2:MyObject"])
        print("myvar is: ", myvar)
        print("myobj is: ", obj)

        # Stacked myvar access
        # print("myvar is: ", root.get_children()[0].get_children()[1].get_variables()[0].get_value())

    finally:
        client.disconnect()

实例(3)-导入NodeSet2.xml

     OPC UA 的信息模型采用标准化模板的xml 来表达,它被称为NodeSet。NodeSet是使用OPC UA 的建模工具来生成的,例如、luaModeler,SiOME等基于图像界面的建模工具,也可以使用UA ModelCompile 编译工具。python-opcua 的服务器能够导入外部生成的NodeSet2信息模型。

  python-opcua server 通过 import_xml 导入NodeSet2 文档。

import sys
sys.path.insert(0, "..")
import time


from opcua import ua, Server


if __name__ == "__main__":

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://localhost:4840/freeopcua/server/")

    server.import_xml("../schemas/UA-Nodeset/DI/Opc.Ua.Di.NodeSet2.xml")
    server.import_xml("../schemas/UA-Nodeset/Robotics/Opc.Ua.Robotics.NodeSet2.xml")

    # 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, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients

    # starting!
    server.start()

    try:
        count = 0
        while True:
            time.sleep(1)
            count += 0.1
            myvar.set_value(count)
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()

实例(4)-定义读取命名空间

可以使用多个xml 文档来描述信息模型,比如最基本的命名模型的URI 是http://www.opcfoundation.org/UA。

在该基础上可以导入其它的命名空间,例如

http://www.opcfoundation.org/UA/DI

http://www.opcfoundation.org/PLCOpen

你也可以导入自定义的信息模型,URI 可以为

http://www.maxim.com/App

在Python-opcua 中,可以注册python 程序的命名空间,例如

    uri = "http://www.maxim.org/app/"
    idx = server.register_namespace(uri)

 注意,这里注册的命名空间并不是你装入的命名空间,而是你Python 程序的命名空间,它返回一个idx。在程序中新建一个变量的话,可以使用该idx

    在Python-opcua 中,命名空间是存放在namespaceArray中的,可以定义下面的子程序来读取namespaceArray

def get_namespace_array(self):
        ns_node = self.get_node(ua.NodeId(ua.ObjectIds.Server_NamespaceArray))
        return ns_node.get_value()

打印返回的namespace

['http://opcfoundation.org/UA/', 'urn:freeopcua:python:server', 'http://www.maxim.org/pac/', 'http://www.maxim.org/fbs/', 'http://www.maxim.org/app/']

从上可见,在python-opcua 中,增加了一个URI 为'urn:freeopcua:python:server' 的命名空间。

一个完整的代码

import sys
sys.path.insert(0, "..")
import time
from opcua import ua, Server
def get_namespace_array(self):

        ns_node = self.get_node(ua.NodeId(ua.ObjectIds.Server_NamespaceArray))
        return ns_node.get_value()
if __name__ == "__main__":

    # setup our server
    server = Server()
    
    server.set_endpoint("opc.tcp://localhost:48400/freeopcua/server/")     
    server.application_uri = "urn:freeopcua:python:server"     
    nodes=server.import_xml("E:/yao2023/Model1/pac.NodeSet2.xml")
    nodes=server.import_xml("E:/yao2023/Model1/OpcUaLib.NodeSet2.xml") 
    nodes=server.import_xml("E:/yao2023/Model1/app.NodeSet2.xml") 
    print(get_namespace_array(server))
    uri = "http://www.maxim.org/app/"
    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, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients
    
    # starting!
    server.start()
  
    try:
        count = 0
        while True:
            time.sleep(1)
            count += 0.1
            myvar.set_value(count)
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复习并发编程的基础知识(一)

时间长了,并发编程的基础知识总忘,来记录一下: 进程和线程 进程:资源分配的最小单元,什么是资源?CPU,内存,网卡等等 线程:进程中的一个实体,不能单独存在&…

七、DMSP/OLS、NPP/VIIRS等夜间灯光数据能源碳排放空间化——能源碳排放增长类型、增长率、总量增长等级分析

一、前言 前文对能源碳排放空间化后的分析角度做了一些介绍,其实无非就是能源碳排放增长类型、增长率等的计算,那么这里强调一下,这个时候不能用利用统计数据计算出来的能源碳排放数据进行计算,而是必须用反演的能源碳排放数据进行划定计算。 二、具体步骤 增长类型 (…

【Excel超实用快捷键!!!办公效率1000%up!up!up!】

目录索引 ctrle:提取数据:合并数据: 普通快捷键:ctrla:ctrlc:ctrlv:ctrlx:ctrlz:ctrly:ctrls:ctrlf: 文字格式快捷键:ctrl…

IMX6ULL裸机篇之SPI实验-SPI主控寄存器

一. SPI主控寄存器 IMX6ULL 芯片的 SPI接口叫做 ECSPI,支持全双工、主丛可配置。 本文学习 IMX6ULL-阿尔法开发板SPI中控芯片的 SPI寄存器部分。后续代码实现需要配置 SPI相关的寄存器。 二. SPI主控的寄存器配置 1. SPI主控芯片寄存器 (1) RXDATA寄存器&am…

DVWA-Command Injection

大约 命令注入攻击的目的是在易受攻击的应用程序中注入和执行攻击者指定的命令。 在这种情况下,执行不需要的系统命令的应用程序就像一个伪系统外壳,攻击者可能会使用它 作为任何授权的系统用户。但是,命令的执行权限和环境与 Web 服务具有的…

【MySQL】创建和管理表

创建和管理表 标识符命名规则MySQL中的数据类型创建和管理数据库使用数据库修改数据库 创建表语法方式一方式二 修改表向表中追加一个列修改一个列重命名一个列删除一个列 重命名表方式一方式2; 删除表清空表 存储数据是处理数据的第一步 。只有正确地把数据存储起来&#xff0…

基于卫星星历计算卫星在CGCS2000大地坐标系中的坐标

目录 一、北斗系统概述 1.空间星座 2.坐标系统 3.时间系统 二、实验目的 三、实验内容 四、实验过程 五、实验结果 一、北斗系统概述 1.空间星座 北斗卫星导航系统简称北斗系统,英文缩写为 BDS,其空间星座由 5 颗地球静止轨道(GEO&…

​“前端已死”甚嚣尘上,全栈工程师卷到起飞

海量应届生入场,坑位却还是那多。具备前后端开发能力的全栈工程师兴起,不仅能够开发前端,还能够处理后端业务逻辑和数据库等技术,还能掌握整个软件开发的细节。企业自然会更愿意招聘全栈工程师,说白了,卷啊…

springboot整合quartz实现定时任务动态增删改查

springboot整合quartz quartz介绍Quartz 核心概念 使用依赖配置文件启动类quartz工具类job业务用到的对象类接口service实现类测试 quartz介绍 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。…

【CMake 入门与进阶(6)】 CMakeLists.txt 部分常用变量(附使用代码)

变量也是 cmake 中的一个重头戏,cmake 提供了很多内置变量,每一个变量都有它自己的含义,通过这个链接地址cmake-variables(7) — CMake 3.5.2 Documentation可以查询到所有的内置变量及其相应的介绍,如下所示: 在这一份…

App移动端测试 —— Monkey的日志

Monkey的日志对于分析脚本的执行情况十分必要。 Monkey 日志由以下几部分组成: 测试命令信息:随机种子 seed、运行次数、可运行应用列表、各事件百分比。” 正文内容从这里开始(可直接省略,亦可配图说明)。 01—Mon…

使用python批量处理工作簿和工作表

案例01 批量新建并保存工作簿 将for语句与xlwings模块相结合,就可以轻松实现批量创建工作簿 import xlwings as xw # 导入xlwings模块 app xw.App(visibleTrue,add_bookFalse) # 启动Excel程序,但不新建工作簿 for i in range(6):workbook app.books…

Pyinstaller 快速找出所需库的方法

目录 【auto-py-to-exe】第三方库 使用【auto-py-to-exe】逐步尝试 1.什么文件都不添加,选择项目与单目录后直接打包 2.直接运行生成的exe文件 3.定位所需的包 4.--add-data 和 --hidden-import 打包为一个exe文件 【auto-py-to-exe】第三方库 其是pyinstaller操…

【头歌-Python】9.1 X射线衍射曲线绘制(project)第3~4关

第3关:X 射线衍射曲线峰值 任务描述 本关任务:读文件中的数据绘制线图形并加绘制峰值。 相关知识 为了完成本关任务,你需要掌握: python 读取文件中的数据使用 matplotlib 绘制图形 python 读取文件 python读取文件可以用以…

6.volatile与JMM

volatile与JMM 6.1 被volatile修饰的变量有两大特点 特点: 可见性 有序性:有排序要求,有时需要禁重排 内存语义: 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中 当读一个vol…

Linux:ftp服务 (vsftpd)

我的ftp服务器为centos7 使用yum安装的vsftpd软件 (如果你需要离线yum库,而不会搭建可以查看) Linux:rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 安装软件 配置环境 其次是Linux的防火墙和selinu…

写一个Orillusion编辑器(伪)

界面效果 思路 bootstrap控制界面效果jquery动态修改界面内容[Add]增加一个box[Play]导出play.html,打开play.html就可以看到程序运行效果 编辑器代码 <!DOCTYPE html> <html> <!-- TODO 1. 序列化数据,保存工程 2. 反序列化数据,打开工程 --><head>…

Python实现ACO蚁群优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

腾讯安全SOC+荣获“鑫智奖”,助力金融业数智化转型

近日&#xff0c;由金科创新社主办&#xff0c;全球金融专业人士协会支持的“2023鑫智奖第五届金融数据智能优秀解决方案评选”榜单正式发布。腾讯安全申报的“SOC基于新一代安全日志大数据平台架构的高级威胁安全治理解决方案”获评“鑫智奖网络信息安全创新优秀解决方案”。 …

大数据分析平台释疑专用帖

大数据分析平台是大数据时代&#xff0c;企业数字化运营决策的一大关键平台&#xff0c;但初次接触大数据分析平台时&#xff0c;大家必然是问题多多的&#xff0c;本文将就几个比较常见的问题进行总结回答&#xff0c;希望对正在了解、选型大数据分析平台的大家有所帮助。 首…