;V1.3 KCV - однопроходное внешнее фрезерование конуса
;           по винтовой линии
;           концевой или торовой (сферической) фрезой
;==========================================
;(X)   - коорд.центра конуса X
 E40=PL1
;(Y)   - коорд.центра конуса Y
 E41=PL2
;(Z)   - высота над деталью
 E42=PL3
;(RFB) - радиус окружности конуса в основании
 E34=PL4
   E30=E34
   E31=0
   E32=E34
;(K)   - координата основания конуса
 E51=PL5
;(H)   - высота конуса
 E57=PL6

;(а)   - угол конуса
 E33=PL7
; E33=ART(E57/E34)
;(d)   - шаг по высоте за 360 градусов
 E35=PL8
   E36=E35*(3.14159265*2)/360
   E37=E57-E36

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

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

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

;(q)   - направление обхода
 E68=PL15
   E1=42
   E4=2
   (BEQ,E68,0,PROTV1)
   E39=NEG(E39)
   E1=41
   E4=3
   "PROTV1"

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

;Радиус фрезы
 E52=PL0
 E52=ABS(E52)
(BNE,E36,0,WW)
 (DIS,"В корректоре не задан К фрезы")
 "WW"
   E34=E34+E52+E43
   E30=E34
   E31=0
   E32=E34

                         ;начальный угол для 1-ой точки поверхности на 1-ом сечении
E60=0
                         ;текущая высота сечения конуса
E67=0
;                        ;координата опускания к основанию конуса RBF+K/2+QIL+USF вдоль оси X
E49=E34+E52+E45+E43

                         ;радиус отхода инструмента от поверхности
E95=10
E70=0
E71=0
E72=0

(BEQ,E73,1,G60)
;G41/G42/G40================================
;----------- Выполнение цикла ---------
 (DPI,$PS1,$PS2)

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

E30=E32*COS(E60)
E31=E32*SIN(E60)
E46=-0.5
   (BEQ,E68,0,PROTV4)
   E46=0.5
   "PROTV4"

G1G27$PS1E30$PS2E46$PS3E67F1000
;E25
;==============================
"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
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
(BLT,E67,E37,BEGIN)
"1"
E67=E57
E60=E60+E39
E50=ABS(E60)
E32=E34-E67/TAN(E33)
(BEQ,E32,0,E32E0)
;K
E72=E34/SQR(E34*E34+E57*E57)
;I
E70=E30/E32*SQR(1-E72*E72)
;J
E71=E31/E32*SQR(1-E72*E72)
E74=ART(E71/E70)
"E32E0"
E30=E32*COS(E60)
E31=E32*SIN(E60)
G1G40$PS1E30$PS2E31$PS3E67
;===============================
(BLT,E70,0,XN1)
(BLT,E71,0,KV4)
(BNC,KV1)
"KV4"
E74=360+E74
(BNC,KV5)
"KV1"
E74=E74
(BNC,KV5)
"XN1"
(BLT,E71,0,KV3)
(BNC,KV2)
"KV3"
E74=180+E74
(BNC,KV5)
"KV2"
E74=180+E74
"KV5"
E100=(E95+2*E52)*COS(E74)
E101=(E95+2*E52)*SIN(E74)
E102=(E95+2*E52)/2*COS(E74)
E103=(E95+2*E52)/2*SIN(E74)
GE4G91XE100YE101IE102JE103
G0G90

 E51=NEG(E51)
 (UIO,$PS3E51)
 G0 $PS3E42
    $PS1E49 $PS2

 E40=NEG(E40)
 E41=NEG(E41)
 (UIO,$PS1E40,$PS2E41)
;--------- КОНЕЦ ---------------
(BNC,END)
;=========================================================================
"G60"
;G61/G62/G60==============================================================
;----------- Выполнение цикла ---------
 (DPI,$PS1,$PS2)

 (UIO,$PS1E40,$PS2E41)
 G0 G90 $PS1E49 $PS2
        $PS3E42
;координата основания вдоль оси Z+USP (с учетом припуска по глубине):
E51=E51+E44
 (UIO,$PS3E51)
 G1 $PS3E67FE26
E32=E32+E43
E34=E34+E43

;X
E30=E32*COS(E60)
;Y
E31=E32*SIN(E60)
;K
E72=E34/SQR(E34*E34+E57*E57)
;I
E70=E30/E32*SQR(1-E72*E72)
;J
E71=E31/E32*SQR(1-E72*E72)
;
   E46=-1
   (BEQ,E68,0,PROT14)
   E46=1
   "PROT14"
G1G27GE2$PS1E30$PS2E46$PS3E67IE70JE71KE72FE25
$PS1E30$PS2E31$PS3E67IE70JE71KE72

;==============================
"BEG60"
E60=E60+E39
E50=ABS(E60)
E67=E36/(2*3.14159265)*E50
E32=E34-E67/TAN(E33)
                         ;если радиус окружности меньше точности окружности, то "1"
(BLT,E32,E38,160)
;X
E30=E32*COS(E60)
;Y
E31=E32*SIN(E60)
;I
E70=E30/E32*SQR(1-E72*E72)
;J
E71=E31/E32*SQR(1-E72*E72)
(BLT,E32,0,160)
                         ;координата текущей точки на поверхности фигуры
G1$PS1E30$PS2E31$PS3E67IE70JE71KE72
                         ;перерасчет угла сегмента на основании заданной точности и изменения радиуса сечения конуса
E39=ARC((E32-E38)/E32)*2
(BEQ,E68,0,PROT12)
E39=NEG(E39)
"PROT12"
E69=ABS(E39)
                         ;если угол сегмента больше 10, то угол сегмента =10 градусам
(BGT,E69,45,60)
(BNC,NEXT60)

"60"
E39=45
(BEQ,E68,0,PROT13)
E39=NEG(E39)
"PROT13"

"NEXT60"
(BLT,E67,E37,BEG60)
"160"
E3=2
   (BEQ,E68,0,PROT15)
E3=3
   "PROT15"
G1$PS1E30$PS2E31$PS3E67IE70JE71KE72

E51=NEG(E51)
(UIO,$PS3E51)
G0 G90 $PS3E42

G0 G60 G90 $PS1E49 $PS2

 E40=NEG(E40)
 E41=NEG(E41)
 (UIO,$PS1E40,$PS2E41)
;--------- КОНЕЦ ---------------

"END"