fn)){
f=fn; P[i].feed=f;
feed_convert(f,0,new_feed);
replace_word(P[i].kadr,'F',new_feed);
error=otkat(i);
if(error) exit(0);
}
/*************************************************/
if (move==1)
{
if (new_move)
{
if (fn > SPEED_LIMIT )
{
/* При круговой интерполяции вектор скорости направлен по касательной
к дуге окружности */
if(IJKcurr){
if(strcmp(PLANE,"XY")==0) tangent(fabs(I)-fabs(x),fabs(J)-fabs(y),&x,&y);
else if(strcmp(PLANE,"XZ")==0) tangent(fabs(I)-fabs(x),fabs(K)-fabs(z),&x,&z);
else if(strcmp(PLANE,"YZ")==0) tangent(fabs(J)-fabs(y),fabs(K)-fabs(z),&y,&z);
/* {x,y,z} - касательная к дуге в ее конечной точке */
}
if(IJKnext){
if(strstr(next,"G02")!=NULL) G=2;
else if(strstr(next,"G03")!=NULL) G=3;
if(strcmp(PLANE,"XY")==0) tangent(In,Jn,&xn,&yn);
else if(strcmp(PLANE,"XZ")==0) tangent(In,Kn,&xn,&zn);
else if(strcmp(PLANE,"YZ")==0) tangent(Jn,Kn,&yn,&zn);
/* {x,y,z} - касательная к дуге в ее начальной точке */
}
/* Косинус угла между векторами скоростей {x,y,z} и {xn,yn,zn} */
CosA=(x*xn+y*yn+z*zn)/sqrt(x*x+y*y+z*z)/sqrt(xn*xn+yn*yn+zn*zn);
if( CosA!=1 )
{
/* Максимально допустимая скорость для такого угла */
if(SPEED_LIMIT==0)
if(CosA==-1)FA=0;
else FA=2/(1-CosA);
else FA=SPEED_LIMIT*2/(1-CosA);
/* При необходимости вставить промежуточный кадр с
подачей, установить флаг mode=1 */
if ( (FA < fn) && ( FA < f ) ) mode=1;
}
}
}
else /* new_move==0 */
/* При необходимости вставить промежуточный кадр с
нулевой подачей, установить флаг mode=2 */
if(new_feed_set==0)
mode=2;
} /* end of if(move==1) */
/* Если требуется для кадра next при следующем обращении
к функции analiz повторить подачу предыдущего перемещения,
то установить флаг mode=3 */
if(move==0 && new_move==1 && new_feed_set==0) mode=3;
/* Если в текущем кадре нужно вывести подачу */
if (feed_set)
{
if(f ) { feed_convert(f,0,new_feed);
replace_word(P[i].kadr,'F',new_feed);
}
else replace_word(P[i].kadr,'F',"0000");
}
/* Вставить в очередь Р промежуточный кадр с подачей FA */
if(mode==1){ f1=(int)FA;
feed_convert(f1,0,new_feed);
strcpy(str,"N000F");
strcat(str,strcat(new_feed,"\n"));
/*************************************************/
/*Торможение можно производить только в кадрах с линейной
интерполяцией*/
if(IJKcurr) {
P[i].feed=f1;
feed_convert(f1,0,new_feed);
replace_word(P[i].kadr,'F',new_feed);
}
else {
/*************************************************/
i=i+1;
strcpy(P[i].kadr,str);
P[i].feed=f1;
P[i].span=0;
/* При необходимости скорректировать
подачи предыдущих кадров */
}
error=otkat(i);
if(error) exit(0);
}
/* Вставить в очередь промежуточный кадр с нулевой подачей */
if(mode==2) {i=i+1;
strcpy(P[i].kadr,"N000F0000\n");
P[i].feed=0;
P[i].span=0;
/* При необходимости скорректировать подачи
предыдущих кадров */
error=otkat(i);
if(error) exit(0);
mode=0;}
}
/* Эта функция осуществляет анализ величины перемещения
предыдущего кадра. Если это перемещение недостаточно
для торможения до скорости текущего кадра, то подача
предыдущего кадра заменяется на меньшую, и осуществля-
ется откат на один кадр назад и аналогичная проверка */
int otkat(int j)
{
float f;
int f1,jj;
char new_feed[10];
char word[50];
if(j==0) return 0;
jj=j;
while((j>0) && (P[j].feed>\n");*/
printf("\nСлишком маленькая подача в кадре:\n%s%s\n",
P[jj-1].kadr,P[jj].kadr);
printf("\nСтанок не успевает затормозиться в предыдущих 18-и кадрах.\n\
Скорректируйте исходную программу.\n\n<< << Нажмите любую клавишу >> >>\n");
return 1;
}
else return 0;
}
/* Эта функция удаляет из кадра подачу */
void feed_del(char *kadr)
{
char ch;
char str[20];
int i=0,j=0;
ch=*kadr;
do
{
ch=*(kadr+j);
if(ch=='F') {j=j+5;continue;}
str[i++]=ch;
j++;
} while(ch!='\0');
strcpy(kadr,str);
}
/* Нахождение касательной {x,y} к дуге, заданной координатами x,y,i,j,
в начальной точке дуги */
void tangent(float i,float j,float *x,float *y)
{
/* Дуга в первой четверти, движение по ч.с. */
if((*x>0) && (*y<0) && (G==2))
{*x=fabs(j); *y=-fabs(i);}
/* Дуга в первой четверти, движение против ч.с. */
else if((*x<0) && (*y>0) && (G==3))
{*x=-fabs(j); *y=fabs(i);}
/* Дуга во второй четверти, движение по ч.с. */
else if((*x>0) && (*y>0) && (G==2))
{*x=fabs(j); *y=fabs(i);}
/* Дуга во второй четверти, движение против ч.с. */
else if((*x<0) && (*y<0) && (G==3))
{*x=-fabs(j); *y=-fabs(i);}
/* Дуга в третьей четверти, движение по ч.c. */
else if((*x<0) && (*y>0) && (G==2))
{*x=-fabs(j); *y=fabs(i);}
/* Дуга в третьей четверти, движение против ч.с. */
else if((*x>0) && (*y<0) && (G==3))
{*x=fabs(j); *y=-fabs(i);}
/* Дуга в четвертой четверти, движение по ч.c. */
else if((*x<0) && (*y<0) && (G==2))
{*x=-fabs(j); *y=-fabs(i);}
/* Дуга в четвертой четверти, движение против ч.с. */
else if((*x>0) && (*y>0) && (G==3))
{*x=fabs(j); *y=fabs(i);}
}