Неделю вооюю с G code.
Вернее с его реализацией в Ncstudio.
Написал построцессор для CamWorks, он же урезанный в виде встроенного Solidworks CAM.
Так вот, описание реализации языка 5.4.8 только на китайском нашёл. На англицском только для более поздней версии 8. Но там отличия есть.
Теперь глюков и косяков там отгреб за эти дни просто писец.
Раньше тоже с ними сталкивался, но там другие были глюки.
Раньше постоянно проблемы были, что считанные данные регистров не совпадали с физическим положением станка.
Это когда я писал свои процедуры поиска отверстий и привязки к заготовке.
Но потом это решилось путем набора волшебных команд
Как они работают никто толком не знает. Подсмотрены были у самой програмы в файле public.dat Да и здесь на форуме тоже обсуждались не раз.
Но поочерёдно запущенные они приводили в синхронизацию регистры с физическим состоянием.
Но это дела годичной давности уже.
Сецчас взялся допилить команда глубокого сверления G73, G81, G82, G83, G86 и т.п.
Они изначально в самой оболочке не реализованы.
А прописаны в том самом файле public.dat
как подпрограммы вызываемые если встречается соответсвующий им G-код
Так вот они там настолько криво написаны, что изначально нерабочие. Все с косяками.
Те правки что нашёл от других меня не устроили. Не до конца понял как там всё работает, да и глюки там свои были.
Это пол беды. Думал что там писать то. Фреза вверх-вниз и делов.
Оказалось. Не работают команды G98 и G99, задающие пскость перехода между группой отверстий.
И их невозможно даже реализоватьв файле public.dat в виде подпрограмм.
Там общее правило - это к номеру команды добавить 600 и получится номер подпрограммы, которую стстема сама вызовет при встрече этого кода и передаст ей все параметры. Например G83 - это подпрограмма O683 и т.д.
Но с этими кодами 98 и 99 это не прокатило.
Ну да ладно. Думаю сделаю что типа по умолчанию G98 активирован - так безопаснее - это более высокие переходы между соседними отверстиями.
Дальше ещё интереснее. Внутри подпрограммы пошлю глюки со скоростями подачи.
На самом деле для холостого хода G0 своя скорость подачи, а для обработки G1 - своя.
И когда переключаешься между G0 и G1, то скорости обработки сами переключаются
Но не в этих подпрограммах)
После первого же использования кода G1 с командой смены его скорости F, эта скорость становится общей и для всех последующих кодов G0.
Победил только явным указанием скорости в каждом конкретном случае.
Но скорость холостого хода обычно как правило в NC программе не задается, а по умолчанию берётся из настройки станка а не из программы. Так заведено.
Но считать её не откуда. Именнованых переменных нет таких... И нумерованных тоже...
Пришлось создать свою переменную в которую дополнительно заносится это значение скорости при холостых проходах G0 в циклах сверления.
Следующим глюком оказалось, что параметры высот начала обработки и окончания передаюся в подпрограмму в виде значений умноженных на -1.
Долго не мог понять почему не могу получить корректное количество проходов, зная приращение и координаты обоих высот.
Оказалось координаты эти с перепутанными знаками.
Сделал инверсию.
Попутно нашёл способ как отображать для отладки значения интересующих меня параметров.
Ведь никакой функции вывода значения не предусмотрено.
Единственно что может сделать станок, так это по ещё одной волшебной команде сбросить в лог файл свои координаты осей, но в системе машинных координат а не координат заготовки в которых обработка ведётся.
Чтобы получить вменяемые значения надо сначало отправить станок в нули по координатам заготовки и волшебной командой сбросить в файл станочные координаты этой точки - получится смещение по сути.
И потом если в интересующем месте опять дать волшебную команду, то он сбросит ещё раз машинные координаты и если из них вычесть первые те, то получатся значения в координатах заготовки.
Но мне этот метод не особо подходил, так как интересовали не координаты так таковые а именно значения переменных, параметров и результаты вычислений. И желательно в режиме реального времени.
Придумал результат вычислений использовать как значение на которое поедет станок по Z. Его координаты видно в программе. И таким образом визуализировал по 5-6 разных переменных подряд через паузу. Естественно программа без станка в режиме эмуляции карты.
Так и вычислил что параметры передаются в перевернутом относительно 0 виде.
Подкорректировал алгоритм и всё отлично заработало!
Пока не запустил сверление нескольких отверстий...
Оказалось что Ncstudio эту инверсию не делает для чётных отверстий.
Просто подстава какая-то.
Но благодаря тому что верхнее отверстие должно быть всегда наибольшее, а нижнее - наименьшее (в абсолютных единицах, с учетом знака), применил правило, что если это не так, то надо тогда перемножить каждое из них на -1
После этого всё заработало!
Написал все доступные для этого станка циклы сверления. Там где не требуется смена вращения шпинделя. Расточные циклы не делал, хотя это тоже интересно очень, но не знаю как к ним CamWork отнесётся и захочет ли их выдавать. Все расточные циклы подразумевают изначальный контроль угла постановки инструмента. Либо контроль его после остановки уже. Так как в качестве инструмента идёт расточая головка с одним несимметричным резцом. И перед операциями ввода или вывода его из отверстия происходит смещение относительно центра.
И все мои доделки правильно заработали!
Правда с ограничениями - только абсолютная стстема координат G90, и высокая плоскоть перехода между отверстиями G98.
Система координат бывает ещё и относительная G91 - это когда значения представляют из себя смещения от прошлой координаты.
А низкую плоскоть переходов лучше не использовать, так как фреза может где-то за крепёж зацепиться.
В целом оба значения G90 и G98 - это по умолчанию так везде.
Из логических операторов в этом языке есть только IF... Привет из 1957 года. Циклов нет. Условных переходов нет. Безусловных тоже. Только вызов подпрограмм. И то они по тому есть, что в те времена размещались на своих отдельных перфокартах)
А мне для реализации моей задумки по автоматическому измерению самим станком габаритов заготовки очень-очень нужен цикл. Чтобы шаги можно было делать в поисках края...
В итоге придумал!
Записывать в переменную1 значение которое будет условием выхода из цикла. В переменную2 записывать 0. Вызывать подпрограмму.
В подпрограмме делать то что нужно мне по циклу
Увеличивать переменную2 на единицу.
Сравнивать если переменная2 не больше переменной1 тогда из этой же подпрограммы вызывать её саму же. Да! Так прокатывает в этой реализации языка!
И вуаля! Полноценный цикл FOR со счётчиком. Либо условие WHILE, если не инкрементровать счётчик, а просто отслеживать его значение.
Короче ретро-кодинг у меня пред- и посленовогодний).
Ассемблер после такого G-кода выглядит практически как визуальное программирование).
И ассемблер документирован отлично всегда. Там на каждый КОП количество тактов процессора приведено и на какие флаги он влияет.
А тут одни глюки и магия какая-то