PCB钻铣软件的开发参考资料
技术支持小组 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轴的参数需要完善的管理(工面位置,工作高度,板材厚度等其它)
文章版权归西部工控xbgk所有,未经许可不得转载。