Настройка автоматической смены инструмента в релизе 4.4
Начиная с релиза 4.4, в визуализаторе доступна настройка автоматической смены инструмента. Все параметры находятся в меню Станок -> Инструменты.
Настройка автоматической смены инструмента состоит из нескольких этапов:
- Настройка механизма автоматической смены инструмента.
- Создание базы используемых инструментов.
- Настройка магазина и распределение инструментов по держателям.
- Настройка исполнительных механизмов и датчиков.
- Настройка калибратора инструмента.
Важно: перед настройкой магазина необходимо сначала заполнить Базу инструментов. Магазин использует инструменты, уже созданные в базе: для каждого держателя выбирается соответствующий номер инструмента и задаётся его положение.
Включение автоматической смены инструмента
Перейдите в меню Станок -> Инструменты -> Смена инструмента.
В параметре «Смена инструмента» выберите значение «Автоматическая». После этого станут доступны параметры настройки автоматического сменщика.
В параметре «Тип сменщика» выберите используемый тип механизма. Для линейного магазина выберите значение «Линейный».
Далее укажите расположение магазина:
- «На столе» - магазин установлен непосредственно на рабочем столе станка.
- «На портале» - магазин установлен на портале. В этом случае дополнительно необходимо указать его ориентацию, например «Вдоль оси Y».
В этом разделе также задаются дистанции выхода из держателя с инструментом и без инструмента, а также выход управления механизмом захвата инструмента.
Кнопка «НАСТРОИТЬ МАГАЗИН» открывает вкладку «Магазин инструментов». Перед переходом к его настройке необходимо сначала заполнить «Базу инструментов».
База инструментов
Перейдите в Станок -> Инструменты -> База инструментов.
База инструментов содержит информацию обо всех инструментах, которые могут использоваться на станке. Созданные в базе инструменты в дальнейшем назначаются конкретным держателям магазина.
Для каждого инструмента задаются следующие параметры:
- «Номер в базе» - номер инструмента;
- «Длина, мм» - длина инструмента;
- «Радиус, мм» - радиус инструмента;
- «Длина по датчику» - значение длины, полученное при измерении инструмента датчиком.
Для добавления нового инструмента нажмите «ДОБАВИТЬ». Для удаления выбранного инструмента используется кнопка «УДАЛИТЬ», а для удаления всей базы - «УДАЛИТЬ ВСЕ».
После заполнения базы нажмите «ПРИМЕНИТЬ». Теперь можно переходить к настройке магазина инструментов.
Магазин инструментов
Перейдите в Станок -> Инструменты -> Магазин инструментов или нажмите кнопку «НАСТРОИТЬ МАГАЗИН» во вкладке «Смена инструмента».
В параметре «Размер магазина» укажите количество держателей, которыми оборудован магазин. После изменения размера в таблице будет отображаться соответствующее количество позиций.
Для каждого держателя отображаются следующие параметры:
- «Информация» - длина и радиус назначенного инструмента;
- «База» - номер инструмента из ранее созданной базы;
- «Позиция» - координаты держателя на станке;
- «Длина по датчику, мм» - измеренная длина назначенного инструмента.
Каждому держателю магазина необходимо назначить соответствующий инструмент из Базы инструментов и указать его фактическое положение на станке.
Настройка координат держателей
В нижней части окна находятся параметры задания координат держателей. При необходимости можно включить параметр «Общие координаты держателей».
Для осей X, Y и Z задаются координаты, соответствующие расположению держателей магазина.
Кнопки «ВВЕРХ» и «ВНИЗ» позволяют изменять порядок держателей в магазине.
После завершения настройки нажмите «ПРИМЕНИТЬ».
Перед первым запуском автоматической смены необходимо убедиться, что номера инструментов в таблице соответствуют их фактическому расположению в держателях магазина.
Управление захватом инструмента
Для управления механизмом зажима и освобождения инструмента используется параметр «Выход управления инструментом». В нём необходимо выбрать дискретный выход контроллера, подключённый к механизму захвата инструмента.
В параметре «Действие для освобождения инструмента» задаётся состояние выбранного выхода, при котором инструмент освобождается. Например, если для разжима цанги необходимо подать сигнал на выбранный выход, следует установить значение «Включить выход».
После настройки визуализатор сможет автоматически управлять зажимом и освобождением инструмента во время выполнения процедуры смены.
Контроль наличия инструмента
Если на станке установлены датчики контроля состояния инструмента, включите параметр «Выполнять проверку датчиков инструмента».
После включения проверки необходимо назначить соответствующие входы:
- «Вход датчика наличия инструмента» - вход, сигнализирующий о наличии инструмента в шпинделе;
- «Вход датчика отсутствия инструмента» - вход, сигнализирующий об отсутствии инструмента в шпинделе.
Если такие датчики на станке не используются, проверку можно оставить отключённой.
Продувка инструмента
Если во время смены инструмента используется пневматическая продувка, включите параметр «Включить продувку инструмента».
После включения необходимо настроить:
- «Выход управления продувкой» - дискретный выход контроллера, подключённый к клапану продувки;
- «Действие для продувки» - состояние выбранного выхода, при котором продувка включается.
Управление щёткой
Если конструкцией станка предусмотрена поднимаемая щётка, которая используется во время смены инструмента, включите параметр «Включить управление щёткой».
После включения необходимо указать:
- «Выход управления щёткой» - дискретный выход контроллера, управляющий механизмом подъёма и опускания щётки;
- «Действие для поднятия щётки» - состояние выхода, соответствующее поднятому положению щётки;
- «Вход датчика поднятия щётки» - вход датчика, подтверждающего верхнее положение щётки;
- «Вход датчика опускания щётки» - вход датчика, подтверждающего нижнее положение щётки.
Управление магазином инструментов
Если магазин инструментов оборудован отдельным механизмом открытия и закрытия, включите параметр «Включить управление магазином инструментов».
После включения задаются следующие параметры:
- «Выход управления магазином» - дискретный выход, управляющий механизмом открытия и закрытия магазина;
- «Действие для открытия магазина» - состояние выхода, соответствующее открытому положению магазина;
- «Вход датчика открытия магазина» - вход, подтверждающий открытое положение магазина;
- «Вход датчика закрытия магазина» - вход, подтверждающий закрытое положение магазина.
Если датчики положения магазина не используются, для соответствующих входов можно оставить значение «Нет».
Настройка калибратора инструмента
В разделе настройки автоматической смены также задаются параметры, используемые при измерении инструмента на калибраторе.
В параметре «Позиция калибратора (маш.)» укажите машинные координаты X, Y и Z, соответствующие фактическому расположению датчика измерения инструмента.
Далее задаются параметры поиска датчика:
- «Скорость быстрого поиска датчика, мм/мин» - скорость первоначального поиска поверхности датчика;
- «Скорость медленного поиска датчика, мм/мин» - скорость повторного точного поиска;
- «Безопасная высота (маш.)» - безопасная машинная координата по оси Z, используемая при перемещении к калибратору.
Также отдельно задаются скорости перемещений:
- XY, быстрое - скорость быстрого перемещения по осям X и Y;
- XY, медленное - скорость медленного перемещения по осям X и Y;
- Z, быстрое - скорость быстрого перемещения по оси Z;
- Z, медленное - скорость медленного перемещения по оси Z.
Параметр «Таймаут остановки шпинделя, сек» задаёт время ожидания полной остановки шпинделя перед продолжением процедуры смены или измерения инструмента.
После изменения параметров нажмите «ПРИМЕНИТЬ».
Панель автоматической смены инструмента
Для контроля состояния системы и выполнения ручных операций используется панель автоматической смены инструмента.
На панели отображается состояние магазина, установленного инструмента и исполнительных механизмов системы автоматической смены.
На панели доступны следующие элементы:
- Магазин инструментов - отображает инструменты, назначенные держателям магазина.
- Текущий инструмент - показывает номер инструмента, который в данный момент установлен в шпинделе.
- Состояние захвата инструмента - позволяет контролировать состояние механизма зажима и освобождения инструмента.
- Состояние щётки - отображает её текущее положение и позволяет вручную управлять механизмом, если управление щёткой включено в настройках.
- Состояние магазина - отображает открытое или закрытое положение магазина и позволяет вручную управлять его механизмом.
- Управление захватом инструмента - позволяет вручную выполнить зажим или освобождение инструмента.
- Выбор и смена инструмента - позволяет выбрать требуемый инструмент и запустить процедуру его установки.
- Ручная установка номера инструмента - позволяет указать, какой инструмент в данный момент считается установленным в шпинделе.
Перед первым запуском автоматической смены рекомендуется проверить работу всех исполнительных механизмов, правильность назначенных входов и выходов, соответствие инструментов позициям магазина, а также координаты держателей и калибратора.
Настройка автоматической смены инструмента в релизе 4.3
- Автосмена инструмента выполняется на макросах.
- Ниже представлены макросы для линейной и карусельной смены инструмента.
- Макросы необходимо добавить через меню Сервис -> Настройки -> Макросы.
- Минимальная версия, на которой поддерживаются макросы из данной статьи: релиз 4.3.
Библиотека переменных - все настройки необходимо выполнять только в этом макросе. Название макроса обязательно должно быть: ATC_VLIB - по такому имени эта библиотека подключается к остальным макросам. Макрос нужно сделать скрытым.
Библиотека функций - в этом макросе реализованы все функции . Название макроса обязательно должно быть: ATC_FLIB - по такому имени эта библиотека подключается к остальным макросам. Макрос нужно сделать скрытым.
Макрос смены инструмента - в этом макросе реализована непосредственно смена инструмента. Макрос нужно сделать скрытым. Макрос нужно назначить на макровызов для команды M0?6 через меню Сервис -> Настройки -> Макровызовы. Макрос будет автоматически вызываться только при работе управляющей программы, когда в ней встречается команда M6Tx, где Tx - следующий номер инструмента.
Макрос построения таблицы инструментов - в этом макросе реализован алгоритм построения таблицы инструментов. После создания таблицы автосмена будет выполняться без измерения только что установленного инструмента - компенсация длины будет выполняться автоматически по таблице. Макрос нужно сделать видимым - запускать его по кнопке на панели МАКРОСЫ. Чтобы активировать режим автоматической компенсации длины инструмента (G43), необходимо в контроллер отправить команду $457=1 (через консоль).
Макрос выполняет измерение инструмента и заносит его длину (фактически значение машинной координаты точки касания фрезы калибратора) в память контроллера. После запуска макроса он просит ввести номер инструмента для измерения - чтобы измерить все инструменты в цикле, введите 0.
Макрос сброса инструмента - в этом макросе реализован автоматический сброс текущего установленного инструмента в соответствующую позицию в магазине. Макрос нужно сделать видимым - запускать его по кнопке на панели МАКРОСЫ.
Макросы линейной смены инструмента
Библиотека переменных
Нажмите, чтобы показать код макроса
{
/* ****** Перед началом использования обязательно сконфигурить все параметры ниже под Ваш станок *****
Макрос работает на версии визуализатора 4.3 и выше.
Макрос необходимо назвать ATC_VLIB - именно по этому имени он подключается в макросах автосмены инструмента.
Макрос нужно сделать скрытым.
*/
// Размер магазина инструментов
var TOOLS_NUMBER = 8
// Параметр BASKET_LOCATION отвечает за расположение магазина инструментов.
// Значение 1 - магазин закреплен на столе (самый частый вариант)
// Значение 2 - магазин закреплен на портале и находится под ним.
var BASKET_LOCATION = 1
// Параметр HOLDERS_ORIENTATION_AXIS используется только, если магазин закреплен под порталом (BASKET_LOCATION = 2)
// и определяет, вдоль какой оси расположены держатели в магазине. Обычно это ось X (сам портал при этом движется вдоль оси Y).
var HOLDERS_ORIENTATION_AXIS = "X"
// Массив координат X позиций инструментов в магазине
var HOLDERS_X_POS = [10, 20, 30, 40, 50, 60, 70, 80]
// Массив координат Y позиций инструментов в магазине
var HOLDERS_Y_POS = [200, 200, 200, 200, 200, 200, 200, 200]
// Массив координат Z позиций инструментов в магазине
var HOLDERS_Z_POS = [-10, -10, -10, -10, -10, -10, -10, -10]
// Расстояние для захода в позицию магазина с инструментом для его сброса, а также расстояние выхода из магазина с только что установленным инструментом.
// Например, если шпинедль с установленным инструментом заходит в магазин по оси Y в положительном направлении, то необходимо параметру
// MOVE_WITH_TOOL_OFFSET_Y присвоить отрицательно значение, остальным 0.
var MOVE_WITH_TOOL_OFFSET_X = 0
var MOVE_WITH_TOOL_OFFSET_Y = -100
var MOVE_WITH_TOOL_OFFSET_Z = 0
// Расстояние ухода с позиции в магазине без инструмента (для снятия), а также захода в позицию магазина без инструмента (для его захвата).
// Например, если шпиндель без инструмента заходит в магазин по оси Z в отрицательном направлении (сверху вниз), то необходимо параметру
// MOVE_WITHOUT_TOOL_OFFSET_Z присвоить положительно значение, остальным 0.
var MOVE_WITHOUT_TOOL_OFFSET_X = 0
var MOVE_WITHOUT_TOOL_OFFSET_Y = 0
var MOVE_WITHOUT_TOOL_OFFSET_Z = 50
// Безопасная высота - все перемещения желательно выполнять на безопасной высоте, по умолчанию это машинный 0 по Z
var SAFE_Z_POS = 0
// Быстрая скорость перемещения по Z
var FAST_RATE_Z = 2000
// Медленная скорость перемещения по Z
var SLOW_RATE_Z = 500
// Быстрая скорость перемещения по X,Y
var FAST_RATE_XY = 5000
// Медленная скорость перемещения по X,Y
var SLOW_RATE_XY = 500
// Таймаут на остановку шпинделя
var SPINDLE_STOP_TIMEOUT = 1
// !!! Ниже обязательно нужно настроить машинные коориднаты позиции, где стоит шайба !!!
// Шпиндель будет автоматически презжать в эту позицию для измерения длины инструмента
var PROBE_X_MPOS = 375
var PROBE_Y_MPOS = 2982
var PROBE_Z_MPOS = -70
var FAST_RATE_PROBE = 200
var SLOW_RATE_PROBE = 10
// Ниже сервисные переменные для активации тех или иных действий в процедуре смены инструмента
// Продувка инструмента. 0 - продувки нет.
var NEED_BLOW_TOOL = 1
// Требуется ли проверка датчиков захвата/освобождения инструмента
var NEED_CHECK_TOOL_SENSORS = 1
// Требуется ли выполнять подъем/опускание щетки отдельной командой
var NEED_BRUSH_CONTROL = 1
// Требуется ли управлять открытием/закрытием магазина инструментов
var NEED_TOOL_BASKET_CONTROL = 0
// Ниже список входов контроллера, к которым подключены датчики. Например, 8 ознаечает подключение ко входу IN8 (переопределенный HOLD).
// Если сигнал не используется, присвойте ему значение -1
// Сигнал поднятой щетки
var BRUSH_UP_INPUT_ID = 9
// Сигнал опущенной щетки
var BRUSH_DOWN_INPUT_ID = -1
// Сигнал наличия инструмента в патроне
var TOOL_CAUGHT_INPUT_ID = 7
// Сигнал отсутствия инструмента в патроне
var TOOL_RELEASED_INPUT_ID = 8
// Сигнал открытия магазина инструментов
var BASKET_ON_INPUT_ID = -1
// Сигнал закрытия магазина инструментов
var BASKET_OFF_INPUT_ID = -1
// Ниже список задействованных релейных выходов. Например, значение 5 означает, используется выход OUT5.
// Номер выхода управления захватом/освобождения инструмента
var TOOL_CTRL_PORTNO = 5
// Номер выхода управления щеткой
var BRUSH_CTRL_PORTNO = 6
// Номер выхода продувки инструмента
var TOOL_BLOW_PORTNO = 7
// Номер выхода управления магазином
var BASKET_CTRL_PORTNO = 4
// Ниже параметры задают, по какому действию релейного выхода осуществляется активация периферии
// Если TOOL_RELEASE_IF_RLY_ON == 1, то освобождение инструмента осуществляется активацией (M64) управляющего им выхода. Если 0 - деактивацией (M65)
var TOOL_RELEASE_IF_RLY_ON = 1
// Если BRUSH_UP_IF_RLY_ON == 1, то подъем щетки осуществляется активацией (M64) управляющего ей выхода. Если 0 - деактивацией (M65)
var BRUSH_UP_IF_RLY_ON = 1
// Если BASKET_OPEN_IF_RLY_ON == 1, то открытие магазина осуществляется активацией (M64) управляющего им выхода. Если 0 - деактивацией (M65)
var BASKET_OPEN_IF_RLY_ON = 1
// Если BLOW_TOOL_IF_RLY_ON == 1, то продув патрона осуществляется активацией (M64) управляющего выхода. Если 0 - деактивацией (M65)
var BLOW_TOOL_IF_RLY_ON = 1
}
Библиотека функций
Нажмите, чтобы показать код макроса
{
/*
Макрос работает на версии визуализатора 4.3 и выше.
Макрос необходимо назвать ATC_FLIB - именно по этому имени он подключается в макросах автосмены инструмента.
Макрос нужно сделать скрытым.
*/
// include "ATC_VLIB"
var brush_up_signal = "i" + String(BRUSH_UP_INPUT_ID)
var brush_down_signal = "i" + String(BRUSH_DOWN_INPUT_ID)
var tool_caught_signal = "i" + String(TOOL_CAUGHT_INPUT_ID)
var tool_released_signal = "i" + String(TOOL_RELEASED_INPUT_ID)
var basket_on_signal = "i" + String(BASKET_ON_INPUT_ID)
var basket_off_signal = "i" + String(BASKET_OFF_INPUT_ID)
// Функция освобождения инструмента из патрона путем включения реле, подключенного к выходу TOOL_CTRL_PORTNO
function release_tool() {
var port_mask = Math.pow(2, TOOL_CTRL_PORTNO-1)
if (TOOL_RELEASE_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
if (tool_released_signal == "i-1") {
$.send("G4P2")
}
}
// Функция захвата инструмента в патрон путем выключения реле, подключенного к выходу TOOL_CTRL_PORTNO
function catch_tool() {
var port_mask = Math.pow(2, TOOL_CTRL_PORTNO-1)
if (TOOL_RELEASE_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
if (tool_caught_signal == "i-1") {
$.send("G4P2")
}
}
function get_basket_sensors_value() {
// 0 - магазин закрыт
// 1 - магазин открыт
// 2 - неверное состояние, когда оба датчика имеют одинаковое состояние
// 3 - датчики магазина не установлены, проверку делать не нужно
if (basket_on_signal != "i-1" || basket_off_signal != "i-1") {
var sensor_value = 0
if (basket_on_signal != "i-1" && basket_off_signal != "i-1") {
var sensor_value = $.inputs[basket_on_signal] && !$.inputs[basket_off_signal]
if (sensor_value == 0) {
if( ($.inputs[basket_on_signal] && $.inputs[basket_off_signal]) || (!$.inputs[basket_on_signal] && !$.inputs[basket_off_signal]) ) {
// Неверное состояние: оба датчика либо одновременно активны, либо одновременно неактивны
var sensor_value = 2
}
}
}
else if (basket_on_signal != "i-1") {
var sensor_value = $.inputs[basket_on_signal]
}
else {
var sensor_value = !$.inputs[basket_off_signal]
}
return sensor_value
}
else {
return 3
}
}
// Функция открытия магазина инструментов путем включения реле, подключенного к выходу BASKET_CTRL_PORTNO
function tool_basket_on() {
var sensor_value = get_basket_sensors_value()
// Проверяем состояние магазина инструментов перед началом процедуры смены инструмента
if (sensor_value == 2) {
// Оба датчика магазина либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков магазина инструментов: невозможно определить его состояние!")
$.tasklist.stop()
$.exit()
}
if(sensor_value == 0 || sensor_value == 3) {
var port_mask = Math.pow(2, BASKET_CTRL_PORTNO-1)
//Магазин инструментов закрыт, открываем его
if (BASKET_OPEN_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
// Если датчик открытия инструмента не установлен, то безусловно отправляем таймаут на открытие инструмента
if(basket_on_signal == "i-1") {
$.send("G4P2")
}
}
}
// Функция закрытия магазина инструментов путем выключения реле, подключенного к выходу BASKET_CTRL_PORTNO
function tool_basket_off() {
var port_mask = Math.pow(2, BASKET_CTRL_PORTNO-1)
if (BASKET_OPEN_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
// Если датчик закрытия инструмента не подключен, то безусловно отправляем таймаут на закрытие магазина.
if(basket_off_signal == "i-1") {
$.send("G4P3")
}
}
function blow_tool() {
var port_mask = Math.pow(2, TOOL_BLOW_PORTNO-1)
// Пускаем воздух для продувки инструмента
if (BLOW_TOOL_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
// Выдерживаем паузу для продувки
$.send("G4P2")
// Отключаем воздух
if (BLOW_TOOL_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
}
// Функция подъема щетки (включение выхода BRUSH_CTRL_PORTNO)
function set_brush_up() {
var port_mask = Math.pow(2, BRUSH_CTRL_PORTNO-1)
if (BRUSH_UP_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
// Если датчик поднятой щетки не установлен, то безусловно отправляем таймаут на поднятие щетки
if (brush_up_signal == "i-1") {
$.send("G4P2")
}
}
// Функция опускания щетки (выключение выхода BRUSH_CTRL_PORTNO)
function set_brush_down() {
var port_mask = Math.pow(2, BRUSH_CTRL_PORTNO-1)
if (BRUSH_UP_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
// Если датчик опущенной щетки не установлен, то безусловно отпраляем таймаут на опускание щетки
if (brush_down_signal == "i-1") {
$.send("G4P2")
}
}
function check_tool_basket_on() {
// Проверяем, что магазин инструментов открыт
// Если датчик открытого магазина не установлен, то сразу выходим из функции
if (basket_on_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_basket_sensors_value() == 1) {
// Магазин открылся, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_basket_sensors_value()
if (sensor_value == 1) {
// Всё хорошо, магазни открыт
}
else if (sensor_value == 0) {
$.message("Магазин инструментов не открылся!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Неверное состояние датчиков магазина инструментов, невозможно проверить его открытие!")
$.tasklist.stop()
$.exit()
}
}
function check_tool_basket_off() {
// Проверяем датчик закрытия магазина инструментов
// Если датчик закрытого магазина не установлен, то сразу выходим из функции
if (basket_off_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 30) {
if (get_basket_sensors_value() == 0) {
// Магазин закрылся, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_basket_sensors_value()
if (sensor_value == 0) {
// Всё хорошо, магазни закрыт
}
else if (sensor_value = 1) {
$.message("Магазин инструментов не закрылся!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Неверное состояние датчиков магазина инструментов, невозможно проверить его закрытие!")
$.tasklist.stop()
$.exit()
}
}
function tool_basket_on_if_closed() {
var sensor_value = get_basket_sensors_value()
if (sensor_value == 0 || sensor_value == 3) {
// Всё хорошо, магазни закрыт, можем его открыть
tool_basket_on()
}
}
function tool_basket_off_if_opened() {
var sensor_value = get_basket_sensors_value()
if (sensor_value == 1 || sensor_value == 3) {
// Всё хорошо, магазни открыт, можем его закрыть
tool_basket_off()
}
}
function get_tool_sensors_value() {
// 0 - отсутствие инструмента
// 1 - наличие инструмента
// 2 - неверное состояние, когда оба датчика имеют одинаковое состояние
if (tool_caught_signal != "i-1" || tool_released_signal != "i-1") {
var sensor_value = 0
if (tool_caught_signal != "i-1" && tool_released_signal != "i-1") {
var sensor_value = $.inputs[tool_caught_signal] && !$.inputs[tool_released_signal]
if (sensor_value == 0) {
if( ($.inputs[tool_caught_signal] && $.inputs[tool_released_signal]) || (!$.inputs[tool_caught_signal] && !$.inputs[tool_released_signal]) ) {
// Неверное состояние: оба датчика либо одновременно активны, либо одновременно неактивны
var sensor_value = 2
}
}
}
else if (tool_caught_signal != "i-1") {
var sensor_value = $.inputs[tool_caught_signal]
}
else {
var sensor_value = !$.inputs[tool_released_signal]
}
return sensor_value
}
else {
return 0
}
}
// Функция для проверки, что инструмент захвачен в патрон
function check_tool_caught() {
$.send("G4P0.1")
if(tool_caught_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_tool_sensors_value() == 1) {
// Инструмент захвачен, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensors_value = get_tool_sensors_value()
if (sensors_value == 1) {
// Всё хорошо, инструмент захвачен, датчик разжатия цанги не активен.
}
else if (sensors_value == 0) {
$.message("Не получен сигнал захвата инструмента либо получен сигнала разжатия цанги!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Невозможно определить состояние цанги после захвата инструмента!")
$.tasklist.stop()
$.exit()
}
}
// Функция для проверки разжатия цанги
function check_tool_released() {
$.send("G4P0.1")
if(tool_released_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_tool_sensors_value() == 0) {
// Инструмент освобожден, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_tool_sensors_value()
if (sensor_value == 0) {
// Всё хорошо, цанга разжата
}
else if (sensor_value == 1) {
$.message("Не получен сигнал разжатия цанги либо получен сигнал захвата инструмента!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Невозможно определить состояние цанги после освобождения инструмента!")
$.tasklist.stop()
$.exit()
}
}
// Функция для проверки, что инструмент не установлен в патрон
function check_no_tool_installed() {
$.send("G4P0.1")
if (get_tool_sensors_value() == 0) {
// Всё хорошо, цанга разжата
}
else {
$.message("Получен сигнал наличия инструмента в патроне после его освобождения!")
$.tasklist.stop()
$.exit()
}
}
function get_brush_sensors_value() {
// 0 - щетка внизу
// 1 - щетка поднята
// 2 - неверное состояние, когда оба датчика имеют одинаковое значение
if (brush_up_signal != "i-1" || brush_down_signal != "i-1") {
var sensor_value = 0
if (brush_up_signal != "i-1" && brush_down_signal != "i-1") {
var sensor_value = $.inputs[brush_up_signal] && !$.inputs[brush_down_signal]
if (sensor_value == 0) {
if( ($.inputs[brush_up_signal] && $.inputs[brush_down_signal]) || (!$.inputs[brush_up_signal] && !$.inputs[brush_down_signal]) ) {
// Неверное состояние: оба датчика либо одновременно активны, либо одновременно неактивны
var sensor_value = 2
}
}
}
else if (brush_up_signal != "i-1") {
var sensor_value = $.inputs[brush_up_signal]
}
else {
var sensor_value = !$.inputs[brush_down_signal]
}
return sensor_value
}
else {
return 0
}
}
// Функция для проверки, что щетка подтяна
function check_brush_up() {
$.send("G4P0.1")
// Если датчик поднятия щетки не установлен, сразу выходим из функции
if (brush_up_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_brush_sensors_value() == 1) {
// Щетка поднялась, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_brush_sensors_value()
if (sensor_value == 1) {
// Всё хорошо, щетка подтяна
}
else {
$.message("Щетка не поднялась!")
$.tasklist.stop()
$.exit()
}
}
// Функция для проверки, что щетка опущена
function check_brush_down() {
$.send("G4P0.1")
// Если датчик опускания щетки не установлен, сразу выходим из функции
if (brush_down_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_brush_sensors_value() == 0) {
// Щетка опустилась, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_brush_sensors_value()
if (sensor_value == 0) {
// Всё хорошо, щетка опущена
}
else {
$.message("Щетка не опустилась!")
}
}
// Функция для установки нового инструмента в шпиндель
function install_new_tool(tool_num) {
// Устанавливаем новый инструмент
if (BASKET_LOCATION == 1) {
// Магазин инструментов закреплен на столе
// Подъезжаем к позиции отступа без инструмента
$.send("G1G53G90X" + String(HOLDERS_X_POS[tool_num - 1] + MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(HOLDERS_Y_POS[tool_num - 1] + MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(FAST_RATE_XY))
$.send("G1G53G90Z" + String(HOLDERS_Z_POS[tool_num - 1] + MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(FAST_RATE_Z))
// Проверяем, что магазин инструментов открыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_on_if_closed()
check_tool_basket_on()
}
// Продуваем патрон и опускаемся в позицию установки нового инструмента
if(NEED_BLOW_TOOL) {
blow_tool()
}
// Опускаемся в позицию захвата инструмента (без инструмента)
$.send("G1G91X" + String(-MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(-MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(-MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Захватываем инструмент
catch_tool()
// Проверяем, что инструмент захвачен в патрон
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_caught()
}
// Устанавливаем в системе номер инструмента
$.send("T" + String(tool_num))
// Поднимаемся на расстояние отступа с инструментом
$.send("G1G91X" + String(MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + MOVE_WITH_TOOL_OFFSET_Z + "F" + SLOW_RATE_Z)
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
$.send("G4P0.1")
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
}
else if (BASKET_LOCATION == 2) {
// Магазин инструментов установлен под порталом
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
// Открываем магазин и проверяем, что он открылся
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_on_if_closed()
check_tool_basket_on()
}
// Подъезжаем к позиции отступа без инструмента
if (HOLDERS_ORIENTATION_AXIS == "X") {
$.send("G1G53G90X" + String(HOLDERS_X_POS[tool_num - 1] + MOVE_WITHOUT_TOOL_OFFSET_X) + "F" + String(FAST_RATE_XY))
}
else if (HOLDERS_ORIENTATION_AXIS == "Y") {
$.send("G1G53G90Y" + String(HOLDERS_Y_POS[tool_num - 1] + MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(FAST_RATE_XY))
}
$.send("G1G53G90Z" + String(HOLDERS_Z_POS[tool_num - 1] + MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(FAST_RATE_Z))
// Продуваем патрон и опускаемся в позицию установки нового инструмента
if(NEED_BLOW_TOOL) {
blow_tool()
}
// Опускаемся в позицию захвата инструмента (без инструмента)
$.send("G1G91X" + String(-MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(-MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(-MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Захватываем инструмент
catch_tool()
// Проверяем, что инструмент захвачен в патрон
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_caught()
}
// Закрываем магазин инструментов, после этого инструмент остается зажатым в патроне
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
// Устанавливаем в системе номер инструмента
$.send("T" + String(tool_num))
// Поднимаемся на расстояние отступа с инструментом
$.send("G1G91X" + String(MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + MOVE_WITH_TOOL_OFFSET_Z + "F" + SLOW_RATE_Z)
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
}
$.send("G4P0.5")
}
// Функция сброса текущего инструмента в магазин
function drop_current_tool(tool_num) {
// Сбрасываем текущий инструмент в магазин
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
if (BASKET_LOCATION == 1) {
// Магазин инструментов закреплен на столе
// Опускаемся на расстояние отступа на быстрой скорости
$.send("G1G53G90X" + String(HOLDERS_X_POS[tool_num - 1] + MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(HOLDERS_Y_POS[tool_num - 1] + MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(FAST_RATE_XY))
$.send("G1G53G90Z" + String(HOLDERS_Z_POS[tool_num - 1] + MOVE_WITH_TOOL_OFFSET_Z) + "F" + String(FAST_RATE_Z))
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_on()
check_tool_basket_on()
}
$.send("G4P0.1")
// На медленной скорости движемся в позицию магазина (с инструментом)
$.send("G1G91X" + String(-MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(-MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(-MOVE_WITH_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Отправляем команду сброса инструмента на пневмомеханизм
release_tool()
// Проверяем, что цанга разжата
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_released()
}
// Поднимаемся на расстояние отступа без инструмента на медленной скорости
$.send("G1G91X" + String(MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
}
else if (BASKET_LOCATION == 2) {
// Магазин инструментов установлен под порталом
// Закрываем магазин инструментов
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off_if_opened()
check_tool_basket_off()
}
// Перемещаемся с инструментом на позицию отступа на быстрой скорости
if (HOLDERS_ORIENTATION_AXIS == "X") {
$.send("G1G53G90X" + String(HOLDERS_X_POS[tool_num - 1] + MOVE_WITH_TOOL_OFFSET_X) + "F" + String(FAST_RATE_XY))
}
else if (HOLDERS_ORIENTATION_AXIS == "Y") {
$.send("G1G53G90Y" + String(HOLDERS_Y_POS[tool_num - 1] + MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(FAST_RATE_XY))
}
$.send("G1G53G90Z" + String(HOLDERS_Z_POS[tool_num - 1] + MOVE_WITH_TOOL_OFFSET_Z) + "F" + String(FAST_RATE_Z))
// Открываем магазин инструментов
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_on()
check_tool_basket_on()
}
// На медленной скорости движемся в позицию магазина (с инструментом)
$.send("G1G91X" + String(-MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(-MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(-MOVE_WITH_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Отправляем команду сброса инструмента на пневмомеханизм
release_tool()
// Проверяем, что цанга разжата
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_released()
}
// Поднимаемся на расстояние отступа без инструмента на медленной скорости
$.send("G1G91X" + String(MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
}
// Проверяем, что в патроне нет инструмента
if(NEED_CHECK_TOOL_SENSORS) {
check_no_tool_installed()
}
// Т.к. в шпинделе инструмента нет, то устанавливаем в системе нулевой инструмент
$.send("T0")
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
$.send("G4P0.5")
}
// Установка длины инструмента.
function set_tool_len(tool_num, tool_len) {
$.send("G10L1P" + String(tool_num) + "Z" + String(tool_len.toFixed(3)))
}
// Функция измерения машинной координаты кончика инструмента
function tool_measure(tool_num) {
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
$.send("G1G53G90X" + String(PROBE_X_MPOS) + "Y" + String(PROBE_Y_MPOS) + "F" + String(FAST_RATE_XY))
$.send("G1G53G90Z" + String(PROBE_Z_MPOS) + "F" + String(FAST_RATE_Z))
$.send("G21G91G38.2Z-" + String($.params.maxTravelValueZ) + "F" + String(FAST_RATE_PROBE))
$.send("G0Z1")
$.send("G38.2Z-3F" + String(SLOW_RATE_PROBE))
$.send("G4P0.1")
set_tool_len(tool_num, $.prb.z)
$.send("G4P0.1")
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
}
}
Макрос смены инструмента
Нажмите, чтобы показать код макроса
{
/*
Макрос автоматической смены инструмента. Работает на версии визуализатора 4.3 и выше.
Макрос нужно сделать невидимым - он не предназначен для запуска по кнопке. Вызывается только
при выполнении УП по команде M6(M06).
Данный макрос необходимо назначить на макровызов для команды M0?6.
Использует для своей работы настройки и функции из библиотек ATC_VLIB и ATC_FLIB.
*/
// include "ATC_VLIB"
// include "ATC_FLIB"
var current_tool = $.tc
var next_tool = $.tn
if (next_tool < 1 || next_tool > TOOLS_NUMBER) {
$.message("Неверный номер следующего инструмента!");
$.exit()
}
var tool_installed = 1
}
{
// Функция проверки всех датчиков шпинделя
function check_tool_sensors() {
$.send("G4P0.1")
var sensor_value = get_tool_sensors_value()
if ( sensor_value == 2) {
// Оба датчика инструмента либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков инструмента: невозможно определить состояние инструмента в шпинделе!")
$.tasklist.stop()
$.exit()
}
else if(sensor_value == 1) {
// Инстурмент установлен в шпиндель
tool_installed = 1
}
else if(sensor_value == 0) {
// Шпиндель свободен
tool_installed = 0
}
else {
$.message("Невозможно определить состояние инструмента в шпинделе!")
//$.send("T" + String(current_tool))
$.tasklist.stop()
$.exit()
}
}
}
G4P0.1
G1G90G53Z{SAFE_Z_POS}F{FAST_RATE_Z}
M5
G4P{SPINDLE_STOP_TIMEOUT}
{
// Проверяем датчики шпинделя, чтобы определить, установлен ли перед началом процедур инструмент
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_sensors()
}
else {
if(current_tool == 0) {
tool_installed = 0
}
}
if(tool_installed) {
if (current_tool < 1 || current_tool > TOOLS_NUMBER) {
$.message("Неверный номер текущего установленного инструмента: " + current_tool);
$.tasklist.stop()
$.exit()
}
if (next_tool == current_tool) {
//$.message("Новый инструмент совпадает с текущим, смена не требуется!")
if(NEED_BRUSH_CONTROL) {
set_brush_down()
check_brush_down()
}
$.exit()
}
}
// Запоминаем текущие рабочие координаты, из которых запускаем процедуру смены инструменты, чтобы в конце процедуры вернуться в эту же позицию
if (tool_installed) {
var startX = $.wc.x
var startY = $.wc.y
//var startZ = $.wc.z
}
else {
var startX = 0
var startY = 0
//var startZ = $.wc.z
}
// Запоминаем текущие обороты шпинделя и скорость подачи
var gcodeSpindleSpeed = $.gc.s
var gcodeFeedRate = $.gc.f
// Поднимаем щетку
if(NEED_BRUSH_CONTROL) {
set_brush_up()
check_brush_up()
}
}
G4P0.1
{
// Для безопасности перед началом процедуры закрываем магазин и проверяем, что он закрыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
}
G4P0.1
{
if (tool_installed) {
// Сбрасываем текущий инструмент в магазин при условии, что в патрон инструмент сейчас установлен
drop_current_tool(current_tool)
}
}
G4P0.1
{
// Устанавливаем новый инструмент
install_new_tool(next_tool)
$.send("G4P0.1")
//Закрываем магазин инструментов
if (NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
$.send("G4P0.1")
//Проверяем, что магазин закрылся
check_tool_basket_off()
}
}
G4P0.1
{
$.send("G1G90X" + String(startX.toFixed(3)) + "Y" + String(startY.toFixed(3)) + "F" + String(FAST_RATE_XY))
$.send("G4P0.1")
if(NEED_BRUSH_CONTROL) {
set_brush_down()
check_brush_down()
}
}
Макрос построения таблицы инструментов
Нажмите, чтобы показать код макроса
{
/*
Макрос создания таблицы инструментов. Работает на версии визуализатора 4.3 и выше.
Данный макрос вызывается по кнопке на панели Макросы.
Использует для своей работы настройки и функции из библиотек ATC_VLIB и ATC_FLIB.
*/
// include "ATC_VLIB"
// include "ATC_FLIB"
var current_tool = 1
var installed_tool_id = -1
var last_tool = TOOLS_NUMBER
}
{
// Функция проверки всех датчиков шпинделя
function check_tool_sensors() {
$.send("G4P0.1")
var sensor_value = get_tool_sensors_value()
if ( sensor_value == 2) {
// Оба датчика инструмента либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков инструмента: невозможно определить состояние инструмента в шпинделе!")
//$.tasklist.stop()
$.exit()
}
else if(sensor_value == 1) {
// Инстурмент установлен в шпиндель
tool_installed = 1
installed_tool_id = $.tc
if (installed_tool_id == 0) {
installed_tool_id = -1
}
}
else if(sensor_value == 0) {
// Шпиндель свободен
tool_installed = 0
}
else {
$.message("Невозможно определить состояние инструмента в шпинделе!")
//$.send("T" + String(current_tool))
//$.tasklist.stop()
$.exit()
}
}
}
{
var p = $.input("Введите номер инструмента для измерения (0 - все инструменты)", ["Номер инструмента (от 0 до " + String(TOOLS_NUMBER) + ")"], [0])
if(!p.length) {
$.exit()
}
var tools_to_measure = parseInt(p[0])
if(tools_to_measure < 0 || tools_to_measure > TOOLS_NUMBER) {
$.message("Неверный номер инструмента!")
$.exit()
}
if(tools_to_measure == 0) {
var current_tool = 1
var last_tool = TOOLS_NUMBER
}
else {
var current_tool = tools_to_measure
var last_tool = tools_to_measure
}
}
{
$.send("G4P0.1")
// Поднимаем щетку
if(NEED_BRUSH_CONTROL) {
set_brush_up()
check_brush_up()
}
// Проверяем датчики шпинделя, чтобы определить, установлен ли перед началом процедуры инструмент
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_sensors()
}
else {
var installed_tool_id = $.tc
if (installed_tool_id == 0) {
var installed_tool_id = -1
}
}
}
{
// Для безопасности перед началом процедуры закрываем магазин и проверяем, что он закрыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
if (installed_tool_id == current_tool && (installed_tool_id == tools_to_measure || tools_to_measure == 0)) {
// Мы выбрали измерение инструмента, который уже установлен в патрон. Просто запускаем для него процедуру измерения и оставляем в патроне по завершении
tool_measure(current_tool)
$.send("G4P0.1")
$.send("G90G1G53Z" + SAFE_Z_POS + "F" + FAST_RATE_Z)
//Выходим из макроса, если на измерении только один инструмент должен быть. Если был введён 0 и изначально в патроне 1й инструмент, то после измерения его скидываем, и переходим на 2-й.
if(tools_to_measure > 0) {
$.exit()
}
else {
drop_current_tool(installed_tool_id)
$.send("G4P0.1")
var current_tool = current_tool + 1
}
}
else if(installed_tool_id != -1) {
// Установлен инструмент, который не нужно измерять сразу - сбрасываем его в магазин перед началом работы
drop_current_tool(installed_tool_id)
$.send("G4P0.1")
}
}
{
while (current_tool <= last_tool) {
// Устанавливаем первый инструмент
install_new_tool(current_tool)
$.send("G4P0.1")
tool_measure(current_tool)
$.send("G4P0.1")
$.send("G90G1G53Z" + SAFE_Z_POS + "F" + FAST_RATE_Z)
if (tools_to_measure > 0 && tools_to_measure == current_tool) {
// Если в начале процедуры мы выбрали только один инструмент, то после измерения его и оставляем в патроне. Выход из цикла.
break
}
$.send("G4P0.1")
// Сбрасываем текущий инструмент в магазин
drop_current_tool(current_tool)
$.send("G4P0.1")
var current_tool = current_tool + 1
}
}
G4P0.1
{
if (tools_to_measure == 0) {
// Если измеряли все инструменты, то в конце процедуры устанавливаем первый инструмент
install_new_tool(1)
}
else {
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off_if_opened()
check_tool_basket_off()
}
}
}
Макрос сброса инструмента
Нажмите, чтобы показать код макроса
{
/*
Макрос для сброса текущего инструмента в магазин. Работает на версии визуализатора 4.3 и выше.
Данный макрос вызывается по кнопке на панели Макросы.
Использует для своей работы настройки и функции из библиотек ATC_VLIB и ATC_FLIB.
*/
// include "ATC_VLIB"
// include "ATC_FLIB"
var current_tool = $.tc
var tool_installed = 1
}
{
// Функция проверки всех датчиков шпинделя
function check_tool_sensors() {
$.send("G4P0.1")
var sensor_value = get_tool_sensors_value()
if ( sensor_value == 2) {
// Оба датчика инструмента либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков инструмента: невозможно определить состояние инструмента в шпинделе!")
$.exit()
}
else if(sensor_value == 1) {
// Инстурмент установлен в шпиндель
tool_installed = 1
}
else if(sensor_value == 0) {
// Шпиндель свободен
tool_installed = 0
}
else {
$.message("Невозможно определить состояние инструмента в шпинделе!")
$.exit()
}
}
}
G4P0.1
{
// Проверяем датчики шпинделя, чтобы определить, установлен ли перед началом процедур инструмент
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_sensors()
}
else {
if(current_tool == 0) {
tool_installed = 0
}
}
if(tool_installed) {
if (current_tool < 1 || current_tool > TOOLS_NUMBER) {
$.message("Неверный номер текущего установленного инструмента: " + current_tool);
$.exit()
}
}
else {
$.message("Инструмент не устанавлен!")
$.exit()
}
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
// Поднимаем щетку
if(NEED_BRUSH_CONTROL) {
set_brush_up()
check_brush_up()
}
}
G4P0.1
{
// Для безопасности перед началом процедуры закрываем магазин и проверяем, что он закрыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
// Сбрасываем текущий инструмент в магазин при условии, что в патрон инструмент сейчас установлен
drop_current_tool(current_tool)
$.send("G4P0.1")
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
}
G4P0.1
Макросы карусельной смены инструмента
Библиотека переменных
Нажмите, чтобы показать код макроса
{
/* ****** Перед началом использования обязательно сконфигурить все параметры ниже под Ваш станок *****
Макрос работает на версии визуализатора 4.3 и выше.
Макрос необходимо назвать ATC_VLIB - именно по этому имени он подключается в макросах автосмены инструмента.
Макрос нужно сделать скрытым.
*/
// Размер магазина инструментов
var TOOLS_NUMBER = 8
// Машинная координата X позиции смены инструмента - обязательно нужно настроить своё значение
var ATC_X_MPOS = 0
// Машинная координата Y позиции смены инструмента - обязательно нужно настроить своё значение
var ATC_Y_MPOS = 0
// Машинная координата Z позиции смены инструмента - обязательно нужно настроить своё значение
var ATC_Z_MPOS = -80
// Ось, к которой подключена карусель
var ROTARY_AXIS = "A"
// Массив координат поворотной оси позиций инструментов в магазине
var HOLDERS_ROTARY_POS = [20, 40, 60, 80, 100, 120, 140, 160]
// Расстояние для захода в позицию магазина с инструментом для его сброса, а также расстояние выхода из магазина с только что установленным инструментом
var MOVE_WITH_TOOL_OFFSET_X = -100
var MOVE_WITH_TOOL_OFFSET_Y = 0
var MOVE_WITH_TOOL_OFFSET_Z = 0
// Расстояние ухода с позиции в магазине без инструмента (для снятия), а также захода в позицию магазина без инструмента (для его захвата)
var MOVE_WITHOUT_TOOL_OFFSET_X = 0
var MOVE_WITHOUT_TOOL_OFFSET_Y = 0
var MOVE_WITHOUT_TOOL_OFFSET_Z = 70
// Безопасная высота - все перемещения желательно выполнять на безопасной высоте, по умолчанию это машинный 0 по Z
var SAFE_Z_POS = 0
// Быстрая скорость перемещения по Z
var FAST_RATE_Z = 2000
// Медленная скорость перемещения по Z
var SLOW_RATE_Z = 500
// Быстрая скорость перемещения по X,Y
var FAST_RATE_XY = 5000
// Медленная скорость перемещения по X,Y
var SLOW_RATE_XY = 500
// Таймаут на остановку шпинделя
var SPINDLE_STOP_TIMEOUT = 1
// !!! Ниже обязательно нужно настроить машинные коориднаты позиции, где стоит шайба !!!
// Шпиндель будет автоматически приезжать в эту позицию для измерения длины инструмента
var PROBE_X_MPOS = 375
var PROBE_Y_MPOS = 2982
var PROBE_Z_MPOS = -70
// Скорость быстрого поиска шайбы (первый этап зондирования)
var FAST_RATE_PROBE = 200
// Калибровочная подача поиска шайбы (второй этап зондирования)
var SLOW_RATE_PROBE = 10
// Ниже сервисные переменные для активации тех или иных действий в процедуре смены инструмента
// Продувка инструмента. 0 - продувки нет.
var NEED_BLOW_TOOL = 1
// Требуется ли проверка датчиков захвата/освобождения инструмента
var NEED_CHECK_TOOL_SENSORS = 1
// Требуется ли выполнять подъем/опускание щетки отдельной командой
var NEED_BRUSH_CONTROL = 0
// Требуется ли управлять открытием/закрытием магазина инструментов
var NEED_TOOL_BASKET_CONTROL = 0
// Ниже список входов контроллера, к которым подключены датчики. Например, 8 ознаечает подключение ко входу IN8 (переопределенный HOLD).
// Если сигнал не используется, присвойте ему значение -1
// Сигнал поднятой щетки
var BRUSH_UP_INPUT_ID = -1
// Сигнал опущенной щетки
var BRUSH_DOWN_INPUT_ID = -1
// Сигнал наличия инструмента в патроне
var TOOL_CAUGHT_INPUT_ID = 7
// Сигнал отсутствия инструмента в патроне
var TOOL_RELEASED_INPUT_ID = 8
// Сигнал открытия магазина инструментов
var BASKET_ON_INPUT_ID = -1
// Сигнал закрытия магазина инструментов
var BASKET_OFF_INPUT_ID = -1
// Ниже список задействованных релейных выходов. Например, значение 5 означает, используется выход OUT5.
// Номер выхода управления захватом/освобождения инструмента
var TOOL_CTRL_PORTNO = 5
// Номер выхода управления щеткой
var BRUSH_CTRL_PORTNO = 6
// Номер выхода продувки инструмента
var TOOL_BLOW_PORTNO = 7
// Номер выхода управления магазином
var BASKET_CTRL_PORTNO = 4
// Ниже параметры задают, по какому действию релейного выхода осуществляется активация периферии
// Если TOOL_RELEASE_IF_RLY_ON == 1, то освобождение инструмента осуществляется активацией (M64) управляющего им выхода. Если 0 - деактивацией (M65)
var TOOL_RELEASE_IF_RLY_ON = 1
// Если BRUSH_UP_IF_RLY_ON == 1, то подъем щетки осуществляется активацией (M64) управляющего ей выхода. Если 0 - деактивацией (M65)
var BRUSH_UP_IF_RLY_ON = 1
// Если BASKET_OPEN_IF_RLY_ON == 1, то открытие магазина осуществляется активацией (M64) управляющего им выхода. Если 0 - деактивацией (M65)
var BASKET_OPEN_IF_RLY_ON = 1
// Если BLOW_TOOL_IF_RLY_ON == 1, то продув патрона осуществляется активацией (M64) управляющего выхода. Если 0 - деактивацией (M65)
var BLOW_TOOL_IF_RLY_ON = 1
}
Библиотека функций
Нажмите, чтобы показать код макроса
{
/*
Макрос работает на версии визуализатора 4.3 и выше.
Макрос необходимо назвать ATC_FLIB - именно по этому имени он подключается в макросах автосмены инструмента.
Макрос нужно сделать скрытым.
*/
// include "ATC_VLIB"
var brush_up_signal = "i" + String(BRUSH_UP_INPUT_ID)
var brush_down_signal = "i" + String(BRUSH_DOWN_INPUT_ID)
var tool_caught_signal = "i" + String(TOOL_CAUGHT_INPUT_ID)
var tool_released_signal = "i" + String(TOOL_RELEASED_INPUT_ID)
var basket_on_signal = "i" + String(BASKET_ON_INPUT_ID)
var basket_off_signal = "i" + String(BASKET_OFF_INPUT_ID)
// Функция освобождения инструмента из патрона путем включения реле, подключенного к выходу TOOL_CTRL_PORTNO
function release_tool() {
var port_mask = Math.pow(2, TOOL_CTRL_PORTNO-1)
if (TOOL_RELEASE_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
if (tool_released_signal == "i-1") {
$.send("G4P2")
}
}
// Функция захвата инструмента в патрон путем выключения реле, подключенного к выходу TOOL_CTRL_PORTNO
function catch_tool() {
var port_mask = Math.pow(2, TOOL_CTRL_PORTNO-1)
if (TOOL_RELEASE_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
if (tool_caught_signal == "i-1") {
$.send("G4P2")
}
}
function get_basket_sensors_value() {
// 0 - магазин закрыт
// 1 - магазин открыт
// 2 - неверное состояние, когда оба датчика имеют одинаковое состояние
// 3 - датчики магазина не установлены, проверку делать не нужно
if (basket_on_signal != "i-1" || basket_off_signal != "i-1") {
var sensor_value = 0
if (basket_on_signal != "i-1" && basket_off_signal != "i-1") {
var sensor_value = $.inputs[basket_on_signal] && !$.inputs[basket_off_signal]
if (sensor_value == 0) {
if( ($.inputs[basket_on_signal] && $.inputs[basket_off_signal]) || (!$.inputs[basket_on_signal] && !$.inputs[basket_off_signal]) ) {
// Неверное состояние: оба датчика либо одновременно активны, либо одновременно неактивны
var sensor_value = 2
}
}
}
else if (basket_on_signal != "i-1") {
var sensor_value = $.inputs[basket_on_signal]
}
else {
var sensor_value = !$.inputs[basket_off_signal]
}
return sensor_value
}
else {
return 3
}
}
// Функция открытия магазина инструментов путем включения реле, подключенного к выходу BASKET_CTRL_PORTNO
function tool_basket_on() {
var sensor_value = get_basket_sensors_value()
// Проверяем состояние магазина инструментов перед началом процедуры смены инструмента
if (sensor_value == 2) {
// Оба датчика магазина либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков магазина инструментов: невозможно определить его состояние!")
$.tasklist.stop()
$.exit()
}
if(sensor_value == 0 || sensor_value == 3) {
var port_mask = Math.pow(2, BASKET_CTRL_PORTNO-1)
//Магазин инструментов закрыт, открываем его
if (BASKET_OPEN_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
// Если датчик открытия инструмента не установлен, то безусловно отправляем таймаут на открытие инструмента
if(basket_on_signal == "i-1") {
$.send("G4P2")
}
}
}
// Функция закрытия магазина инструментов путем выключения реле, подключенного к выходу BASKET_CTRL_PORTNO
function tool_basket_off() {
var port_mask = Math.pow(2, BASKET_CTRL_PORTNO-1)
if (BASKET_OPEN_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
// Если датчик закрытия инструмента не подключен, то безусловно отправляем таймаут на закрытие магазина.
if(basket_off_signal == "i-1") {
$.send("G4P3")
}
}
function blow_tool() {
var port_mask = Math.pow(2, TOOL_BLOW_PORTNO-1)
// Пускаем воздух для продувки инструмента
if (BLOW_TOOL_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
// Выдерживаем паузу для продувки
$.send("G4P2")
// Отключаем воздух
if (BLOW_TOOL_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
}
// Функция подъема щетки (включение выхода BRUSH_CTRL_PORTNO)
function set_brush_up() {
var port_mask = Math.pow(2, BRUSH_CTRL_PORTNO-1)
if (BRUSH_UP_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
// Если датчик поднятой щетки не установлен, то безусловно отправляем таймаут на поднятие щетки
if (brush_up_signal == "i-1") {
$.send("G4P2")
}
}
// Функция опускания щетки (выключение выхода BRUSH_CTRL_PORTNO)
function set_brush_down() {
var port_mask = Math.pow(2, BRUSH_CTRL_PORTNO-1)
if (BRUSH_UP_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
// Если датчик опущенной щетки не установлен, то безусловно отпраляем таймаут на опускание щетки
if (brush_down_signal == "i-1") {
$.send("G4P2")
}
}
function check_tool_basket_on() {
// Проверяем, что магазин инструментов открыт
// Если датчик открытого магазина не установлен, то сразу выходим из функции
if (basket_on_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_basket_sensors_value() == 1) {
// Магазин открылся, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_basket_sensors_value()
if (sensor_value == 1) {
// Всё хорошо, магазни открыт
}
else if (sensor_value == 0) {
$.message("Магазин инструментов не открылся!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Неверное состояние датчиков магазина инструментов, невозможно проверить его открытие!")
$.tasklist.stop()
$.exit()
}
}
function check_tool_basket_off() {
// Проверяем датчик закрытия магазина инструментов
// Если датчик закрытого магазина не установлен, то сразу выходим из функции
if (basket_off_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 30) {
if (get_basket_sensors_value() == 0) {
// Магазин закрылся, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_basket_sensors_value()
if (sensor_value == 0) {
// Всё хорошо, магазни закрыт
}
else if (sensor_value = 1) {
$.message("Магазин инструментов не закрылся!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Неверное состояние датчиков магазина инструментов, невозможно проверить его закрытие!")
$.tasklist.stop()
$.exit()
}
}
function tool_basket_on_if_closed() {
var sensor_value = get_basket_sensors_value()
if (sensor_value == 0 || sensor_value == 3) {
// Всё хорошо, магазни закрыт, можем его открыть
tool_basket_on()
}
}
function tool_basket_off_if_opened() {
var sensor_value = get_basket_sensors_value()
if (sensor_value == 1 || sensor_value == 3) {
// Всё хорошо, магазни открыт, можем его закрыть
tool_basket_off()
}
}
function get_tool_sensors_value() {
// 0 - отсутствие инструмента
// 1 - наличие инструмента
// 2 - неверное состояние, когда оба датчика имеют одинаковое состояние
if (tool_caught_signal != "i-1" || tool_released_signal != "i-1") {
var sensor_value = 0
if (tool_caught_signal != "i-1" && tool_released_signal != "i-1") {
var sensor_value = $.inputs[tool_caught_signal] && !$.inputs[tool_released_signal]
if (sensor_value == 0) {
if( ($.inputs[tool_caught_signal] && $.inputs[tool_released_signal]) || (!$.inputs[tool_caught_signal] && !$.inputs[tool_released_signal]) ) {
// Неверное состояние: оба датчика либо одновременно активны, либо одновременно неактивны
var sensor_value = 2
}
}
}
else if (tool_caught_signal != "i-1") {
var sensor_value = $.inputs[tool_caught_signal]
}
else {
var sensor_value = !$.inputs[tool_released_signal]
}
return sensor_value
}
else {
return 0
}
}
// Функция для проверки, что инструмент захвачен в патрон
function check_tool_caught() {
$.send("G4P0.1")
if(tool_caught_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_tool_sensors_value() == 1) {
// Инструмент захвачен, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensors_value = get_tool_sensors_value()
if (sensors_value == 1) {
// Всё хорошо, инструмент захвачен, датчик разжатия цанги не активен.
}
else if (sensors_value == 0) {
$.message("Не получен сигнал захвата инструмента либо получен сигнала разжатия цанги!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Невозможно определить состояние цанги после захвата инструмента!")
$.tasklist.stop()
$.exit()
}
}
// Функция для проверки разжатия цанги
function check_tool_released() {
$.send("G4P0.1")
if(tool_released_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_tool_sensors_value() == 0) {
// Инструмент освобожден, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_tool_sensors_value()
if (sensor_value == 0) {
// Всё хорошо, цанга разжата
}
else if (sensor_value == 1) {
$.message("Не получен сигнал разжатия цанги либо получен сигнал захвата инструмента!")
$.tasklist.stop()
$.exit()
}
else {
$.message("Невозможно определить состояние цанги после освобождения инструмента!")
$.tasklist.stop()
$.exit()
}
}
// Функция для проверки, что инструмент не установлен в патрон
function check_no_tool_installed() {
$.send("G4P0.1")
if (get_tool_sensors_value() == 0) {
// Всё хорошо, цанга разжата
}
else {
$.message("Получен сигнал наличия инструмента в патроне после его освобождения!")
$.tasklist.stop()
$.exit()
}
}
function get_brush_sensors_value() {
// 0 - щетка внизу
// 1 - щетка поднята
// 2 - неверное состояние, когда оба датчика имеют одинаковое значение
if (brush_up_signal != "i-1" || brush_down_signal != "i-1") {
var sensor_value = 0
if (brush_up_signal != "i-1" && brush_down_signal != "i-1") {
var sensor_value = $.inputs[brush_up_signal] && !$.inputs[brush_down_signal]
if (sensor_value == 0) {
if( ($.inputs[brush_up_signal] && $.inputs[brush_down_signal]) || (!$.inputs[brush_up_signal] && !$.inputs[brush_down_signal]) ) {
// Неверное состояние: оба датчика либо одновременно активны, либо одновременно неактивны
var sensor_value = 2
}
}
}
else if (brush_up_signal != "i-1") {
var sensor_value = $.inputs[brush_up_signal]
}
else {
var sensor_value = !$.inputs[brush_down_signal]
}
return sensor_value
}
else {
return 0
}
}
// Функция для проверки, что щетка подтяна
function check_brush_up() {
$.send("G4P0.1")
// Если датчик поднятия щетки не установлен, сразу выходим из функции
if (brush_up_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_brush_sensors_value() == 1) {
// Щетка поднялась, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_brush_sensors_value()
if (sensor_value == 1) {
// Всё хорошо, щетка подтяна
}
else {
$.message("Щетка не поднялась!")
$.tasklist.stop()
$.exit()
}
}
// Функция для проверки, что щетка опущена
function check_brush_down() {
$.send("G4P0.1")
// Если датчик опускания щетки не установлен, сразу выходим из функции
if (brush_down_signal == "i-1") {
return
}
var try_count = 0
while (try_count < 20) {
if (get_brush_sensors_value() == 0) {
// Щетка опустилась, выходим из цикла проверки датчиков
break;
}
var try_count = try_count + 1
$.send("G4P0.1")
}
var sensor_value = get_brush_sensors_value()
if (sensor_value == 0) {
// Всё хорошо, щетка опущена
}
else {
$.message("Щетка не опустилась!")
}
}
// Функция для установки нового инструмента в шпиндель
function install_new_tool(tool_num) {
// Устанавливаем новый инструмент
// Подъезжаем к позиции отступа без инструмента
$.send("G1G53G90X" + String(ATC_X_MPOS + MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(ATC_Y_MPOS + MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(FAST_RATE_XY))
$.send("G4P0.1")
// Проверяем, что магазин инструментов открыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_on_if_closed()
check_tool_basket_on()
}
$.send("G4P0.1")
// Поворачиваем магазин на нужный угол
$.send("G90G0G53" + ROTARY_AXIS + String(HOLDERS_ROTARY_POS[tool_num - 1]))
$.send("G4P0.1")
$.send("G1G53G90Z" + String(ATC_Z_MPOS + MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(FAST_RATE_Z))
// Продуваем патрон и опускаемся в позицию установки нового инструмента
if(NEED_BLOW_TOOL) {
blow_tool()
}
// Опускаемся в позицию захвата инструмента (без инструмента)
$.send("G1G91X" + String(-MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(-MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(-MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Захватываем инструмент
catch_tool()
// Проверяем, что инструмент захвачен в патрон
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_caught()
}
// Устанавливаем в системе номер инструмента
$.send("T" + String(tool_num))
// Поднимаемся на расстояние отступа с инструментом
$.send("G1G91X" + String(MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + MOVE_WITH_TOOL_OFFSET_Z + "F" + SLOW_RATE_Z)
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
// Поворачиваем магазин на 0й угол
$.send("G90G0G53A0")
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
$.send("G4P0.1")
}
// Функция сброса текущего инструмента в магазин
function drop_current_tool(tool_num) {
// Сбрасываем текущий инструмент в магазин
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
$.send("G4P0.1")
// Опускаемся на расстояние отступа на быстрой скорости
$.send("G1G53G90X" + String(ATC_X_MPOS + MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(ATC_Y_MPOS + MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(FAST_RATE_XY))
$.send("G4P0.1")
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_on()
check_tool_basket_on()
}
$.send("G4P0.1")
// Поворачиваем магазин на нужный угол
$.send("G90G0G53" + ROTARY_AXIS + String(HOLDERS_ROTARY_POS[tool_num - 1]))
$.send("G4P0.1")
$.send("G1G53G90Z" + String(ATC_Z_MPOS + MOVE_WITH_TOOL_OFFSET_Z) + "F" + String(FAST_RATE_Z))
// На медленной скорости движемся в позицию магазина (с инструментом)
$.send("G1G91X" + String(-MOVE_WITH_TOOL_OFFSET_X) + "Y" + String(-MOVE_WITH_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(-MOVE_WITH_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Отправляем команду сброса инструмента на пневмомеханизм
release_tool()
// Проверяем, что цанга разжата
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_released()
}
// Поднимаемся на расстояние отступа без инструмента на медленной скорости
$.send("G1G91X" + String(MOVE_WITHOUT_TOOL_OFFSET_X) + "Y" + String(MOVE_WITHOUT_TOOL_OFFSET_Y) + "F" + String(SLOW_RATE_XY))
$.send("G1G91Z" + String(MOVE_WITHOUT_TOOL_OFFSET_Z) + "F" + String(SLOW_RATE_Z))
// Проверяем, что в патроне нет инструмента
if(NEED_CHECK_TOOL_SENSORS) {
check_no_tool_installed()
}
// Т.к. в шпинделе инструмента нет, то устанавливаем в системе нулевой инструмент
$.send("T0")
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
$.send("G4P0.1")
}
// Установка длины инструмента.
function set_tool_len(tool_num, tool_len) {
$.send("G10L1P" + String(tool_num) + "Z" + String(tool_len.toFixed(3)))
}
// Функция измерения машинной координаты кончика инструмента
function tool_measure(tool_num) {
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
$.send("G1G53G90X" + String(PROBE_X_MPOS) + "Y" + String(PROBE_Y_MPOS) + "F" + String(FAST_RATE_XY))
$.send("G1G53G90Z" + String(PROBE_Z_MPOS) + "F" + String(FAST_RATE_Z))
$.send("G21G91G38.2Z-" + String($.params.maxTravelValueZ) + "F" + String(FAST_RATE_PROBE))
$.send("G0Z1")
$.send("G38.2Z-3F" + String(SLOW_RATE_PROBE))
$.send("G4P0.1")
set_tool_len(tool_num, $.prb.z)
$.send("G4P0.1")
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
}
}
Макрос смены инструмента
Нажмите, чтобы показать код макроса
{
/*
Макрос автоматической смены инструмента. Работает на версии визуализатора 4.3 и выше.
Макрос нужно сделать невидимым - он не предназначен для запуска по кнопке. Вызывается только
при выполнении УП по команде M6(M06).
Данный макрос необходимо назначить на макровызов для команды M0?6.
Использует для своей работы настройки и функции из библиотек ATC_VLIB и ATC_FLIB.
*/
// include "ATC_VLIB"
// include "ATC_FLIB"
var current_tool = $.tc
var next_tool = $.tn
if (next_tool < 1 || next_tool > TOOLS_NUMBER) {
$.message("Неверный номер следующего инструмента!");
$.exit()
}
var tool_installed = 1
}
{
// Функция проверки всех датчиков шпинделя
function check_tool_sensors() {
$.send("G4P0.1")
var sensor_value = get_tool_sensors_value()
if ( sensor_value == 2) {
// Оба датчика инструмента либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков инструмента: невозможно определить состояние инструмента в шпинделе!")
$.tasklist.stop()
$.exit()
}
else if(sensor_value == 1) {
// Инстурмент установлен в шпиндель
tool_installed = 1
}
else if(sensor_value == 0) {
// Шпиндель свободен
tool_installed = 0
}
else {
$.message("Невозможно определить состояние инструмента в шпинделе!")
//$.send("T" + String(current_tool))
$.tasklist.stop()
$.exit()
}
}
}
G4P0.1
G1G90G53Z{SAFE_Z_POS}F{FAST_RATE_Z}
M5
G4P{SPINDLE_STOP_TIMEOUT}
{
// Проверяем датчики шпинделя, чтобы определить, установлен ли перед началом процедур инструмент
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_sensors()
}
else {
if(current_tool == 0) {
tool_installed = 0
}
}
if(tool_installed) {
if (current_tool < 1 || current_tool > TOOLS_NUMBER) {
$.message("Неверный номер текущего установленного инструмента: " + current_tool);
$.tasklist.stop()
$.exit()
}
if (next_tool == current_tool) {
//$.message("Новый инструмент совпадает с текущим, смена не требуется!")
if(NEED_BRUSH_CONTROL) {
set_brush_down()
check_brush_down()
}
$.exit()
}
}
// Запоминаем текущие рабочие координаты, из которых запускаем процедуру смены инструменты, чтобы в конце процедуры вернуться в эту же позицию
if (tool_installed) {
var startX = $.wc.x
var startY = $.wc.y
//var startZ = $.wc.z
}
else {
var startX = 0
var startY = 0
//var startZ = $.wc.z
}
// Запоминаем текущие обороты шпинделя и скорость подачи
var gcodeSpindleSpeed = $.gc.s
var gcodeFeedRate = $.gc.f
// Поднимаем щетку
if(NEED_BRUSH_CONTROL) {
set_brush_up()
check_brush_up()
}
}
G4P0.1
{
// Для безопасности перед началом процедуры закрываем магазин и проверяем, что он закрыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
}
G4P0.1
{
if (tool_installed) {
// Сбрасываем текущий инструмент в магазин при условии, что в патрон инструмент сейчас установлен
drop_current_tool(current_tool)
}
}
G4P0.1
{
// Устанавливаем новый инструмент
install_new_tool(next_tool)
$.send("G4P0.1")
//Закрываем магазин инструментов
if (NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
$.send("G4P0.1")
//Проверяем, что магазин закрылся
check_tool_basket_off()
}
}
G4P0.1
{
$.send("G1G90X" + String(startX.toFixed(3)) + "Y" + String(startY.toFixed(3)) + "F" + String(FAST_RATE_XY))
$.send("G4P0.1")
if(NEED_BRUSH_CONTROL) {
set_brush_down()
check_brush_down()
}
}
Макрос построения таблицы инструментов
Нажмите, чтобы показать код макроса
{
/*
Макрос создания таблицы инструментов. Работает на версии визуализатора 4.3 и выше.
Данный макрос вызывается по кнопке на панели Макросы.
Использует для своей работы настройки и функции из библиотек ATC_VLIB и ATC_FLIB.
*/
// include "ATC_VLIB"
// include "ATC_FLIB"
var current_tool = 1
var installed_tool_id = -1
var last_tool = TOOLS_NUMBER
}
{
// Функция проверки всех датчиков шпинделя
function check_tool_sensors() {
$.send("G4P0.1")
var sensor_value = get_tool_sensors_value()
if ( sensor_value == 2) {
// Оба датчика инструмента либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков инструмента: невозможно определить состояние инструмента в шпинделе!")
//$.tasklist.stop()
$.exit()
}
else if(sensor_value == 1) {
// Инстурмент установлен в шпиндель
tool_installed = 1
installed_tool_id = $.tc
if (installed_tool_id == 0) {
installed_tool_id = -1
}
}
else if(sensor_value == 0) {
// Шпиндель свободен
tool_installed = 0
}
else {
$.message("Невозможно определить состояние инструмента в шпинделе!")
//$.send("T" + String(current_tool))
//$.tasklist.stop()
$.exit()
}
}
}
{
var p = $.input("Введите номер инструмента для измерения (0 - все инструменты)", ["Номер инструмента (от 0 до " + String(TOOLS_NUMBER) + ")"], [0])
if(!p.length) {
$.exit()
}
var tools_to_measure = parseInt(p[0])
if(tools_to_measure < 0 || tools_to_measure > TOOLS_NUMBER) {
$.message("Неверный номер инструмента!")
$.exit()
}
if(tools_to_measure == 0) {
var current_tool = 1
var last_tool = TOOLS_NUMBER
}
else {
var current_tool = tools_to_measure
var last_tool = tools_to_measure
}
}
{
$.send("G4P0.1")
// Поднимаем щетку
if(NEED_BRUSH_CONTROL) {
set_brush_up()
check_brush_up()
}
// Проверяем датчики шпинделя, чтобы определить, установлен ли перед началом процедуры инструмент
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_sensors()
}
else {
var installed_tool_id = $.tc
if (installed_tool_id == 0) {
var installed_tool_id = -1
}
}
}
{
// Для безопасности перед началом процедуры закрываем магазин и проверяем, что он закрыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_busket_off()
check_tool_busket_off()
}
if (installed_tool_id == current_tool && (installed_tool_id == tools_to_measure || tools_to_measure == 0)) {
// Мы выбрали измерение инструмента, который уже установлен в патрон. Просто запускаем для него процедуру измерения и оставляем в патроне по завершении
tool_measure(current_tool)
$.send("G4P0.1")
$.send("G90G1G53Z" + SAFE_Z_POS + "F" + FAST_RATE_Z)
//Выходим из макроса, если на измерении только один инструмент должен быть. Если был введён 0 и изначально в патроне 1й инструмент, то после измерения его скидываем, и переходим на 2-й.
if(tools_to_measure > 0) {
$.exit()
}
else {
drop_current_tool(installed_tool_id)
$.send("G4P0.1")
var current_tool = current_tool + 1
}
}
else if(installed_tool_id != -1) {
// Установлен инструмент, который не нужно измерять сразу - сбрасываем его в магазин перед началом работы
drop_current_tool(installed_tool_id)
$.send("G4P0.1")
}
}
{
while (current_tool <= last_tool) {
// Устанавливаем первый инструмент
install_new_tool(current_tool)
$.send("G4P0.1")
tool_measure(current_tool)
$.send("G4P0.1")
$.send("G90G1G53Z" + SAFE_Z_POS + "F" + FAST_RATE_Z)
if (tools_to_measure > 0 && tools_to_measure == current_tool) {
// Если в начале процедуры мы выбрали только один инструмент, то после измерения его и оставляем в патроне. Выход из цикла.
break
}
$.send("G4P0.1")
// Сбрасываем текущий инструмент в магазин
drop_current_tool(current_tool)
$.send("G4P0.1")
var current_tool = current_tool + 1
}
}
G4P0.1
{
if (tools_to_measure == 0) {
// Если измеряли все инструменты, то в конце процедуры устанавливаем первый инструмент
install_new_tool(1)
}
}
Макрос сброса инструмента
Нажмите, чтобы показать код макроса
{
/*
Макрос для сброса текущего инструмента в магазин. Работает на версии визуализатора 4.3 и выше.
Данный макрос вызывается по кнопке на панели Макросы.
Использует для своей работы настройки и функции из библиотек ATC_VLIB и ATC_FLIB.
*/
// include "ATC_VLIB"
// include "ATC_FLIB"
var current_tool = $.tc
var tool_installed = 1
}
{
// Функция проверки всех датчиков шпинделя
function check_tool_sensors() {
$.send("G4P0.1")
var sensor_value = get_tool_sensors_value()
if ( sensor_value == 2) {
// Оба датчика инструмента либо одновременно активны, либо одновременно неактивны
$.message("Неверное состояние датчиков инструмента: невозможно определить состояние инструмента в шпинделе!")
$.exit()
}
else if(sensor_value == 1) {
// Инстурмент установлен в шпиндель
tool_installed = 1
}
else if(sensor_value == 0) {
// Шпиндель свободен
tool_installed = 0
}
else {
$.message("Невозможно определить состояние инструмента в шпинделе!")
$.exit()
}
}
}
G4P0.1
{
// Проверяем датчики шпинделя, чтобы определить, установлен ли перед началом процедур инструмент
if(NEED_CHECK_TOOL_SENSORS) {
check_tool_sensors()
}
else {
if(current_tool == 0) {
tool_installed = 0
}
}
if(tool_installed) {
if (current_tool < 1 || current_tool > TOOLS_NUMBER) {
$.message("Неверный номер текущего установленного инструмента: " + current_tool);
$.exit()
}
}
else {
$.message("Инструмент не устанавлен!")
$.exit()
}
// Поднимаемся на безопасную высоту
$.send("G90G1G53Z" + String(SAFE_Z_POS) + "F" + String(FAST_RATE_Z))
// Поднимаем щетку
if(NEED_BRUSH_CONTROL) {
set_brush_up()
check_brush_up()
}
}
G4P0.1
{
// Для безопасности перед началом процедуры закрываем магазин и проверяем, что он закрыт
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
// Сбрасываем текущий инструмент в магазин при условии, что в патрон инструмент сейчас установлен
drop_current_tool(current_tool)
$.send("G4P0.1")
if(NEED_TOOL_BASKET_CONTROL) {
tool_basket_off()
check_tool_basket_off()
}
}
G4P0.1
