====== Jog from PLC ====== //Note: This article is an extension of the original [[plc:plc#jog_from_plc|PLC: Jog from PLC]] section. For more info on PLC programming, see the original article.// The Jog from PLC feature in myCNC allows motion control commands to be executed directly from within PLC programs. This enables dynamic axis control (changing direction, speed, or enabling/disabling movement) without stopping machine motion. Such functionality is especially useful for multi-axis homing or probing operations. Jogging motion is managed using the following global variables, which define acceleration, speed, and direction. ^ Variable Name ^ ID ^ Description ^ | GVAR_G0PLC_SPEED | 8630 | Jog feedrate | | GVAR_G0PLC_TIME | 8631 | Jog acceleration time in ms | | GVAR_G0PLC_SPEED_UNITS | 8632 | Jog speed | | GVAR_PLC_JOGSPEED_UNITS | 8634 | Jog speed + axis mask (%%axis << 24 | speed%%) | | GVAR_PLC_JOG | 8635 | Jog direction control bitmask | ---- ===== Example Implementations ===== ==== Example 1: X-Axis Homing ==== #include pins.h #include func_homing.h main() { gvarset(5539,1); //switch to fast g0moveA implementation gvarset(8631,10); //acceleration time 100ms = 0.1s speed=1000; gvarset(8634,((1<<24)|speed)); //Jog speed for X gvarset(8634,((2<<24)|speed)); //Jog speed for Y forward=1; backward=(1<<8); sensor=INPUT_HOME_X; probe(); exit(99); } This PLC: * Performs homing along the X-axis. * Enables fast motion mode (%%GVAR 5539%%). * Sets acceleration time (%%GVAR 8631%%) and jog speed (%%GVAR 8634%%). * Defines direction bits for X-axis (%%forward%% / %%backward%%). * Uses %%INPUT_HOME_X%% as the active home sensor. * Calls the %%probe()%% routine to move toward and retract from the home switch (see the func_homing.h code below). ---- ==== Example 2: Y-Axis Homing ==== #include pins.h #include func_homing.h main() { gvarset(5539,1); //switch to fast g0moveA implementation gvarset(8631,10); //acceleration time 100ms = 0.1s speed=1000; gvarset(8634,((1<<24)|speed)); //Jog speed for X gvarset(8634,((2<<24)|speed)); //Jog speed for Y forward=(2<<8); backward=2; sensor=INPUT_HOME_Y; probe(); exit(99); } * Performs homing along the Y-axis. * Uses same motion parameters as the X-axis script above. * Reads the Y home sensor (%%INPUT_HOME_Y%%). ---- ==== Example 3: Simultaneous XY Homing ==== #include pins.h #include func_homing.h main() { gvarset(5539,1); //switch to fast g0moveA implementation gvarset(8631,10); //acceleration time 100ms = 0.1s speed=1000; gvarset(8634,((1<<24)|speed)); //Jog speed for X gvarset(8634,((2<<24)|speed)); //Jog speed for Y forward1=1; forward2=2; backward1=(1<<8); backward2=(2<<8); sensor1=INPUT_HOME_X; sensor2=INPUT_HOME_Y; probe_xy(); exit(99); } * Performs simultaneous homing of X and Y axes. * Defines independent direction masks for each axis. * Uses both X and Y home sensors. * Calls %%probe_xy()%% to handle dual-axis probing until both sensors are reached. ---- ==== Example 4: Probe and Jog Control Functions (func_homing) ==== probe() { gvarset(8635,forward); //Jog forward timer=60000; do { timer--; if ((timer&0xff)==0) { gvarset(8635,forward); }; a=portget(sensor); if (a!=0) { timer=0;}; }while(timer>0); gvarset(8634,((1<<24)|(speed/8))); //Jog speed for X gvarset(8634,((2<<24)|(speed/8))); //Jog speed for Y gvarset(8635,backward); //Jog backward timer=60000; do { timer--; if ((timer&0xff)==0) { gvarset(8635,backward); }; a=portget(sensor); if (a==0) { timer=0;}; }while(timer>0); gvarset(8635, 0); //Jog Stop do{ a=gvarget(6060); }while(a!=0x4d); }; probe_xy() { dir1=forward1; dir2=forward2; gvarset(8635,dir1|dir2); //Jog forward timer=60000; do { timer--; if ((timer&0xff)==0) { gvarset(8635,dir1|dir2); }; if (dir1) { a=portget(sensor1); if (a!=0) { dir1=0; gvarset(8635,dir1|dir2); //Jog forward }; }; if (dir2) { a=portget(sensor2); if (a!=0) { dir2=0; gvarset(8635,dir1|dir2); //Jog forward }; }; }while(dir1|dir2); dir1=backward1; dir2=backward2; gvarset(8634,((1<<24)|(speed/8))); //Jog speed for X gvarset(8634,((2<<24)|(speed/8))); //Jog speed for Y gvarset(8635,dir1|dir2); //Jog backward timer=60000; do { timer--; if ((timer&0xff)==0) { gvarset(8635,dir1|dir2); }; if (dir1) { a=portget(sensor1); if (a==0) { dir1=0; gvarset(8635,dir1|dir2); //Jog forward }; }; if (dir2) { a=portget(sensor2); if (a==0) { dir2=0; gvarset(8635,dir1|dir2); //Jog forward }; }; }while(dir1|dir2); gvarset(8635, 0); //Jog Stop do{ a=gvarget(6060); }while(a!=0x4d); }; **%%probe()%%** * Sends a forward jog command. * Monitors the assigned input sensor until triggered. * Reduces jog speed (1/8 of initial) and reverses. * Moves backward until sensor deactivates. * Stops jogging and waits for motion completion (%%GVAR 6060 == 0x4D%%). **%%probe_xy()%%** * Executes dual-axis jog for X and Y simultaneously. * Each axis stops independently when its home sensor triggers. * Once both sensors are active, machine jogs backward at reduced speed until both are clear. * Ends motion and waits for confirmation of stop. The Jog from PLC mode allows smooth and flexible axis control without halting motion or interrupting the main program execution.