Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (обсуждение касается https://github.com/akamaus/gcodec)
- XXX 10:59
- Николай, подскажите как использовать gcodec
- ============================================================================================================
- Николай 19:37
- А какая стоит задача?
- Какая у вас операционная система?
- Вообще Результатом работы gcodec будет исполняемый файл, который в текстовом виде выдаст код для Fanuc
- #!/bin/bash
- if [[ $# != 2 ]]; then
- echo "Usage: continuous_build <h-code-source> <fanuc-macro-program>"
- exit 1
- fi
- while true
- do
- sleep 1
- if [ -n $1 ]; then
- make SOURCE="$1" PROG="$2"
- else
- make
- fi
- done
- вот скрип для удобства компилирования вашей программы вызывается, ге *.hs - исходный код программы, а *.nc - скомпилированный код для ЧПУ
- ./continuous_build.sh mounts.hs ~/arbaiten/programming/current-testing.NC
- ============================================================================================================
- XXX 21:11
- Операционная система Windows 7 64, но в теории могу установить дебиан на виртуальную машину. Конечно удобней делать всё из под винды. Возможно ли это?
- Задача в общем и целом состоит в переводе чертежа в код, корректно исполняемый ЧПУ станком. На чертеже, допустим, все достаточно тривиально: геометрические фигуры состоящие из дуг окружностей, отрезков прямых и их сочетаний; геометрические тела построенные на основе этих фигур. Программа: набор элементарных инструкций и подпрограмм, записанный преимущественно с использованием макропеременных, что позволяет "на лету" корректировать управляющую программу.
- Я так понимаю, что нужно написать алгоритм обработки (перемещения кончика инструмента) на языке хаскел? Если да, то в чём преимущество перед непосредственным написанием сразу в g кодах?
- 10 марта 2016
- ============================================================================================================
- Николай 1:44
- В принципе возможно, но нет готовой IDE. В линуксе я использовал, указанный выше скрипт + Emacs.
- Дмитрий уже указывал основную фишку g-codec "Особенно прекрасен, когда нужно выпускать широкую линейку деталей, различающиеся лишь несколькими параметрами, из-за чего использовать cam-системы становится неудобно." Это его главная фишка. Можно писать на Fanuc macro B(я писал достаточно большие программы), однако там даже нет имён переменных и с остальным проблемы.
- Для каких стоек или какого по планируется использовать g-codec? сейчас есть полная поддержка только fanuc macro b, linux CNC очень на него похож, так что я думаю тоже будет работать.
- под g - кодом имеется в виду IS0-7 ?
- Что значит на лету корректировать управляющую программу? Имеется в виду измерение и запись коррекций диаметров инструмента при помощи G31 при обработке? или что-то иное?
- g-codec создавался для разгрузки программиста и снижения требований к оператору станка, также параметрические программы проще в отладке(при собственно фрезеровании), доступны к редактированию все основные размеры, а не только корекции на диаметр инструмента и перемещение нуля системы программы
- "Задача в общем и целом состоит в переводе чертежа в код, корректно исполняемый ЧПУ станком" - чертежи бывают разные, и все они состоят из "дуг окружностей, отрезков прямых и их сочетаний" Я использую g-codec для 2.5D фрезерования, 3d фрезерование только круглых выточек по спирали.
- ============================================================================================================
- XXX 8:45
- Стойки Haas, на них язык Macro B функционирует практически безболезненно.
- » под g - кодом имеется в виду IS0-7 ?
- именно он
- Под корректировкой я подразумевал изменение чего угодно вообще, любых параметров.
- Так как 2,5D коррекция на станке реализована и так, а не реализована лишь коррекция по нормали, то необходима коррекция инструмента именно по нормали. То есть учитывается геометрия инструмента: диаметр и радиус скругления на кромке (пускай и считаем инструмент идеальным).
- Чаще приходится сталкиваться с какими-то объемными задачами, условно 3D фрезеровка: цилиндрические, сферические, конические, наклонные поверхности, их простые сопряжения.
- ============================================================================================================
- XXX 9:10
- Самое главное что, насколько я понял, нужно знать синтаксис языка haskell и с его помощью описывать уже придуманный алгоритм и логику. Разница лишь в том, что переменные будут названы как-то (условно, подсветка кода как в IDE?). С другой стороны нужно ли это?
- Вот например при вычислении аргумента для X слова может быть задействовано большое количество переменных.
- #1=...
- #2=...
- ...
- #N=...
- ...
- #11=F(#i,#j)
- #NN=F(#k,#p)
- G01 X[F(#1,...,#N,...,#11,...,#NN)]
- Тогда в квадратных скобках может находиться произвольный микс из набора базовых переменных, их функций, функций от этих переменных и функций от функций, и т.д.
- Подсказки о том как какая переменная подписана не факт что упростит задачу.
- ============================================================================================================
- XXX 9:18
- CIRCLE.NC
- 0 КБ
- Если Вам не трудно, опишите алгоритм действий, лучше со скриншотами, как бы Вы создавали данный NC файл с помощью gcodeca.
- Допустим известно, что окружность имеет диаметр 50мм, а обойти её нужно с помощью линейной интерполяции.
- ============================================================================================================
- Николай 18:28
- %
- O0526(krugli paz)
- #100 = 2 ( razmer:1-na sebia,2-ot sebia*1 )
- #101 = 0.0 ( Visota paralelii*2 )
- ( Razmeri detali )
- #102 = 69.4 ( Shirina zagotovoki*4 )
- #103 = 33.0 ( Visota zagotovki*5 )
- #104 = 18.0 ( shirina viborki )
- #105 = 2 ( kreplenia:1-paz, 2-radius, 0-net )
- ( Circle )
- #106 = 30.0 ( start karmana po Y )
- #107 = 5.0 ( start karmana po X )
- #108 = 25.0 ( D karmana )
- #109 = 18.0 ( glubina karmana )
- #110 = 6.0 ( R vnesh paz )
- #111 = 10 ( Tool number EXT )
- #112 = 5.0 ( Tool R ext )
- #113 = 1.1 ( StepZ ext )
- ( parametri obrabotki )
- #114 = 1 ( nomer centra: 1-sunmill, 2-awea )
- #115 = 0.5 ( pripusk XY, Z )
- #116 = 5.0 ( R-pointXY )
- #117 = 15.0 ( S-pointZ )
- #118 = 2.0 ( R-pointZ )
- #119 = 0 ( instrument )
- #120 = 1.0 ( shag po Z )
- #121 = 2500.0 ( vrezaie )
- #122 = 1000.0 ( rezania )
- #123 = 5.0 ( R-instrumenta )
- #124 = 10000.0 ( spindel_init )
- #125 = 0.0 ( Dlina zagotovoki*3 )
- #126 = [ #101 + #103 ]
- #127 = 0.0 ( init x )
- #128 = 0.0 ( init y )
- G91 G28 Z0.0
- G54.1 P1
- G90 G21 G17 G23 G40 G49 G80
- ( Tool T15 D10 )
- #119 = #111 ( tool )
- #120 = #113
- #123 = #112 ( R-tool )
- #121 = 3600.0 ( rezanie )
- #122 = 1500.0 ( vrezanie )
- ( change_tool_start )
- M6 T#119
- G0 G43 H#119 Z[ #126 + 100.0 ]
- M8
- M3 S10000.0
- #127 = #107
- IF [ #100 EQ 1 ] THEN GOTO 0010
- GOTO 0020
- N0010
- #106 = [ #102 - #106 ]
- N0020
- #120 = 1.2
- ( paz R function no correction )
- #129 = FIX [ [ #109 / #120 ] ]
- #130 = [ [ #108 / 2.0 ] - #123 ]
- G1 F10000.0 Z[ #126 + #117 ] Y[ 0.0 - #106 ] X#127
- F#122 Z#126
- X[ #127 + #130 ]
- G2 I[ 0.0 - #130 ]
- N0030
- IF [ 1 - [ #129 GT 0 ] ] THEN GOTO 0040
- ( iteration R )
- G2 I[ 0.0 - #130 ] Z[ #5003 - #120 ] F#121
- #129 = [ #129 - 1 ]
- GOTO 0030
- N0040
- G2 I[ 0.0 - #130 ] Z[ #126 - #109 ] G9
- G2 I[ 0.0 - #130 ] G9 F200.0
- G1 Y[ 0.0 - #106 ] X#127 F[ #122 / 3.0 ]
- G0 Z[ #126 + #117 ]
- M9
- G0 Z[ #126 + #117 ]
- M5
- ( Tool T21 D5 )
- #119 = 21
- #124 = 8000.0
- #123 = 2.5
- ( change_tool_start )
- M6 T#119
- G0 G43 H#119 Z[ #126 + 100.0 ]
- M8
- M3 S#124
- ( slot_preposition )
- G0 X#127 Y[ 0.0 - #106 ]
- G1 Z[ #126 + #117 ] F10000.0
- Z[ #126 + #117 ]
- G1 Z#126 F#121
- Z[ [ #126 - #109 ] + 1.0 ]
- F[ #122 / 2.0 ] Z[ #5003 - 3.0 ]
- Z[ #126 + #117 ] G0
- M9
- G0 Z[ #126 + #117 ]
- IF [ #114 GT 1 ] THEN GOTO 0050
- GOTO 0060
- N0050
- G0 Z[ #126 + 150.0 ]
- X300.0 Y240.0
- N0060
- IF [ 2 GT #114 ] THEN GOTO 0070
- GOTO 0080
- N0070
- G0 Z[ #126 + 100.0 ]
- X50.0 Y190.0
- N0080
- M5
- M7
- G4 P1500
- M9
- M30
- %
- вот компилированая программа выточки с разметкой центра, а вот её исходник
- {-# LANGUAGE OverloadedStrings, ImplicitParams, NoMonomorphismRestriction #-}
- import CNC.HCode
- import CNC.AwePrelude
- import Prelude(putStrLn, return)
- import Standart_functions
- import Milling_functions
- hcode_prog2 :: HCode ()
- hcode_prog2 = do
- — блок переменных
- ofs_table <- sysTable "_OFS"
- programm_mode <- newVar (2 :: Int) #"razmer:1-na sebia,2-ot sebia*1"
- parallelHigh <- newVar (0 :: RealT) # "Visota paralelii*2"
- comment "Razmeri detali"
- partWidth <- newVar (69.4 :: RealT) # "Shirina zagotovoki*4"
- blankHigh <- newVar (133.0 :: RealT) #"Visota zagotovki*5"
- pocket_width <- newVar (18.0 :: RealT) #"shirina viborki"
- mount_mode <- newVar (1 :: Int) #"kreplenia:1-paz, 2-radius, 0-net"
- comment "Circle"
- r_pocket_y <- newVar (30.0 :: RealT) #"start karmana po Y"
- r_pocket_x <- newVar (5.0 :: RealT) #"start karmana po X"
- pocket_D <- newVar (25.0 :: RealT) #"D karmana"
- pocket_depth <- newVar (18.0 :: RealT) #"glubina karmana"
- slot_ext_R <- newVar (6.0 ::RealT)# "R vnesh paz"
- tool_num_ext <- newVar (10 :: Int) # "Tool number EXT"
- tool_R_ext <- newVar (5.0 ::RealT)# "Tool R ext"
- stepZext <- newVar (1.1 ::RealT)# "StepZ ext"
- comment "parametri obrabotki"
- cnc_center <- newVar (1 :: Int) # "nomer centra: 1-sunmill, 2-awea"
- allowance <- newVar (0.5 ::RealT) #"pripusk XY, Z"
- rpointXY <- newVar (5.0 ::RealT) # "R-pointXY"
- spointZ <- newVar (15.0 ::RealT) # "S-pointZ"
- rpointZ <- newVar (2.0 ::RealT) #"R-pointZ"
- nameTool <- newVar (0 :: Int) # "instrument"
- stepZ <- newVar (1.0 :: RealT) # "shag po Z"
- feedCut <- newVar (2500.0 ::RealT) # "vrezaie"
- feedPlunge <- newVar (1000.0 ::RealT) # "rezania"
- cur_R <- newVar (5.0 :: RealT) # "R-instrumenta"
- s_spindel <- newVar (10000 :: RealT) #"spindel_init"
- partLength <- newVar (0.0 :: RealT) # "Dlina zagotovoki*3"
- fullHigh <- newVarE $ (parallelHigh + blankHigh :: Expr RealT) — Вычисляем полную высоту от базы тисков
- start_x <- newVar (0 :: RealT) #"init x"
- start_y <- newVar (0 :: RealT) #"init y"
- cur_z <- sysVar 5003 :: HCode (Expr RealT)
- cur_x <- sysVar 5001 :: HCode (Expr RealT)
- cur_y <- sysVar 5002 :: HCode (Expr RealT)
- let ?cur_R = cur_R
- let ?cur_x = cur_x
- let ?cur_y = cur_y
- let ?cur_z = cur_z
- let ?stepZ = stepZ
- let ?feedCut = feedCut
- let ?blankHigh = blankHigh
- let ?partWidth = partWidth
- let ?feedPlunge = feedPlunge
- let ?fullHigh = fullHigh
- let ?nameTool = nameTool
- let ?parallelHigh = parallelHigh
- let ?partLength = partLength
- let ?programm_mode = programm_mode
- let ?rpointXY = rpointXY
- let ?rpointZ = rpointZ
- let ?spointZ = spointZ
- let ?programm_mode = programm_mode
- let ?cnc_center = cnc_center
- --пошла сама программа (START!)
- frame [g 91, g 28, z 0] — поднимаемся в референтную позицию по Z
- frame [g_real 54.1, p 1]
- frame [g 90, g 21, g 17, g 23, g 40, g 49, g 80] —строка безопасности
- comment "Tool T15 D10"
- —фрезеруем круглый паз
- nameTool #= tool_num_ext #"tool"
- stepZ #= stepZext
- cur_R #= tool_R_ext # "R-tool"
- feedCut #= 3600 # "rezanie"
- feedPlunge #= 1500 # "vrezanie"
- change_tool_start nameTool 10000
- start_x #= r_pocket_x
- gIf (programm_mode == 1) $ do
- r_pocket_y #= partWidth - r_pocket_y
- stepZ #= 1.2
- round_slot pocket_D pocket_depth start_x r_pocket_y
- iteration_end
- --даём центр
- comment "Tool T21 D5"
- nameTool #= 21
- s_spindel #= 8000
- cur_R #=2.5
- change_tool_start nameTool s_spindel
- slot_preposition start_x r_pocket_y
- z $ fullHigh + spointZ
- frame [g 1, z $ fullHigh, f $ feedCut]
- z $ fullHigh - pocket_depth + 1.0
- frame [f $ feedPlunge/2, z $ cur_z - 3.0]
- frame [z $ fullHigh + spointZ, g 0]
- surface_end
- m 30
- main = do
- putStrLn "%"
- putStrLn "O0526(krugli paz)"
- putHCode hcode_prog2
- putStrLn "\n%"
- как видно в исходнике используются функции(что очень удобно)
- change_tool_start nameTool s_spindel - установка и подготовка нужного инструмента
- slot_preposition start_x r_pocket_y - подход на фрезерование паза
- round_slot pocket_D pocket_depth start_x r_pocket_y - собственнно само фрезерование
- я написал библиотеку 2.5D обработки, единственно чего к ней нет это документации, а без документации разобраться будет сложно
- синтаксис исходника, не совсем haskell очень много чего перегружено
- но зато у нас есть строгая типизация, и другие классные фишки этого языка, а это очень сильно облегчает разработку
- поддержка сплайнов описываемых функциями в g-codec тоже есть, но я до неё так и не дошёл
- ============================================================================================================
- Николай 18:40
- а вот фунция круглого паза:
- — Фрезерование круглый паз
- round_slot diametr slot_depth centerX centerY = do
- comment "paz R function no correction"
- count_z <- newVarE $ (fix $ slot_depth / ?stepZ :: Expr Int) — количество целых шагов
- radius <- newVarE $ (diametr / 2 - ?cur_R)
- frame [g 01, f 10000, z $ ?fullHigh + ?spointZ, y $ - centerY, x $ centerX]
- frame [f ?feedPlunge, z $ ?fullHigh]
- frame [x $ centerX + radius]
- --цикл винтовой интерполяции
- frame [g 02, i $ - radius]
- while (count_z > 0) $ do — цикл по Z
- comment "iteration R"
- frame [g 02, i $ - radius, z $ ?cur_z - ?stepZ, f $ ?feedCut]
- count_z #= count_z - 1
- frame [g 02, i $ -radius, z $ ?fullHigh - slot_depth, g 9]
- frame [g 02, i $ -radius, g 9, f 200]
- frame [g 01, y $ - centerY, x $ centerX, f $ ?feedPlunge/3]
- frame [g 0, z $ ?fullHigh + ?spointZ]
- только сюда отступы не скопировались - отступы в haskell это важно
- ============================================================================================================
- XXX 18:43
- а в какой среде для удобства лучше писать? или можно просто создавать текстовой файлик?
- отступы в виде пробелов?
- ============================================================================================================
- Николай 18:44
- табы
- ============================================================================================================
- XXX 18:45
- на счет сплайнов интересно конечно, но я даже не представляю как они реализованы на чпу. с отрезками и дугами проще :)
- ============================================================================================================
- Николай 18:45
- round_slot diametr slot_depth centerX centerY = do
- это заголовок функции дальше все строки смещаются на 1 таб, при переводе строки Emacs при включённом режиме haskell отступ сохраняет
- я бы рекомендовал Emas, тем более что мы Дмитрием собирались сделать утановщик под win
- ============================================================================================================
- XXX 18:45
- то есть отступы выполняют роль скобок? {}
- ============================================================================================================
- Николай 18:46
- в принципе да но это чисто синтаксис haskell
- ============================================================================================================
- XXX 18:47
- да, интересно конечно, спасибо
- попробую разобраться :)
- ============================================================================================================
- Николай 18:47
- смотри, документацию я постараюсь сделать к маю, тогда же вылью в репозиторий библиотеку фрезерования
- просто долго и муторно её делать с примерами, а щас как всегда других дел куча) Как будет
- round_slot_mill.hs
- 4 КБ
- вот тот исходник что я тебе прислал с разметкой
- если убрать там мой код, вполне есть рыба куда можно своё вставлять и экспериментировать
- сначала будет тяжело привыкнуть к тому на что ругается компилятор, но там всего несколько типовых ситуаций обычно всплывает разберёшься)
- кстати, как ты пришёл к тому чтобы использовать для написания управляющих программ не только CAM - системы*?
- ============================================================================================================
- XXX 18:52
- вероятно можно провести более детальную декомпозицию.
- и не знаю как на фануках, но у хаас есть некая аналогия с функциональным программированием.
- то есть можно создать библиотеку фрезерования, но уже в .NC формате
- вызывается "функция" командой G65 P9000 A B C ... Z
- где P9000 это номер программы из "библиотеки", а буквы это аргументы
- ============================================================================================================
- Николай 18:52
- неее я думал над этим - не безопасно
- тебе надо держать актуальными файлы подпрограмм на всех станках синхронно с тем что у тебя на продакшене,а это малореально и чревато авариями
- безопаснее чтобы программы были самодостаточны и в 1м файле
- а режимы программ позволят сэкономить адресное пространство имён программ
- ============================================================================================================
- XXX 19:01
- как то встала задача обработать наклонную фаску с двумя скруглениями на теле вращения (на отверстии). там высокая шероховатость. была выбрана стратегия зигзагом "вверх-вниз". получалось очень много кадров, а станок не позволяет сохранять большие файлы. работать с динамической подгрузки не хотелось вот и подумал что-то такое написать. возможности станка опять же не позволяли многое реализовать (старая стойка), так что углубился в вопрос довольно сильно.
- да и камы не всегда позволяют обработать что-то с нужными допусками. например прямоугольник с одним размером в минусе, а другим в плюсе
- для 2,5D обработки макро подходит в большинстве случаев
- ============================================================================================================
- Николай 19:03
- ну тогда g-codec тебе очень поможет
- макропрограммы на 20-30Кб вполне)
- попробуй на базе круглого паза просто скомпилять пустой файл с переменными ну и дальше туда дописывай, пока разберёшься с синтаксисом, я может библиотеку с примерами выкачу
Add Comment
Please, Sign In to add comment