当前位置:文档之家› 数据采样法插补C语言程序

数据采样法插补C语言程序

{
double fDeltaL,fL;
double K;
int bXIsBigger;
double GEnd,NEnd;
double GStepVal;//NStepVal;
double AxisGVal,AxisNVal;
double fStVel;
double fDistToEnd;
fStVel=FVal/300000; //插补速度,单位为mm/st
DSM_Line(30,50,1000,10);//输入要插补直线的参数
fclose(fp);
return 0;
}
AxisGVal=AxisNVal=0;
fDeltaL=FVal*Ts/(60*1000); //一个插补周期内的合成增量,单位为毫米
fL=sqrt(XEnd*XEnd+YEnd*YEnd);
K=fDeltaL/fL;
//确定引导坐标和非引导坐标
if (fabs(XEnd>=fabs(YEnd)))
unsigned short Judge_Quadrant(double x, double y)
{
unsigned short nDir;
if (x>=0)
{ //象限判断
if (y>=0)
{
nDir=1;
return 1;
}
else
{
nDir=4;
return 4;
}
}
else
{
if (y>=0)
{
nDir=2;
return 2;
}
else
{
nDir=3;
return 3;
}
}
}
/********************************************************************/
/*函数名: DSM_Line*/
/*功能:数据采样法直线插补*/
/*参数:double XEnd, double YEnd插补终点mm*/
{
bXIsBigger=1;
GEnd=XEnd;
NEnd=YEnd;
}
else
{
bXIsBigger=0;
GEnd=YEnd;
NEnd=XEnd;
}
GStepVal=GEnd*K;
fDistToEnd=(AxisGVal-GEnd)*(AxisGVal-GEnd)+(AxisNVal-NEnd)*(AxisNVal-NEnd);
es=FT/2;
a=2*asin(FT/2/radius);//每个插补周期所超过的弦线对应的圆心角
xCur=xSt,yCur=ySt;
InsertPoint(xCur,yCur);
if(bIsCW==0)//逆圆插补
{
while(judge==1||full_circle==1)//终点判断
{
xCur1=xCur*cos(a)-yCur*sin(a);//三角函数圆弧插补的迭代公式
#include<stdlib.h>
#include<stdio.h>
/********************************************************************/
/*函数名: InsertPoint*/
/*功能:控制机床各轴进给并将进给结果写入文件中*/
printf("please input filename:\n");
scanf("%s",fn);
if((fp=fopen(fn,"w"))==NULL)
{
printf("can't open file\n");
exit(0);
}
//DSM_Circle(40,0,40,0,40,1000,10,1);//输入要插补圆弧的参数
/*参数:double x, double y插补点单位:毫米*/
/*说明:与机床硬件关联,每产生一个点调用一次*/
/********************************************************************/
void InsertPoint(double xCur,double yCur)
{
double FT,a,xCur,yCur,xCur1;
double es,xdir,ydcle=0,judge=1;
int ndir;
if(xSt==xEnd&ySt==yEnd)
full_circle=1;//整圆判断
FT=FVal*Ts/60/1000.0;
}
fDistToEnd=(AxisGVal-GEnd)*(AxisGVal-GEnd)+(AxisNVal-NEnd)*(AxisNVal-NEnd);
}
}
/********************************************************************/
/*函数名: DSM_Circle*/
//该函数在VC++6.0下编译测试通过,可实现直线、圆弧、完整圆的数据采样法插补;并可将插补函数计算出的数//据点写入xxx.txt文件中
//若有任何疑问,欢迎邮件联系,dingjiang90@
//版权所有,侵权必究。转载时请注明来自大连理工机械工程学院Deanjiang
#include<math.h>
/* bool bIsCW圆弧插补方向0或1*/
/********************************************************************/
void DSM_Circle(double xSt, double ySt, double xEnd, double yEnd,double radius, double FVal, int Ts, int bIsCW)
full_circle=0;
xdir=xCur-xEnd;
ydir=yCur-yEnd;
ndir=Judge_Quadrant(xdir,ydir);
switch(ndir)
{
case 1:judge=xdir>=es||ydir>=es;break;
case 2:judge=(-xdir)>=es||ydir>=es;break;
}
}
}
else//顺圆插补
{
while(judge==1||full_circle==1)//终点判断
{
xCur1=xCur*cos(a)+yCur*sin(a);//三角函数圆弧插补的迭代公式
yCur=yCur*cos(a)-xCur*sin(a);
xCur=xCur1;
InsertPoint(xCur,yCur);
{
extern FILE *fp;
char ch=10;
printf("xCur=%f,yCur=%f\n",xCur,yCur);
fprintf(fp,"%f,%f",xCur,yCur);
fputc(ch,fp);
}
/********************************************************************/
/*函数名: Judge_Quadrant*/
/*功能:判断参数坐标的所在象限并返回相应象限值*/
/*参数:double xmm*/
/*double ymm
*/
/********************************************************************/
/*功能:数据采样法圆弧插补*/
/*参数:double XStart, double YStart插补起点mm*/
/*double XEnd, double YEnd插补终点mm*/
/*double FVal插补速度mm/min*/
/* unsigned short Ts插补周期ms*/
/*double radius圆弧半径mm*/
case 3:judge=(-xdir)>=es||(-ydir)>=es;break;
case 4:judge=xdir>=es||(-ydir)>=es;break;
}
}
}
}
FILE *fp;//文件指针
int main()
{
double ft=1000.0*10/60/1000;
char fn[10];
while (fDistToEnd>(fDeltaL*fDeltaL/4))
{
AxisGVal+=GStepVal;
AxisNVal=AxisGVal*NEnd/GEnd;
if (bXIsBigger)
{
InsertPoint(AxisGVal,AxisNVal);
}
else
{
InsertPoint(AxisNVal,AxisGVal);
/*double FVal插补速度mm/min*/
/* unsigned short Ts插补周期ms*/
/********************************************************************/
void DSM_Line(double XEnd, double YEnd, double FVal, unsigned short Ts)
相关主题