==== Software PLC examples ====
//**NOTE**: The myCNC team recommends utilizing the examples provided in this manual (as well as other manuals in this documentation) as a starting point for your machine setup. When possible (and applicable), it is recommended to keep changes to a mininum. In general, using these examples as the basis for your PLCs/macro commands allows for an easier setup process.//
===General examples===
* [[How to add mandatory Homing after Emergency Button and-or Servo ready alarm]]
* [[Button to toggle select output pin with indication]]
* [[Oil Change counter]]
* [[Controller Peripherals Test - BV17]]
* [[plc:Charge Pump]]
=== Endless loop for G-code program ===
An endless loop can be made in Software PLC procedure. PLC procedure contains an endless loop. In the loop it checks the current status of myCNC controller, if the controller is in Idle mode and ready to run a new program, it reloads G-code file (if needed), reset current program pointer and starts running g-code.
PLC code is -
main()
{
do
{
do{ a=gvarget(6065); }while(a!=0); //wait Motion Controller ready to accept new program
gvarset(100001,1); //Reset G-code pointer to start
timer=5; do{ timer--;}while(timer>0); //0.5 sec Pause
gvarset(100002,1); //Start G-code
}while(1); //endless loop
exit(99);
};
If **Stop** button pressed, g-code will be stopped, the procedure will see Motion controller is ready for next loop entry and restart g-code again. This behaviour can be inappropriate for many applications.
A simple solution is to add global variable **single/auto** and check this variable in the loop.
main()
{
do
{
do{ a=gvarget(6065); }while(a!=0); //wait Motion Controller ready to accept new program
gvarset(100001,1); //Reset G-code pointer to start
timer=5; do{ timer--;}while(timer>0); //0.5 sec Pause
gvarset(100002,1); //Start G-code
}while(gvarget(400)==0); //endless loop, if #400==0, otherwise exit from procedure
exit(99);
};
//If variable #400 will be set to non-zero value, NOT_ENDLESS.plc process will be finished
In case no need to exit from ENDLESS.plc and variable #400 should be monitored constantly and run g-code when #400 is set bu user -
main()
{
do
{
if (gvarget(400)!=0) //if #400!=0, run g-code, otherwise continue to test #400
{
do{ a=gvarget(6065); }while(a!=0); //wait Motion Controller ready to accept new program
gvarset(100001,1); //Reset G-code pointer to start
timer=5; do{ timer--;}while(timer>0); //0.5 sec Pause
gvarset(100002,1); //Start G-code
};
}while(1); //endless loop
exit(99);
};
//If variable #400 will be set to non-zero value, ENDLESS.plc process will be finished
=== Endless loop with switch to left & right sides of working area ===
#define MAX_X 800
#define MAX_Y 800
main()
{
do
{
auto=gvarget(501); //Automatic mode
if (auto)
{
do { rect_not_ready=gvarget(7369); }while(rect_not_ready==0);
left_right=1;
xmax=gvarget(7350);
if (xmax>MAX_X){ left_right=0;};
ymax=gvarget(7351);
if (ymax>MAX_Y){ left_right=0;};
gvarset(502,left_right); //502 - shows both sides or single side
LR=gvarget(500);
if (LR==0) //left
{
// gvarset(9100,1); //show message #1
//do{ a=portget(11); }while(a==0); //press pedal, port 11
//do{ a=gvarget(6065); }while(a!=0); //press pedal, port 11
// gvarset(9100,0); //clear the message
portclr(10);//Vacuum Left OFF
portset(9); //
portset(11);//
portset(22);//
// gvarset(9101,1); //show message #2
//do{ a=portget(13); }while(a==0); //press pedal, port 13
// gvarset(9101,0); //убрать
portset(10);//Vacuum Left
portclr(9); //
timer=5; do{ timer--; }while(timer>0); //wait 0.5 seconds while the vacuum is working
portclr(11);//выключить упоры
portclr(22);//
////
//ждать пока УП завершится
do{ a=gvarget(6065); }while(a!=0); //wait
////
do {
do{ a=gvarget(6065); }while(a!=0); //wait for the system to be ready
gvarset(100010,54); //Дать код G54
timer=5; do{ timer--; }while(timer>0); //wait 0.5s for the system to switch
n=gvarget(5220);//gets the current coordinate system number
} while(n!=1); //while the current system is not G54
do{ a=gvarget(6065); }while(a!=0); //wait for the system to be ready
gvarset(100001,1); //go to the beginning of the program
timer=5; do{ timer--; }while(timer>0); //wait 0.5s
do{ a=gvarget(6065); }while(a!=0); //wait for the system to be ready
gvarset(100002,1); //start the program
}else //right
{
// gvarset(9110,1); //show message #1
// do{ a=portget(12); }while(a==0); //press pedal, port 11
// gvarset(9110,0); //clear the message
portclr(15); //Vacuum Left OFF
portset(16); //
portset(14); //
portset(23); //
// gvarset(9111,1); //show message #2
// do{ a=portget(14); }while(a==0); //press pedal, port 13
// gvarset(9111,0); //clear
portset(15); //Vacuum Left
portclr(16); //
timer=5; do{ timer--; }while(timer>0); //wait 0.5 seconds while the vacuum is working
portclr(14);//
portclr(23);//
////
do{ a=gvarget(6065); }while(a!=0); //wait
//wait until the control program is finished
////
do{
do{ a=gvarget(6065); }while(a!=0); //wait until the program is ready
gvarset(100010,55); //assigns G54 coordinate system
timer=5; do{ timer--; }while(timer>0); //wait 0.5 seconds while the coordinate system switch is happening
n=gvarget(5220);//obtain the current coordinate system number
} while(n!=2);//while the system is not G55
do{ a=gvarget(6065); }while(a!=0); //wait while the processor is busy
gvarset(100001,1); //return to the beginning of the program
timer=5; do{ timer--; }while(timer>0); //wait 0.5 seconds
do{ a=gvarget(6065); }while(a!=0); //wait for the system to be ready
gvarset(100002,1); //start the program
};
timer=20; do{ timer--; }while(timer>0); //3 second pause
do{ a=gvarget(6065); }while(a!=0); //wait until the program is complete
LR=LR^1; //switch to the other side
gvarset(500,LR);
};//auto
}while(1);
exit(99);
};
===Jog Step (0.001, 0.01, 0.1 1.0) Indication with external LED display===
There are global variables which represent current jog step size
^ Variable Name ^ Variable Number ^ Description ^
| GVAR_JOG_STEP_SIZE | 5522 | prepresents current jog step size (double) |
| GVAR_JOG_STEP_0_0001 | 7381 | the value is "1" if Current Jog Step Size is "0.0001", otherwize is "0" (integer) |
| GVAR_JOG_STEP_0_001 | 7382 | the value is "1" if Current Jog Step Size is "0.001", otherwize is "0" (integer) |
| GVAR_JOG_STEP_0_01 | 7383 | the value is "1" if Current Jog Step Size is "0.01", otherwize is "0" (integer) |
| GVAR_JOG_STEP_0_1 | 7384 | the value is "1" if Current Jog Step Size is "0.1", otherwize is "0" (integer) |
| GVAR_JOG_STEP_1_0 | 7385 | the value is "1" if Current Jog Step Size is "1.0", otherwize is "0" (integer) |
| GVAR_JOG_STEP_10 | 7386 | the value is "1" if Current Jog Step Size is "10", otherwize is "0" (integer) |
Software PLC procedure can be made to handle LED display according to "Current Jog Step Size".
- The procedure contains an endless loop.
- Variables a7382...a7385 keep previous state or "Current Jog Step Size"
- There are testing "Current Jog Step Size" global variables values, switching binary output if variables were changed and store new states in the a7382...a7385 local variables
main()
{
a7382=gvarget(7382);
a7383=gvarget(7383);
a7384=gvarget(7384);
a7385=gvarget(7385);
do{
if (gvarget(7382)!=a7382)
{
a7382=gvarget(7382);
if (a7382==0){portclr(14);}else {portset(14);};
};
if (gvarget(7383)!=a7383)
{
a7383=gvarget(7383);
if (a7383==0){portclr(13);}else {portset(13);};
};
if (gvarget(7384)!=a7384)
{
a7384=gvarget(7384);
if (a7384==0){portclr(12);}else {portset(12);};
};
if (gvarget(7385)!=a7385)
{
a7385=gvarget(7385);
if (a7385==0){portclr(11);}else {portset(11);};
};
}while(1);
exit(99);
};
===Switching an output ON for a certain period of time===
#define OUTPUT_TIMER 15
main()
{
count=0;
do{
a=gvarget(7373);
if (a!=0)
{
count++;
if (count<30) { portset(OUTPUT_TIMER); }
else {
portclr(OUTPUT_TIMER);
if (count>6000) { count=0; };
};
}else
{
portclr(OUTPUT_TIMER);
count=0;
};
}while(1);
exit(99);
};