逐点比较法第一象限直线圆弧插补
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
逐点比较法第一象限直线,圆弧插补编程
逐点比较法是以折线来逼近给定的轨迹,就是每走一步控制系统都要将加工点与给定的图形轨迹相比较,以决定下一步进给的方向,使之逼近加工轨迹。逐点比较法以折线来逼近直线或圆弧,其最大的偏差不超过一个最小设定单位。只要将脉冲当量取得足够小,就可以达到精度要求。逐点比较插补法在脉冲当量为0.01mm,系统进给速度小于3000mm/min时,能很好的满足要求。
一、逐点比较法直线插补
如下图所示设直线 oA 为第一象限的直线,起点为坐标原点o (0 , 0) ,
终点坐标为, A( ) , P() 为加工点。
若 P 点正好处在直线 oA 上,由相似三角形关系则有
即
点在直线 oA 上方 ( 严格为直线 oA 与 y 轴正向所包围的区域 ) ,则有
即
若 P 点在直线 oA 下方 ( 严格为直线 oA 与 x 轴正向所包围的区
域 ) ,则有图 3 — 1 逐点比较法第一象限直线插补
即
令
则有:
①如,则点 P 在直线 oA 上,既可向 +x 方向进给一步,也可向 +y 方向进给一步;
②如,则点 P 在直线 oA 上方,应向 +x 方向进给一步,以逼近oA 直线;
③如,则点 P 在直线 oA 下方,应向 +y 方向进给一步,以逼近 oA 直线一般将及视为一类情况,
即时,都向 +x 方向进给一步。
当两方向所走的步数与终点坐标相等时,停止插补。这即逐点比较法直线插补的原理。
对第一象限直线 oA 从起点 ( 即坐标原点 ) 出发,当 F 时, +x 向走一步;当 F<0 时,y 向走一步。
特点:每一步都需计算偏差,这样的计算比较麻烦。
递推的方法计算偏差:
每走一步后新的加工点的偏差用前一点的加工偏差递推出来。
采用递推方法,必须知道开始加工点的偏差,而开始加工点正是直线的起点,故。下面推导其递推公式。
设在加工点 P( ) 处,,则应沿 +x 方向进给一步,此时新加工点的坐标值为
新加工点的偏差为
即
若在加工点 P( ) 处,,则应沿 +y 方向进给一步,此时新加工点的坐标值为
,
新加工点的偏差为
即
综上所述,逐点比较法直线插补每走一步都要完成四个步骤 ( 节拍 ) ,即:
(1) 位置判别根据偏差值大于零、等于零、小于零确定当前加工点的位置。
(2) 坐标进给根据偏差值大于零、等于零、小于零确定沿哪个方向进给一步。
(3) 偏差计算根据递推公式算出新加工点的偏差值。
(4) 终点判别用来确定加工点是否到达终点。
若已到达,则应发出停机或转换新程序段信
号。一般用 x 和 y 坐标所要走的总步数 J
来判别。令 J= ,每走一步则 J 减 1 ,
直至 J=0 。
上图为第一象限直线插补程序框图
二、逐点比较法插补程序
#include "conio.h"
#include "graphics.h"
#include "process.h"
#define Ni_circle 0
#define Shun_circle 1
void init_graph();
void draw_Base_circle();
void draw_cabu_circle();
void close_graph();
void acrroods();
static float x0,y0;
void line_cabu(), draw_line(),draw_line_cabu();
void line_cabu() /*此函数控制直线插步两次*/ {
int i;
init_graph();
sleep(1);
for(i=0;i<2;i++)
{
line(0,120,300,120); outtextxy(310,120,"Z"); line(100,10,100,300); outtextxy(110,300,"X"); outtextxy(90,130,"O");
draw_line();
if(i==0)
draw_line_cabu(6);
else draw_line_cabu(2);
gotoxy(50,5);
getch();
cleardevice();
setcolor(WHITE);
}
}
void draw_line()/*画直线*/
{
line(100,120,600,450);
textcolor(YELLOW);
directvideo=0;
gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 "); gotoxy(45,6); cprintf("Line to :X500 Y0 Z330"); gotoxy(45,7); cprintf("Units :Pixel");
gotoxy(45,8); cprintf("Line now:");
}
void draw_line_cabu(int step)/*关键的直线插补函数*/ {
int Xe=600,Ye=450;
float Fm,Xm=100,Ym=120;
setcolor(RED);