开放式上位数控软件架构及其组件间解耦问题研究
2018-3-1 来源:燕山大学 河北省计算机 北京机床所 作者:李志明 李卫超 田梦 吴荣华 王琼琼
摘要:在分析上位数控软件功能特点的基础上。考虑开放式数控系统中关键部件更换时软件适应性,提出一种分层的开放式上位数控系统软件架构,并简述了各层及模块之间的交互关系;将依赖注入机制应用于开放式上位数控软件各组件间的解耦问题中,以后置处理模块内部、以及后置处理模块与代码仿真及干涉检测模块间的解耦问题为例。分别说明了构造子注入、设值注入的使用方法。
关键词:开放式数控系统;软件架构;依赖注入;解耦
数控系统在诸多高端装备中均处于核心地位,直接影响着装备性能的优劣。专用数控系统的封闭性致使无法将最新的软硬件技术成果融人数控系统之中,严重地阻碍了数控技术的发展,使之难以适应互联网+、中国制造2025等新战略要求。因此,开放式数控系统逐渐成为了数控技术发展的主流,其应用也日益广泛。
在常见的3种开放式数控系统结构中,“IPC+开放式运动控制器”方式,凭借其自身硬软件平台良好的开放性及便捷性,应用较多。在该方式中,开放式数控系统软件具有统领性作用,且其复杂程度较高,例如各坐标轴运动状态、机床状态等信息显示、NC代码编辑与下载,运动轨迹预览及仿真、参数设置、外围设备控制与检测等,均需通过数控系统的UI界面加以体现;此外,还有许多用户不可见的重要功能模块,如NC代码语法检查、机床运动坐标变化、路径优化及NC代码生成等模块。
目前,我国在开放式数控系统软件架构方面的研究开展的较少,缺乏该方面软件架构实施的资料和规范,尚未形成完善的、统一的架构体系心J。此外,在开放式数控系统软件研发过程中,某项功能的实现往往需要多个模块协作完成;模块与模块之间的耦合难以避免,而过度的耦合则会严重影响开放式数控系统软件的扩展性、移植性、维护性。
本文以项目组研发的开放式精密激光切割数控系统平台为基础,对开放式上位数控系统软件架构问题进行研究,并将依赖注入原理(又称控制反转)运用到组件间的解耦问题之中,以期建立一个模块化、可重构、可扩展的开放式数控系统平台。
1 、基于UMAC的开放式数控系统硬件架构
本文中开放式数控系统硬件架构以IPC和UMAC为基础构建,其硬件结构示意如图l所示。在该架构中,用户可充分利用IPC的软硬件资源,融合最新的信息技术及个性化需求,对运行于IPC中的上位数控软件进行自主开发。上位数控软件的作用主要是实现实时性要求不是很高的人机交互功能;UMAC运动控制器一般由电源模块、通用CPU板、轴扩展卡、I/O卡和具有特定功能的附件板卡等构成,是该架构的核心所在,主要实现实时性要求很高的NC代码解释、插补运算、运动控制、软PLC程序执行等功能。该硬件架构兼具灵活性和稳定性,开发效率高,可满足专用数控系统难以满足的个性化功能需求。

图1开放式敦控系统硬件平台示意
从图l中可以发现,上位数控软件是重要的人机接口之一,对整个数控系统具有统领性作用;其稳定性、可靠性对整套数控装备的性能具有重要的影响。软件架构决定了软件的品质,在软件开发中占有重要地位。因此,在开放式数控系统方兴未艾之时,对上位数控软件的架构问题展开研究显得尤为必要。
2、开放式数控系统软件架构
开放式数控系统软件由IPC中的上位数控软件和UMAC中的下位软PLC程序两部分组成,是开放式数控装备的灵魂所在。UMAC中的软PLC程序的架构问题详见文献[3];IPC中的上位数控软件架构及组件间解耦问题是本文的研究重点。
2.1上位数控软件功能
软件的开放性是开放式数控系统的特点之一,也就是说,开放式数控系统允许用户开发常规的、个性化的数控功能以及软件系统集成。就常规功能而言,可分为用户可见的人机交互功能和用户不可见的数据及业务处理功能;本文分别称之为显性功能和隐性功能。常见的显性功能有CNC各类状态显示、参数设置、工艺档案、NC代码仿真、MDI等功能;常见的隐性功能有后置处理、NC代码语法检查、故障诊断与报警、连锁控制逻辑、与运动控制器及外设交互等。为了配合开放式数控系统的硬件开放性,增强上位数控软件的生命力,还应从架构角度着重考虑软件对核心设备及部件更换的适应能力,如运动控制器、激光器的更换情况。
由此可见,开放式数控系统的功能模块繁多,且模块间依赖关系复杂。因此,要开发一套稳定可靠、性能良好,适应性及可扩展性强,易维护的上位数控软件,架构问题则应是要考虑的首要问题。
2.2上位数控软件架构研究
常用的软件架构类型有MVC架构、分层架构H J、微内核架构”J、元模型架构∞o和管道一过滤器架构等。
在上位数控软件架构类型选取时,从用户数量、界面复杂程度、人机交互频度、业务逻辑复杂度以及系统的扩展性、移植性和互换性等角度考虑,最终选取分层架构模式。分层架构中各层之间通过定义好的接口进行通信。上层仅使用下层提供的服务而无需知道下层的细节,这使得在接口不变的前提下可以对某一层或者某层中的部分功能进行无损替换,从而降低系统间的依赖程度并在较大程度上保证了系统的可扩展性。分层架构将原本复杂的系统分开,有利于分化系统的复杂性,使开发人员可以专注于某一层的细节。
本文通过对上位数控系统整个流程进行研究,并综合考虑开放程度和集成代价,得到“系统一模块一组件”的组成结构,将开放式上位数控系统软件分为人机交互层、业务逻辑层、通讯协议层和数据服务层。上位数控软件架构分层如图2所示。

图2开放式致控系统上位机软件架构
图2中,人机交互层主要用于用户操作指令与数控系统状态和参数之间的交互,如坐标及速度显示、机床状态显示、参数设置、工艺档案管理等。
业务逻辑层负责对相关数据进行数控业务知识的处理,是对数控领域内各对象的抽象,由后置处理、故障诊断、代码仿真及检测、权限管理等模块组成,具有承上启下的作用,是整个上位数控软件的核心部分。
通讯协议层负责上位数控软件与UMAC、外设、以及数据库之间的通讯工作,由运动控制器通讯协议包、网络通讯协议和数据库操作封装等组成。通讯协议层对上层服务接口的定义,应考虑不同主流厂商的设备通讯协议,尽量定义一致的接口,从而增强设备更换时的系统适应性,如开放式运动控制器的更换、激光加工系统中激光器的更换等。
数据服务层的主要功能是实现数据存储,如工艺档案、材料档案、机床特性、系统故障诊断表等。图2中所示的开放式上位数控系统各层及模块间的交互关系如图3所示。

图3开放式数控系统各层及模块问的交互关系
通常,分层架构与依赖注入机制一起使用,实现层与层之间的“可替换”式设计。在此基础上,本文还将依赖注入应用到了组件间的解耦之中,从而在很大程度上降低了上位数控软件中各组件之间的耦合度。
3、组件间的解耦设计
耦合度是指模块或组件间的依赖关系,包括控制关系、调用关系、数据传递关系。对于绝大部分软件来说,在软件设计阶段便确定了各模块的控制关系、调用关系和数据传递关系;在编码阶段中,控制关系和数据传递关系造成的耦合无法进一步优化,而调用关系造成的耦合则可以通过使用合适的设计模式得到很大程度的改善。
在常规的软件开发过程中,组件的实例化通常在其他相关组件中完成。这种依赖关系造成的耦合降低了组件的可移植性和可替换性。针对这个问题,本文将依赖注入设计模式应用于上位数控软件的各组件的设计之中,从而有效降低了组件间的耦合度。
3.1依赖注入模式简介
依赖注入[71有3种模式:接口注人、设值注入和构造子注入;其中设值注入和构造子注入是目前主流的实现模式。设值注入方式简洁、便利,适宜在组件依赖关系较为复杂时使用。构造子注入在构造组件时完成依赖关系的设定,能让组件在被创建后就处于相对稳定的状态,适宜在组件的依赖关系相对简单时使用。在实际开发中,以构造子注人为主,设值注入为辅,会达到较好的效果坤J。
Castle是基于.NET平台的开源项目,囊括了ORM、IoC容器、MVC框架、AOP等,为开发人员构建应用程序提供了强大的支持。Windsor Container是Castle的IoC容器,可以实现对组件生命周期、组件间依赖关系的管理。
3.2应用构造子注入解耦示例
后置处理模块根据当前机床特性信息、系统特性信息和刀位文件信息生成正确的NC代码。图4为后置处理模块最初的依赖关系图,图5为运用依赖注入原理将依赖关系提取后的依赖关系。

图4后置处理的原始依慧关系

圈5后置处理应用构造子注入后的依藏关系
机床特性信息组件、系统特性信息组件和刀位文件信息组件在容器中完成实例化,之后由容器将实例化后的对象注入到后置处理组件中。后置处理组件对于机床特性信息、系统特性信息和刀位文件信息的依赖是固定不变的,适合使用构造子注入的注入方式,这样使得组件被创建后就具备了正确运行必要的参数,使组件处于相对稳定的状态。
后置处理组件中构造子注人代码示例如下:

3.3应用设值注入解耦示例
代码仿真与干涉检测模块负责对后置处理模块产生的NC代码进行仿真和干涉检测,检测通过后的NC代码才能在机床上实际运行。此时,代码仿真与干涉检测模块依赖于后置处理模块,图6为二者最初的依赖关系,图7为应用依赖注入原理将依赖关系提取后,后置处理组件和代码仿真与干涉检测组件的依赖关系。后置处理功能组件在容器中进行实例化,之后该实例由容器注入到代码仿真与干涉检测组件中,由于代码的仿真及干涉检测不但支持对后置处理功能所生成NC代码的检测,还支持用户自己编写NC代码的检测,并且对于程序中使用的某些第三方类库而言,可能要求组件必须提供一个默认的构造函数,此时构造子注入模式就体现出其局限性‘9|,此时合适的依赖注入方式应为设值注人。


代码仿真及干涉检测组件中设值注入代码示例如下:


文中采用的Windsor container容器可以自动管理组件间的依赖关系,无需用户去编写XML配置文件或者通过Attribute来指定容器之间的依赖关系旧o,当某个功能模块的接口有新的实现时只需要修改容器中相应代码即可。这种设计方法降低了相关组件间的耦合度,提高了功能模块的复用性,便于功能模块的替换及扩展,使系统的设计结构更加清晰。
4、结语
依托IPC+UMAC的开放式数控系统架构中软件开放性的特点,在分析了上位数控软件功能特点及考虑了硬件设备更换时的系统适应性的基础上,提出了一种分层的上位数控系统软件架构,并阐述了各层及模块之间的交互关系。之后,将依赖注入机制应用于开放式上位数控软件各组件问的解耦问题中,结合后置处理模块内部、以及后置处理模块和代码仿真及干涉检测模块间的解耦问题,分别示例了构造子注入、设值注入的应用。依赖注入机制的使用降低了上位数控软件各组件间的耦合度,提高了软件各模块的复用性。在开放式数控系统应用兴起之初,本文对构建模块化、可重构、可扩展的开放式上位数控软件具有一定的参考价值。
投稿箱:
如果您有机床行业、企业相关新闻稿件发表,或进行资讯合作,欢迎联系本网编辑部, 邮箱:skjcsc@vip.sina.com
如果您有机床行业、企业相关新闻稿件发表,或进行资讯合作,欢迎联系本网编辑部, 邮箱:skjcsc@vip.sina.com
更多相关信息