Разобрался, как из пользовательского скрипта выполнить какую-нибудь из основных команд (пуск / стоп / пауза / изменить подачу / изменить значение в окошках рабочих координат / или выполнить функцию пользовательской кнопки).
Так же можно выполнить любую команду G-кода, как в строке MDI
Например, написал сейчас скрипт, который вызывает паузу, выключает шпиндель, и поднимает фрезу на 20 мм
Подробнее вот здесь: http://dynomotion.com/Help/KMotionCNC/K … rKFLOP.htm
Работает это примерно так - требуемое действие сохраняется в переменную Persist Var.
Эта переменная предается в KMotionCNC
KMotionCNC видит, что в этой переменной что-то есть, и в зависимости от содержимого выполняет требуемые действия,
Затем KMotionCNC обнулят эту переменную, чтобы дать понять контроллеру, что все сделано
Если не ошибаюсь - все это происходит примерно 10 раз в секунду.
В общем - все, что нужно уже написано в файле "KFLOPtoPCCmdExamples.c"
В начале файла осуществляются различные действия для примера, а во второй половине файла определены функции для удобства вызова команд.
Тестовые действия я закрыл, как ремарки "//"
И еще отключил вывод ответов в консоль
Вот, что получилось (этот скрипт ничего не делает, но в нем определены все необходимые функции):
Если в этом файл добавить команды (перечислил возможные варианты ниже), они будут выполняться на стороне KMotionCNC.
DoPC(PC_COMM_ESTOP); // E-Стоп (не проверял)
DoPC(PC_COMM_HALT); // Пауза
DoPC(PC_COMM_EXECUTE); // Запуск выполнения УП (не проверял)
DoPC(PC_COMM_SINGLE_STEP); // выполнить одну строку УП (не проверял)
DoPCFloat(PC_COMM_SET_FRO,0.25f); // задает скорость подачи (не проверял)
DoPCFloat(PC_COMM_SET_FRO_INC,1.1f); // вероятно - увеличивает скорость подачи (не проверял)
DoPCFloat(PC_COMM_SET_X,0.0);
DoPCFloat(PC_COMM_SET_Y,0.0);
DoPCFloat(PC_COMM_SET_Z,2.25); // установить значение в окошке координаты Z равным 2,25 мм
DoPCInt(PC_COMM_USER_BUTTON,3); // вызов пользовательской кнопки (не проверял)
DoPCInt(PC_COMM_MCODE,3); // вероятно - выполняет M-код (не проверял)
Answer = MsgBox("Hello World",MB_YESNO|MB_ICONEXCLAMATION); // выводит диалоговое окно (не проверял)
if (Answer == IDYES)
printf("Answer is Yes\n");
else
printf("Answer is No\n");
MDI("G0 X1.2 Y2.2 Z3.3"); // Выполнить в окне MDI команду G0 X1.2 Y2.2 Z3.3
MDI("M5"); // остановить шпиндель (запустится программа, привязанная к этой функции)
MoveRel(2,5000); // поднять ось Z на 5000 импульсов
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Но есть сложности.
Во первых - нужно быть внимательным и следить за тем в какой ветке выполняется подпрограмма, чтобы не возникло проблем при вызове новой программы в ветке выполняющейся.
Во вторых - если повесить подпрограмму на пользовательскую кнопку - Kmotion CNC может зависнуть, если для запуска выбрать параметр "выполнить и ждать завершения"
В третьих - между действиями, связанными с движением станка и действиями связанными с обращением к интерфейсу иногда стоит добавить паузу, иначе скрипт не дождется плавного снижения скорости.
В четвертых - если в скрипте использовать команду MDI("M5"), то после нажатия "продолжить" программа не предложит запустить шпиндель, т.к. помнит, что до этого была команда M5. Я заменил ее на выключение пина, управляющего шпинделем.