;V1.3 KCN
; - однопроходное фрезерование внутренней
;   конической поверхности снизу вверх;
; - однопроходное резание внутренней резьбы
;   на конической поверхности снизу вверх
;   за один проход.
;==========================================
;(X)   - коорд.центра конуса X
 E40=PL1
;(Y)   - коорд.центра конуса Y
 E41=PL2
;(Z)   - высота над деталью
 E42=PL3
;(RFB) - радиус окружности конуса в основании
 E34=PL4
   E30=E34
   E80=E34
   E31=0
         ;E32 - радиус конуса в текущей точке
          E32=E34
;(K)   - координата основания конуса
 E51=PL5
;(H)   - высота конуса
 E57=PL6
 
;(а)   - угол конуса
 E33=PL7
; E33=ART(E57/E34)
;(d)   - шаг по высоте за 360 градусов
 E35=PL8
         ;дельта 
         E36=E35*(3.14159265*2)/360
E77=E57/E35
E78=E77-INT(E77)
;радиус верхнего основания конуса
E79=E34+E57/TAN(E33)

;(e)   - допустимое отклонение от окружности (мм)
 E38=PL9
;         E37=E57-E38

   ;расчет угла сегмента на основании заданной точности
   E39=ARC((E34-E38)/E34)*2
;
;(USF) - припуск вдоль боковой поверхности
 E43=PL10
;
;(USP) - припуск по глубине
 E44=PL11
;
;(QIL) - отклонение от размера начала работы 
 E45=PL12

;(F)   - рабочая подача по контуру
 E25=PL13

;(f)   - рабочая подача подхода к основанию конуса вдоль оси Z
 E26=PL14

;(q)   - направление обхода (=0-против ч.с.;=1-по ч.с.)
 E68=PL15
      
 (BEQ,E68,0,PROTV1)
   E39=NEG(E39)
   
   "PROTV1"

;(TOR)   - тип фрезы 0-концевая; 1-торовая (сферическая)
 E73=PL16
 ;по умолчанию G61 
 E2=61


              ;начальный угол для 1-ой точки поверхности на 1-ом сечении
E60=0
              ;текущая высота сечения конуса
E67=0
              ;координата для быстрого подхода к основанию конуса (за 1 мм до дна)
E75=E67+1


;Радиус фрезы
 E52=PL0
 E52=ABS(E52)

;если 1, то переход к расчету обработки торовой фрезой
(BEQ,E73,1,G60)

;===============================================================================
;=======================РЕЗЬБОВАЯ=ИЛИ=КОНЦЕВАЯ ФРЕЗА============================
;===============================================================================
(BNE,E36,0,WW)
 (DIS,"В корректоре не задан К фрезы")
 "WW"

   E34=E34-E52-E43
              ;ошибка1:фреза с учетом бокового припуска не помещается в отверстие     
(BLT,E34,0,ERR1)
   E30=E34
   E31=0
   E32=E34

;             ;координата опускания к основанию конуса RBF+K/2+QIL+USF вдоль оси X
E49=E34-E52-E45-E43
;ошибка2:фреза с учетом бокового припуска UCF и отклонения QIL не помещается в отверстие
;(BLT,E49,0,ERR2)
(BGT,E49,0,VV)
E49=0
"VV"

;----------- Выполнение цикла ---------
 (DPI,$PS1,$PS2)

 (UIO,$PS1E40,$PS2E41)
 G0 $PS1 $PS2
 G0 $PS3E42

                         ;координата основания вдоль оси Z+USP (с учетом припуска по глубине):
 E51=E51+E44+1
 (UIO,$PS3E51)
                         ;быстрое опускание по Z + 1мм
 G1$PS3E75 FE26
                         ;опускание по Z в 0 на рабочей подаче 
 G1$PS3E67 FE25
 G1 G27 $PS1E49 $PS2 FE25

                         ;расчет координаты на начальном угле E60
;X
E30=E32*COS(E60)
;Y
E31=E32*SIN(E60)

;     X       Y      Z
G1G27$PS1E30$PS2E31$PS3E67FE25
;==============================
"BEGIN"
                         ;расчет угла сегмента на основании заданной точности и изменения радиуса сечения конуса
                E90=E32-E52
                E39=ARC((E90-E38)/E90)*2
                (BEQ,E68,0,PROTV2)
                E39=NEG(E39)
        "PROTV2"
                E69=ABS(E39)
                         ;если угол сегмента больше 30, то угол сегмента =30 градусам
                (BGT,E69,40,10)
                (BNC,NEXT)
        "10"
                E39=40
                (BEQ,E68,0,PROTV3)
                E39=NEG(E39)
        "PROTV3"
        "NEXT"
E60=E60+E39
E50=ABS(E60)
E67=E36/(2*3.14159265)*E50
(BGT,E67,E57,BEGIN1)

E32=E34+E67/TAN(E33)

                         ;если радиус окружности меньше точности окружности, то "1"
(BLT,E32,E38,1)
                         ;если радиус окружности меньше 0, то "1"
(BLT,E32,0,1)

E30=E32*COS(E60)
E31=E32*SIN(E60)
                         ;координата текущей точки на поверхности фигуры
G1$PS1E30$PS2E31$PS3E67
;
(BNC,BEGIN)

;последний кадр профиля конуса========
"BEGIN1"
;против ч.с
E60=E57/E35*360
                (BEQ,E68,0,PROT2)
E60=NEG(E60)
"PROT2"
E32=E79-E52-E43
E30=E32*COS(E60)
E31=E32*SIN(E60)
E67=E57
G1$PS1E30$PS2E31$PS3E67
 E51=NEG(E51)
 (UIO,$PS3E51)
 G0 $PS1E49 $PS2
    $PS3E42
 E40=NEG(E40)
 E41=NEG(E41)
 (UIO,$PS1E40,$PS2E41)
;--------- КОНЕЦ ---------------
(BNC,END)
;=========================================================================
;=========================================================================
;=========================================================================
;===========================ТОРОВАЯ ФРЕЗА=================================
;=========================================================================
;=========================================================================
"G60"
;G61/G62/G60==============================================================
(BNE,E36,0,WWW)
 (DIS,"В корректоре не задан К фрезы")
 "WWW"

   E34=E34-E43
   E74=E34-E52-E43
              ;ошибка1:фреза с учетом бокового припуска не помещается в отверстие     
(BLT,E74,0,ERR1)
   E30=E34
   E31=0
   E32=E34

;             ;координата опускания к основанию конуса RBF+K/2+QIL+USF вдоль оси X
E49=E34-E52-E45-E43
;ошибка2:фреза с учетом бокового припуска UCF и отклонения QIL не помещается в отверстие
;(BLT,E49,0,ERR2)
(BGT,E49,0,VVV)
E49=0
"VVV"

;----------- Выполнение цикла ---------
 (DPI,$PS1,$PS2)

 (UIO,$PS1E40,$PS2E41)
 G0 $PS1 $PS2
 G0 $PS3E42
                    ;координата основания вдоль оси Z+USP (с учетом припуска по глубине):
 E51=E51+E44+1
 (UIO,$PS3E51)
                         ;быстрое опускание по Z + 1мм
; G1$PS3E75 FE26
M00

;X
E30=0
;Y
E31=0
;Z
E75=PL0
;I
E70=0
;J
E71=0
;K
E72=1
 G1 G27 $PS1E30 $PS2E31 $PS3E75 FE26
                         ;опускание по Z в 0 на рабочей подаче 
; G1 G27 GE2 $PS1E30 $PS2E31 $PS3E67 IE70 JE71 KE72 FE25



E60=0
E32=E34-E43
                         ;расчет координаты на начальном угле E60
;X
E30=E32*COS(E60)
;Y
E31=E32*SIN(E60)
;I
E70=-1*E30/SQR(E30*E30+E31*E31)
;J
E71=-1*E31/SQR(E30*E30+E31*E31)
;K
E72=1

G1G27GE2 $PS1E30 $PS2E46 $PS3E67 IE70 JE71 KE72 FE25

;==============================
"BEG60"

                         ;расчет угла сегмента на основании заданной точности и изменения радиуса сечения конуса
                E90=E32-E52
                E39=ARC((E90-E38)/E90)*2
                (BEQ,E68,0,PRO2)
                E39=NEG(E39)
        "PRO2"
                E69=ABS(E39)
                         ;если угол сегмента больше 30, то угол сегмента =30 градусам
                (BGT,E69,40,100)
                (BNC,NEXT1)
        "100"
                E39=40
                (BEQ,E68,0,PRO3)
                E39=NEG(E39)
        "PRO3"
        "NEXT1"
E60=E60+E39
E50=ABS(E60)
E67=E36/(2*3.14159265)*E50
(BGT,E67,E57,BEGIN2)

E32=E34+E67/TAN(E33)
                         ;если радиус окружности меньше точности окружности, то "1"
(BLT,E32,E38,160)

(BLT,E32,0,160)

;X
E30=E32*COS(E60)
;Y
E31=E32*SIN(E60)
;I
E70=-1*E30/SQR(E30*E30+E31*E31)
;J
E71=-1*E31/SQR(E30*E30+E31*E31)
;K
E72=1
                         ;координата текущей точки на поверхности конуса
G1$PS1E30$PS2E31$PS3E67IE70JE71KE72
(BNC,BEG60)

;последний кадр профиля конуса========
"BEGIN2"
;против ч.с
E60=E57/E35*360
                (BEQ,E68,0,PROTI2)
E60=NEG(E60)
"PROTI2"

E32=E79-E43
;X
E30=E32*COS(E60)
;Y
E31=E32*SIN(E60)
;I
E70=-1*E30/SQR(E30*E30+E31*E31)
;J
E71=-1*E31/SQR(E30*E30+E31*E31)
;Z
E67=E57
;K
E72=1
                         ;координата последней точки на поверхности конуса
G1$PS1E30$PS2E31$PS3E67IE70JE71KE72
 E51=NEG(E51)
 (UIO,$PS3E51)
 G0 G60 G90 $PS1E49 $PS2
    $PS3E42

 E40=NEG(E40)
 E41=NEG(E41)
 (UIO,$PS1E40,$PS2E41)

(BNC,END)
;--------- КОНЕЦ ---------------
"ERR1"
(DIS,"K>основания конуса+USF")
"ERR2"
(DIS,"K>основания конуса+USF+QIL")
"1"
"END"