1总体方案手套机样机
如前所述,不同手套机机型上,同一功能模块可能在机械结构与控制电路上并不相同,这样针对不同手套机需要开发不同的控制系统。为此本研究针对市场已有机械结构,将手套机控制系统的硬件、软件模块化,同时引入Linux操作系统,从而实现快速组合的通用型控制系统开发要求。嵌入式Linux一般由引导程序、Linux内核、文件系统和应用程序组成[5]。基于Linux的手套机嵌入式控制系统,应对Linux内核、文件系统和应用程序进行相应调整。在Linux内核中,加入了6个模块对应的驱动。在文件系统中,编写启动脚/etc/init.d/rcS,通过菜单选择,完成对手套机设备的启动检测。最后加载应用程序,即手套机主程序。对每个模块,将采用Linux驱动经典结构:驱动—总线—设备。驱动、设备分别向总线注册,而且驱动(或设备)注册时会调用相应设备(或驱动)注册,其实质为总线依据设备结构体成员name,驱动结构体成员id_table是否匹配来决定是否调用驱动结构体成员probe来完成注册[6]。将手套机模块化后—即在底层对驱动和设备进行分离,对手套机启动脚本编写。对于各种手套机控制结构,仅需修改或添加设备文件,而不会对应用层主程序产生影响。
2手套机模块化驱动程序
手套机模块化驱动程序是模块化手套机控制系统设计中重要组成部分。正是因为同种模块的多种设备实现了同样控制动作,使得基于Linux手套机控制系统每个模块驱动文件与设备的分离,不仅驱动文件对现有多种设备文件具有通用性,而且对将来产生的新设备起到了兼容,同时底层驱动与应用层主控程序分离,减少了软件上的修改,也是手套机启动脚本可以对设备进行选择的基础。Linux驱动一般分为3类:字符设备、块设备、网络设备[7-8]。手套机控制系统中系统环境的网络设备网卡(DM9000AEP),块设备nand(K9F2GO8)芯片厂商出厂时已有驱动,仅做移植修改就可,无需编写。对于6个模块,均为字符型设备,独立编写。以驱动对应设备多寡为标准,现将6个模块分2部分,手机套各模块与抽象后Linux驱动设备对应关系如表1所示。2.1多设备模块该部分驱动与设备关系是一对二,故可采用plat-form总线。platform总线是Linux驱动经典结构的代表,即驱动—总线—设备模型。简而言之,该结构可将同类型设备的共性,即实现功能编写于驱动文件,而将各设备的向异性,及硬件属性,编写于设备文件中。platform总线可依据设备platform_device成员name,驱动platform_drive成员id_table是否匹配来决定是否调用驱动platform_drive成员probe来完成注册[9]。2.2.1设备文件的注册在platform设备文件xxx.c中(xxx即为表中Linux设备名一与Linux设备名二),platform通过设备注册函数platform_device_register()完成platform_de-vice数据结构xxx_dev,resource数据结构xxx_resource[]注册,其中主要成员为:start=Physical_address,end=SIZ:依手套机控制电路原理图进行设置,主要是电磁铁,电磁阀物理的地址,以及微动开关的中断号设置。name="xxx":设备与驱动匹配标志,其将决定调用哪个驱动。platform_data=is_xxx:同模块不同设备区分标志,为便于驱动的编写。对于虚拟的设备needle_machine_dev.c(即单色纱线导纱机构),仅赋值name,platform_data完成格式统一。2.2.2驱动文件的注册在platform驱动文yyy.c中(yyy即为表中linux驱动名)中,其核心为完成数组yyy__table[],函数yyy_probe()注册。以纱线模块为例的分析,数组yyy__ta-ble[]原型为:staticstructplatform_device_idyyy_table[]={{.name="xxx",},{},};是驱动所支持设备id数组,对于纱线模块,其驱动文件yarn_drv.c将含有staticstructplatform_device_idneedle_drv_table[]={{.name="needle_electromagnet_dev",},{.name="needle_machine_dev",},{},};从而匹配yarn_electromagnet_dev.c,yarn_machine_dev.c设备文件中platform_device成员name。yarn_drv.c驱动文件中probe()将用platform_get_resource()获得所注册设备硬件信息(即yarn_electro-magnet_dev_resource[],yarn_machine_dev_resource[]之一),而在file_operations成员ioctl()函数将依据probe()获得的硬件情况,编写统一控制的函数。从而yarn_drv.c驱动使不同纱线模块设备的实现了相同的功能。ioctl设备控制函数原型为:staticintioctl(structinode*inodep,structfile*filp,un-signed,intcmd,unsignedlongarg)设备文件注册中platform_data=is_xxx在ioctl()函数中区分了不同设备,手套机驱动中Ioctrl()实现的命令1、命令2如表2、表3所示。2.2单设备模块对于这3个模块,由于驱动与设备一一对应(如表4所示),可采用传统字符驱动编写流程[10],单个文件将设备和驱动一次性注册,带来程序的简洁性,但并不合适手套机的模块化的思想,例:信号检测模块中接近开关采用新的结构,有可能导致信号检测模块的软件部分改变,以及手套机主程序的改变,即导致手套机整个系统的改变。故考虑对新结构的兼容性,依然采用如第一部分所述设备—总线—驱动模型。综上所述,6个模块均采用Linux驱动经典结构:驱动—总线—设备[11],以达到同一个驱动实现不同设备的操作,亦可对将来新设备结构兼容,从而实现手套机控制系统的模块化。2.3手套机选针电磁铁驱动实现对于电磁铁选针结构的手套机,因其多达92路的选针电磁铁,故而其总的功耗需求量比较大。针对这种情况,对相关的源代码进行编写时,应对选针电磁铁的吸合时间进行合理的控制,以达到降低功耗的目的,同时也延长选针电磁铁的使用寿命。选针电磁铁的流程图如图3所示。
3手套机设备检测启动程序
正是由于手套机控制系统的的模块化,使得手套机设备检测启动程序可以在人工干预的情况下,进行对设备文件进行选择性的加载,使手套机控制系统具有智能化的特点。Linux内核启动时,如不添加/etc/inittab文件,默认情况下将会分析/etc/init.d/rcS,其中rcS为shell文件,在该文件中可以完成对Linux应用层的初始化[12],手套机硬件自检测启动程序流程如图4所示。除系统环境所移植的驱动采用固态加载(即与内核统一编译,Linux内启动,其将自动加载)外,6个模块均采用动态加载方式(命令行模式insmodxxx.ko),分3步加载。3.1单设备文件加载信号检测模块、显示界面模块、按键模块的设备文件及驱动文件加载,其中显示界面模块、按键模块将参与第二部分设备文件选。3.2多设备文件加载要控制人员根据手套机的结构对选针模块、软轴控制模块、纱线模块设备进行二选一,依次运行needle_dev_selsect.c,flexible_dev_selsect.c,yarn_dev_sel-sect.c进行设备选择,同时在子shell脚本中/glove_selsect.sh记录设备选择。3个模块的设备选择完毕,以“(/glove_selsect.sh)”启动子shell脚本,进行设备文件加载。以纱线模块的yarn_dev_selsect.c为例,流程图如图5所示。3.3主程序glove.c调用在底层中已完成设备与驱动的隔离,启动文件已将所需设备加载,故glove.c主程序仅对手套机6个模块对应驱动调用,其所做完全与具体设备无关,从而实现手套机的模块化,手套机与主程序流程图如图6所示。
4结束语
随着手套机的机电一体化水平的提高,手套机的一些子控制系统由传统的机械型转化为机电结合型,而且电控比重越来越大,甚至有超过机械部分的趋势。虽然电控型有着结构简单、操作灵活等优点,但传统的机械型有着稳定的优点,故两种类型各自占据市场的一定比例。本研究将手套机的主要部分模块化,使现有常见的不同子控制系统的手套机可以使用统一的主控程序。基于Linux系统,本研究设计了模块化手套机控制系统;基于总线—设备—驱动结构,该系统将传统的手套机控制部分划归为6个模块,并针对每个模块编写通用的驱动,实现多种同类设备控制。通过对手套机的模块化,使应用层手套机主程序与底层分离,减少因手套机机械结构的变动带来软件上的修改。该设计已实现模块化手套机控制系统的基本功能。利用该设计所提出的模块化思想,可对手套机新、旧子系统在软件上的兼容性问题提供良好的解决办法;使手套机不再因为部分子系统的改变而带来科技期刊整个软件系统的改变。
作者:赵子轩 袁嫣红 张建义 单位:浙江理工大学 机械与自动控制学院