逐点比较法第一象限直线圆弧插补

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档