Управление KMotionCNC из KFLOP
С программы пользователя KFLOP могут запрашивать действия, которые должны выполняться приложением KMotionCNC, запущенным на ПК, путем установки различных кодов команд в специальные переменные persist.UserData. Специальные переменные UserData постоянно загружаются KMotionCNC примерно 10 раз в секунду для обновления DROs и т.д. Если код команды загружен, KMotionCNC пытается выполнить запрошенное действие, а затем изменяет значение команды UserData на результирующий код. Ноль означает успех, а отрицательное значение указывает код ошибки (все команды положительные). Таким образом, процесс включает в себя:
#1 - KFLOP сохраняет команду в Persist Var, чтобы запросить действие
#2 - команда загружается в KMotionCNC со следующим запросом состояния
#3 - KMotionCNC выполняет действие
#4 - KMotionCNC очищает Persist Var, чтобы сообщить о завершении
#5 - KFLOP проверяет, что переменная очищена, чтобы знать, что действие было успешным и выполнено
Возможна загрузка нескольких Persist Vars, если это требуется для выполняемого действия. Если требуются дополнительные параметры или данные, то один из загруженных параметров укажет, где находятся эти данные.
Количество переменных UserData увеличено со 100 до 200. Переменные 100-107 - это специальные постоянно загружаемые переменные. Это определено в файле PC-DSP.h:
#define PC_COMM_PERSIST 100 // First Persist Variable that is uploaded in status
#define N_PC_COMM_PERSIST 8 // Number of Persist Variables that are uploaded in status
Поддерживаются следующие команды:
Пример KFLOPtoPCCmdExamples.c, который демонстрирует, как вызывать эти действия из программы пользователя.
// Trigger a message box on the PC to be displayed
// defines for MS Windows message box styles and Operator
// response IDs are defined in the KMotionDef.h file
int MsgBox(char *s, int Flags)
// put the MDI string (Manual Data Input - GCode) in the
// gather buffer and tell the App where it is
int MDI(char *s)
// Put a Float as a parameter and pass the command to the App
int DoPCFloat(int cmd, float f)
// Put an integer as a parameter and pass the command to the App
int DoPCInt(int cmd, int i)
// Pass a command to the PC and wait for it to handshake
// that it was received by either clearing the command
// or changing it to a negative error code
int DoPC(int cmd)
Пример кода для использования вспомогательных функций:
main()
{
int Answer;
double *pD = (double *)persist.UserData;
DoPC(PC_COMM_ESTOP);
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,1.25);
DoPCInt(PC_COMM_USER_BUTTON,3);
DoPCInt(PC_COMM_MCODE,3);
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");
// put 3 double values in the persist vars
pD[10] = 123.456;
pD[11] = 1000.0;
pD[12] = 999.9;
// transfer up to the GCode Vars
SetVars(100,3,10); // Upload 3 to GCode 100 from persist 10
MDI("#100 = [#100 + 1]");
// read them back into different persist Vars
GetVars(100,3,13); // Download 3 from GCode 100 to persist 13
printf("%f %f %f\n",pD[13],pD[14],pD[15]);
}