运动控制卡在异形玻璃切割行业中的应用
深圳市众为兴数控技术有限公司

[摘要] 运动控制卡是一种基于工业PC机、用于各种运动控制场合(包括位移、速度、加速度等)的上位控制单元。它的出现主要是因为:(1)为了满足新型数控系统的标准化、柔性、开放性等要求;(2)在各种工业设备(如切割、雕刻、喷涂、点胶、焊接等)、国防装备(如跟踪定位系统等)、智能医疗装置等设备的自动化控制系统研制和改造中,急需一个运动控制模块的硬件平台;(3)PC机在各种工业现场的广泛应用,也促使配备相应的控制卡以充分发挥PC机的强大功能。
[关键词]ADT8940、上位控制、执行结构

一、数控系统组织结构及控制原理图

采用PC+运动控制卡的简易数控系统,其主要组成及其控制流程图如下图(1)所示:



图(1)
通过上述组织结构图不难看出:一个完整的数控系统主要有“执行结构”和“上位控制”两部分组成。“执行机构”主要包括:步进电机,伺服电机,以及由继电器输出控制的交流马达、汽缸、液压缸等,“执行机构”通过机械联结装置将运动传递到刀具或工件,进而实现机械部件的运动;“上位控制”单元主要包括:PC机,运动控制卡,数控应用软件和辅助工具软件。
“上位控制”单元是数控系统的“指挥中心”,“执行机构”的所有动作都受“上位控制“的统一调度,从而确保了各部件协调动作。在“上位控制”对“执行机构”实施控制的过程中,运动控制卡起了关键性的作用,她是PC机和执行机构联系的桥梁,是执行机构的直接控制者,所以运动控制卡性能的优劣将直接影响整个数控系统的性能。
深圳市众为兴数控技术有限公司是一家专业从事数控硬件产品和应用系统开发的公司,运动控制卡作为公司的一项核心产品,其性能指标一直稳居在国内的先进行列,基于运动控制卡自主研发的数控应用系统渗透到了植毛钻孔机,水射流切割、火焰切割、异形玻璃切割、喷涂机、雕刻机、焊接机、医疗机械等领域。下面详细讨论运动控制卡在异型玻璃切割行业中的应用。

二、异形玻璃切割系统
1、 行业概述
传统的玻璃切割采用手工和简易机械切割方式,在玻璃仅仅用于门窗的时代,上述切割方式已经绰绰有余。然而随着科技和生活水平的不断提高,玻璃在电子产品、工艺品、装饰品、家庭日用品等领域的应用越来越普及,利用传统方式去切割厚度很厚,面积大,形状复杂,精度要求高的玻璃非常困难,而且效率很低。传统切割方式在玻璃切割领域中的应用已经走到了尽头,取而代之的最佳方式莫过于将数控技术应用到玻璃切割中。
深圳市众为兴数控技术有限公司结合自身所长,自主开发了异形玻璃切割系统,该系统在玻璃切割行业中已经得到了广泛的应用。

2、 系统设计

(1) 硬件方案

因PLC和其他控制器存在图形处理麻烦、存储容量和内存容量小等缺陷,所以最终采用PC+运动控制卡硬件方案。
运动控制卡是基于PC机各种总线的步进电机或数字式伺服电机的上位控制单元,总线形式也是多种多样,通常使用的是基于ISA总线,PCI总线和PC104总线的。随着PC机的发展,主板上ISA插槽已经越来越少,而PC104总线插槽仅出现在价格昂贵的工控主板上,PCI总线已经成为普通PC机的主流。
综合玻璃切割工艺,加工过程中需要使用到两轴联动、三轴联动、、两轴直线插补、三轴直线插补和自动加减速等功能,所以选择PCI插槽的ADT8940四轴运动控制卡作为运动控制单元。

(2)软件方案

ADT8940运动控制卡具有开放式结构、使用简便、功能丰富、可靠性高等特点,其所有功能都是以库函数形式出现,用户只管调用,无须了解具体的实现方式,所以可以在短期内,开发出既满足性能要求,又能大幅度降低成本的系统。
在传统数控系统中,通常需要专业人员手工编辑G代码,或者使用Mastercam等专业性很强的绘图工具生成G代码,G代码是系统唯一能够识别的加工指令,这对操作人员提出了很高的要求。为了开发出通用性强,性价比高的系统,我们分析了目前比较通用的各种绘图工具,决定在兼容传统的G代码的基础上,增加目前通用性强的DXF文件(AutoCAD)和PLT(AutoCAD、CoreDraw)文件作为切割加工的原始数据,从而解决了客户使用G代码的烦恼。
VC中提供的数据链表模板类,可以很方便地管理数据,加上VC有强大的图形处理功能,可以方便地将数据文件格式转化成图形格式,直观地反映出来。所以选用VC作为软件开发工具。

(3)功能规划及设计要点

解析功能—系统具有对DXF、PLT、CNC、NC文件的解析功能,从而自动生成加工过程中所需要的数据。解析总体思路采用短直线逼近法来模拟实际轨迹,解析精度可调,用户可以根据实际需要进行设定。
编辑功能—在玻璃切割中,经常需要批量切割排列规则的方形和圆形工件,如果通过绘图方式很不方便。为了增强系统的通用性和灵活性,系统中增加了方形和圆形工件的排版和编辑功能,以方便的实现方形和圆形工件的切割加工。
回零功能—系统上电启动,每个轴正常需要回零,确保系统找到机械零点,通常用原点接近开关作为原点信号。
设定起点—在机械零点的基础上,人为设定的加工零点。设定加工起点的目的,主要是为了提高加工效率。
抬刀功能—在切割加工过程中,如果刀具在工件中旋转较大角度,既会影响刀具的使用寿命,同时还会在拐角处留下圆角。为避免上述现象的发生,用户可以通过设定抬刀角度,确保刀具旋转角度在超出抬刀角度的情况下,刀具先抬起,然后旋转,接着下刀进行后续切割。
变速功能—在加工过程中,如果采用统一速度进行高速切割加工,那么在拐角较大处,就会留下不规则的弧形,影响产品的加工精度。为此,系统增加了拐角减速功能。
暂停记忆—系统在暂停时,会自动记忆当前的位置,以保证继续加工时,所有运动轴都能准确回到暂停时的位置,确保加工的准确性。
手动功能—为提高手动调机的灵活性,系统采用了手持盒控制和键盘控制和鼠标控制三种方式来实现各运动轴的移动,同时还提供了指定坐标移动法,确保各运动轴运动到指定位置。
IO诊断—该功能主要用于装机调试和故障检测中。机器安装完毕,必须保证所有的输入和输出信号正常后,方可进行加工,否则将会带来安全隐患和加工出现异常的现象。
保护功能—系统使用了三级保护措施,一级保护采用硬件限位开关,二级保护采用软件限位,三级保护采用了急停关闭所有电机驱动器使能的应急方案,确保了系统加工过程的安全。

(4) 运动控制卡操作

ADT8940控制卡是基于PCI总线的控制卡,它提供了丰富的运动控制函数,可方便基于XY平台的数控系统、机器人系统、雕刻切割系统、座标测量系统的应用(具体在系统中主要用到了单轴运动、两轴联动、三轴联动、两轴直线插补,三轴直线插补等功能。对于XY两轴插补,只需设置X轴的速度曲线,三轴插补需要设置X轴的速度,Z轴的倍率及驱动速度应与X轴设置相同,同时Z轴的初始速度也应设为X轴的驱动速度)。
下面简单介绍系统中所用库函数的功能和使用方法。
a. 初始化卡常用函数
int adt8940_initial(void)—该函数用于检测运动控制卡和复位运动控制卡,这是调用其他函数的前提。函数返回值为ADT8940运动控制卡的数量,返回值<=0,表示初始化失败。
int set_range(int cardno, int axis, long value)—该函数用于设定倍率,倍率是决定速度,加减速度和加减速度变化率的参数。
int set_pulse_mode(int cardno,int axis,int value,int logic,int dir_logic)—该函数用于设置输出脉冲的工作方式,运动控制卡提供独立脉冲和双脉冲的工作方式。
int set_command_pos(int cardno,int axis,long value)—该函数用于设定逻辑计数器的值。
int set_actual_pos(int cardno,int axis,long value)—该函数用于设定实位计数器的值。
b. 运动控制常用函数
int set_startv(int cardno,int axis,long value)—设定起始速度。
int set_speed(int cardno,int axis,long value)—设定驱动速度。
int set_acc(int cardno,int axis,long value)—设定加速度。
int pmove(int cardno,int axis,long pulse)—单轴驱动函数,连续向不同轴发送此指令,即可实现多轴联动。
int inp_move2(int cardno,int no,long pulse1,long pluse2)—两轴插补函数,no的取值决定是前两轴还是后两轴插补。
int inp_move3(int cardno,long pulse1,long pluse2,long pulse3)—两轴插补函数。
c. 状态检查函数
int get_status(int cardno,int axis,int *value)—获取单轴驱动状态,该函数主要用于单轴运动和多轴联动的场合。
int get_inp_stauts(int cardno,int no,int *value)—获取插补驱动状态。
int get_inp_status2(int cardno,int no,int *value)—获取连续插补允许写状态,通过使用该函数可以在当前插补未结束的情况下,插入下一条插补指令,以便保证插补的连续性。
d. 参数检查函数
int get_command_pos(int cardno,int axis,long *value)—获取逻辑计数器的值。
Int get_actual_pos(int cardno,int axis,long *value)—获取 实位计数器(通常为编码器和光栅尺)的值。
int get_speed(int cardno,int axis,long *speed)—获取运动轴的速度
e. 开关量操作函数
int read_bit(int ca