斯兴瑶 廖映华 胥 云 黄 宇 杨 明
(四川轻化工大学机械工程学院,四川 宜宾 644000)
OPC UA 作为一种新的数据传输架构,将传统的OPC UA 规范进行有效的集成与改进[1]。它的灵活性、安全性和扩展性相对于传统OPC 技术有了极大的提高,给行业软、硬件供应商和集成方案解决商提供一种新的思路。
西门子828D 数控系统的OPC UA 为用户提供了统一的地址空间和服务模型,解决了以往同一系统的数据不能同时被访问的难题,同时也改进了原来OPC 信息传输的弊端,可以通过管理员授权的单一端口进行数据的访问,减少了因为防火墙原因访问失败问题的出现[2-3]。同时西门子数控系统的OPC UA 允许数据按照不同格式表示,允许开发者自定义变量,极大地方便了数据的获取。
本文为了解决数控系统数据采集与存储问题,具体分析了西门子828D 数控系统的OPC UA的结构、功能、变量以及配置,为数据采集做好基础工作。开发符合规范的OPC UA 客户端浏览西门子828D 数控系统的OPC UA 服务器变量,通过Python编写数据采集程序,通过OPC UA 实现数控机床实时的数据采集。其技术架构如图1 所示。
图1 OPC UA 技术框架
本次使用的是西门子OPERATE V4.7 版本的OPC UA 服务器,该服务器将报警服务器和数据提供服务器整合到一起,给外界提供唯一的一个OPC UA服务器供其调用。根据西门子提供的(西门子828D NC 变量和接口信号)可知,西门子828D 数控系统的OPC UA 服务器所提供的系统变量如表1 所示。
表1 系统变量
本次采集的机床实时数据来自/Channel 地址中的通道变量,报警实时数据来源于/Nck 地址变量,刀具数据来自/Toool 地址变量。
西门子828D 数控系统自身支持最新的OPC UA,在使用西门子828D 数控系统的OPC UA 之前,首先需要购买服务权限,然后通过HMI 面板配置OPC UA的服务,最后重启系统,激活OPC UA 服务器完成对OPC UA的设置。主要配置过程如图2 所示。
图2 启动OPC UA 服务器
OPC UA 服务器负责管理自身的数据和处理逻辑,并通过OPC UA 通讯协议对OPC UA 客户端提供相应的服务[4-5]。当OPC UA 客户端向OPC UA 服务器发送请求时,服务器接收请求返回响应,这种C/S 网络架构的通信形式可以实现安全、快速、稳定和加密的数据交换,同时减少数据在传输的过程中的丢包现象的发生,节约了网络带宽,保证传输不受到环境和网络的过大影响。
选定Pycharm2019 开发环境,开发使用的是Python语言,使用的工具包是GitHub 开源的OPC UA 工具包,可视化界面基于Python的PyQT5 图形库编写。主程序的开发流程如图3 所示。
图3 主程序流程
主程序开发关键技术如下:
(1)开发环境配置
以Python 为开发语言,集成开发环境选择JetBrains 软件公司出品的PyCharm2019,使用OPC UA 工具包连接西门子828D 数控系统内置OPC UA服务器,使用QtDesigner 来制作UI 界面,最终使用PyInstaller 将Python 文件打包成.exe 文件。具体开发工具如表2 所示。
表2 客户端开发工具
(2)初始化OPC UA的协议线
初始化OPC UA 协议栈的目的是在连接到OPC UA 服务器之前,与OPC UA 服务器建立信息交流的通道,该通道是独立于协议之外的通道,用于数据交换的安全性。在Python 编程中具体表现在导入OPC UA 工具包的时候,该工具包有一个名为_init_.py 文件初始文件。
(3)连接OPC UA的服务器
通过OPC UA 工具包的Connect 函数连接到OPC UA 服务器,通过Disconnect 函数断开与OPC UA服务器连接。
(4)遍历节点属性
当连接到OPC UA 服务器时,通过get-node 方法获取节点对象,通过get-attributes 方法获取node节点的属性及值,开发的OPC UA 客户端只要功能如表3 所示。
表3 客户端主要功能
界面采用QtDesigner 进行编写,将编写完毕的UI 文件使用pyuic 工具转换为Python 文件代码,编写相关控件的逻辑函数,建立界面与程序的联系。最终使用PyInstaller 工具将其打包为.exe 文件。程序的主界面原型如图4 所示。
图4 主界面原型图
OPC UA 客户端界面主要由5 个窗口组成:
(1)OPC UA 连接窗口
在连接栏窗口中,通过显式的输入当前OPC UA的URL 地址,同时将用户名和密码通过参数的形式进行传递。点击连接按钮,通过OPC UA 客户端程序的解析,将各个参数与OPC UA 服务器进行匹配,如通过参数正确即可成功连接OPC UA 服务器。同时也可点击断开按钮,断开与OPC UA 服务器的连接。
(2)OPC UA 变量地址浏览窗口
在变量地址浏览窗口中,当输入正确的URL地址连接上OPC UA 服务器时,该浏览框即可显示当前OPC UA 服务器所有的系统变量,用户或者开发人员可以通过对照《西门子828DNC 变量和接口信号》手册从变量地址浏览窗口中获取变量的具体地址、变量名称、变量浏览名和节点的ID 值。
(3)OPC UA 变量属性浏览窗口
在变量属性浏览窗口中,当用户点击左侧的具体变量时,可以在该窗口查看变量的具体属性值,例如变量的属性、变量值和变量类型。
(4)OPC UA 变量订阅窗口
在变量订阅窗口中,当用户订阅某个变量时,就可以在该窗口查看订阅的变量的当前的状态。
(5)OPC UA 变量监测窗口
在变量监测窗口中,当用户订阅某个变量时,可通过该窗口查看当前订阅变量当前值的变化趋势。
西门子828D 数控系统具有“简单、好用,开放”的特点[6-8]。通过向西门子购买OPC UA 服务器的授权之后,就可以开发相应的符合OPCUA 规范的客户端程序,并可以通过西门子828D 数控系统的OPC UA 服务器对外提供的数据接口访问系统的数据[9-10]。开发OPC UA 客户端实现快速获取OPC UA 浏览器所支持的变量,方便地获取各变量的属性以及当前值。通过采用Python 编程语言实现了对西门子828D 数控系统的数据采集。
本次设计的基于B/S 架构的828D 数控机床信息可视化平台的数据主要来源有两部分,来自机床的实时数据与人工录入的静态数据[11]。由于人工录入数据比较简单,这里主要讲解关于使用Python 程序自动采集机床的实时数据。
机床的实时数据主要是指通过OPC UA 协议实时的采集数控机床当前的加工过程数据。采集的数据一部分保存到MySQL 数据库中,一部分通过消息队列传输到数据处理层,供前端页面使用。
查询《西门子828D OPC UA 配置手册》可知,OPCUA 服务器支持监控项的最大数量的计算公式如式(1)所示。
式中:MN(max number)为最大采样数据条目数;SL(system load) 为系统负载;UES(update every second)为每秒更新。
对OPC UA 服务器进行数据采集的采样速率有开发者自定义,通过每秒更新公式可得知OPC UA服务器变量每秒更新的数目,每秒更新计算公式如式(2)所示。
式中:SR(sampling rate)为采样速率。
西门子828D 数控系统的系统负载为500 条目/s,本次预设的采样速率为1 s 采集一次,根据上述公式可以计算出OPC UA 服务器支持监控项的最大数据量为500 个。本次监控的变量数目远远小于500,故采集变量的数目满足OPC UA 服务器的要求。
通过OPC UA 客户端并对照《西门子828DNC变量和接口信号》可以精确的获取变量的地址,同时将监控的变量进行分类的统计,具体包括主轴相关变量地址表、XYZ轴坐标相关变量地址表、程序相关变量地址表和报警信息变量地址表,各变量地址具体信息如表4 所示。
表4 主轴变量地址
该采集程序的开发包与开发OPC UA的客户端的同为GitHub 开源的基于Python的OPC UA 工具包。首先初始化OPC UA 协议栈后,客户端发出请求与OPC UA 服务器建立连接,之后程序的任何请求都会通过此连接进行传输。数据采集程序流程如图5 所示。
图5 数据采集程序流程
数据采集的核心流程是通过对机床当前状态进行判断,当机床状态发生改变时,调用不同组的对应采集函数对组中各个监测变量进行数据采集,其中数据采集的数据可以在压缩后直接存储到MySQL数据库中为数据统计分析提供数据支撑,可直接传输到消息队列中供调用。
主要探讨了如何储存西门828D 数控系统采集数据,主要包括数据库设计与具体的实现方案。根据系统的要求,对数据库设计所遇见的问题进行了具体的分析,并提出了3 个关键的问题:如何建立不同数据表的结构、如何实现存储海量的实时加工数据、如何降低数据库的负载。与此同时,对以上3 个问题都提出了具体的解决措施。
在软件开发中,优秀的数据库设计,可以大大地提高整个系统的运行效率,保证该信息可视化平台的稳定运行。MySQL 数据库作为一款开源且性能优异的关系型数据库,在Web 开发中占据了巨大的份额。
此次采用MySQL的主要原因有:MySQL 数据库和Python 语言以及Django 框架的兼容性很高,有许多开源的工具包可供开发者使用,方便整个项目的开发:MySQL 数据库支持多个客户机的同时访问,方便后期采集数据在不同用户之间的共享:MySQL 拥有优异的读写性能,数据表的数据存储量大,满足本次系统的要求。
通过上4.1 小节的分析可知,数控机床工作20 h的数据采集量就达数GB,也就意味着数据库单表的数据量大小随着时间线性增加。当需要对数据进行统计分析的时候,由于单表的数据量巨大,就会造成查询效率降低,影响整个系统的运行速度,从而给用户造成不好的体验。同时将读写操作放在同一个数据库进行,造成数据库负载压力过大,查询缓慢。基于此,本次的数据库设计在数据库内部对实时数据表采用水平分区的方式进行设计。数据表分区示意图如图6所示。
图6 数据库分区示意图
对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理的子表组成。通过设置分区列,并以时间范围为参照标准,数据按照每一个月为尺度进行分区。从而将单表的数据以趋于平均的方式存储在多个逻辑表中,从而逻辑上降低了单个表的数据存储大小,提高了MySQL的性能。
数据库分为主库和备用库,主库用于写操作,备用库用来读数据,读取数据不会引起数据库阻塞,采集实时数据存入库会阻塞大量的读。数据量大时,甚至会造成数据库崩溃,因此采用数据库读写分离的策略解决阻塞问题,备用库将主库的数据进行实时的复制,实现了数据库的备份操作,有效防止数据库意外崩溃。数据库读写分离流程如图7 所示。
通过图7 可以看出,当主库中的数据发生变化的时候,备用库的日志重新执行,使从数据库的数据与主数据库保持一致。
图7 读写分离流程图
首先归纳出需要进行存储的数据,正确划分各个实体之间的关系,确保实体之间的关系明确,无重复。根据分析,系统各实体之间的关系如图8所示。
图8 系统实体关系模型
通过对数据库结构的设计,可以极大地提高数据库的存储性能。根据系统的实体关系模型图,将采集的实时数据划分为4 部分:机床加工的实时过程数据、机床加工的程序信息、机床的报警信息和机床开关机信息。分别为其建立数据表,其中数据表用来存储机床加工的实时过程数据,数据表用来存储机床加工实时程序信息,数据表用来存储机床实时的报警信息,数据表用来存储机床开关机信息,部分数据表的结构如图9 所示。
图9 机床信息数据结构
本文研究了西门子828D 数控系统数据采集方法,设计了基于数据采集和数据存储的系统架构,分析OPC UA 服务器所提供的功能以及内部变量,通过OPC UA 结合Python 语言完成了对数控机床数据的采集。设计了MySQL 关系数据库,采用读写分析架构,实现了数控系统数据的有效存储。
测试结果表明,西门子828D 数控系统实现了对默认提供的系统变量进行数据采集,能够高效的存储数据,但和全面获取数控机床的数据比较还存在一定差距,后期还需要针对数控机床I/O 模块进行采集。