В общем я его "пабидил"!
Не прошло и два года!(всего 23 месяца каких то..).
Токарный станок:
Требовалось чтобы во время работы G кода, включался поиск оси на револьверной головке. Аналог кнопки Ref Y(X, Z, кому что требуется.. у меня револьвер на Y стоит). После поиска сигнала и остановки, обнуляются координаты и далее уже даю команду крутится по часовой на определённую длину(шаг). Например второй инструмент переключится на Y1.0, третий на Y3.0, шестой на Y6.0, на Y7.0 опять встанет первый инструмент! И если не будет перед сменой позиции головки, поиска сигнала от домашнего положения и обнуления координат, то например если требуется выставить позицию головы на второй инструмент(Y2.0) после шестого инструмента! Он начнет крутить голову в обратную сторону! С Y6.0 до Y2.0! И никаких проблем бы не было, если бы не одно но... голова от ТПК125 крутится только в одну сторону! В обратную сторону она фиксируется(клинит). И вот тут засада. Не буду же я в ручную каждый раз жать на кнопку RefY! К тому же без остановки программы она не активна!
Временное решение было сажать инструмент на координаты Y7, Y15,Y28,Y79... etc... В общем полный геморрой! Бывало что за одну деталь участвуют 6 инструментов и каждый из них в разном порядке выставляется по ходу работы раза по три! Вместо простого указания T1, T5, T4 итд.. приходилось писать вот такое:
(требуется инструмент под номером 4)
T0104
G00
Y4.2
Y4.0
G01 F30
Y3.8
G01 F60
Y3.6
(далее требуется инструмент 2)
T0102
G00
Y8.2
Y8.0
G01 F30
Y7.8
G01 F60
Y7.6
итд... к 10ой смене инструмента цифры могут быть уже под Y50+++ Конкретно начинаешь путаться и много считать...
Мало того! Перед новой деталью надо обязательно сбросить координаты головы! Иной раз тупо забываешь.. и программа с Y50 лезет на Y4... А голова то в обратку не крутится... происходит потеря шага(в моем случае энкодер стоит.. он просто отключает двигатель) и либо останавливается программа(если сигнал ошибки заведен на плату), либо он пойдет работать не тем инструментом... да еще и без удержания двигателем! А это зачастую "привет".....(у меня обычно так... руки не доходят датчик завести.)
Пробовал использовать код G28.1
Он работает аналогично кнопки "RefY" но из G кода! Казалось бы вот решение! Но есть два нюанса.. а точнее даже ТРИ!
1. Он глючит! Чтобы исправно работал нужно делать паузы и задержки между кодом и прочими командами. Вот пример:
T0102
G28.1 Y0 (поймает датчик и обнулит Y)
G01 F50 (это типо задержка! Если ставить G4 и паузу - любая цифра сделает зависание до бесконечности!)
Y0.1(тоже задержка, можно хоть 0.01! Видно это не сколько задержка сколько "пинок" для программы! Иначе не работает!)
G00(тут уже пошел код револьвера)
Y1
G00
Y0.9
G01 F10
Y0.65
G01 F60
Y0.55
И все бы хорошо! НО!
2. Он СИЛЬНО глючит! Не сразу удалось выяснить, почему в один день детали выходят из под резца сотка в сотку! В другой день либо недожрет пару десяток! Либо сожрет! А иной раз и вовсе врежется в станок... Дело в том что после G28.1 кода, иногда(далеко не всегда!) координаты тупо меняются! Как только срабатывает G28.1 и начинает крутится револьвер в поисках домашнего положения, вместе с этим координаты X и Z хаотично меняются! Причем "измена" может случится на 0.001мм! А может на 10мм! И далеко не всегда! Обычно сначала малое число, потом больше, больше... чем больше раз используешь G28.1 , тем больше и изменения вносит. Через деталей 10 может конкретно сбиться. А ты это время вводишь поправки в инструмент! Не понимая что не так! Вчера точил 50 деталей сотка в сотку! Сегодня после каждой детали надо править Offset! Бывает на пару соток! Бывает на пару миллиметров! Когда я это выяснил, проводил тесты от чего и почему такое происходит. 100% зависимости не углядел. Если перезагрузить программу, то некоторое время все работает штатно. Но потом опять начинается. Бывает на 3ей детали. Бывает на 10ой! Самое обидное, что меняет он также и машинные координаты! Тем самым не дав понять, была ли "подмена" или нет! Только если следить за координатами каждый раз при использовании G28.1 кода! И если координаты X или Z изменились, срочно паузу и смотреть на сколько!(чаще всего это 0.001-0.003) но даже так через несколько смен инструмента там уже сотки набегают! Бывает только одну координату заменит! Бывает обе! Также возможно зависимость есть, если часто меняешь цифры в Fixture Offset! Например надо подкорректировать резец(сточилась кромка, ушел размер), и походу на эту разницу G28.1 и добавляет к координатам по своему желанию! И чем чаще выставляешь поправки, тем чаще G28.1 "подсирает!" Но зависимость не 100%! Так как даже без ввода поправок он может начать "подсирать!"
3. ОН ОЧЕНЬ СИЛЬНО ГЛЮЧИТ! Если включишь функцию Backlash, то такое начнется... чем больше люфт и величина поправки, тем больше G28.1 внесет изменения в координаты!(хадина...).
В целом функция backlash не очень хорошая. Лучше ее вовсе не использовать.
В общем на протяжении почти двух лет я использовал как G28.1, так и просто прокрутку револьвера по координатам Y5, Y10, Y40 итд.. С G28.1 50/50! То весь день все исправно! То как начнет тупить(перезагрузка помогает не на долго). В другом случае геморрой с написанием программ да и иной раз забудешь обнулится...
Это было вводное так сказать!

Сейчас начнется главное!
Конечно я читал форумы по макросам! Но беда в том что никто... НИКТО не использует токарный! И все макросы тупо под фрезер и подобное! И вот все это время я периодически тратил время на поиски решения через макрос! Перепробовал кучу всего! С одной стороны учить язык который использует mach4 у меня тупо нет времени! Мне всего то нужен один примитивный макрос на поиск HOME одной оси! И все! Больше от макросов мне ничего не надо! И ради этого тратить годы на изучение.... особенно когда рано или поздно перейдешь на нормальную стойку ЧПУ! В общем не вариант...
С другой стороны макрос очень нужен!
В общем и так и сяк все перепробовал - ничего! Перечитал все забугорные форумы! НИЧЕГО! В конечном итоге нашел намек у пендосов на требуемое! И если бы не одна случайность сегодня, я бы еще года два возился точно!
В общем основа макроса такая!
mc.mcAxisHome(inst, 1) - единичка, это под какой цифрой у меня ось Y!(странно... в системе указано что двигатель стоит под цифрой 0)
Выглядит это вот так:
function m120() - макрос под номером 120(можно ставить любой, но и название файла тоже нужно менять)
local inst = mc.mcGetInstance();
mc.mcAxisHome(inst, 1); - вот это основа!
end
Простейший макрос! Но вот засада... Эта шняга не работает! НИКАК! Совсем!
Начинаем разбираться... Если бы не чистая случайность.. я бы не разобрался. Дело в том что данный макрос не работает из G кода! То есть! Это полный аналог кнопки "RefY"! Но как многие уже знают, эти кнопки не работают во время пуска программы нажатием на кнопку активации G кода!(Cycle Start Gcode!) И когда доходит до строки с макросом(в моем случае это M120), то ничего не происходит! Просто виснет все пока не нажмешь стоп.(а далее либо пропускай этот макрос.. либо сухари суши). Я долго искал другой способ. Через поиск дома по G31 коду например, а далее макросом обнулять координаты(что то даже получалось.. но не на 100%). В итоге по крупицам с разных форумов и методом тыка, я нашел решение.
Все так и оказалось!
mc.mcAxisHome(inst, 1)
Не работает пока активен Cycle Start Gcode! А значит надо остановить программу! Использовать этот макрос, а затем запустить!
function m120()
local inst = mc.mcGetInstance();
mc.mcCntlCycleStop(inst);
mc.mcAxisHome(inst, 1);
mc.mcCntlCycleStart(inst);
end
Мы запускаем программу нажатием на кнопку Cycle Start Gcode! Далее станок работает и доходит до макроса! Включается макрос, макрос ВЫКЛЮЧАЕТ программу! Включает поиск оси. Затем опять включает Cycle Start Gcode! ИИИИИ!!!
Нифига не сработало!

))))))))
И так оно бы и осталось.. если бы я случайно не вспомнил об первом глюке кода G28.1! А это задержка! Без задержки он не работает! И я попробовал сделать вот так!
function m120()
local inst = mc.mcGetInstance();
mc.mcCntlCycleStop(inst); - остановка программы
wx.wxSleep(0.1); - задержка на 0.1 сек (аналог пинка... прям как у G28.1)
mc.mcAxisHome(inst, 1); - поиск дома
wx.wxSleep(4); - задержка на 4 сек
mc.mcCntlCycleStart(inst); - запуск программы(и продолжение G кода... тоесть станок продолжает резать или переключать инструмент)
wx.wxSleep(1); - задержка на 1 сек
end
И вот только в этом случае все заработало! Задержка нужна для того чтобы макрос остановил работу станка, затем револьверка нашла сигнал от датчика. Потом обнулилась. И запустить опять станок! В общем у меня на это ушло 3 секунды. Но это впритык! 1 из 10 раз макрос не срабатывал! А точнее либо останавливался либо запускался по кругу!(сам.. и по второму разу уже срабатывал обычно! Если выставить время меньше, то бывало что 10 раз перезапускается!). Я сделал 5 секунд на всякий пожарный.. И тогда работало все 100% исправно!
Вот такие у меня выдались последние пару лет!

)
Почему столько тексту? А у меня праздник! Столько времени убить из за подобной ерунды, что написание каких то пары страниц это не проблема! Да и мало ли кому пригодится! Старался подробно все описать причины и следствия!