Guest User

обсуждение gcodec

a guest
Nov 28th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.37 KB | None | 0 0
  1. (обсуждение касается https://github.com/akamaus/gcodec)
  2. XXX 10:59
  3. Николай, подскажите как использовать gcodec
  4. ============================================================================================================
  5. Николай 19:37
  6. А какая стоит задача?
  7. Какая у вас операционная система?
  8.  
  9. Вообще Результатом работы gcodec будет исполняемый файл, который в текстовом виде выдаст код для Fanuc
  10. #!/bin/bash
  11.  
  12. if [[ $# != 2 ]]; then
  13. echo "Usage: continuous_build <h-code-source> <fanuc-macro-program>"
  14. exit 1
  15. fi
  16.  
  17. while true
  18. do
  19. sleep 1
  20. if [ -n $1 ]; then
  21. make SOURCE="$1" PROG="$2"
  22. else
  23. make
  24. fi
  25. done
  26.  
  27. вот скрип для удобства компилирования вашей программы вызывается, ге *.hs - исходный код программы, а *.nc - скомпилированный код для ЧПУ
  28.  
  29. ./continuous_build.sh mounts.hs ~/arbaiten/programming/current-testing.NC
  30. ============================================================================================================
  31. XXX 21:11
  32. Операционная система Windows 7 64, но в теории могу установить дебиан на виртуальную машину. Конечно удобней делать всё из под винды. Возможно ли это?
  33.  
  34. Задача в общем и целом состоит в переводе чертежа в код, корректно исполняемый ЧПУ станком. На чертеже, допустим, все достаточно тривиально: геометрические фигуры состоящие из дуг окружностей, отрезков прямых и их сочетаний; геометрические тела построенные на основе этих фигур. Программа: набор элементарных инструкций и подпрограмм, записанный преимущественно с использованием макропеременных, что позволяет "на лету" корректировать управляющую программу.
  35.  
  36. Я так понимаю, что нужно написать алгоритм обработки (перемещения кончика инструмента) на языке хаскел? Если да, то в чём преимущество перед непосредственным написанием сразу в g кодах?
  37. 10 марта 2016
  38. ============================================================================================================
  39. Николай 1:44
  40. В принципе возможно, но нет готовой IDE. В линуксе я использовал, указанный выше скрипт + Emacs.
  41.  
  42. Дмитрий уже указывал основную фишку g-codec "Особенно прекрасен, когда нужно выпускать широкую линейку деталей, различающиеся лишь несколькими параметрами, из-за чего использовать cam-системы становится неудобно." Это его главная фишка. Можно писать на Fanuc macro B(я писал достаточно большие программы), однако там даже нет имён переменных и с остальным проблемы.
  43. Для каких стоек или какого по планируется использовать g-codec? сейчас есть полная поддержка только fanuc macro b, linux CNC очень на него похож, так что я думаю тоже будет работать.
  44.  
  45. под g - кодом имеется в виду IS0-7 ?
  46.  
  47. Что значит на лету корректировать управляющую программу? Имеется в виду измерение и запись коррекций диаметров инструмента при помощи G31 при обработке? или что-то иное?
  48.  
  49. g-codec создавался для разгрузки программиста и снижения требований к оператору станка, также параметрические программы проще в отладке(при собственно фрезеровании), доступны к редактированию все основные размеры, а не только корекции на диаметр инструмента и перемещение нуля системы программы
  50.  
  51. "Задача в общем и целом состоит в переводе чертежа в код, корректно исполняемый ЧПУ станком" - чертежи бывают разные, и все они состоят из "дуг окружностей, отрезков прямых и их сочетаний" Я использую g-codec для 2.5D фрезерования, 3d фрезерование только круглых выточек по спирали.
  52. ============================================================================================================
  53. XXX 8:45
  54. Стойки Haas, на них язык Macro B функционирует практически безболезненно.
  55. » под g - кодом имеется в виду IS0-7 ?
  56. именно он
  57. Под корректировкой я подразумевал изменение чего угодно вообще, любых параметров.
  58. Так как 2,5D коррекция на станке реализована и так, а не реализована лишь коррекция по нормали, то необходима коррекция инструмента именно по нормали. То есть учитывается геометрия инструмента: диаметр и радиус скругления на кромке (пускай и считаем инструмент идеальным).
  59. Чаще приходится сталкиваться с какими-то объемными задачами, условно 3D фрезеровка: цилиндрические, сферические, конические, наклонные поверхности, их простые сопряжения.
  60. ============================================================================================================
  61. XXX 9:10
  62. Самое главное что, насколько я понял, нужно знать синтаксис языка haskell и с его помощью описывать уже придуманный алгоритм и логику. Разница лишь в том, что переменные будут названы как-то (условно, подсветка кода как в IDE?). С другой стороны нужно ли это?
  63. Вот например при вычислении аргумента для X слова может быть задействовано большое количество переменных.
  64.  
  65. #1=...
  66. #2=...
  67. ...
  68. #N=...
  69. ...
  70. #11=F(#i,#j)
  71. #NN=F(#k,#p)
  72.  
  73. G01 X[F(#1,...,#N,...,#11,...,#NN)]
  74.  
  75. Тогда в квадратных скобках может находиться произвольный микс из набора базовых переменных, их функций, функций от этих переменных и функций от функций, и т.д.
  76. Подсказки о том как какая переменная подписана не факт что упростит задачу.
  77. ============================================================================================================
  78. XXX 9:18
  79. CIRCLE.NC
  80. 0 КБ
  81. Если Вам не трудно, опишите алгоритм действий, лучше со скриншотами, как бы Вы создавали данный NC файл с помощью gcodeca.
  82. Допустим известно, что окружность имеет диаметр 50мм, а обойти её нужно с помощью линейной интерполяции.
  83. ============================================================================================================
  84. Николай 18:28
  85. %
  86. O0526(krugli paz)
  87. #100 = 2 ( razmer:1-na sebia,2-ot sebia*1 )
  88. #101 = 0.0 ( Visota paralelii*2 )
  89. ( Razmeri detali )
  90. #102 = 69.4 ( Shirina zagotovoki*4 )
  91. #103 = 33.0 ( Visota zagotovki*5 )
  92. #104 = 18.0 ( shirina viborki )
  93. #105 = 2 ( kreplenia:1-paz, 2-radius, 0-net )
  94. ( Circle )
  95. #106 = 30.0 ( start karmana po Y )
  96. #107 = 5.0 ( start karmana po X )
  97. #108 = 25.0 ( D karmana )
  98. #109 = 18.0 ( glubina karmana )
  99. #110 = 6.0 ( R vnesh paz )
  100. #111 = 10 ( Tool number EXT )
  101. #112 = 5.0 ( Tool R ext )
  102. #113 = 1.1 ( StepZ ext )
  103. ( parametri obrabotki )
  104. #114 = 1 ( nomer centra: 1-sunmill, 2-awea )
  105. #115 = 0.5 ( pripusk XY, Z )
  106. #116 = 5.0 ( R-pointXY )
  107. #117 = 15.0 ( S-pointZ )
  108. #118 = 2.0 ( R-pointZ )
  109. #119 = 0 ( instrument )
  110. #120 = 1.0 ( shag po Z )
  111. #121 = 2500.0 ( vrezaie )
  112. #122 = 1000.0 ( rezania )
  113. #123 = 5.0 ( R-instrumenta )
  114. #124 = 10000.0 ( spindel_init )
  115. #125 = 0.0 ( Dlina zagotovoki*3 )
  116. #126 = [ #101 + #103 ]
  117. #127 = 0.0 ( init x )
  118. #128 = 0.0 ( init y )
  119. G91 G28 Z0.0
  120. G54.1 P1
  121. G90 G21 G17 G23 G40 G49 G80
  122. ( Tool T15 D10 )
  123. #119 = #111 ( tool )
  124. #120 = #113
  125. #123 = #112 ( R-tool )
  126. #121 = 3600.0 ( rezanie )
  127. #122 = 1500.0 ( vrezanie )
  128. ( change_tool_start )
  129. M6 T#119
  130. G0 G43 H#119 Z[ #126 + 100.0 ]
  131. M8
  132. M3 S10000.0
  133. #127 = #107
  134. IF [ #100 EQ 1 ] THEN GOTO 0010
  135. GOTO 0020
  136. N0010
  137. #106 = [ #102 - #106 ]
  138. N0020
  139. #120 = 1.2
  140. ( paz R function no correction )
  141. #129 = FIX [ [ #109 / #120 ] ]
  142. #130 = [ [ #108 / 2.0 ] - #123 ]
  143. G1 F10000.0 Z[ #126 + #117 ] Y[ 0.0 - #106 ] X#127
  144. F#122 Z#126
  145. X[ #127 + #130 ]
  146. G2 I[ 0.0 - #130 ]
  147. N0030
  148. IF [ 1 - [ #129 GT 0 ] ] THEN GOTO 0040
  149. ( iteration R )
  150. G2 I[ 0.0 - #130 ] Z[ #5003 - #120 ] F#121
  151. #129 = [ #129 - 1 ]
  152. GOTO 0030
  153. N0040
  154. G2 I[ 0.0 - #130 ] Z[ #126 - #109 ] G9
  155. G2 I[ 0.0 - #130 ] G9 F200.0
  156. G1 Y[ 0.0 - #106 ] X#127 F[ #122 / 3.0 ]
  157. G0 Z[ #126 + #117 ]
  158. M9
  159. G0 Z[ #126 + #117 ]
  160. M5
  161. ( Tool T21 D5 )
  162. #119 = 21
  163. #124 = 8000.0
  164. #123 = 2.5
  165. ( change_tool_start )
  166. M6 T#119
  167. G0 G43 H#119 Z[ #126 + 100.0 ]
  168. M8
  169. M3 S#124
  170. ( slot_preposition )
  171. G0 X#127 Y[ 0.0 - #106 ]
  172. G1 Z[ #126 + #117 ] F10000.0
  173. Z[ #126 + #117 ]
  174. G1 Z#126 F#121
  175. Z[ [ #126 - #109 ] + 1.0 ]
  176. F[ #122 / 2.0 ] Z[ #5003 - 3.0 ]
  177. Z[ #126 + #117 ] G0
  178. M9
  179. G0 Z[ #126 + #117 ]
  180. IF [ #114 GT 1 ] THEN GOTO 0050
  181. GOTO 0060
  182. N0050
  183. G0 Z[ #126 + 150.0 ]
  184. X300.0 Y240.0
  185. N0060
  186. IF [ 2 GT #114 ] THEN GOTO 0070
  187. GOTO 0080
  188. N0070
  189. G0 Z[ #126 + 100.0 ]
  190. X50.0 Y190.0
  191. N0080
  192. M5
  193. M7
  194. G4 P1500
  195. M9
  196. M30
  197.  
  198. %
  199. вот компилированая программа выточки с разметкой центра, а вот её исходник
  200. {-# LANGUAGE OverloadedStrings, ImplicitParams, NoMonomorphismRestriction #-}
  201.  
  202. import CNC.HCode
  203. import CNC.AwePrelude
  204.  
  205. import Prelude(putStrLn, return)
  206. import Standart_functions
  207. import Milling_functions
  208. hcode_prog2 :: HCode ()
  209. hcode_prog2 = do
  210. — блок переменных
  211. ofs_table <- sysTable "_OFS"
  212. programm_mode <- newVar (2 :: Int) #"razmer:1-na sebia,2-ot sebia*1"
  213. parallelHigh <- newVar (0 :: RealT) # "Visota paralelii*2"
  214. comment "Razmeri detali"
  215. partWidth <- newVar (69.4 :: RealT) # "Shirina zagotovoki*4"
  216. blankHigh <- newVar (133.0 :: RealT) #"Visota zagotovki*5"
  217. pocket_width <- newVar (18.0 :: RealT) #"shirina viborki"
  218. mount_mode <- newVar (1 :: Int) #"kreplenia:1-paz, 2-radius, 0-net"
  219. comment "Circle"
  220. r_pocket_y <- newVar (30.0 :: RealT) #"start karmana po Y"
  221. r_pocket_x <- newVar (5.0 :: RealT) #"start karmana po X"
  222. pocket_D <- newVar (25.0 :: RealT) #"D karmana"
  223. pocket_depth <- newVar (18.0 :: RealT) #"glubina karmana"
  224. slot_ext_R <- newVar (6.0 ::RealT)# "R vnesh paz"
  225. tool_num_ext <- newVar (10 :: Int) # "Tool number EXT"
  226. tool_R_ext <- newVar (5.0 ::RealT)# "Tool R ext"
  227. stepZext <- newVar (1.1 ::RealT)# "StepZ ext"
  228. comment "parametri obrabotki"
  229. cnc_center <- newVar (1 :: Int) # "nomer centra: 1-sunmill, 2-awea"
  230. allowance <- newVar (0.5 ::RealT) #"pripusk XY, Z"
  231. rpointXY <- newVar (5.0 ::RealT) # "R-pointXY"
  232. spointZ <- newVar (15.0 ::RealT) # "S-pointZ"
  233. rpointZ <- newVar (2.0 ::RealT) #"R-pointZ"
  234. nameTool <- newVar (0 :: Int) # "instrument"
  235. stepZ <- newVar (1.0 :: RealT) # "shag po Z"
  236. feedCut <- newVar (2500.0 ::RealT) # "vrezaie"
  237. feedPlunge <- newVar (1000.0 ::RealT) # "rezania"
  238. cur_R <- newVar (5.0 :: RealT) # "R-instrumenta"
  239. s_spindel <- newVar (10000 :: RealT) #"spindel_init"
  240. partLength <- newVar (0.0 :: RealT) # "Dlina zagotovoki*3"
  241. fullHigh <- newVarE $ (parallelHigh + blankHigh :: Expr RealT) — Вычисляем полную высоту от базы тисков
  242. start_x <- newVar (0 :: RealT) #"init x"
  243. start_y <- newVar (0 :: RealT) #"init y"
  244. cur_z <- sysVar 5003 :: HCode (Expr RealT)
  245. cur_x <- sysVar 5001 :: HCode (Expr RealT)
  246. cur_y <- sysVar 5002 :: HCode (Expr RealT)
  247. let ?cur_R = cur_R
  248. let ?cur_x = cur_x
  249. let ?cur_y = cur_y
  250. let ?cur_z = cur_z
  251. let ?stepZ = stepZ
  252. let ?feedCut = feedCut
  253. let ?blankHigh = blankHigh
  254. let ?partWidth = partWidth
  255. let ?feedPlunge = feedPlunge
  256. let ?fullHigh = fullHigh
  257. let ?nameTool = nameTool
  258. let ?parallelHigh = parallelHigh
  259. let ?partLength = partLength
  260. let ?programm_mode = programm_mode
  261. let ?rpointXY = rpointXY
  262. let ?rpointZ = rpointZ
  263. let ?spointZ = spointZ
  264. let ?programm_mode = programm_mode
  265. let ?cnc_center = cnc_center
  266.  
  267. --пошла сама программа (START!)
  268. frame [g 91, g 28, z 0] — поднимаемся в референтную позицию по Z
  269. frame [g_real 54.1, p 1]
  270. frame [g 90, g 21, g 17, g 23, g 40, g 49, g 80] —строка безопасности
  271. comment "Tool T15 D10"
  272. —фрезеруем круглый паз
  273. nameTool #= tool_num_ext #"tool"
  274. stepZ #= stepZext
  275. cur_R #= tool_R_ext # "R-tool"
  276. feedCut #= 3600 # "rezanie"
  277. feedPlunge #= 1500 # "vrezanie"
  278. change_tool_start nameTool 10000
  279. start_x #= r_pocket_x
  280. gIf (programm_mode == 1) $ do
  281. r_pocket_y #= partWidth - r_pocket_y
  282. stepZ #= 1.2
  283. round_slot pocket_D pocket_depth start_x r_pocket_y
  284. iteration_end
  285. --даём центр
  286. comment "Tool T21 D5"
  287. nameTool #= 21
  288. s_spindel #= 8000
  289. cur_R #=2.5
  290. change_tool_start nameTool s_spindel
  291. slot_preposition start_x r_pocket_y
  292. z $ fullHigh + spointZ
  293. frame [g 1, z $ fullHigh, f $ feedCut]
  294. z $ fullHigh - pocket_depth + 1.0
  295. frame [f $ feedPlunge/2, z $ cur_z - 3.0]
  296. frame [z $ fullHigh + spointZ, g 0]
  297. surface_end
  298. m 30
  299.  
  300. main = do
  301. putStrLn "%"
  302. putStrLn "O0526(krugli paz)"
  303. putHCode hcode_prog2
  304. putStrLn "\n%"
  305. как видно в исходнике используются функции(что очень удобно)
  306.  
  307. change_tool_start nameTool s_spindel - установка и подготовка нужного инструмента
  308. slot_preposition start_x r_pocket_y - подход на фрезерование паза
  309. round_slot pocket_D pocket_depth start_x r_pocket_y - собственнно само фрезерование
  310. я написал библиотеку 2.5D обработки, единственно чего к ней нет это документации, а без документации разобраться будет сложно
  311. синтаксис исходника, не совсем haskell очень много чего перегружено
  312. но зато у нас есть строгая типизация, и другие классные фишки этого языка, а это очень сильно облегчает разработку
  313. поддержка сплайнов описываемых функциями в g-codec тоже есть, но я до неё так и не дошёл
  314. ============================================================================================================
  315. Николай 18:40
  316. а вот фунция круглого паза:
  317. — Фрезерование круглый паз
  318. round_slot diametr slot_depth centerX centerY = do
  319. comment "paz R function no correction"
  320. count_z <- newVarE $ (fix $ slot_depth / ?stepZ :: Expr Int) — количество целых шагов
  321. radius <- newVarE $ (diametr / 2 - ?cur_R)
  322. frame [g 01, f 10000, z $ ?fullHigh + ?spointZ, y $ - centerY, x $ centerX]
  323. frame [f ?feedPlunge, z $ ?fullHigh]
  324. frame [x $ centerX + radius]
  325. --цикл винтовой интерполяции
  326. frame [g 02, i $ - radius]
  327. while (count_z > 0) $ do — цикл по Z
  328. comment "iteration R"
  329. frame [g 02, i $ - radius, z $ ?cur_z - ?stepZ, f $ ?feedCut]
  330. count_z #= count_z - 1
  331.  
  332. frame [g 02, i $ -radius, z $ ?fullHigh - slot_depth, g 9]
  333. frame [g 02, i $ -radius, g 9, f 200]
  334. frame [g 01, y $ - centerY, x $ centerX, f $ ?feedPlunge/3]
  335. frame [g 0, z $ ?fullHigh + ?spointZ]
  336. только сюда отступы не скопировались - отступы в haskell это важно
  337. ============================================================================================================
  338. XXX 18:43
  339. а в какой среде для удобства лучше писать? или можно просто создавать текстовой файлик?
  340. отступы в виде пробелов?
  341. ============================================================================================================
  342. Николай 18:44
  343. табы
  344. ============================================================================================================
  345. XXX 18:45
  346. на счет сплайнов интересно конечно, но я даже не представляю как они реализованы на чпу. с отрезками и дугами проще :)
  347. ============================================================================================================
  348. Николай 18:45
  349. round_slot diametr slot_depth centerX centerY = do
  350. это заголовок функции дальше все строки смещаются на 1 таб, при переводе строки Emacs при включённом режиме haskell отступ сохраняет
  351. я бы рекомендовал Emas, тем более что мы Дмитрием собирались сделать утановщик под win
  352. ============================================================================================================
  353. XXX 18:45
  354. то есть отступы выполняют роль скобок? {}
  355. ============================================================================================================
  356. Николай 18:46
  357. в принципе да но это чисто синтаксис haskell
  358. ============================================================================================================
  359. XXX 18:47
  360. да, интересно конечно, спасибо
  361. попробую разобраться :)
  362. ============================================================================================================
  363. Николай 18:47
  364. смотри, документацию я постараюсь сделать к маю, тогда же вылью в репозиторий библиотеку фрезерования
  365. просто долго и муторно её делать с примерами, а щас как всегда других дел куча) Как будет
  366. round_slot_mill.hs
  367. 4 КБ
  368. вот тот исходник что я тебе прислал с разметкой
  369. если убрать там мой код, вполне есть рыба куда можно своё вставлять и экспериментировать
  370. сначала будет тяжело привыкнуть к тому на что ругается компилятор, но там всего несколько типовых ситуаций обычно всплывает разберёшься)
  371. кстати, как ты пришёл к тому чтобы использовать для написания управляющих программ не только CAM - системы*?
  372. ============================================================================================================
  373. XXX 18:52
  374. вероятно можно провести более детальную декомпозицию.
  375. и не знаю как на фануках, но у хаас есть некая аналогия с функциональным программированием.
  376. то есть можно создать библиотеку фрезерования, но уже в .NC формате
  377. вызывается "функция" командой G65 P9000 A B C ... Z
  378. где P9000 это номер программы из "библиотеки", а буквы это аргументы
  379. ============================================================================================================
  380. Николай 18:52
  381. неее я думал над этим - не безопасно
  382. тебе надо держать актуальными файлы подпрограмм на всех станках синхронно с тем что у тебя на продакшене,а это малореально и чревато авариями
  383. безопаснее чтобы программы были самодостаточны и в 1м файле
  384. а режимы программ позволят сэкономить адресное пространство имён программ
  385. ============================================================================================================
  386. XXX 19:01
  387. как то встала задача обработать наклонную фаску с двумя скруглениями на теле вращения (на отверстии). там высокая шероховатость. была выбрана стратегия зигзагом "вверх-вниз". получалось очень много кадров, а станок не позволяет сохранять большие файлы. работать с динамической подгрузки не хотелось вот и подумал что-то такое написать. возможности станка опять же не позволяли многое реализовать (старая стойка), так что углубился в вопрос довольно сильно.
  388. да и камы не всегда позволяют обработать что-то с нужными допусками. например прямоугольник с одним размером в минусе, а другим в плюсе
  389. для 2,5D обработки макро подходит в большинстве случаев
  390. ============================================================================================================
  391. Николай 19:03
  392. ну тогда g-codec тебе очень поможет
  393. макропрограммы на 20-30Кб вполне)
  394. попробуй на базе круглого паза просто скомпилять пустой файл с переменными ну и дальше туда дописывай, пока разберёшься с синтаксисом, я может библиотеку с примерами выкачу
Add Comment
Please, Sign In to add comment