⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.c

📁 激光加工控制系统 可以读入plt文件
💻 C
📖 第 1 页 / 共 2 页
字号:
      buf[i] = 0;
    }
    e_x = atof(&(buf[b_p+1]));
    e_x -= o_x;
    buf[i] = chbak;
    i = b_p + 1;
    while ((buf[i] != 'Y')&&(buf[i] != 0))
      i ++;
    if (buf[i] == 'Y'){
      j = b_p + 1;
      while ((buf[j] != 'I')&&(buf[j] != 'J')&&(buf[i] != 0))
	j ++;
      if (buf[j] != 0){
	chbak = buf[j];
	buf[j] = 0;
      }
      e_y = atof(&(buf[i+1]));
      e_y -= o_y;
      buf[j] = chbak;
    }
    else{
      e_y = b_y;
    }
  }
  else{
    e_x = b_x;
    e_y = atof(&(buf[b_p+1]));
    e_y -= o_y;
  }

  i = b_p + 1;
  while ((buf[i] != 'I')&&(buf[i] != 0))
    i ++;
  if (buf[i] == 'I'){
    j = b_p + 1;
    while ((buf[j] != 'J')&&(buf[i] != 0))
      j ++;
    if (buf[j] != 0){
      chbak = buf[j];
      buf[j] = 0;
    }
    I = atof(&(buf[i+1]));
    buf[j] = chbak;
  }
  else
    I = oldi;

  i = b_p + 1;
  while ((buf[i] != 'J')&&(buf[i] != 0))
    i ++;
  if (buf[i] == 'J'){
    J = atof(&(buf[i+1]));
  }
  else
    J = oldj;

  cx = I + b_x;
  cy = J + b_y;

  r = sqrt((b_x-cx)*(b_x-cx)+(b_y-cy)*(b_y-cy));

  ba = count_angle(cx,cy,b_x,b_y);
  ea = count_angle(cx,cy,e_x,e_y);
  an = ba;
  if (ba > ea){
    len = r*(ba-ea);
  }
  else{
    len = r*(ba + 2*PI - ea);
  }
  if (type == 3)     // 2 clock wise
    len = r*2*PI - len;  // 3 anti clock wise
  if ((fabs(ba-ea) < 0.0001) || (fabs(fabs(ba-ea)-2*PI) < 0.0001))
    len = r*2*PI;
  num = len;
  if (num > 0){
    for (i=0;i<num;i++){
      step_len = len/num;
      step_an = step_len / r;
      if (type == 3){  // anti clock wise
	n_an = ba + (i+1)*step_an;
      }
      else{
	n_an = ba - (i+1)*step_an;
      }
      n_x = cx + r*cos(n_an);
      n_y = cy + r*sin(n_an);
      fprintf(t_fpe,"G01X%fY%f\n",n_x,n_y);
    }
  }
  else{
      fprintf(t_fpe,"G01X%fY%f\n",e_x,e_y);
  }
  oldx = e_x;
  oldy = e_y;
}

float count_angle(float x0, float y0, float x1, float y1)
{
  float a;

  if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0) < 1e-8)
    return 0;
  a = acos((x1-x0)/sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)));
  if (y1 < y0)
    a = 2*PI - a;
  return a;
}

recover_data()
{
  int i;

  xmaxv = xmaxv3;
  ymaxv = ymaxv3;
//  test_dog();
  zmaxv = zmaxv3;
  xmaxa = xmaxa3;
  ymaxa = ymaxa3;
  zmaxa = zmaxa3;
  xmaxv1 = xmaxv;               // Max Speed units(G CODE) per danwei
  ymaxv1 = ymaxv;
  x_once_max_v_pulses = xmaxv*xsteps*interval/(1000.0);
  y_once_max_v_pulses = ymaxv*ysteps*interval/(1000.0);
  if (danwei == MINUTES){
    x_once_max_v_pulses /= 60.0;
    y_once_max_v_pulses /= 60.0;
  }
  x_times = x_once_max_v_pulses/x_once_max_a_pulses;
  if (x_times > 1)
    x_once_max_v_pulses = x_once_max_a_pulses*x_times;
  x_len_to_acc = 0;
  for (i=0;i<x_times;i++){
    x_len_to_acc += (i+1)*x_once_max_a_pulses;
  }
  y_times = y_once_max_v_pulses/y_once_max_a_pulses;
  if (y_times > 1)
    y_once_max_v_pulses = y_once_max_a_pulses*y_times;
  y_len_to_acc = 0;
  for (i=0;i<y_times;i++){
    y_len_to_acc += (i+1)*y_once_max_a_pulses;
  }
}

set_data()
{
  int i;

  xmaxv3 = xmaxv;
  ymaxv3 = ymaxv;
  zmaxv3 = zmaxv;
  xmaxa3 = xmaxa;
  ymaxa3 = ymaxa;
  zmaxa3 = zmaxa;
  xmaxv = xmaxv2;
  ymaxv = ymaxv2;
  zmaxv = zmaxv2;
  xmaxa = xmaxa2;
  ymaxa = ymaxa2;
  zmaxa = zmaxa2;
  xmaxv1 = xmaxv;               // Max Speed units(G CODE) per danwei
  ymaxv1 = ymaxv;
  x_once_max_v_pulses = xmaxv*xsteps*interval/(1000.0);
  y_once_max_v_pulses = ymaxv*ysteps*interval/(1000.0);
  if (danwei == MINUTES){
    x_once_max_v_pulses /= 60.0;
    y_once_max_v_pulses /= 60.0;
  }
  x_times = x_once_max_v_pulses/x_once_max_a_pulses;
  if (x_times > 1)
    x_once_max_v_pulses = x_once_max_a_pulses*x_times;
  x_len_to_acc = 0;
  for (i=0;i<x_times;i++){
    x_len_to_acc += (i+1)*x_once_max_a_pulses;
  }
  y_times = y_once_max_v_pulses/y_once_max_a_pulses;
  if (y_times > 1)
    y_once_max_v_pulses = y_once_max_a_pulses*y_times;
  y_len_to_acc = 0;
  for (i=0;i<y_times;i++){
    y_len_to_acc += (i+1)*y_once_max_a_pulses;
  }
}

trans_line(int b_p,FILE *to_file)
{
  int i;

  fprintf(to_file,"%s\n",buf);
  b[0] = oldx;
  b[1] = oldy;
  if (buf[b_p] == 'X'){
    e[0] = atof(&(buf[b_p+1]));
    e[0] -= o_x;
    i = b_p + 1;
    while ((buf[i] != 'Y')&&(buf[i] != 0))
      i ++;
    if (buf[i] == 'Y'){
      e[1] = atof(&(buf[i+1]));
      e[1] -= o_y;
    }
    else{
      e[1] = b[1];
    }
  }
  else{
    e[0] = b[0];
    e[1] = atof(&(buf[b_p+1]));
    e[1] -= o_y;
  }

  oldx = e[0];
  oldy = e[1];
}

proc_line(int b_p,FILE *to_file)
{
  int i,j,flag;
  int a_times,times[2];
  int s,v,r_p,a_s_ps,max_times;
  int a,num,p,half_ps,k,m;
  long all_ps,run_ps,ps[2],ll;
  int left,aver_add,left_add,type;
  float l1,l2,l3,an;
  double df;
  float b_x,e_x,b_y,e_y,n_x,n_y;

  vmax = x_once_max_v_pulses;
  b[0] = x_ps/xsteps;
  b[1] = y_ps/ysteps;
  bb_x = x_ps;
  bb_y = y_ps;
  if (buf[b_p] == 'X'){
    e[0] = atof(&(buf[b_p+1]));
    e[0] -= o_x;
    i = b_p + 1;
    while ((buf[i] != 'Y')&&(buf[i] != 0))
      i ++;
    if (buf[i] == 'Y'){
      e[1] = atof(&(buf[i+1]));
      e[1] -= o_y;
    }
    else{
      e[1] = b[1];
    }
  }
  else{
    e[0] = b[0];
    e[1] = atof(&(buf[b_p+1]));
    e[1] -= o_y;
  }

  if (fabs(e[0]-b[0]) + fabs(e[1]-b[1]) < 0.0001)
    return -1;
  if (fabs(e[0]) + fabs(e[1]) < 0.0001)
    i = 0;
  oldx = b[0];
  oldy = b[1];

  b_x = b[0];  b_y = b[1];  e_x = e[0];  e_y = e[1];

  flag = 0;
  i = 0;
  while ((nbuf[i] != 'G')&&(nbuf[i] != 0))
    i ++;
  if (nbuf[i] == 0)
    flag = 1;
  else{
    type = atoi(&(nbuf[i+1]));
    if (type == 1){
      i = 0;
      while ((nbuf[i] != 'X')&&(nbuf[i] != 0))
	i ++;
      if (nbuf[i] == 0){
	n_x = e[0];
      }
      else{
	n_x = atof(&(nbuf[i+1]));
	n_x -= o_x;
      }
      i = 0;
      while ((nbuf[i] != 'Y')&&(nbuf[i] != 0))
	i ++;
      if (nbuf[i] == 0){
	n_y = e[1];
      }
      else{
	n_y = atof(&(nbuf[i+1]));
	n_y -= o_y;
      }

      df = ((e_x-b_x)*(e_x-b_x));
      df += ((e_y-b_y)*(e_y-b_y));
      l1 = sqrt(df);
      df = (n_x-e_x)*(n_x-e_x);
      df += (n_y-e_y)*(n_y-e_y);
      l2 = sqrt(df);
      df = (n_x-b_x)*(n_x-b_x);
      df += (n_y-b_y)*(n_y-b_y);
      l3 = sqrt(df);

      if (fabs(l3-l1-l2) < 0.001){
	an = PI;
      }
      else
	an = acos((l1*l1+l2*l2-l3*l3)/(2*l1*l2));

      if (an < 5*PI/8)
	flag = 1;
    }
    else
     flag = 1;
  }

  if (sub_flag == 1)
    add_flag = 1;
  else
    add_flag = 0;
  if (flag == 1)
    sub_flag = 1;
  else
    sub_flag = 0;

  if (fabs(e_x)+fabs(e_y) < 0.001)
    i = 0;
  pulses_per_unit[0] = xsteps;
  pulses_per_unit[1] = ysteps;
  times[0] = times[1] = 0;
  for (i=0;i<2;i++){
    all_ps = fabs(e[i] - b[i])*pulses_per_unit[i];
    ps[i] = all_ps;
  }

  ll = 0;
  p = 0;
  for (i=0;i<2;i++){
    if (ll < ps[i]){
      ll = ps[i];
      p = i;
    }
  }

  i = p;
  flag = 0;
  df = (e[0]-b[0])*(e[0]-b[0]);
  df += (e[1]-b[1])*(e[1]-b[1]);
  df = sqrt(df);
  r_p = vmax*fabs(e[i]-b[i])/df;
  all_ps = fabs(e[i] - b[i])*pulses_per_unit[i];

  s = 0;
  v = 0;
  a = acc[i];
  a_times = 0;
  while (flag == 0){
    if (v+a > r_p)
      flag = 1;
    else{
      v += a;
      s += v;
      a_buf[a_times] = v;
      a_times ++;
    }
  }

  a_s_ps = 0;
  if (add_flag == 1)
    a_s_ps += s;
  if (sub_flag == 1)
    a_s_ps += s;
  if (all_ps > a_s_ps + 4*r_p){
    a_s_ps = 0;
    if (add_flag == 1){
      for (j=0;j<a_times;j++){
	putxy(i,a_buf[j]);
      }
      a_s_ps += s;
    }
    if (sub_flag == 1){
      a_s_ps += s;
    }

    run_ps = all_ps - a_s_ps;
    if (r_p == 0){
      putxy(i,all_ps);
    }
    else{
      num = run_ps / r_p;
      left = run_ps % r_p;
      aver_add = left / num;
      left_add = left % num;
      for (j=0;j<num;j++){
	if (j < left_add)
	  putxy(i,r_p + aver_add + 1);
	else
	  putxy(i,r_p + aver_add);
      }

      if (sub_flag == 1){
	for (j=a_times-1;j>=0;j--){
	  putxy(i,a_buf[j]);
	}
      }
    }
  }
  else if ((add_flag == 1)||(sub_flag == 1)){
    if ((add_flag == 1)&&(sub_flag == 1)){
      half_ps = all_ps / 2;
      if (half_ps > s){
	left = half_ps - s;
	num = left / r_p;
	left_add = left % r_p;
	k = 0;
	for (j=0;j<a_times;j++){
	  if (j == 0){
	    if (left_add < a_buf[0]){
	      putxy(i,left_add);
	      b_buf[k++] = left_add;
	    }
	    putxy(i,a_buf[j]);
	    b_buf[k++] = a_buf[j];
	  }
	  else if (j == a_times-1){
	    putxy(i,a_buf[j]);
	    b_buf[k++] = a_buf[j];
	    if (left_add >= a_buf[j]){
	      putxy(i,left_add);
	      b_buf[k++] = left_add;
	    }
	  }
	  else if ((left_add > a_buf[j-1]) && (left_add < a_buf[j])){
	    putxy(i,left_add);
	    b_buf[k++] = left_add;
	    putxy(i,a_buf[j]);
	    b_buf[k++] = a_buf[j];
	  }
	  else{
	    putxy(i,a_buf[j]);
	    b_buf[k++] = a_buf[j];
	  }
	}

	for (m=k-1;m>=0;m--){
	  if (m == 0){
	    if (all_ps % 2 == 1)
	      putxy(i,b_buf[m]+1);
	    else
	      putxy(i,b_buf[m]);
	  }
	  else
	    putxy(i,b_buf[m]);
	}
      }
      else{
	m = 0;
	k = 0;
	flag = 0;
	while (flag == 0){
	  if (m + a_buf[k] > half_ps){
	    flag = 1;
	  }
	  else{
	    m += a_buf[k];
	    k ++;
	  }
	}
	left = half_ps - m;
	if (k == 0){
	  putxy(i,all_ps);
	}
	else{
	  aver_add = left / k;
	  left_add = left % k;
	  m = 0;
	  for (j=0;j<k;j++){
	    if (j < left_add){
	      putxy(i,a_buf[j]+aver_add+1);
	      b_buf[m++] = a_buf[j]+aver_add+1;
	    }
	    else{
	      putxy(i,a_buf[j]+aver_add);
	      b_buf[m++] = a_buf[j]+aver_add;
	    }
	  }

	  for (k=m-1;k>=0;k--){
	    if (k == 0){
	      if (all_ps % 2 == 1)
		putxy(i,b_buf[k]+1);
	      else
		putxy(i,b_buf[k]);
	    }
	    else
	      putxy(i,b_buf[k]);
	  }
	}
      }
    }
    else if ((add_flag == 1)&&(sub_flag == 0)){
      if (all_ps > s){
	left = all_ps - s;
	num = left / r_p;
	left = left % r_p;
	if (a_times == 0){
	  putxy(i,left);
	  for (j=0;j<num;j++)
	    putxy(i,r_p);
	}
	else{
	  aver_add = left / a_times;
	  left_add = left % a_times;
	  for (j=0;j<a_times;j++){
	    if (j < left_add)
	      putxy(i,a_buf[j]+aver_add+1);
	    else
	      putxy(i,a_buf[j]+aver_add);
	  }
	  for (j=0;j<num;j++)
	    putxy(i,r_p);
	}
      }
      else{
	m = 0;
	k = 0;
	flag = 0;
	while (flag == 0){
	  if (m + a_buf[k] > all_ps){
	    flag = 1;
	  }
	  else{
	    m += a_buf[k];
	    k ++;
	  }
	}
	left = all_ps - m;
	if (k == 0){
	  putxy(i,all_ps);
	}
	else{
	  aver_add = left / k;
	  left_add = left % k;
	  m = 0;
	  for (j=0;j<k;j++){
	    if (j < left_add)
	      putxy(i,a_buf[j]+aver_add+1);
	    else
	      putxy(i,a_buf[j]+aver_add);
	  }
	}
      }
    }
    else if ((add_flag == 0)&&(sub_flag == 1)){
      if (all_ps > s){
	left = all_ps - s;
	num = left / r_p;
	left = left % r_p;
	if (a_times == 0){
	  for (j=0;j<num;j++)
	    putxy(i,r_p);
	  putxy(i,left);
	}
	else{
	  aver_add = left / a_times;
	  left_add = left % a_times;
	  for (j=0;j<num;j++)
	    putxy(i,r_p);
	  for (j=a_times-1;j>0;j--){
	    if (j < left_add)
	      putxy(i,a_buf[j]+aver_add+1);
	    else
	      putxy(i,a_buf[j]+aver_add);
	  }
	}
      }
      else{
	m = 0;
	k = 0;
	flag = 0;
	while (flag == 0){
	  if (m + a_buf[k] > all_ps){
	    flag = 1;
	  }
	  else{
	    m += a_buf[k];
	    k ++;
	  }
	}
	left = all_ps - m;
	if (k == 0){
	  putxy(i,all_ps);
	}
	else{
	  aver_add = left / k;
	  left_add = left % k;
	  m = 0;
	  for (j=k-1;j>=0;j--){
	    if (j < left_add)
	      putxy(i,a_buf[j]+aver_add+1);
	    else
	      putxy(i,a_buf[j]+aver_add);
	  }
	}
      }

    }
  }
  else{
    if (r_p == 0){
      putxy(i,all_ps);
    }
    else{
      num = all_ps / r_p;
      left = all_ps % r_p;
      if (num == 0){
	putxy(i,all_ps);
      }
      else{
	aver_add = left / num;
	left_add = left % num;
	for (j=0;j<num;j++){
	  if (j < left_add)
	    putxy(i,r_p + aver_add + 1);
	  else
	    putxy(i,r_p + aver_add);
	}
      }
    }
  }
  if (sub_flag == 1){
    putxy(i,0);
  }
  return 1;
}


put1()
{
  int i;

  strcpy(buf1,"P");
  itoa(x,buf2,10);
  strcat(buf1,buf2);
  itoa(y,buf2,10);
  strcat(buf1," ");
  strcat(buf1,buf2);
  put_a_line(to_file,buf1);
  x_ps += x;
  y_ps += y;
}

putxy(int i,int num)
{
  if (i == 0){
    x = num;
    if (e[0] < b[0])
      x = -x;
    y = bb_y+(x_ps+x-bb_x)*(e[1]-b[1])/(e[0]-b[0])-y_ps;
  }
  if (i == 1){
    y = num;
    if (e[1] < b[1])
      y = -y;
    x = bb_x+(y_ps+y-bb_y)*(e[0]-b[0])/(e[1]-b[1])-x_ps;
  }
  put1();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -