Важно. Настройка многошпиндельных станков доступна только для контроллеров MSC-4ES и MSC-6ES.
Порядок настройки станка
- Активировать продвинутый режим визуализатора через меню Сервис-Настройки-Управление, включив соответствующую галочку.
- Через меню Станок-Инструменты-Исполнительные узлы создать отдельный исполнитель в режиме Фрезер для каждого шпинделя.
- В настройках исполнителя включить галочку Привязать к номеру инструмента в УП и указать номер инструмента, которому будет соответствовать данный исполнитель. После этого в G-код файле по команде M6 Tx будет выполняться переключение на шпиндель, который привязан к данному номеру Tx.
- Если каждый шпиндель имеет независимую ось Z, необходимо настроить привод вертикальной оси шаговым двигателем и указать, какой осью контроллера управляется данный шпиндель по вертикали (Z, A, B или C).
- Если все шпиндели физически расположены на одной "голове", управляемой одной осью Z, но каждый из них активируется отдельным пневмомеханизмом, необходимо настроить управление вертикальной оси пневмоприводом. Далее указать, какой выход контроллера используется для управления соответствующим пневмомеханизмом (он физически должен быть подключен к данному выходу) и сгенерировать макросы активации и деактивации. При необходимости эти макросы можно вручную отредактировать, если требуются дополнительные действия.
- Через меню Сервис-Настройки-Макросы добавить макрос автоматической смены инструмента (см. код ниже для каждого случая), сделать его скрытым.
- Через меню Сервис-Настройки-Макровызовы добавить макровызов на команду M0?6, которому назначить созданный ранее макрос автосмены.
Схема подключения двухшпиндельного станка с независимыми осями Z к контроллеру MSC-4ES

Схема подключения двухшпиндельного станка с независимыми осями Z к контроллеру MSC-6ES

Макрос автосмены для шпинделей с независимыми осями Z
Нажмите, чтобы показать код макроса
{
// Макрос для автоматического переключения между шпинделями с независимыми осями Z.
// В настройках исполнителя необходимо задать соответсвующий номер инструмента T.
// !!! В макросе настраивать только переменные из первой секции !!!
// Номера выходов, управляющих проключением сигнала управления шпинделем на i-ый исполнитель. 1-ый элемент в массиве соответствует 1-му исполнителю и т.д.
// Назначение: разрывать сигнал SPEN на частотник соответствующего шпинделя, чтобы надежно его отключать, когда исполнитель не активен.
var EXEC_SPEN_OUT_ID = [5, 6]
// Вертикальные оси исполнителей. 1-ый элемент в массиве соответствует 1-му исполнителю и т.д.
var EXEC_ZAXIS = ["Z", "A"]
// Координата безопасной высоты
var SAFE_Z_POS = 50
// Перемещение на безопасную высоту в абсолютных или относительных координатах.
// Если IS_INCREMENTAL_SAFE_Z_POS == 1, то SAFE_Z_POS задает относительно перемещение, и параметр IS_MACHINE_SAFE_Z_POS не используется.
// Если IS_INCREMENTAL_SAFE_Z_POS == 0, то SAFE_Z_POS задает абсолютную позицию, а машинная или рабочая определяется параметром IS_MACHINE_SAFE_Z_POS
var IS_INCREMENTAL_SAFE_Z_POS = 0
// Безопасная высота в рабочих или машинных координатах.
// Если IS_MACHINE_SAFE_Z_POS == 1, то SAFE_Z_POS в машинных координатах
var IS_MACHINE_SAFE_Z_POS = 0
// Задержка на раскрутку шпинделя после смены исполнителя, в секундах
var SPINUP_DELAY = 5
}
{
function enable_exec_spen(exec_id) {
var out_id = EXEC_SPEN_OUT_ID[exec_id]
var port_mask = Math.pow(2, out_id-1)
$.send("M64P" + String(port_mask))
}
function disable_exec_spen(exec_id) {
var out_id = EXEC_SPEN_OUT_ID[exec_id]
var port_mask = Math.pow(2, out_id-1)
$.send("M65P" + String(port_mask))
}
function move_to_safe_pos(exec_id) {
if (IS_INCREMENTAL_SAFE_Z_POS == 1) {
$.send("G91 G0 " + EXEC_ZAXIS[exec_id] + String(SAFE_Z_POS))
$.send("G90")
}
else {
if (IS_MACHINE_SAFE_Z_POS == 0) {
$.send("G90 G0 " + EXEC_ZAXIS[exec_id] + String(SAFE_Z_POS))
}
else {
$.send("G90 G53 G0 " + EXEC_ZAXIS[exec_id] + String(SAFE_Z_POS))
}
}
}
}
{
$.send("G4P0.1")
while ($.status != 1) {
$.wait()
}
// Индекс текущего исполнителя
var cur_exec_index = $.current_executor
if (cur_exec_index >= EXEC_SPEN_OUT_ID.length || cur_exec_index >= EXEC_ZAXIS.length) {
$.message("Индекс текущего исполнителя превышает максимально допустимое значение!")
$.tasklist.stop()
$.exit()
}
var cur_exec_tool_number = $.executors[cur_exec_index].gcode_tool_number
if (!$.executors[cur_exec_index].bind_gcode_tool_number)
cur_exec_tool_number = 0
var exec_len = $.executors.length
var next_tool = $.tn
if (cur_exec_tool_number == next_tool) {
$.message(["Следующий номер инструмента совпадает с номером инструмента текущего исполнителя!"])
$.executors[cur_exec_index].enable()
$.executors[cur_exec_index].profile_enable()
// Проключаем цепь сигнала управления шпинделем для нового исполнителя
enable_exec_spen(cur_exec_index)
// Активируем задержку на раскрутку шпинделя
$.send("G4P" + String(SPINUP_DELAY))
$.exit()
}
var next_executor_index = -1
for (var i = 0; i < exec_len; i++) {
if ($.executors[i].gcode_tool_number == next_tool && $.executors[i].bind_gcode_tool_number) {
next_executor_index = i;
}
}
// Поднимаем текущий исполнитель на безопасную высоту
move_to_safe_pos(cur_exec_index)
if (next_executor_index < 0) {
$.message(["Исполнитель, привязанный к номеру инструмента " + next_tool + ", не найден!"])
$.tasklist.stop()
$.exit()
}
else if (next_executor_index >= EXEC_SPEN_OUT_ID.length || next_executor_index >= EXEC_ZAXIS.length) {
$.message("Индекс следующего исполнителя превышает максимально допустимое значение!")
$.tasklist.stop()
$.exit()
}
// Разываем сигнал управления шпинделем для текущего исполнителя
disable_exec_spen(cur_exec_index)
// Переключаемся и активируем новый исполнитель
$.executors[next_executor_index].enable()
$.executors[next_executor_index].profile_enable()
$.send("T" + String($.executors[next_executor_index].gcode_tool_number))
// Проключаем цепь сигнала управления шпинделем для нового исполнителя
enable_exec_spen(next_executor_index)
// Активируем задержку на раскрутку шпинделя
$.send("G4P" + String(SPINUP_DELAY))
}
Схема подключения двухшпиндельного станка с управлением пневмоприводами к контроллеру MSC-4ES

Схема подключения двухшпиндельного станка с управлением пневмоприводами к контроллеру MSC-6ES

Макрос автосмены для шпинделей с пневмоприводом
Нажмите, чтобы показать код макроса
{
// Макрос для автоматического переключения между шпинделями с независимыми осями Z.
// В настройках исполнителя необходимо задать соответсвующий номер инструмента T.
// !!! В макросе настраивать только переменные из первой секции !!!
// Номера выходов, управляющих поднятием/опусканием шпинделя (4 - OUT4 (переопределенный FLD), 5 - OUT5 и т.д.). 1-ый элемент в массиве соответствует 1-му исполнителю и т.д.
var EXEC_ENA_OUT_ID = [5, 6]
// Если EXEC_ENA_IF_RLY_ON == 1, то активация (опускание) исполнителя осуществляется по замыканию (M64) соответствующего релейного выхода. Если 0, то по размыканию (M65)
var EXEC_ENA_IF_RLY_ON = 1
// Номера выходов (6 - OUT6, 7 - OUT7 и т.д.), управляющих проключением сигнала управления шпинделем на i-ый исполнитель. 1-ый элемент в массиве соответствует 1-му исполнителю и т.д.
// Назначение: разрывать сигнал SPEN на частотник соответствующего шпинделя, чтобы надежно его отключать, когда исполнитель не активен.
var EXEC_SPEN_OUT_ID = [3, 4]
// Задержка на раскрутку шпинделя после смены исполнителя, в секундах
var SPINUP_DELAY = 5
}
{
function activate_executor(exec_id) {
var out_id = EXEC_ENA_OUT_ID[exec_id]
var port_mask = Math.pow(2, out_id-1)
if (EXEC_ENA_IF_RLY_ON == 1) {
$.send("M64P" + String(port_mask))
}
else {
$.send("M65P" + String(port_mask))
}
}
function deactivate_executor(exec_id) {
var out_id = EXEC_ENA_OUT_ID[exec_id]
var port_mask = Math.pow(2, out_id-1)
if (EXEC_ENA_IF_RLY_ON == 1) {
$.send("M65P" + String(port_mask))
}
else {
$.send("M64P" + String(port_mask))
}
}
function enable_exec_spen(exec_id) {
var out_id = EXEC_SPEN_OUT_ID[exec_id]
var port_mask = Math.pow(2, out_id-1)
$.send("M64P" + String(port_mask))
}
function disable_exec_spen(exec_id) {
var out_id = EXEC_SPEN_OUT_ID[exec_id]
var port_mask = Math.pow(2, out_id-1)
$.send("M65P" + String(port_mask))
}
}
{
$.send("G4P0.1")
while ($.status != 1) {
$.wait()
}
// Индекс текущего исполнителя
var cur_exec_index = $.current_executor
if (cur_exec_index >= EXEC_ENA_OUT_ID.length || cur_exec_index >= EXEC_SPEN_OUT_ID.length) {
$.message("Индекс текущего исполнителя превышает максимально допустимое значение!")
$.tasklist.stop()
$.exit()
}
var cur_exec_tool_number = $.executors[cur_exec_index].gcode_tool_number
if (!$.executors[cur_exec_index].bind_gcode_tool_number)
cur_exec_tool_number = 0
var exec_len = $.executors.length
var next_tool = $.tn
var next_executor_index = -1
for (var i = 0; i < exec_len; i++) {
if ($.executors[i].bind_gcode_tool_number) {
if ($.executors[i].gcode_tool_number == next_tool) {
next_executor_index = i;
}
else {
// Поднимаем исполнитель
deactivate_executor(i)
// Разываем сигнал управления шпинделем исполнителя
disable_exec_spen(i)
}
}
}
if (next_executor_index < 0) {
$.message(["Исполнитель, привязанный к номеру инструмента " + next_tool + ", не найден!"])
$.tasklist.stop()
$.exit()
}
else if (next_executor_index >= EXEC_ENA_OUT_ID.length || next_executor_index >= EXEC_SPEN_OUT_ID.length) {
$.message("Индекс следующего исполнителя превышает максимально допустимое значение!")
$.tasklist.stop()
$.exit()
}
// Переключаемся и активируем новый исполнитель
$.send("G0")
$.executors[next_executor_index].enable()
$.executors[next_executor_index].profile_enable()
$.send("T" + String(next_tool))
// Проключаем цепь сигнала управления шпинделем для нового исполнителя
enable_exec_spen(next_executor_index)
// Активируем задержку на раскрутку шпинделя
$.send("G4P" + String(SPINUP_DELAY))
// Опускаем новый исполнитель
activate_executor(next_executor_index)
}