具体实施方式
要进行数字控制钻铆机自动钻铆,计算机理论模型和装夹在壁板上的铆接工件(板壁)之间必须建立精确映像。为了建立这种精确映像,拖架自重及载荷变形、A角及B角转动对变形的影响,对理论坐标造成的偏移等因素必须有所考虑。对变形及坐标偏移,需进行实时修正补偿,使得计算机理论模型和装夹在壁板上的铆接工件(板壁在机床加工坐标系内)一致对应。
1)基线标示及测量
托架制造时,在托架水平状态下,在托架上标画出两条(沿托架长度方向,内外各一)和A角理论转动中心线平行的一条直线上标画一些点。作为变形基准线控制节点(拖架自重变形)这两条直线在理论上是水平的,但在托架安装或安装工装工件后或有变形,成为曲线。(如图1,图2所示)其中Y向表示机床坐标系统的Y坐标方向,Y向表示机床坐标系统的Y坐标方向,Z向表示机床坐标系统的Z坐标方向;A角转动中心线是托架绕之转动的轴线,在水平状态下与X向平行。O表示托架形成A角和B角时结构上的转动交点。B角如图3所示
●自重变形曲线数据测量,在A、B角为零的状态下,没有安装工装工件时,测量给出:托架上标画的两条基线控制点坐标;如图4所示
●加载工件及夹具以后变形曲线数据测量,在A、B角为零(水平)状态,并安装工装工件情况下,测量给出:托架上标画的两条基线控制点坐标;如图5所示
●根据测量的基线控制点坐标,建立4条变形控制曲线(两条自重状态,两条加载工件及夹具状态)如图4,图5所示
2)根据两对变形测量基线,建立变形模型的两张变形曲面(一张自重状态,一张加载工件及夹具状态),形成随托架姿态变化的变形量包络区间;如图6所示
3)根据变形模型,对理论模型进行修正
差补变形修正计算以前,必须使变形测量坐标和工件模型坐标,理论模型的坐标系统齐平(基准对齐)。拖架在载荷分布确定以后,托架姿态的变化,相当于托架水平状态载荷的均匀增加或减少。托架垂直方向变形量与具有相同分布的载荷大小成线性变化。
数值计算方法
所需数据:
工件及工装理论载荷W
铆接点的理论坐标(X,Y,Z)
法向量为(Nx,Ny,Nz)
变形模型(如图4,5,6所示)
计算:
1.在自重变形曲面上,计算(X,Y)位置的Z向自重变形量V1;
2.在载荷W(有工装及工件)变形测量曲面上,计算(X,Y)位置的变形量V2;
3.以理论铆接点的理论法线,结合机床运动结构,计算一个托架运动A,B角度(初始法向调平);
4.按线性规律,计算载荷为W*COS(A)*COS(B)情况下的(X,Y)位置的变形量V3;
5.对理论点位置坐标进行修补形成变形后的位置坐标(X,Y,Z’);
6.在理论模型曲面上,(X,Y)位置找临近三点,形成三角平面片,计算三点的变形坐标,利用三点变形坐标的平面法向,作为理论变形法向(NX’,NY,’NZ’)(形成逼近调平法矢量);
7.利用(X,Y,Z’)及(NX’,NY’,NZ’)修改APT文件,经后置处理后形成控制拖架运动指令,达到在铆接中动态修补控制。ATP文件处理前后如图11、图12所示,其中:
GOTO表示刀具所到达位置及姿态,前2个数值为位置矢量,后三个数值为法向矢量坐标值,红线标出了其中变形处理前后其数值的变化情况。其他的APT指令与本发明数据处理关系不大,不再详述。开发环境、开发工具及部分程序
本程序是在CATIA V5环境下,采用CATIA V5的CAA二次开发技术、VB、VBSCRIPT,DEPHI,MACRO等编程开发工具,设计了符合托架变形的数学模型需要的数据处理软件和数控后置处理程序,其数据处理集成图及方法流程图参见图7和图8。下边是部分程序代码:
procedure TForml.bxClick(Sender:TObject);
type Tcood=array[0..1]of string;
var
instr,outstr,sepchar,datas,x,y,z,dx,dy,dz,zp:string;
mask1:Tmask;
catiadoc,op,ep,partl,hybridShapeFactoryl,PointCoordl_f,
refpointl_f,bxm_f,hybridBodyl,hybridBody2,op_ref_b,op_ref_e:
OleVariant;
op_e,bxjd_f,l1,bxm,bxjd,selection,params,
PointCoordl,refpointl,PointCoord2,refpoint2:OleVariant;
dirline,cood,Parametersl,bxname,hybridBody3,fs_bx_op,bxv,fsbxname
,fsbxv,bx_op,fs_bx_line,fs_pb_ref,fs_pe_ref,fs_pb,fs_pe,fs_bxjd:V
ariant;
zb:string;
i:integer;
fsbx,bx,fx,fy,fz,f_bx,fze,l,z_O:real;
begin
sepchar:=,’;
reset(inputfile);
rewrite(outfile);
mask1:=tmask.Create(’GOTO/*’);
CATIA.Visible:=True;
catiadoc:=CATIA.ActiveDocument;
partl:=catiadoc.Part;
hybridShapeFactoryl:=partl.HybridShapeFactory;
hybridBodyl:=partl.HybridBodies.add;
hybridBodyl.Name:=’铆点和变形点’;
hybridBody2:=partl.FindObjectByName(’自重变形曲面模型’);
bxm:=hybridBody2.HybridShapes.item(’自重变形曲面’);
hybridBody3:=partl.FindObjectByName(’负载变形曲面模型’);
bxm_f:=hybridBody3.HybridShapes.item(’负载变形曲面’);
//========初始(0,0,0)Z变形
x:=floattostr(0);
y:=floattostr(0);
z:=floattostr(0);
dx:=floattostr(0);
dy:=floattostr(0);
dz:=floattostr(0);
//变形处理
//铆点变形处理
op:=hybridShapeFactoryl.AddNewPointCoord(x,y,z);
op.name:=’0点’;
hybridBodyl.AppendHybridShape(op);
partl.UpdateObject(hybridBodyl);
op_ref_b:=partl.CreateReferenceFromObject(op);
zp:=FloatToStr(strtoFloat(z)-10000);
op_e:=hybridShapeFactoryl.AddNewPointCoord(x,y,zp);
op_ref_e:=partl.CreateReferenceFromObject(op_e)
l1:=hybridShapeFactoryl.AddNewLinePtPt(op_ref_b,op_ref_e);
//hybridBodyl.AppendHybridShape(l1);
//partl.UpdateObject(hybridBodyl);
bxjd:=hybridShapeFactoryl.AddNewIntersection(l1,bxm);
hybridBodyl.AppendHybridShape(bxjd);
bxjd_f:=hybridShapeFactoryl.AddNewIntersection(l1,bxm_f);
hybridBodyl.AppendHybridShape(bxjd_f);
partl.UpdateObject(hybridBodyl);
PointCoordl:=hybridShapeFactoryl.AddNewPointCoord(0.000000,
0.000000,0.000000);
refpointl:=partl.CreateReferenceFromObject(bxjd);
PointCoordl.PtRef:=refpointl;
hybridBodyl.AppendHybridShape(PointCoordl);
PointCoordl_f:=hybridShapeFactoryl.AddNewPointCoord(0.000000,
0.000000,0.000000);
refpointl_f:=partl.CreateReferenceFromObject(bxjd_f);
PointCoordl_f.PtRef:=refpointl_f;
hybridBodyl.AppendHybridShape(PointCoordl_f);
//铆点变形处理
//法矢修正
fx:=strtoFloat(x)+strtoFloat(dx)*l;
fy:=strtoFloat(y)+strtoFloat(dy)*l;
fz:=strtoFloat(z)+strtoFloat(dz)*l;
fs_pb:=hybridShapeFactoryl. AddNewPointCoord(fx,fy,fz);
//hybridBodyl.AppendHybridShape(fs_pb);
//partl.UpdateObject(hybridBodyl);
fs_pb_ref:=partl.CreateReferenceFromObject(fs_pb);
fze:=fz-10000;
fs_pe:=hybridShapeFactoryl.AddNewPointCoord(fx,fy,fze);
fs_pe_ref:=partl.CreateReferenceFromObject(fs_pe);
fs_bx_line:=hybridShapeFactoryl.AddNewLinePtPt(fs_pb_ref,
fs_pe_ref);
fs_bxjd:=hybridShapeFactoryl.AddNewIntersection(fs_bx_line,bx
m);
hybridBodyl.AppendHybridShape(fs_bxjd);
partl.UpdateObject(hybridBodyl)c型自动钻铆
PointCoord2:=hybridShapeFactoryl.AddNewPointCoord(0.000000,
0.000000,0.000000);
refpoint2:=partl.CreateReferenceFromObject(fs_bxjd);
PointCoord2.PtRef:=refpoint2;
hybridBodyl.AppendHybridShape(PointCoord2);
//法矢修正
//cood:=VarArrayCreate([0,2],varVariant);
params:=VarArrayCreate([0,5],varVariant);
params[0]:=x;
params[1]:=y;
params[2]:=z;
params[3]:=dx;
params[4]:=dy;
params[5]:=dz;
//PointCoordl.GetCoordinates(cood);
partl.UpdateObject(hybridBodyl);
selection:=catiadoc.Selection;
selection.clear;
selection.add(PointCoordl);
selection.add(op);
selection.add(PointCoord2);
select ion.add(PointCoordl_f);
//selection.Item(1).value.GetCoordinates(cood);
//CATIA.SystemService.Evaluate(’Sub CATMain(f,v)\ndim
coodl(2)\nselection.Item(1).value.GetCoordinates(cood1)\nEnd Sub’,
CATVBScriptLanguage,’CATMain’,cood);
//CATIA.SystemService.Evaluate(’Sub CATMain(f,v)\nEnd Sub’,
CATVBScriptLanguage,’CATMain’,cood);
CATIA.SystemService.ExecuteScript(’c:\’,catScriptLibraryType
Directory,’getz3.CATScript’,’CATMain’,params);
Parametersl:=partl.Parameters.SubList(op,True);
bxname:=op.Name+’_Z修正’;
bxv:=Parametersl.item(bxname).value;
bx:=bxv*1.00000;
//zb:=cood[0];
memo2.Lines.Append(floattostr(bx));
z:=floattostr(StrToFloat(z)+bx);
bx_op:=hybridShapeFactoryl.AddNewPointCoord(x,y,z);
bx_op.name:=’修正0点’;
hybridBodyl.AppendHy’bridShape(bx_op);
//
//变形处理
z_O:=bx;
//========初始(0,0,0)Z变形
i:=0;
l:=200;
repeat
begin
readln(inputfile,instr);
if maskl.Matches(instr) then
begin
i:=i+1;
datas:=RegulateStr(copy(instr,8,length(instr)-7),sepchar);
//x:=copy(datas,l,pos(sepchar,datas)-1);
x:=GetSubStr(datas,sepchar);
y:=GetSubStr(datas,sepchar);
z:=GetSubStr(datas,sepchar);
dx:=GetSubStr(datas,sepchar);
dy:=GetSubStr(datas,sepchar);
dz:=GetSubStr(datas,sepchar);
//变形处理
//铆点变形处理
op:=hybridShapeFactoryl.AddNewPointCoord(x,y,z);
op.name:=’理论铆点’+inttostr(i);
hybridBodyl.AppendHybridShape(op);
partl.UpdateObject(hybridBodyl);
op_ref_b:=partl.CreateReferenceFromObject(op);
zp:=FloatToStr(strtoFloat(z)-10000);
op_e:=hybri dShapeFactoryl.AddNewPointCoord(x,y,zp);
op_ref_e:=partl.CreateReferenceFromObject(op_e);
l1:=hybridShapeFactoryl.AddNewLinePtPt(op_ref_b,op_ref_e);
//hybridBodyl.AppendHybri dShape(l1);
//partl.UpdateObject(hybridBodyl);
bxjd:=hybridShapeFactoryl.AddNewIntersection(l1,bxm);
hybridBodyl.AppendHybridShape(bxjd);
jd_f:=hybridShapeFactoryl.AddNewIntersection(l1,bxm_f);
hybridBodyl.AppendHybridShape(bxjd_f);
partl.UpdateObject(hybridBodyl);
PointCoordl:=hybridShapeFactoryl.AddNewPointCoord(O.000000,
0.000000,0.000000);
refpointl:=partl.CreateReferenceFromObject(bxjd);
PointCoordl.PtRef:=refpointl;
hybridBodyl.AppendHybridShape(PointCoordl);
PointCoordl_f:=hybridShapeFactoryl.AddNewPointCoord(0.000000,
0.000000,0.000000);
refpointl_f:=partl.CreateReferenceFromObject(bxjd_f);
PointCoordl_f.PtRef:=refpointl_f;
hybridBodyl.AppendHybridShape(PointCoordl_f);
//铆点变形处理
//法矢修正
fx:=strtoFloat(x)+strtoFloat(dx)*l;
fy:=strtoFloat(y)+strtoFloat(dy)*l;
fz:=strtoFloat(z)+strtoFloat(dz)*l;
fs_pb:=hybridShapeFactoryl.AddNewPointCoord(fx,fy,fz);
//hybridBody l.AppendHybridShape(fs_pb);
//partl.UpdateObject(hybridBodyl);
fs_pb_ref:=partl.CreateReferenceFromObject(fs_pb);
fze:=fz-10000;
fs_pe:=hybridShapeFactoryl.AddNewPointCoord(fx,fy,fze);
fs_pe_ref:=partl.CreateReferenceFromObject(fs_pe);
fs_bx_line:=hybridShapeFactoryl.AddNewLinePtPt(fs_pb_ref,
fs_pe_ref);
fs_bxjd:=hybridShapeFactoryl.AddNewIntersection(fs_bx_line,bx
m);
hybridBodyl.AppendHybridShape(fs_bxjd);
partl.UpdateObject(hybridBodyl);
PointCoord2:=hybridShapeFactoryl.AddNewPointCoord(0.000000,0.
000000,0.000000);
refpoint2:=partl.CreateReferenceFromObject(fs_bxjd);
PointCoord2.PtRef:=refpoint2;
hybridBodyl.AppendHybridShape(PointCoord2);
//法矢修正
//cood:=VarArrayCreate([0,2],varVariant);
params:=VarArrayCreate([0,5],varVariant);
params[0]:=x;
params[1]:=y;
params[2]:=z;
params[3]:=dx;
params[4]:=dy;
params[5]:=dz;
//PointCoordl.GetCoordinates(cood);
partl.UpdateObject(hybridBodyl);
selection:=catiadoc.Selection;
selection.clear;
selection.add(PointCoordl);
selection.add(op);
selection.add(PointCoord2);
selection.add(PointCoordl_f);
//selection.Item(1).value.GetCoordinates(cood);
//CATIA.SystemService.Evaluate(’Sub CATMain(f,v)\ndim
cood1(2)\nselection.Item(1).value.GetCoordinates(cood1)\nEnd Sub’,
CATVBScriptLanguage,’CATMain’,cood);
//CATIA.SystemService.Evaluate(’Sub CATMain(f,v)\nEnd Sub’,
CATVBScriptLanguage,’CATMain’,cood);
CATIA.SystemService.ExecuteScript(’c:\’,catScriptLibraryTypeD
irectory,’getz3.CATScript’,’CATMain’,params);
Parametersl:=partl.Parameters.SubList(op,True);
bxname:=op.Name+’_Z修正’;
bxv:=Parametersl.item(bxname).value;
bx:=(bxv-z_0)*0.5*abs(StrToFloat(dz))*(StrToFloat(dz)*StrToFl
oat(dz)+StrToFloat(dy)*StrToFloat(dy));
Parametersl.item(bxname).value:=floattostr(bx);
//法矢端点_Z修正
fsbxname:=op.Name+’_法矢Z修正’;
fsbxv:=Parametersl.item(fsbxname).value;
fsbx:=fsbxv*abs(StrToFloat(dz))*(StrToFloat(dz)*StrToFloat(dz)+
StrToFloat(dy)*StrToFloat(dy));
Parametersl.item(fsbxname).value:=floattostr(fsbx);
//法矢端点_Z修正
//zb:=cood[0];
memo2.Lines.Append(floattostr(bx));
z:=floattostr(StrToFloat(z)+bx);
bx_op:=hybridShapeFactoryl.AddNewPointCoord(x,y,z);
bx_op.name:=’修正铆点’+inttostr(i);
hybridBodyl.AppendHybridShape(bx_op);
//
//法矢修正
fz:=fz+fsbx;
fs_bx_op:=hybridShapeFactoryl.AddNewPointCoord(fx,fy,fz);
dirline:=hybridShapeFactoryl.AddNewLinePtPt(bx_op,fs_bx_op);
hybridBodyl.AppendHybridShape(dirline);
//法矢修正
//变形处理
out str:=’GOT0/’+x+’,’+y+’,’+z+’,’+dx+’,’+dy+’,’+dz;
//memol.Lines.Append(y);
end
else
outstr:=instr;
writeln(outfile,outstr);
memol.Lines.Append(outstr);
end;
until eof(inputfile);
closefile(outfile);
end;
具体应用实例:
本发明的自动钻铆托架变形修补数据处理方法运用在G4026SXX-120全自动钻铆系统,直接在CATIAV5系统上建立工件数模,进行铆钉工艺分布,加工编程,经过试验证明已经达到全自动数控铆接的目标,其位置精度及法向精度满足ARJ飞机机翼壁板产品的精度要求。下列一组图片为ARJ飞机机翼壁板的经变形修补技术数据处理后,自动铆接加工的实例图片参见图9,图10,图13(最大产品上后壁板长度接近13米,下后壁板是双曲曲率最大的工件)。