求救编程高手,用matlab仿真直线插补的程序

求救编程高手,用matlab仿真直线插补的程序,第1张

%逐点比较法直线插补

%==========================================================================

F=0 %偏差函数

xs=0 %X起始坐标

ys=0 %Y起始坐标

xe=5 %X终点坐标

ye=6 %Y终点坐标

xo=xs %插补前X坐标

yo=ys %插补前Y坐标

xn=xs %插补后X坐标

yn=ys %插补后Y坐标

dx=1 %X脉冲当量

dy=1 %Y脉冲当量

TT=1 %插补周期

%==========================================================================

n=abs(xe-xs)+abs(ye-ys) %插补次数

plot([xs xe*dx],[ys ye*dy],'r-')hold ongrid on

%==========================================================================

while(n>0)

if(F>=0)

xn=xo+dx

yn=yo

plot([xo xn],[yo yn],'b-')hold ongrid on

xo=xnyo=yn

F=F-ye

else

yn=yo+dy

xn=xo

plot([xo xn],[yo yn],'b-')hold ongrid on

xo=xnyo=yn

F=F+xe

end

pause(TT)

n=n-1

end

这是我自己编的一个程序仿真通过,控制核心板是51单片机可以参考:

//第一象限顺弧

#include<reg51.h>

//#define xe 10 //终点横坐标

//#define ye 0 //终点纵坐标

//#define x0 10 //起点横坐标

//#define y0 0 //起点纵坐标

//#define R 10 //半径

void xzRotateStep() // X向走一步

void yzRotateStep() // -x向走一步

void xfRotateStep() // y向走一步

void yfRotateStep() // -y向走一步

void d1shun() //第一象限顺弧

void d4shun() //第二象限顺弧

void d3shun() //第三象限顺弧

void d2shun() //第四象限顺弧

int kx=0x01int ky=0x10//

/*延时函数*/

void display(int x)

{

int i,y

for(i=xi>0i--)

for(y=100y>0y--)

}

void main()

{

d1shun()

d4shun()

d3shun()

d2shun()

}

void d1shun()

{

int F,xi,yi,count // (xi,yi)为动点坐标,F为偏差值,count为计数值。

int k=0

int kx=

F=xi=0

yi=10

count=20

do{

if(F>=0)

{

yfRotateStep() //-y向走一步

F=F-2*yi+1

xi=xi

yi=yi-1

}

else

{

xzRotateStep() //+x向走一步

F=F+2*xi+1

xi=xi+1

yi=yi

}

count-- k++

P2=k

}

while(count) //计数为0?

}

void d4shun()

{

int F,xi,yi,count // (xi,yi)为动点坐标,F为偏差值,count为计数值。

int k=0

F=xi=10

yi=0

count=20

do{

if(F>=0)

{

xfRotateStep() //-x向走一步

F=F-2*xi+1

xi=xi-1

yi=yi

}

else

{

yfRotateStep() //-y向走一步

F=F+2*yi+1

xi=xi

yi=yi+1

}

count-- k++

P2=k

}

while(count) //计数为0?

}

void d3shun()

{

int F,xi,yi,count // (xi,yi)为动点坐标,F为偏差值,count为计数值。

int k=0

F=xi=0

yi=-10

count=20

do{

if(F>=0)

{

yzRotateStep() //+y向走一步

F=F-2*yi+1

xi=xi

yi=yi-1

}

else

{

xfRotateStep() //-x向走一步

F=F+2*xi+1

xi=xi+1

yi=yi

}

count-- k++

P2=k

}

while(count) //计数为0?

}

void d2shun()

{

int F,xi,yi,count // (xi,yi)为动点坐标,F为偏差值,count为计数值。

int k=0

F=xi=-10

yi=0

count=20

do{

if(F>=0)

{

xzRotateStep() //-x向走一步

F=F-2*xi+1

xi=xi-1

yi=yi

}

else

{

yfRotateStep() //-y向走一步

F=F+2*yi+1

xi=xi

yi=yi+1

}

count-- k++

P2=k

}

while(count) //计数为0?

}

void xzRotateStep()

{

int i

switch(kx)

{

case 0x01: kx=P1=0x02display(200)for(i=0i<20000i++)break

case 0x02: kx=P1=0x04display(200)for(i=0i<20000i++) break

case 0x04: kx=P1=0x01display(200)for(i=0i<20000i++) break

}

}

void xfRotateStep()

{

int i

switch(kx)

{

case 0x01: kx=P1=0x04display(200)for(i=0i<20000i++)break

case 0x04: kx=P1=0x02display(200)for(i=0i<20000i++) break

case 0x02: kx=P1=0x01display(200)for(i=0i<20000i++) break

}

}

void yzRotateStep()

{

int j

switch(ky)

{

case 0x10: ky=P1=0x20display(200)for(j=0j<20000j++)break

case 0x20: ky=P1=0x40display(200)for(j=0j<20000j++)break

case 0x40: ky=P1=0x10display(200)for(j=0j<20000j++)break

}

}

void yfRotateStep()

{

int j

switch(ky)

{

case 0x10: ky=P1=0x40display(200)for(j=0j<20000j++)break

case 0x40: ky=P1=0x20display(200)for(j=0j<20000j++)break

case 0x20: ky=P1=0x10display(200)for(j=0j<20000j++)break

}

}

可以使用FM357-2定位模块进行带直线插补和圆弧插补的编程,具体方法是:在PLC的CPU中调用功能块并启动含有插补指令的运动程序即可进行插补编程。

在用户程序执行阶段,可编程逻辑控制器总是按由上而下的顺序依次地扫描用户程序。在扫描每一条梯形图时,又总是先扫描梯形图左边的由各触点构成的控制线路。

并按先左后右、先上后下的顺序对由触点构成的控制线路进行逻辑运算,然后根据逻辑运算的结果,刷新该逻辑线圈在系统RAM存储区中对应位的状态;或者确定是否要执行该梯形图所规定的特殊功能指令。

扩展资料:

西门子PLC插补编程的原理:

数控车床的运动控制中,工作台X、Y、Z轴的最小移动单位是一个脉冲当量。因此,刀具的运动轨迹是具有极小台阶所组成的折线。

例如,用数控车床加工直线OA、曲线OB,刀具是沿X轴移动一步或几步,再沿Y轴方向移动一步或几步,直至到达目标点。从而合成所需的运动轨迹。

数控系统刀具半径补偿的含义是将刀具中心轨迹,沿着程编轨迹偏置一个距离,加工程序与刀具半径大小无关,它的功能是仅用一个程序就可以完成粗、精加工,或采用不同刀具直径加工时,可以不要重写加工程序。

参考资料来源:百度百科—西门子PLC

参考资料来源:百度百科—插补


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8069613.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存