刘慧双,宋 宝,周向东,唐小琦
(华中科技大学机械科学与工程学院,武汉 430074)
嵌入式数控系统NCUC-Bus现场总线设备驱动研究与开发*
刘慧双,宋 宝,周向东,唐小琦
(华中科技大学机械科学与工程学院,武汉 430074)
针对NCUC-Bus现场总线技术在嵌入式数控系统中的应用,分析了基于NCUC-Bus的嵌入式数控系统的网络结构、工作原理和对设备驱动的设计要求,搭建了基于ARM+FPGA的NCUC-Bus嵌入式数控系统硬件平台。在嵌入式实时Linux操作系统下,采用RTDM编写NCUC-Bus总线设备驱动程序,解析了驱动程序中用到的关键函数。对驱动程序进行了功能和性能测试后,成功应用到NCUC-Bus嵌入式数控系统中。结果表明在实时Linux操作系统下,设计能有效地操作NCUC-Bus总线设备。
NCUC-Bus现场总线;嵌入式数控系统;设备驱动;RTDM;实时
传统的数控装置与驱动器之间采用脉冲量或模拟量的通信方式进行信息交互,存在通信速率低、容易受外部干扰等问题,很难实现高速和高精。随着数控系统对多通道、高速、高精度的要求越来越高,基于数字信号传输的总线式通信方式成为数控系统与伺服驱动器、I/O之间通信的首选[1]。国际上,基于实时以太网技术的现场总线标准有8种,而应用于数控领域的主要有PROFINET实时以太网现场总线、EtherCAT实时以太网现场总线和SERCOS III实时以太网现场总线[1-2]。为缩小与国外现场总线技术的差距,国内“数控系统现场总线技术标准联盟”制定了NCUC-Bus现场总线协议,它是连接数控装置与驱动装置(伺服、主轴)、I/O装置的全数字、串行、同步、双向、多站点的主-从式的现场通信网络[3]。
论文分析了NCUC-Bus嵌入式数控系统网络结构和NCUC-Bus总线控制器工作原理,采用嵌入式Linux操作系统与Xenomai实时补丁构建实时操作系统,应用驱动程序模块动态加载的思想,根据RTDM编写NCUC-Bus总线设备驱动程序,正确访问总线控制器相关寄存器,完成数控系统控制器和伺服驱动器、I/O之间的信息交互,为NCUC-Bus总线技术在嵌入式数控系统的应用提供了途径。
基于NCUC-Bus的嵌入式数控系统网络结构如图1示,主控单元主要由 ARM9系列微处理器S3C2440、可编程逻辑器件FPGA、PHY芯片、光纤收发器等组成,构成NC运行的硬件平台和总线控制器(主站),再利用光纤线连接具有光纤通信接口的伺服装置和 IO单元(从站)。其中核心处理器S3C2440是一个由Advanced RISC Machines(ARM)公司设计的16/32位ARM920T的RISC处理器,提供了一套完整的通用系统外设,减少了整体系统成本且支持Linux操作系统。总线控制器核心芯片是Altera公司的FPGA芯片EP2C8Q208C8N,实现基于NCUC-Bus的现场总线协议。
图1 基于NCUC-Bus的现场总线网络结构
工作过程中主机通过设备驱动程序提供的硬件操作接口,读写总线控制器相关寄存器,实现总线控制器与主机间数据的实时交互,FPGA总线控制器按照NCUC-Bus协议的规定将数据发送到总线网络,依次经过各从站设备,形成一个数据传输回路。其中设备驱动模块为操作硬件的IO端口、轴口等提供相应服务,Linux软件系统的层次关系[4]以及基于NCUC-Bus嵌入式系统的软件结构如图2所示。
图2 软件系统层次关系
NCUC-Bus总线控制器按照协议规定对接收数据进行封装处理,保证数据传输的透明和可靠,实现主机对于驱动装置、I/O装置等现场设备的控制。
NCUC-Bus总线控制器由FPGA实现,与从站的通信接口采用PHY+光电转换模块+光纤接头的设备连接形式。PHY芯片实现数据的编码、译码和收发。光电转换模块实现电信号和光信号的转换,以提高系统抗电磁干扰能力[2]。
图3 总线控制器硬件结构
FPGA总线控制器软件任务主要包括数据帧解析、数据上下载、数据发送、差错检测等,其中数据解析根据不同设备(轴、IO等)要求的数据帧格式将数据解析为具有特定意义的数据帧;数据上下载完成主从站控制信息和状态信息的交互;数据发送将处理后的数据发送;差错检测通过差错检测机制判断传输数据帧是否出错。
图4 总线控制器软件功能模块
由于NCUC-Bus现场总线数据存储区需要同时供给主机和FPGA总线控制器读写,因此采用了双口RAM的存储形式,需满足一定的时序控制,为匹配4ms硬件插补周期,NCUCBus通信周期设计为4ms,这要求用户通过驱动程序与总线控制器寄存器在4ms内完成所有交互。
图5 数据收发时序控制
为此,编写的设备驱动模块为操作硬件的IO端口、轴口等寄存器提供相应服务的前提是操作系统具有实时性。目前linux的实时性改造主要有两种方案,一种是提高内核的可抢占性,主要是直接修改linux内核源代码中的数据结构、进程调度函数和中断方式,代表有Kurt-Linux,这种方法工作量大,影响系统的稳定性,而且会造成原有设备驱动和应用程序的不兼容。第二种方案是采用双内核机制,新的实时内核接管了硬件中断,负责调度实时任务运行在GNU/linux主机系统内,同时原有的linux内核被看做是一个低优先级的后台任务。这种
方法对内核的修改较小,使用方便,而且兼容原有设备驱动程序和应用程序,目前应用广泛[5]。双内核方
案的代表有 Xenomai、RTAI、RT-Linux等。Xenomai与其他双核系统相比有一个突出的优点在于它比普通Linux内核具有更高的集成度[6],因此这里采用Xenomai搭建Linux实时系统。
普通Linux内核提供的API如open()、read()、write()、ioctl()不具备实时性,需要采用一个新的编程框架来开发实时环境下的设备驱动。RTDM(Real Time Device Module)为开发实时linux环境下的设备驱动以及相应的应用程序提供了统一的编程接口[7-8],因此本文采用RTDM编写设备驱动。
NCUC-Bus总线设备驱动由以下几部分组成:加载设备(module_init)、初始化设备(init_ncdrv)、打开设备(ncdev_open)、数据读写和控制(ncdev_ioctl_rt)、关闭设备(ncdev_close)和卸载设备(module_exit)[9]。其中 init_ncdrv通过向函数 rtdm_dev_register()传递设备结构体描述指针,来向内核注册一个RTDM设备,通过调用函数ncdev_init(),完成设备物理地址到内核虚拟地址的映射以及相关寄存器配置;ncdev_ioctl_rt是基于ioctl系统调用的实现函数,为总线设备中用户空间和内核空间的数据传递提供所需操作接口。其实现通常是一个基于命令号的switch语句,根据用户请求命令号和指定的地址及数据,完成内核空间下相应内存地址处数据的读写,其间用函数rtdm_copy_from_user()完成用户空间到内核空间的数据复制,rtdm_copy_to_user()完成内核空间到用户空间的数据复制。驱动程序实现如图6示。
图6 设备驱动实现
驱动程序并不能直接通过物理地址访问硬件设备,必须将设备物理地址映射到内核虚拟地址空间,然后根据映射得到的内核虚拟地址,通过Linux中特定的函数实现访问。使用函数ioremap()将I/O操作的物理地址映射到内核虚拟地址空间上去。I/O操作的物理地址映射到内核虚拟地址空间后,我们可以像读写RAM那样直接读写I/O内存资源了[10]。writeb()、writew()、writel()实现往内存映射后的I/O 空间上写数据,readb()、readw()、readl()实现从内存映射后的I/O空间读取数据。
设备驱动程序中使用数据长度以2字节为单位的函数writew()和readw(),如可以通过以下三句话,实现总线控制器相关配置寄存器的访问(物理基址为0x10002C00)。
根据总线控制要求,我们的设备驱动程序中对周期和非周期数据读写、伺服控制、IO输入输出、AD/DA通道都提供了相应操作接口。
在控制函数ncdev_ioctl_rt()中,不同的命令号对应不同类的总线操作接口。CMD_BUS_INIT命令号为总线寄存器初始化标志提供操作接口,通知总线开始初始化;CMD_WRITE_CONF_REG命令号为总线重发次数等参数配置寄存器提供操作接口;CMD_NCSVO_OUT命令号为写轴控制参数接口;CMD_NCSVO_STATE为读轴状态接口;CMD_NCSVO_PGFB命令号则为读取伺服轴的反馈位置提供操作接口;CMD_READ_APER_PARM命令号用来读取非周期参数;CMD_WRITE_APER_PARM用来配置非周期参数命令;CMD_READ_REG实现总线相关寄存器的读操作;CMD_WRITE_REG为总线相关寄存器的写操作提供接口,例如写清除寄存器;CMD_IO_INPUT和CMD_IO_OUTPUT命令号则实现简单的IO读写,另外对于AD/DA转换也提供了操作接口,为系统功能扩展提供可能。
图7 基于NCUC-Bus的设备操作接口
硬件测试平台是ARM S3C2440的微处理器+FPGA总线控制器构成的NCUC-Bus现场总线控制系统,测试平台需要完成关键功能和性能测试。
将基于RTDM编写的实时驱动模块插入内核后,实时用户态程序即可通过Xenomai提供的Native Skin API函数接口来操作设备,首先调用 rt_dev_open()来打开设备,然后调用rt_dev_ioctl()完成读写操作及其他更复杂的操作,最后采用rt_dev_close()关掉设备。
对现场总线设备驱动系统的可靠性和实时性进行测试,如图8,首先需要采用rt_task_create()来创建实时任务,调用rt_task_start()来开始任务;rt_task_set_periodic()来设定实时任务的周期为4ms,rt_task_set_mode()来设定实时任务的运行级别,rt_task_wait_period()来确保每个实时任务在设定的周期到来后才开始运行。调用rt_dev_ioctl()访问设备驱动程序中的各操作接口,依照通信要求操作硬件设备,对驱动模块功能及可靠性进行测试。
图8 驱动测试方法框图
例如调用 rt_dev_ioctl(my_fd,CMD_WRITE_APER_PARM,&aper_parm_write),应用操作接口CMD_WRITE_APER_PARM来访问非周期数据寄存器区0x10002200_0x100022ff,进行非周期参数配置和在线修改,如图9示,可以保证参数的正确配置和修改。
图9 参数设置界面
利用示波器观测总线控制器通信周期为4ms时,主机与总线控制器数据交互时间仅为1.4ms,其中黄色通道1是FPGA总线控制器通信周期开始的中断脉冲,绿色通道2是主机与总线控制器数据交换完成后,ARM提供给FPGA的中断清除标志脉冲。结果表明满足实时性要求。
图10 通信实时性验证
系统功能、性能最终测试结果表明,主机和总线控制器能在定时周期内按照通信要求,正确完成数据的发送和接收,在拷机时间内主从站没有数据包丢失,各电机运行正常,轴运行平稳。
现场总线设备驱动模块成功应用在基于现场总线技术的数控系统中,如图11所示,其中总线控制器通过光纤接口连接从站设备,从站设备包括6个伺服驱动器和4个作为PLC设备的I/O板。
图11 基于NCUC-Bus的嵌入式测试系统
本文通过介绍基于NCUC-Bus现场总线的嵌入式数控系统网络结构以及总线控制器的工作原理,提出设备驱动的设计要求,采用Xenomai搭建Linux实时系统,根据RTDM编写了总线设备驱动程序。通过搭建测试平台验证驱动模块,结果表明满足功能和实时性能要求,实现了对6个伺服轴和4个IO设备的准确控制。设计在实时Linux操作系统下,为NCUC-Bus总线对伺服、IO设备的控制提供实现途径,为以后NCUC-Bus总线技术在嵌入式数控系统中的广泛应用提供了基础。
[1]殷哲波.基于FPGA的数控系统现场总线技术的研究[D].武汉:华中科技大学,2009.
[2]陈天航.NCUC-Bus现场总线关键技术研究[D].武汉:华中科技大学,2010.
[3]黄兴,唐小琦,周向东.总线型数控系统软件平台的研究与实现[J].计算机应用,2010(12):39-43.
[4]韦东山.嵌入式Linux应用开发[M].北京:人民邮电出版社,2008.
[5]陈曾汉,张鹏,晏来成.基于Xenomai的实时测控系统的研究与实现[J].计算机应用与软件,2009,26(5):162 -165.
[6]Karim Yaghmour,JonMasters,Gilad Ben-yossef & Philippe Gerum.Building Embedded Linux Systems[M].美国:O’Reilly Media Inc,2008.
[7]王海花.基于RTAI/RTnet实时以太网图像传输系统的设计与实现[D].成都:西南交通大学,2007.
[8]李伟.强实时RTAI在ARM9处理器的实现[D].成都:西南交通大学,2010.
[9]张威,黄冲.嵌入式Linux设备驱动的设计方法研究[J].江西师范大学学报,2007,31(4):391 -393.
[10]蒋贵金,张辉,王国锋.基于Linux的FPGA数据通信接口驱动设计与实现[J].计算机应用,2009,29(9):2520-2522.
(编辑 赵蓉)
Research and Development of NCUC-Bus Fieldbus Device Driver on Embedded CNC System
LIU Hui-shuang,SONG Bao,ZHOU Xiang-dong,TANG Xiao-qi
(School of Mechanical Science and Engineering,HuaZhong University of Science and Technology,Wuhan 430074,China)
W ith regard to the application of the NCUC-Bus fieldbus technology in embedded CNC System,Paper analysed network structure and working principle of the embedded NCUC-Bus CNC system,and the design requirements of device driver.Built embedded hardware CNC platform,based on ARMand FPGA.Based on embedded real-time Linux operating system,used RTDM to program the NCUCBus device driver,analysed the key functions of program.After testing the function and performance of the driver,successfully applied to the embedded NCUC-Bus fieldbus system.The results showed that design could effectively operate NCUC-Bus device based on real-time Linux operating system.
fieldbus NCUC-Bus;embedded CNC system;device driver;RTDM;real-time
TP316
A
1001-2265(2012)08-0062-04
2012-02-03
国家自然科学基金(50905069);国家科技重大专项(2010ZX04017-011)
刘慧双(1987—),女,河南商丘人,华中科技大学硕士研究生,主要研究方向:数控技术、嵌入式数控系统,(E-mail)liuhuishuang 1987@163.com。