基于Android的数控系统可靠性数据采集系统设计
2019-01-30夏继强董彦威王帆
夏继强, 董彦威, 王帆
(北京航空航天大学 机械工程及自动化学院 ,北京 100191)
0 引 言
目前,我国已经成为世界上第一大机床产销国,但是由于高档数控机床可靠性方面的差距,导致国产高档数控系统和机床在市场竞争中处于劣势,由于缺乏批量的第三方数据,严重阻碍了对国产数控系统可靠性的研究[1]。目前我国对于数控系统数据采集的研究大多是通过有线的方式进行,主要是为了实现车间信息联网,这种方式要求在复杂的工厂环境中进行布线,安装本地服务器等一些列配套设备,方案实施复杂,成本高[2]。为了实现便捷采集,选用Android系统作为开发平台,运用4G移动网络进行数据发送,并通过数控系统基于TCP/IP协议的DNC接口采集数据[3]。这种嵌入式无线采集方案具有更多优势:单台采集终端自成一套系统,可自主完成数据采集和发送任务,配置灵活,适合复杂工况下进行数据采集;采用4G无线传输,降低了机床地理位置约束,可以实现分布式采集;将数据采集协议封装到.so动态库中,更安全,且移植方便[4-6]。
1 系统整体设计方案
系统主要由数控设备、嵌入式采集终端、服务器和数据库组成,采用C/S架构,结构如图1所示。采集终端直接与数控系统支持TCP/IP协议的DNC接口连接,机床通信API(Application Programming Interface)以C++语言实现,并封装到.so动态库中,数据采集软件通过Android JNI(Java Native Interface)接口调用.so库中本地代码完成数据采集,把采集到的数据存到本地SQLite数据库,同时把数据以JSON格式通过4G网络发送的远端服务器,服务器接收并校验通过后,保存到数据库。
图1 信息采集系统总体框架
嵌入式采集终端采用Freescale Cortex-A9四核处理器,内置Android 4.4原生系统,支持USB2.0、RS485、以太网等输入输出接口,搭载WiFi模块和华为4G全网通移动通信模块。
采集机床的数据种类主要包括:报警信息、报警时间、进给轴指令位置、实际位置、转速、负载电流、G代码模态、开机时间和运行时长等,能够全面反映机床的运行状态。
2 嵌入式终端数据采集软件开发
2.1 数据采集软件总体架构
图2 嵌入式采集终端软件架构
Android数据采集软件要求同步实现数据的采集和发送功能,由于4G信号强弱会有波动,存在数据采集和发送速率不匹配问题,为了能够连续、稳定地采集数据,不造成数据丢失,数据采集软件采用了多线程架构,如图2所示。数据采集软件有三个线程,包括一个主线程和两个子线程,并使用了SQLite数据库进行数据缓存。数据采集服务运行于Android UI主线程,由开机广播接收者启动,实现开机自启。数据采集线程把采集到的数据通过线程间通信发送给主线程的数据采集服务,数据采集服务对数据进行过滤、封装处理,并保存到本地SQLite数据库。与此同时数据发送线程不断地检测SQLite数据库中是否有数据需要发送,如果有,则把数据取出,直接通过4G网络发送给远端服务器。两个线程独立工作,互不干扰。
2.2 线程之间工作原理
数据采集软件主线程的数据采集服务,主要负责协调数据采集子线程和网络传输子线程工作,对整个软件起调度和管理的作用,Android 服务无需为用户提供操作界面,并且能够长时间在后台运行,占用系统资源少。数据采集服务开机自启,在服务中分别开启数据采集和发送子线程。
数据采集子线程通过JNI接口调用.so动态库中的通信API采集数控系统的运行数据,并把采集到的数据封装成数据对象,通过Handler异步消息传递给主线程服务。数据采集使用基于Socket的TCP/IP协议,机床作为服务端,采集终端作为客户端。主线程对数据进行分类、校验、过滤,保存到本地SQLite数据库。SQLite数据库是Android系统自带的一个微型数据库[7],数据库本身是安全的,程序中使用单例模式,保证了数据读/写安全。
使用SQLite数据库进行数据缓存,这样有效解决了数据的采集和发送速率不匹配的问题,特别是在网络状态不佳的情况下,依然能够保持数据采集线程不受干扰,SQLite数据库有3 GB容量,可容纳至少两周的数据量,保证采集到的数据不丢失,等网络状况恢复之后继续发送。
网络传输子线程的主要任务是把采集到的数据通过4G移动网络发送到远程服务器,使用HTTP(HyperText Transfer Protocol)超文本传输协议。网络传输子线程循环检测本地SQLite数据库中是否有可发送数据,如果有数据需要发送,将数据转化为Json格式发送给远程服务器,收到服务器的确认信息后,从SQLite数据库中删除该条数据[8-9]。
3 DNC接口驱动二次开发
3.1 Android NDK开发简介
Android是一款以Linux为核心的开源操作系统[10],Android操作系统的框架如图3所示。因为Android平台的底层是用C/C++写的核心库函数与Linux内核,所以在理论上可以运行C/C++代码[11]。
图3 Android系统架构
Android NDK是一套工具集合,允许开发者能够使用C/C++语言实现Android应用程序的功能,而在NDK开发过程使用JNI机制实现Java语言与C/C++语言中函数的相互调用。Android NDK将开发者编写的C/C++代码编译成能够被Linux内核加载执行的动态库(后缀名为so),开发者可以通过JNI接口在Java代码中调用这个动态库中的C/C++函数。这个库文件也被打包到最终的应用程序安装包中[12-13]。
3.2 Android NDK开发DNC接口驱动
虽然机床厂商提供了数据采集动态库,库中封装了与数控系统通信的数据,但是库里面的C/C++函数并不满足JNI规则,因此Android Javanative函数无法直接调用库中的API。此外,库里面的大多数函数在执行之后返回值指针,而在Android中是没有指针概念的,自然也无法读取指针类型数据的具体内容。
图4 DNC动态库二次开发方案
为了解决以上两个问题,决定在原有动态库的基础上进行二次开发。在原动态库中函数不满足JNI机制的情况下,Android程序无法直接调用,但是C/C++函数调用原动态库的函数时却不必遵守JNI机制,针对这一特点本文提出了如图4所示的解决方案:开发一个符合JNI规则的新动态库,通过新库中的本地代码调用原动态库中的接口函数,由于新库中的函数符合JNI机制,能够和Javanative函数建立一对一映射关系,这样就能实现在Java函数层间接调用原动态库中接口函数的目的,这也是能够实现机床数据采集的关键。
开发新动态库,首先要建一个Java类来封装用于与机床通信的函数,这些函数必须用“native”关键字修饰,表明该函数是通过本地代码实现的。代码格式下所示,只需要声明函数参数类型、返回值类型,没有函数体。
public staticnativeint GSKRM_Initialization(String addr,int port);
然后,在C文件中,用C/C++代码实现Java代码中声明的native函数,在函数体中调用原动态库接口函数,代码格式如下所示,函数名前必须有关键字“JNIEXPORT”和“JNICALL”,这是JNI机制规定的格式,表示该函数与Java中的native函数有对应关系。函数前两个是默认参数,“JNIEnv”表示JNI运行环境指针,通过该指针可以调用JNI工具函数,“jobject”表示调用该函数的java对象,通过该参数可以使用Java反射机制在C/C++代码中调用Java对象,其他参数为Javanative函数原有参数。
JNIEXPORTjintJNICALL//函数C++实现
Java__GSKNativeApi_GSKRM_1Initialization
(JNIEnv * env,
jobject obj,
jstring ipaddr, jint port){
//函数体,调用原动态库中接口函数
}
当两个层函数完成之后,需要把这两层函数建立一对一的映射关系,这样调用Java类的native函数才会映射到本地代码层函数。这种使用新动态库调用原动态库的方案不仅可以解决无法直接调用的难题,还能够实现数据格式转化,JNI机制提供了完整数据格式转化方法。
4 系统验证
使用Tomcat搭建数据服务器,数据保存到Mysql数据库,并为服务器配备了公网IP地址,数据可以通过4G直接发送到数据服务器。按照图1所示的整体技术方案部署好整个系统,开始验证系统的功能,系统验证结果如图5所示。
图5为注册信息表内容,注册信息主要记录机床的特征信息,其中:“id”表示数控系统ID号;“tp”表示数控系统型号;“ver”表示版本号;“time”表示时间。
图6为运行信息表内容,运行信息主要记录机床加工过程中各轴的参数信息以及G代码执行信息等,主要反映机床的运行状态,其中:“cas”表示主轴实际转速;“ccs”表示主轴指令转速;“aload”表示主轴负载电流;“aspdx”表示进给轴实际转速;“apstx”表示进给轴实际位置;“cpstx”表示进给轴指令位置;“loadx”表示进给轴负载电流。信息采集系统会周期性采集数控系统的运行信息。
图5 注册信息表数据内容
图6 运行信息表数据内容
通过对信息采集系统进行测试,验证了整个信息采集系统的功能,数据采集稳定,网络传输适应性较高,信息采集系统满足了设计之初提出的要求。
5 结束语
基于Android嵌入式平台采集系统的设计使得对数控系统进行数据采集更加便捷、高效,使用了Android软件开发的多项技术,软件功能更强,开发效率更高,Android NDK展示了Android 平台强大的兼容性。利用4G网络高带宽、覆盖广的优势,数据传输更加便捷,实现了数控系统可靠性数据的多地域、分布式采集功能。