开放式上位数控软件架构及其组件间解耦问题研究*
2016-08-31李志明李卫超吴荣华王琼琼
李志明 李卫超 田 梦 吴荣华 王琼琼
(①燕山大学信息科学与工程学院(软件学院),河北 秦皇岛 066004 ②河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004 ③北京机床所精密机电有限公司,北京 100102)
开放式上位数控软件架构及其组件间解耦问题研究*
李志明①②李卫超①②田梦①②吴荣华③王琼琼①②
(①燕山大学信息科学与工程学院(软件学院),河北 秦皇岛 066004②河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004③北京机床所精密机电有限公司,北京 100102)
在分析上位数控软件功能特点的基础上,考虑开放式数控系统中关键部件更换时软件适应性,提出一种分层的开放式上位数控系统软件架构,并简述了各层及模块之间的交互关系;将依赖注入机制应用于开放式上位数控软件各组件间的解耦问题中,以后置处理模块内部、以及后置处理模块与代码仿真及干涉检测模块间的解耦问题为例,分别说明了构造子注入、设值注入的使用方法。
开放式数控系统;软件架构;依赖注入;解耦
数控系统在诸多高端装备中均处于核心地位,直接影响着装备性能的优劣。专用数控系统的封闭性致使无法将最新的软硬件技术成果融入数控系统之中,严重地阻碍了数控技术的发展,使之难以适应互联网+、中国制造2025等新战略要求。因此,开放式数控系统逐渐成为了数控技术发展的主流,其应用也日益广泛。
在常见的3种开放式数控系统结构[1]中,“IPC+开放式运动控制器”方式,凭借其自身硬软件平台良好的开放性及便捷性,应用较多。在该方式中,开放式数控系统软件具有统领性作用,且其复杂程度较高,例如各坐标轴运动状态、机床状态等信息显示、NC代码编辑与下载,运动轨迹预览及仿真、参数设置、外围设备控制与检测等,均需通过数控系统的UI界面加以体现;此外,还有许多用户不可见的重要功能模块,如NC代码语法检查、机床运动坐标变化、路径优化及NC代码生成等模块。
目前,我国在开放式数控系统软件架构方面的研究开展的较少,缺乏该方面软件架构实施的资料和规范,尚未形成完善的、统一的架构体系[2]。此外,在开放式数控系统软件研发过程中,某项功能的实现往往需要多个模块协作完成;模块与模块之间的耦合难以避免,而过度的耦合则会严重影响开放式数控系统软件的扩展性、移植性、维护性。
本文以项目组研发的开放式精密激光切割数控系统平台为基础,对开放式上位数控系统软件架构问题进行研究,并将依赖注入原理(又称控制反转)运用到组件间的解耦问题之中,以期建立一个模块化、可重构、可扩展的开放式数控系统平台。
1 基于UMAC的开放式数控系统硬件架构
本文中开放式数控系统硬件架构以IPC和UMAC为基础构建,其硬件结构示意如图1所示。在该架构中,用户可充分利用IPC的软硬件资源,融合最新的信息技术及个性化需求,对运行于IPC中的上位数控软件进行自主开发。上位数控软件的作用主要是实现实时性要求不是很高的人机交互功能;UMAC 运动控制器一般由电源模块、通用 CPU 板、轴扩展卡、I/O 卡和具有特定功能的附件板卡等构成,是该架构的核心所在,主要实现实时性要求很高的NC代码解释、插补运算、运动控制、软PLC程序执行等功能。该硬件架构兼具灵活性和稳定性,开发效率高,可满足专用数控系统难以满足的个性化功能需求。
从图1中可以发现,上位数控软件是重要的人机接口之一,对整个数控系统具有统领性作用;其稳定性、可靠性对整套数控装备的性能具有重要的影响。软件架构决定了软件的品质,在软件开发中占有重要地位。因此,在开放式数控系统方兴未艾之时,对上位数控软件的架构问题展开研究显得尤为必要。
2 开放式数控系统软件架构
开放式数控系统软件由IPC中的上位数控软件和UMAC中的下位软PLC程序两部分组成,是开放式数控装备的灵魂所在。UMAC中的软PLC程序的架构问题详见文献[3];IPC中的上位数控软件架构及组件间解耦问题是本文的研究重点。
2.1上位数控软件功能
软件的开放性是开放式数控系统的特点之一,也就是说,开放式数控系统允许用户开发常规的、个性化的数控功能以及软件系统集成。就常规功能而言,可分为用户可见的人机交互功能和用户不可见的数据及业务处理功能;本文分别称之为显性功能和隐性功能。
常见的显性功能有CNC各类状态显示、参数设置、工艺档案、NC代码仿真、MDI等功能;常见的隐性功能有后置处理、NC代码语法检查、故障诊断与报警、连锁控制逻辑、与运动控制器及外设交互等。为了配合开放式数控系统的硬件开放性,增强上位数控软件的生命力,还应从架构角度着重考虑软件对核心设备及部件更换的适应能力,如运动控制器、激光器的更换情况。
由此可见,开放式数控系统的功能模块繁多,且模块间依赖关系复杂。因此,要开发一套稳定可靠、性能良好,适应性及可扩展性强,易维护的上位数控软件,架构问题则应是要考虑的首要问题。
2.2上位数控软件架构研究
常用的软件架构类型有MVC架构、分层架构[4]、微内核架构[5]、元模型架构[6]和管道-过滤器架构等。
在上位数控软件架构类型选取时,从用户数量、界面复杂程度、人机交互频度、业务逻辑复杂度以及系统的扩展性、移植性和互换性等角度考虑,最终选取分层架构模式。分层架构中各层之间通过定义好的接口进行通信。上层仅使用下层提供的服务而无需知道下层的细节,这使得在接口不变的前提下可以对某一层或者某层中的部分功能进行无损替换,从而降低系统间的依赖程度并在较大程度上保证了系统的可扩展性。分层架构将原本复杂的系统分开,有利于分化系统的复杂性,使开发人员可以专注于某一层的细节。
本文通过对上位数控系统整个流程进行研究,并综合考虑开放程度和集成代价,得到“系统—模块—组件”的组成结构,将开放式上位数控系统软件分为人机交互层、业务逻辑层、通讯协议层和数据服务层。上位数控软件架构分层如图2所示。
图2中,人机交互层主要用于用户操作指令与数控系统状态和参数之间的交互,如坐标及速度显示、机床状态显示、参数设置、工艺档案管理等。
业务逻辑层负责对相关数据进行数控业务知识的处理,是对数控领域内各对象的抽象,由后置处理、故障诊断、代码仿真及检测、权限管理等模块组成,具有承上启下的作用,是整个上位数控软件的核心部分。
通讯协议层负责上位数控软件与UMAC、外设、以及数据库之间的通讯工作,由运动控制器通讯协议包、网络通讯协议和数据库操作封装等组成。通讯协议层对上层服务接口的定义,应考虑不同主流厂商的设备通讯协议,尽量定义一致的接口,从而增强设备更换时的系统适应性,如开放式运动控制器的更换、激光加工系统中激光器的更换等。
数据服务层的主要功能是实现数据存储,如工艺档案、材料档案、机床特性、系统故障诊断表等。
图2中所示的开放式上位数控系统各层及模块间的交互关系如图3所示。
通常,分层架构与依赖注入机制一起使用,实现层与层之间的“可替换”式设计。在此基础上,本文还将依赖注入应用到了组件间的解耦之中,从而在很大程度上降低了上位数控软件中各组件之间的耦合度。
3 组件间的解耦设计
耦合度是指模块或组件间的依赖关系,包括控制关系、调用关系、数据传递关系。对于绝大部分软件来说,在软件设计阶段便确定了各模块的控制关系、调用关系和数据传递关系;在编码阶段中,控制关系和数据传递关系造成的耦合无法进一步优化,而调用关系造成的耦合则可以通过使用合适的设计模式得到很大程度的改善。
在常规的软件开发过程中,组件的实例化通常在其他相关组件中完成。这种依赖关系造成的耦合降低了组件的可移植性和可替换性。针对这个问题,本文将依赖注入设计模式应用于上位数控软件的各组件的设计之中,从而有效降低了组件间的耦合度。
3.1依赖注入模式简介
依赖注入[7]有3种模式:接口注入、设值注入和构造子注入;其中设值注入和构造子注入是目前主流的实现模式。设值注入方式简洁、便利,适宜在组件依赖关系较为复杂时使用。构造子注入在构造组件时完成依赖关系的设定,能让组件在被创建后就处于相对稳定的状态,适宜在组件的依赖关系相对简单时使用。在实际开发中,以构造子注入为主,设值注入为辅,会达到较好的效果[8]。
Castle是基于.NET平台的开源项目,囊括了ORM、IoC容器、MVC框架、AOP等,为开发人员构建应用程序提供了强大的支持。Windsor Container是Castle的IoC容器,可以实现对组件生命周期、组件间依赖关系的管理。
3.2应用构造子注入解耦示例
后置处理模块根据当前机床特性信息、系统特性信息和刀位文件信息生成正确的NC代码。图4为后置处理模块最初的依赖关系图,图5为运用依赖注入原理将依赖关系提取后的依赖关系。
机床特性信息组件、系统特性信息组件和刀位文件信息组件在容器中完成实例化,之后由容器将实例化后的对象注入到后置处理组件中。后置处理组件对于机床特性信息、系统特性信息和刀位文件信息的依赖是固定不变的,适合使用构造子注入的注入方式,这样使得组件被创建后就具备了正确运行必要的参数,使组件处于相对稳定的状态。
后置处理组件中构造子注入代码示例如下:
//刀位文件信息
private IDLDataInfo iDLDataInfo;
//机床特性信息
private IMachineToolInfo iMachineToolInfo;
//系统特性信息
private ISystemInfo iSystemInfo;
//构造函数,构建依赖关系
public PostProcessor(IDLDataInfo dlDataInfo,IMachineToolInfo machineToolInfo,ISystemInfo systemInfo)
{
this.iDLDataInfo = dlDataInfo;
this.iMachineToolInfo = machineToolInfo;
this.iSystemInfo = systemInfo;
}
3.3应用设值注入解耦示例
代码仿真与干涉检测模块负责对后置处理模块产生的NC代码进行仿真和干涉检测,检测通过后的NC代码才能在机床上实际运行。此时,代码仿真与干涉检测模块依赖于后置处理模块,图6为二者最初的依赖关系,图7为应用依赖注入原理将依赖关系提取后,后置处理组件和代码仿真与干涉检测组件的依赖关系。
后置处理功能组件在容器中进行实例化,之后该实例由容器注入到代码仿真与干涉检测组件中,由于代码的仿真及干涉检测不但支持对后置处理功能所生成NC代码的检测,还支持用户自己编写NC代码的检测,并且对于程序中使用的某些第三方类库而言,可能要求组件必须提供一个默认的构造函数,此时构造子注入模式就体现出其局限性[9],此时合适的依赖注入方式应为设值注入。
代码仿真及干涉检测组件中设值注入代码示例如下:
//后置处理
private IPostProcessor _Post;
//设值注入
public IPostProcessor Post
{
get { return this. _Post; }
set { this. _Post = value; }
}
容器中部分代码示例如下:
//建立容器
IWindsorContainercontainer=new indsorContainer(newXmlInterpreter(("../../BasicUsage.XML") );
//加入组件
container.AddComponent("machinetoolinfo",typeof(IMachineToolInfo),typeof(MachineToolInfo));
container.AddComponent("systeminfo",typeof(ISystemInfo),typeof(SystemInfo));
container.AddComponent("dldatainfo",typeof(IDLDataInfo),typeof(DLDataInfo));
container.AddComponent( "post",typeof(IPostProcessor),typeof(PostProcessor));
container.AddComponent( "ncsimulation",typeof(ICodeSimulation),typeof(CodeSimulation) );
//获取组件
PostProcessor post=(PostProcessor)container["post"];
CodeSimulation code=(CodeSimulation)container["ncsimulation"];
code.Post = post;
//使用组件
string ncCode=post.OutPutNCCode();
文中采用的Windsor container容器可以自动管理组件间的依赖关系,无需用户去编写XML配置文件或者通过Attribute来指定容器之间的依赖关系[8],当某个功能模块的接口有新的实现时只需要修改容器中相应代码即可。这种设计方法降低了相关组件间的耦合度,提高了功能模块的复用性,便于功能模块的替换及扩展,使系统的设计结构更加清晰。
4 结语
依托IPC+UMAC的开放式数控系统架构中软件开放性的特点,在分析了上位数控软件功能特点及考虑了硬件设备更换时的系统适应性的基础上,提出了一种分层的上位数控系统软件架构,并阐述了各层及模块之间的交互关系。之后,将依赖注入机制应用于开放式上位数控软件各组件间的解耦问题中,结合后置处理模块内部、以及后置处理模块和代码仿真及干涉检测模块间的解耦问题,分别示例了构造子注入、设值注入的应用。依赖注入机制的使用降低了上位数控软件各组件间的耦合度,提高了软件各模块的复用性。在开放式数控系统应用兴起之初,本文对构建模块化、可重构、可扩展的开放式上位数控软件具有一定的参考价值。
[1]Zhou L, Yuan J L, Gao P, et al. A new architecture of open CNC system based on compiling mode [J]. The International Journal of Advanced Manufacturing Technology,2014,73:1597-1603.
[2]杨梅. 基于DSP的自动焊锡机开放式控制系统的开发[D].广州:华南理工大学,2013:3-4.
[3]李志明,李卫超,吴荣华,等. 开放式精密激光切割数控系统软PLC程序设计方法[J].制造技术与机床,2015(4):97-101.
[4]福勒.企业应用架构模式 [M].王怀民,周斌,译.北京:机械工业出版社,2010:12-17.
[5]孙永清,林九川,钱伟. Hyper-V微内核架构安全性分析[J]. 武汉理工大学学报,2010,32(15):130-132.
[6]闫喜强,李彦,李文强, 等.元模型的复杂产品多学科信息建模方法[J]. 计算机辅助设计与图形学学报,2013,25(10):1540-1548.
[7]Kamil Jezek, Lukas Holy, Premek Brada. Dependency injection refined by extra-functional properties [J]. 2012 IEEE Symposium on Visual Languages and Human-Centric Computing,2012:255-256.
[8]马立林. 基于Castle面向用户的实验室管理系统的设计与实现[D].南昌:南昌大学,2010:18-25.
[9]闫轩. 基于AOP/IOC技术的电信行业统一接口平台系统的设计与实现[D].北京:中国科学院大学,2013:17-18.
(编辑谭弘颖)
如果您想发表对本文的看法,请将文章编号填入读者意见调查表中的相应位置。
Research on the upper computer software architecture and its decoupling problem of components
LI Zhiming①②, LI Weichao①②,TIAN Meng①②, WU Ronghua③, WANG Qiongqiong①②
(①School of Information Science and Engineering (Software), Yanshan University, Qinhuangdao 066004, CHN;②The Key Laboratory for Computer Virtual Technology and System Integration of Hebei Province,Qinhuangdao 066004, CHN;③BMTRI Precision Mechatronics Co.,Ltd., Beijing 100102, CHN)
On the basis of analyzing the functions of the upper computer software, and the software adaptability when the key parts in the open CNC system replaced is considered, a layered software architecture of upper computer software is proposed, and the relationships among layers and modules are explained. The dependency injection mechanism is applied to the decoupling problem among the components of upper computer software. Taking the decoupling problem in post-processing module and the decoupling problem between post-processing module and code simulation and interference detection module for example, the application of the constructor injection and the setter injection are described respectively.
open CNC system; software architecture; dependency injection; decoupling
TP311. 1
B
李志明,男,1978年生,博士,副教授,主要从事数控及制造装备信息化、计算机测控技术、软件工程方面的研究工作,已发表学术论文近20篇,承担、参与多项省部级科研项目。
2015-09-14)
160221
*2012年科技部专项阀芯精密激光切割机成套工艺与装备研发(JK12-0301);2013年河北省科技支撑计划项目开放式精密激光切割数控系统软件架构研究(13211828)