|

技术支持小组 2003.09.23 (以下控制以DMC1000控制卡为例)
一、功能和工艺要求 1.对PCB电路径钻孔,精度小于0.01 2.能铣出电路板块,精度小于0.1 3.支持钻孔文件TXT,ROT,DRL,GBR 4.支持多刀具补偿,多刀加工换刀操作 5.接受NC,CNC的平面坐标数据 6.处理图形加工的顺序,及图形加工方向 7.能简单编辑图形,如选择,旋转,平移,镜像,复制,排列等。 8.加工控制能中断,并可从中断继续加工,或指定加工 9.设定工作原点,控制高速主轴马达,可手动调试设备
二、系统流程
三、使用函数 手动调试需要完成的功能:输入输出测试,手动驱动脉冲,检测运行状态,停止动作,找机械原点: 对应的函数调为: d1000_out_bit 数字输出函数,可以控制高速马达的开启或关闭 d1000_get_in_bit 读输入口状态 d1000_start_tr_move 手动发脉冲,可使用单轴点位运行 d1000_check_done 检测运动状态函数 d1000_decel_stop 停止脉冲输出(减速停较好) d1000_home_move 单轴找原点函数 d1000_home_move_all 多轴找原点函数 d1000_board_init 控制卡初始化 d1000_board_close 控制卡释放
位置显示及清除需要的函数: d1000_get_abs_position 取得绝对位置 d1000_set_position 设定位置函数,当值为0时位置清除
加工控制需要的函数: d1000_start_ta_line2 两轴插补函数 d1000_set_vector_profile 设定矢量插补速度 d1000_change_speed 速度改变速度
四、核心部分的编程 该控制部分编程相对于激光控制难度较大,其加工控制部分及断点,事件处理可参见激光编辑核心部分。此处介绍铣边及钻孔在加工控制编程当中,需考虑的主要因素是刀具的参数及操作(如下刀,抬刀,换刀)。 其刀具需要一个数据结构定义如下: class Cknife { public: Cknife(); ~Cknife();
double fDR; //刀径 double fDownSpeed; //下刀速度 double fUpSpeed; //抬刀速度
const static int MAXLAYLE=0x10; //支持最大的 下刀次数(16次) int nDups; //需要下刀次数(此值不参大于MAXLAYLE double fLayle[MAXLAYE];//每次下刀深度不一样
int nLife; //寿命长度 int nFinish; //完成多少次孔操作 BOOL bDiWei; //是否只用来作定位孔处理
COLORREF color; //颜色标识 //…其它用户自定义属性 }
有了单一刀具的数据,还需要一个刀具管理类: class CProcessknife { public: CProcessKnife() ~CProcessKnife()
int Drill_Hold( int nKnife, PARA ¶); //专用于单孔钻处理 //此函数,需要区别定位孔,处理多次钻孔,不同抬刀高度(停止时抬刀高度与作业抬刀高度是不一样的,此处编程有一小小技巧)
int Drill_Mark(int nKnife, BOOL bUpDown, PARA ¶ );//用于铣边的下刀或抬刀处理,此函数,只管下刀到位,然后抬刀即可,需要取消定位孔的影响
int ReplaceKnife( int nKnife, PARA ¶);//换刀函数 // 此函数需要完成,达到指定位置进行换刀操作,需要考虑其操作被中断的情况
CArray knifeArray; //建立一个动态的刀具数组 Int m_nCurrKnife; //当前被操作的刀具索引
Struct TAG_SPEEDSC { double fDR; //刀具 double fSC; //速度比 } TAG_SPEED m_speedSC[20]; //建立一个速度比,最多20即可 Int ComplieSpeed( … ); //速度比计算函数 // … 其它用户函数,如增加刀具,删除刀具,取指定刀具参数,查找刀具
}
从纯编程技术手段来处理,以上的CprocessKnife类,可以处理成这样: class CprocessKnife : public Carray {//…用户函数 }; 如此以来,动态数组所有特性功能CprocessKnife都具备,不必上述方法,要增加一个刀具对象需要如下函数: 设有CprocessKnife 对象有proknife; int Add( Cknife &knife ){ knifeArray.Add( knife ); return knifeArray.GetSize(); }
则调用为: proknife.Add( knife ); 或者通过外部调来增加: proknife.knifeArray.Add( knife );
需要使下新的方法,则无须写Add函数,如直接添加代码如下: proknife.Add( knife ); 诸如此类,可以节省大量编写代码时间,而其它用户定义函数照定义不误。
如此以来,钻孔或铣边时,编程基本思路如下: 钻孔为例: void Chold::OnMark( PARA ¶ ){ proknife.Replace( holdKnife, para ); //先处理是否要换刀 int step(0); //为了说明问题,使用步进式编程较易明白
while( m_nWorkStatus == RUNNING && step < 2){ doEvent() switch( step ){ case 0: if( ismove() ) break; fast_moveto( X, Y ); //快速移到孔的XY位置 step ++; case 1: if( ismove() ) break; m_nWorkStatus = proknife.Drill_Hold( holdKnife, para ); //作一次钻孔操作 step ++; break; } //其它处理 铣边处理为(以多边形图形为例): void PolyLine::OnMark( PARA ¶ ) { const int nSize = runData.GetSize(); for( int I(0); I { if( I == 0 || bBreak ){// 第一点,或有断点时(当中恐刀具有变动) bBreak ? moveto( break.x, break.y): moveto( runData[I].x, runData[I].y ); while( ismove() ) ::doevent(); m_nWorkStatus = proknife.ReplaceKnife(polyKinife, para );//换刀 if( m_nWorkStatus != RUNNING ) break; proknife.Drill_Mark( polyKnife, TRUE , para );//只下刀 continue; } conline(rundata[I].x, rundata[I].y,runSpeed); //加工路径 //…其它处理 }// end for i proknife.Drill_Mark( polyKnife, FALSE, para ); //只抬刀 }// end on mark function
五、注意事项 其注意事项,部分可参见激光的参考资料,在此列出钻孔铣边细节上的注意事项: 1.钻孔,需要支持钻槽钻圆操作 2.当钻的孔径较大,需要铣出来时,则要有钻孔转成铣边处理 3.钻孔与铣边都需要定位孔操作,需要提供其相应的处理方案 4.钻孔的路径,需要有优化处理,通常文件输出图形已有优化 5.铣边的图形,需要考虑如何根据不同的刀径作补偿处理 6.铣边时,需要考虑内补偿,外补偿,无补偿的处理 7.铣边时,需要考虑单元图形排列时,其加工的开始点可选择处理 8.Z轴的参数需要完善的管理(工面位置,工作高度,板材厚度等其它)
|