新闻分类
News list潍坊激光打标机绘制PLT图形的实现方法
时间:2020-5-20 15:18:00 来源:http://www.qdmingzu.com/news378041.html
摘要:潍坊激光打标机是一种工业用的激光标记设备,主要用来在产品或工件表面上用高能量的激光烧蚀出标记在激光打标控制系统中,利用直线插补算法的原理对PLT图形进行处理和绘制,实现简单,控制方便。
绘制图形的输出设备通常有两类,一是 显示器,二是绘图仪或打印机本文所讨论的激光打标机是一种工业用的激光打标设备,主要用来在扳手、轴承、标牌或其他工件表面上用激光烧蚀出标记它与微机之间通过一块接口电路板相连,主要由驱动电路和激光头两部分组成接口电路中,端口B的高四位和低四位分别
用于控制激光头中X轴和Y轴方向步进电机的移动,端口A用于控制激光口的开关在为楚天激光集团公司设计的激光打标控制系统中,我们成功地使用了直线的逐点比较插补生成算法(简称直线插补算法)对PLT图形进行处理和绘制,这种算法实现简单,控制方便。
1 直线插补算法
所谓直线插补算法就是执行机构每走一步都要和给定轨迹上的坐标值进行一-次比较, 看当前位置是在给定点的上方还是下方,从而确定下一步的进给方向. 若取起始点为坐标原点,则直线插补计算公式及进给方向如附表所示:
四个象限的终点坐标值均取其数字的绝对值,表中Fm表示当前点的偏差,Fm+ 1表示进给后到达的点的偏差,LI. L2. L3、L4表示当前点所在的象限,+X, -X,+Y, -Y分别表示进给方向,起始点的坐标为(XI,Y1).(X2,Y2)为结束点的坐标.
算法的思想用流程图描述如下:
2 PLT 图形的格式
PLT文件是ASC II码形式的矢量图形文件,除文件头和尾外,其内容主要是-些点的坐标和起落笔的标
忠例如:
.....A.1453,42556: PD; PA1850,1503: PU; PA8500, 6020; ..... PU; PA3080, 3551;
前后分别是文件头和文件尾,PA表示后面跟的是以逗号分隔的点的X、Y坐标; PD表示落笔,以它前后两点
为端点画一条直线; PU表示起笔,直接将笔移动到后面的点上而不用画线别.如点(1453, 2556) 到点(1850,1503)应画一条直线,而点(1850, 1503) 到点(8500, 6020) 直接将笔移动到后面的点上,不需要画出其
轨迹
3实现方法
在实现过程中,我们选择VC+作为开发工具,它不仅使得开发过程方便快捷,而且也很容易实现对端
口的控制操作.实现过程中的几个主要函数分别如下:
3.1插补算法实现的直线绘制函数及图形绘制函数
由于PLT图形文件是由一-段段的直线构成的,因此,我们用直线插补算法编写了-一个画直线的函数: void
CL asrCrtl:line1(int xI, int y1, int x2, inty2).在此基础上,我们构造了画-一个PLT图形文件的函数,其代码如下:
void CI aserCrtr:draw0)41
{
int i;
for(i=1;i<pointnum-1;i+ +) /法掉首尾两(0,0)点
if(oldlaser- -0)&&(curlaser-- 1)) /如果当前点出光标志为1
//且上一点的出光标志 为0
laserdelay(://则重新出光时,需要延迟
if(breakflags- false) /检 查中断标志
line l(curx.cury.p[i.x.p[i].y);
else
break;
if(i= =1)&&(firstdelayflags- true)) firstdelayO; /首点延迟
oldlaser- curlaser;
curlaser-p[i].laser;
curx=p(i].x;cury=p[i.y;
3. 2在指定位置绘制字符图形的函数
在draw )函数的基础上,我们编写了voidCLaserCrl:display(int x0, int yO,char code)函数,用来绘制-个
图形文件.在调用draw(函数之前,需要调用fetch0函数对指定的文件进行处理,还需要进行诸如坐标平移,
图形缩放、旋转等操作.
3.3 PLT文件的处理函数
fetch0函数主要用来对PLT文件进行处理,并将各点的坐标保存到数组中.其实现如下:
int CL aserCtl::fetch(const char * filename)
{ int ij,n.m, ld ,laser;,
char tx[ l0],y[10];
char b,b1,b2.b3;
FILE*fp:
if( fp=fopen(filename.,"r+b")= =NULL){
MessageBox(NULL,"打开文件错",".MB_ OK);
retum0; }
fseek(fp,44L ,SEEK_ SET);
p[0].x=0;p[0].y=0:p[]laser=0;j=l;
for(i= I;i<N;i++){
n=0;m=0;b=getc(fp);
f(p)){
fclose(fp);
break;
switch(b){
case P://如果遇到P字符
bl-=get(p://则取下一字符
switch(bl){
case 'A://若为PA,则取出紧跟的坐标值
ld-=fell(fp);
do{ b2=getc(fp);
n=n+I; }while(b2 !=;); /n表示到;,的字符个数
fseek(fp,Id.SEEK_ SET);
firead(tx,I,n-I,fp);
p[i].x=atoi(tx):
strcpy(tx."
");
do{b3=getc(fp);
m=m+1;
}while(b3 !=';);
fseek(fp.ld+n.SEEK_ SET);
fread(ty.l.m-2.fp);
p[iJ.y-atoi(ty);
strcpy(ty."
");
j=j+1;
break;
case U: /若 为PU则表示抬笔,应置出光标志为不出光
laser= =0;
pfj-1]laser-laser;,
break;
case 'D': //若 为PD则表示落笔,应置出光标志为出光
laser=l;
p[-1].laser=laser,
break;
};
pOi].laser=p[j-1 ].laser,
break;
case ;//其他字符不作处理
break;
case中
break;
case 'S':
break;
default:break;
}}
pointnum=j; /得到坐标点的个数
fclose(fp);
retum 1;
4提高控制精度的几项措施
4.1 Y轴上直线的绘制
若打标文件里有平行于Y轴的直线存在,采用直线插补算法,激光头最后则会在X轴方向上不能回到坐标原点,当进行连续打标时,就可能会出现图形的偏移.为了在每次打完一个文件,使激光头能精确地回到
坐标原点, Y轴方向的直线就必须特殊处理.我们采用的方案是控制电机只朝Y方向移动,不用直线插补算法
以下这段程序包含在line1()的末尾
if(x1=x2) .
{n=labs(y1-y2);
tag= (yl-y2)>0?-1:I;
while(n>0)
{
movey(tag);
n--;
}
4.2延迟时间的设置
由于激光需要一段时间的振荡,达到一定的强度后才能在工件表面刻划出痕迹,故关闭激光后重新出光时需要有一段延迟才 不会出现字符笔划残缺的现象另外,因为PC机的指令执行时间远远小于电机移动时间,如果不延迟或延迟的时间太短,则指令执行完时可能电机还没有移动到指定位置,容易导致控制不精确,以及激光头不能精确回到原点;如果延迟的时间太长则电机等待,单位时间内电机移动的步数减少,速度减慢.经过多次试验和延迟参数的对比,我们取得了较好的效果。