Professional Documents
Culture Documents
G Codes Supported
G00 Rapid Tool Positioning
G01 Linear Interpolated Feedrate Move
G02 Clockwise Circular Feedrate Move
G03 Counter Clockwise Circular Feedrate Move
G04 Dwell
G17 XY Plane Selection
G18 XZ Plane Selection
G19 YZ Plane Selection
G20 Inch Units (same as G70)
G21 Metric Units (same as G71)
G27 Home to Switches
G28 Move to Reference Point 1
G29 Return from Reference Point
G30 Move to Reference Points 2-20
G40 Cancel Cutter Compensation
G41 Cutter Compensation (Left)
G42 Cutter Compensation (Right)
G43 Tool Length/Geometry Compensation (Plus)
G44 Tool Length/Geometry Compensation (Minus)
G49 Cancel Tool Length/Geometry Compensation
G52 Use Local Coordinate System
G53 Linear Move to Machine Coordinates (Rapid)
G53.1 Linear Move to Machine Coordinates (Feedrate)
G54-59 Set Program Zero (Fixture Offsets)
G54.1 Set Program Zero (Extended Fixture Offsets)
G70 Inch Units (same as G20)
G71 Metric Units (same as G21)
G73 High Speed Peck Drilling Cycle
G76 Thread Cutting Cycle
G80 Cancel Canned Cycle
G81 Drilling Cycle
G82 Counterboring Cycle
84 FlashCut CNC Section 4 System Programming
M Codes Supported
M00 Program Pause
M01 Optional Program Pause
M02 End of Program
MXX Custom Programmable (See “M-Code Definitions” in the Initial Setup
section of this manual). Typical functions are:
M03 Spindle On
M05 Spindle Off
M06 Tool Change
M07 Mist Coolant On
M08 Flood Coolant On
M09 Coolant Off
M50 Plasma On
M51 Plasma Off
M30 End of Program (Reset)
M30.1 End of Program (Reset and Restart)
M98 Subroutine Call
M99 Return From Subroutine
M100 Wait for Input Line (Normal State)
M101 Wait for Input Line (Tripped State)
FlashCut CNC Section 4 System Programming 85
Mode
Most G-code commands supported by FlashCut are modal, meaning they put the
system into a particular mode of operation and don’t need to be repeated on every
program line. A modal command stays in effect until another command changes
the mode. Related modal commands that affect one aspect of program execution
are called a mode group.
The following list shows the mode groups supported by FlashCut.
Movement
G00 Rapid Tool Positioning
G01 Linear Interpolated Feedrate Move
G02 Clockwise Circular Feedrate Move
G03 Counter Clockwise Circular Feedrate Move
Circular Interpolation
G17 XY Plane Selection
G18 XZ Plane Selection
G19 YZ Plane Selection
86 FlashCut CNC Section 4 System Programming
Units
G20 Inch Units (also G70)
G21 Metric Units (also G71)
Cutter Compensation
G40 Cancel Cutter Compensation
G41 Cutter Compensation (Left)
G42 Cutter Compensation (Right)
Canned Cycles
G73 High Speed Peck Drilling Cycle
G76 Thread Cutting Cycle
G80 Cancel Canned Cycle
G81 Drilling Cycle
G82 Counterboring Cycle
G83 Peck Drilling Cycle
G85 Reaming Cycle
Positioning
G90 Absolute Positioning Mode
G91 Incremental Positioning Mode
FlashCut CNC Section 4 System Programming 87
Example:
G01 X4.0 Y3.0 Z1.0 F7.0 Moves the tool to program coordinates
X=4.0, Y=3.0, Z=1.0 at a feedrate of 7.0
in/min
X2.0 Y2.5 Moves the tool to program coordinates
X=2.0 Y=2.5, leaving the Z axis unchanged
at Z=1.0 (the feedrate remains 7.0 in/min)
• For any move that includes the A (rotary) axis, there are two ways
FlashCut can interpret the current F setting, depending on your setting
in the G-Code panel of the Configuration dialog box.
Linear Feedrate (Distance/Minute) – This option directs FlashCut to
interpret the feedrate command (F) as a linear feedrate. The speed of
the tool tip relative to its point of contact on the rotating workpiece
will be at the specified F value. In this mode, you can use a single F
command to cover pure linear and rotary-included moves.
Rotary Feedrate (Degrees/Minute) – This option directs FlashCut to
interpret the feedrate command (F) as a rotary feedrate. The A axis
controls the timing. The F parameter is interpreted as degrees/minute.
Example:
G01 X1 A90 F360
The A axis turns 90 degrees while the X axis moves 1 inch. The A
axis turns at exactly 360 degrees/minute. The timing for the X axis is
based on the A axis motion and is not explicitly listed in the G-code
file.
Note that if you choose the rotary feedrate interpretation, the F
feedrate in use is always interpreted as degrees/minute for any move
that contains motion on the A axis. For all other moves, it's interpreted
as inches/minute (or mm/min). Therefore, you must be very careful to
reset F every time you switch between pure linear and rotary-included
moves.
• FlashCut can move up to three axes simultaneously. If you specify a
move on all four axes, FlashCut will perform two separate moves, one
for the Z axis and one for the X-Y-A axes. The Z move will occur
first if the direction is towards the home end of the axis (specified by
the Home End setting on the Homing panel of the Configuration
dialog box). Otherwise the X-Y-A move will occur first. If this
behavior doesn’t suit your needs, use two G01 commands.
90 FlashCut CNC Section 4 System Programming
G04 Dwell
The G04 command causes the program to dwell for a specified amount of time.
The command format is:
G04 Xn
where n is the number of seconds to wait. For safety reasons there is a maximum
time allowed for each dwell command.
Example:
G04 X1.5 Program pauses for 1.5 seconds before moving
on to the next line of G-Code
You’ll activate cutter compensation just before cutting a feature (profile, pocket,
etc.) then cancel cutter compensation immediately upon completing the feature.
The typical sequence of commands is –
1. Select tool with M06 command (eg. M06 T1)
2. Move Z axis up to safe height above workpiece
3. Activate cutter compensation using G41 or G42
4. Move X and Y axes together (G00 or G01) to a point on the feature
(called the ‘approach’ move)
5. Move Z axis down into the workpiece
6. Do any number of XY moves (lines and arcs) to cut the feature, all at
the same Z axis depth
7. Move Z axis up to safe height above workpiece
8. Cancel cutter compensation using G40
9. Repeat steps 3-8 for all features
Be sure to follow these steps for each distinct feature of the part. Cutter
compensation should be turned off whenever the machine is not actually cutting a
feature (e.g. when returning to machine zero or the tool change position).
Note that cutter compensation is available only in milling mode (Machine Type
drop-down menu on the Machine Tool panel of the Configuration dialog box).
For information on customizing cutter compensation, please see “Cutter
Compensation Setup” in the Initial Setup section of this manual.
The following example demonstrates use of cutter compensation.
Example:
This G-Code file cuts on the inside of two 1-inch squares.
F10.00 Set feedrate
M06 T1 Select tool 1
G00 Z 0.25 Raise Z to safe height
G41 D1 Activate cutter comp left
G00 X 1.00 Y 1.00 Approach move
G01 Z-0.10 Plunge into workpiece
G01 X 2.00 Y 1.00 Cut first side of square
G01 X 2.00 Y 2.00
G01 X 1.00 Y 2.00
G01 X 1.00 Y 1.00 Cut last side of square
G00 Z 0.25 Raise Z to safe height
FlashCut CNC Section 4 System Programming 99
Example:
If the offset for G54 is set to
X=1
Y=2
Z = -3
A = 90
in the Fixture Offsets panel, the G54 command would place Program Zero at
machine coordinate X=1, Y=2, Z=-3, A=90. The result is the same as if you
moved the machine tool to machine coordinate X=1, Y=2, Z=-3, A=90, then
clicked the Zero button for program coordinates. The G54-59 and G54.1
commands require Machine Zero to be set.
The G54.1 command allows access to 100 fixture offsets using the following
syntax:
G54.1 Pn
where ‘n’ is any number 1 through 100. This command raises the total number of
available fixture offsets to 106 (6 for G54-59, plus 100).
The G92 command is similar to the G54-59 and G54.1 commands, except the new
program coordinates for the current location are specified in the command itself.
The command syntax is:
G92 Xx Yy Zz Aa
where ‘x’, ‘y’, ‘z’ and ‘a’ are the new current program coordinates.
Example:
G92 X1 Y2 Z-3 A90
sets the current program coordinates to X=1, Y=2, Z=-3, A=90. The new offset
from Machine Zero to Program Zero is not specified, so its value depends on
where the machine happens to be positioned. For this reason, the 54-59 and
G54.1 commands are generally preferred to the G92 command, since they use a
more reliable method for setting the Program Zero location.
For the G54-59, G54.1 and G92 commands, the Program Zero that’s established
remains in effect after the G-Code file has finished execution. The function of
these commands is identical to that of the Program Coordinates Zero and Set
buttons on the main screen.
102 FlashCut CNC Section 4 System Programming
When applying tool length and geometry compensation, FlashCut uses the offsets
defined in the Tooling panel of the Configuration dialog box. See “Tooling
Settings” in the Initial Setup section for more information on defining your tool
offsets.
For tool length and geometry compensation to work properly, FlashCut must
know what tool is in use at all times. Therefore, you must indicate every tool
change with an M06 command in the G-Code file. Similarly, whenever you
change a tool between running G-Code files, you should select it in the Current
Tool pull-down menu. The Compensation Mode pull-down menu is set to
Positive (G43) by default.
Technically, the M06 command indicating your starting tool is optional, but we
recommend you include it so the file is self-contained and less prone to operator
error. However, if you choose not to include an M06 command for your starting
tool, you must make certain you choose your starting tool from the Current Tool
pull-down menu on the main screen, before running the file.
Once the M06 command has set the current tool, the G43 command applies the
proper offset to account for the current tool’s length or geometry as follows:
G43 Hn
where n is the tool number for the current tool.
Milling Mode (Tool Length Compensation) – The G43 command tells FlashCut
to shift all subsequent Z axis moves away from the workpiece (in the positive Z
direction) by an amount equal to the Z offset for tool ‘n’.
Lathe Mode (Tool Geometry Compensation) – The G43 command tells FlashCut
to shift all subsequent moves away from the workpiece (in the positive X and Z
directions) by an amount equal to the X and Z offset for tool ‘n’.
If tool length/geometry compensation is already in effect for a previous tool, the
resulting shift away from the workpiece equals the difference between offsets for
tool ‘n’ and the previous tool.
Milling Mode Example:
G43 H3 Shifts all subsequent Z axis moves away from the
workpiece (in the positive Z direction) by the Z
offset for Tool #3
Lathe Mode Example:
G43 H3 Shifts all subsequent X and Z axis moves away
from the workpiece (in the positive X and Z
directions) by the X and Z offset for Tool #3
The G44 command is identical to the G43 command, except that it shifts all
moves in the direction opposite from G43. Unless you are an experienced CNC
programmer and know how to use G44 correctly, G43 is the preferred command.
The G49 command cancels tool length/geometry compensation.
104 FlashCut CNC Section 4 System Programming
When using tool length compensation there are several important things to keep in
mind:
• You must predefine all tools and associated offsets in the Tooling
panel of the Configuration dialog box.
• It’s good practice to include an M06 tool change and a G43
compensation command for the first tool used, near the beginning of
the G-Code program.
• FlashCut does not cancel tool offset when it finishes processing a G-
Code file. TO AVOID CRASHES, IT IS VERY IMPORTANT
THAT YOU UPDATE THE CURRENT TOOL DROP-DOWN
MENU, WHENEVER YOU MANUALLY CHANGE A TOOL.
• The G43, G44 and G49 commands are modal, so the current tool offset
remains active until FlashCut executes another one of these three
commands, or you set the Compensation Mode pull-down menu.
• It’s good practice to use the G43 command in the line directly
following the M06 command.
The following example illustrates proper use of the tool change and tool length
compensation commands.
Milling Mode Example:
There are two basic methods for setting Program Zero, and both will be covered
in this example.
• Use G54-G59 to apply a fixture offset (“Fixture Offset Method”). This
method requires Machine Zero and the correct fixture offset to be set.
• Touch the tip of the tool to the top of the workpiece and click the Program
Coordinates Zero button on the main screen (“Tool Touch-Off Method”).
This method doesn’t require Machine Zero or a fixture offset to be set.
In this example, the tool change position (reference point 1 on the Reference
Points panel of the Configuration dialog box) is defined as machine coordinates
X=0, Y=0, Z=0 (Machine Zero). Tool #1 is loaded in the machine tool, and
selected in the Current Tool pull-down menu on the main screen. The
Compensation Mode pull-down menu is set to Positive (G43). Machine Zero has
been set. The machine tool is at Machine Zero. The tooling configuration is
shown below.
FlashCut CNC Section 4 System Programming 105
G73, G80, G81, G82, G83, G85, G98, G99 Drilling Canned Cycle Commands
Canned drilling cycles simplify programming by letting you specify standard
drilling operations with a single command. FlashCut supports the following
drilling cycles:
G73 High Speed Peck Drilling Cycle
G80 Cancel Canned Cycle
G81 Drilling Cycle
G82 Counterboring Cycle
G83 Peck Drilling Cycle
G85 Reaming Cycle
FlashCut CNC Section 4 System Programming 107
The following diagrams illustrate the sequence of moves for all drilling cycles.
The rest of this section refers to these diagrams.
(G98)
R Level
Top of Workpiece
(G99)
Key
Z Level
Dwell (G82 only) Feedrate Rapid
Move Move
G81 Drilling Cycle / G82 Counterboring Cycle
(G98)
R Level
Top of Workpiece
(G99)
Key
Z Level
Feedrate Rapid
Move Move
G85 Reaming Cycle
108 FlashCut CNC Section 4 System Programming
(G98)
R Level
Top of Workpiece
Q
D
(G99)
Q Key
Z Level
Feedrate Rapid
Move Move
G83 Peck Drilling Cycle
(G98)
R Level
Top of Workpiece
Q
D
(G99)
Q Key
Z Level
Feedrate Rapid
Move Move
G73 High Speed Peck Drilling Cycle
FlashCut CNC Section 4 System Programming 109
• When you switch to a new command in the mode group, you must
include all parameters required for the command.
• The feedrate set by the F parameter for any canned cycle command
remains as the current feedrate for subsequent G01, G02 or G03
moves, unless you explicitly set F to another value for the next move.
The required parameters are Z, X, K, D, F. Note that in the diagram above, the
‘A’ and ‘I’ parameters are zero, and the cutting method is ‘1’ (all default values).
Cutting a thread generally requires several passes. The ‘P’ parameter controls the
depth, starting position and plunge angle of each pass, as shown in the following
diagrams. For all four cutting methods shown in the diagrams below, the ‘A’
parameter is shown as nonzero to illustrate its affect. When ‘A’ is zero, the
plunges are straight into the workpiece, along the X axis, as shown in the diagram
above.
The settings on the Threading panel of the Configuration dialog box also affect
the cutting passes as follows.
Minimum Depth of Cut – The incremental depth of any pass will greater than or
equal to this value (except for the final pass and any spring passes).
FlashCut CNC Section 4 System Programming 113
Final Pass Depth of Cut – Incremental depth of the final pass (finishing pass).
Spring Passes – Number of additional passes performed at the same depth as the
final pass.
WARNING: The Feed Hold button (and feed hold input lines) are disabled
during a threading pass, since it is not safe to stop moving the tool while the
part is still turning. If you need to stop motion during a cutting pass, turn off
power to the spindle and Signal Generator.
Example (assumes Minimum Depth of Cut is 0.010, Final Pass Depth of Cut is
0.005, Spring Passes is set to 1):
G00 X0.75 Move to the Start Point
G76 X1.0 Z-2 K0.125 D500 F0.2
Performs a total of 8 threading passes (including
1 spring pass) to make a two inch long thread
with minor diameter 1.0, major diameter 1.25, at
5 turns per inch. By default the cutting method
is P1, the tool angle is 0, and there is no taper.
The first pass is cut at a depth of 0.05.
Note that the F parameter does not set the feedrate for subsequent non-threading
moves, since its meaning is different from the standard F command.
G02 X1.0 Y-1.0 I0.5 J-0.5 Moves the tool using counter-clockwise circular
interpolation to the program coordinates X=3.0,
Y=4.0, Z=-2.0 with a center point at program
coordinates X=2.5, Y=4.5, Z=-2.0.
G90 All XYZA coordinates after this command will be
interpreted as program coordinates
G01 X1.0 Y2.0 Z-0.5 Moves the tool to program coordinates X=1.0,
Y=2.0, Z=-0.5
Example:
G01 X1 Y1 F10 First line of main program
M98 Pmysub Jump to subroutine “mysub”
G01 X0 Y0 Continued execution after “mysub” ends
M02 End of main program
Example:
Main G-Code File (Engraves “A B”)
#C:\GCODE\ALPHABET.FGC
G00 X0 Y0
M98 PmakeA
G00 X1 Y0
M98 PmakeB
M02
ALPHABET.FGC File
OmakeA
G91
[Incremental G-Code to cut the letter “A”]
G90
M99
OmakeB
G91
[Incremental G-Code to cut the letter “B”]
G90
M99
Notice that the syntax for calling the included subroutines is the same as for
calling subroutines listed in the main G-Code file.
You may create as many subroutines as you like in the main G-Code file and all
included files, but each must have a unique name.
FlashCut’s support for included files lets you create a library of reusable
subroutines that you can apply to various projects and jobs.
M03, M05, M07, M08, M09, M50, M51, MXX Auxiliary Device Control
Using the M-Code Definitions panel of the Configuration dialog box you can
define up to 50 M-Codes to turn on or off various devices via the output lines.
You can also define M-Codes to digitally control external devices (using a group
of output lines as digital input into the control lines of the device). See “M-Code
Definitions” in the Initial Setup section for details on how to set up the M codes.
When FlashCut processes an M-Code that sets output lines, if the current output
line state already reflects the M-Code’s intended action, FlashCut skips the M-
Code, including any associated delay. For example, if the spindle is on, and
118 FlashCut CNC Section 4 System Programming
FlashCut processes an M-Code to turn on the spindle, the delay associated with
turning on the spindle (eg. 2 seconds) is skipped.
Typical M codes include:
M03 Spindle On
M05 Spindle Off
M07 Mist Coolant On
M08 Flood Coolant On
M09 Coolant Off
M50 Plasma On
M51 Plasma Off
Program Comments
You can add comments to your program by enclosing them in parentheses.
FlashCut ignores anything enclosed in parentheses as shown below.
Example:
(Move to beginning of the next feature)
G00 X1.0 Y3.0 (Ready to move Z axis down)
G00 Z-1.5
(Begin next feature)
G01 Z-1.6 F8
G01 X3.0 Y7.5
Optional Line
The optional line command is a forward slash (‘/’) at the start of a G-Code line.
FlashCut only executes the line if the Execute Optional G-Code Lines checkbox is
checked, on the G-Code panel of the Configuration dialog box. If the checkbox is
unchecked, FlashCut ignores the line.
Example:
G00 X2 Y4
/G00 Z1 This line not always executed
G00 X3 Y5
Values
In every G-Code example up to this point, all values were literal values. A literal
value is one that’s typed into the G-Code program and cannot change. Examples
of literal values are:
1
2.33
“Please close the door”
An example of these values used in G-Code is:
T1
G00 X2.33
M00 “Please close the door”
120 FlashCut CNC Section 4 System Programming
Variables
In addition to literal values, the FlashCut G-Code interpreter understands
variables.
A variable is a placeholder for a value. There are two categories of variables in
Flashcut: System and User. System variables are defined and set by the FlashCut
software itself. These variables represent status values in the software, and
therefore allow you to access information about the current state of the program.
Most system variables cannot be modified in a G-Code program. However, all
system variables can be read in a G-Code program. The system variables
currently supported are:
• #CurrTool – This variable represents the number of the tool currently loaded.
Its value is 0 if no tool is loaded. This value can be modified in a G-Code
program. It is typically modified in a tool change macro.
• #NextTool – This variable represents the number of the tool that will be
loaded on the next tool change command (M06). Its value is 0 if no tool has
been specified with the T command. This value can be modified in a G-Code
program.
• #CurrFeedrate – This variable represents the current feedrate. This value can
be modified in a G-Code program.
• #TlChgFeedrate – This variable represents the feedrate at which the controlled
rate portions of an automatic tool change will occur.
• #TlChgCheckPower – This variable represents the state of the Monitor Tool
Chuck Power checkbox on the Tool Change panel of the Configuration dialog
box (checked = true).
• #TlChgPowerInputLine – This variable represents the setting of the Input Line
text box on the Tool Change panel of the Configuration dialog box.
• #TlChgCheckPowerInputNormal – This variable represents the setting of the
Power On State pull-down menu on the Tool Change panel of the
Configuration dialog box (Normal = true).
• #Tool – This is an array variable that is used to access properties of any
configured tool.
• #RefPoint – This is an array variable that is used to access properties of any
defined reference point.
• #FixOff – This is an array variable that is used to access properties of any
defined fixture offset.
• #TlRackPos – This is an array variable that is used to access the properties of
any tool rack position.
• #Machine – This variable represents the current position of the machine tool
in machine coordinates.
FlashCut CNC Section 4 System Programming 121
• #Program – This variable represents the current position of the machine tool
in program coordinates.
• #ProgZeroOff – This variable represents the offset from the machine
coordinate system to the program coordinate system.
• #ToolOff – This variable represents the tool offset currently in effect.
#Tool, #RefPoint, #FixOff, and #TlRackPos are array variables. Array variables
are discussed later in this section.
#Machine, #Program, #ProgZeroOff, and #ToolOff are runtime variables. This
means that their values are not accessible in a G-Code program. Rather, these
variables are intended to be used in the Tool Length Formula (on the Tool Length
Sensing panel of the Configuration dialog box).
In addition to the above variables, there are several general-purpose system
variables available that do not represent any system status values. These variables
have been provided for use in macros. You are free to set and read these variables
as desired.
• #SysInteger1 - #SysInteger8 – Eight system-declared INTEGER variables.
• #SysReal1 - #SysReal8 – Eight system-declared REAL variables.
• #SysBoolean1 - #SysBoolean8 – Eight system-declared BOOLEAN variables.
• #SysString1 - #SysString8 – Eight system-declared STRING variables.
User variables are defined and maintained by the G-Code programmer. In order
to use a User variable, you must first declare it with a simple statement that
includes the type of the variable and its name, as in this example:
GLOBAL INTEGER #Count
In the above statement, the word “GLOBAL” indicates the scope of the variable
(more on that later), “INTEGER” is the type, and “#Count” is the variable name.
The types supported by FlashCut are:
• INTEGER – These are whole numbers (ie. numbers without decimal points).
They can be positive or negative (or zero).
• REAL – These are rational (or fractional) numbers (ie. numbers with decimal
points). They can be positive or negative (or zero).
• BOOLEAN – Variables of this type can have one of two values: TRUE or
FALSE.
• STRING – Variables of this type represent text.
122 FlashCut CNC Section 4 System Programming
Example declarations:
GLOBAL INTEGER #Index
GLOBAL REAL #X
GLOBAL BOOLEAN #IsDone
GLOBAL STRING #Message
As with all other words in a FlashCut G-Code program, the case of the letters
does not matter. In other words, these two declarations are the same:
GLOBAL REAL #X
Global REal #x
If these two lines appeared in the same G-Code file, an error would be reported
because the same variable is being declared twice.
Variable names can be any sequence of letters or numbers or the underscore
character (_), but must always start with a number sign (#). The following are all
legal variable names:
#X
#Index
#3rdAxis
#Is_Done
The word “GLOBAL” in a variable declaration indicates the scope, or context, of
the variable. A variable with GLOBAL scope can have its value changed or
retrieved anywhere in the G-Code program, even in a file that is included into the
program. GLOBAL variables must be declared before any line of G-Code other
than lines that include files using #.
If the word GLOBAL is omitted from the variable declaration, that variable is
considered to have local scope. This means that the variable’s value can only be
changed or retrieved in the same subroutine in which it was declared.
Currently, FlashCut only supports GLOBAL variables, so the word “GLOBAL”
is optional. Future releases of FlashCut will support local variables. In these
releases, the word GLOBAL will be required to indicate variables with global
scope.
One or more variables can be declared on the same line. For example,
REAL #X #Y #Z
declares three variables, #X, #Y, and #Z, that are all of type REAL. When
declaring more than one variable on the same line, the variable names must be
separated by spaces.
FlashCut CNC Section 4 System Programming 123
The value of a variable can be set by using the assignment operator. The
assignment operator is an equals sign (=). Variables can be assigned literal
values, as shown below:
INTEGER #Count
#Count = 0
The above code declares an integer variable called #Count, and then assigns
#Count the literal value of 0. The process is similar for all variable types.
REAL #X #Y
BOOLEAN #IsDone
STRING #Message
#X = 1.0
#Y = 2.1
#IsDone = FALSE
#Message = “Please make sure the enclosure is closed.”
A variable can be used in place of a literal value in a G-Code file. For instance,
REAL #X #Y
#X = 1.0
#Y = 2.1
G00 X#X Y#Y
will cause a rapid move to X = 1.0, Y = 2.1. Here are more examples of variable
use:
INTEGER #ToolNumber
STRING #Message
#ToolNumber = 1
M06 T#ToolNumber
#Message = “Please make sure the enclosure is closed.”
M00 #Message
Some variables types will be automatically converted to the correct type as
necessary. For instance, motion commands take REAL type parameters, but
INTEGER type parameters will be automatically converted. Example:
INTEGER #X #Y
#X = 1
#Y = 2
G00 X#X Y#Y
124 FlashCut CNC Section 4 System Programming
M00 #Message
M00 #X
M00 #Count
M00 #IsDone
Some system variables represent objects, rather than simple types. The system
variables in this category are #Machine, #Program, #ProgZeroOff, and #ToolOff.
Here is a description of the properties of each:
• Machine
o X – the current position on the X axis in machine coordinates
o Y – the current position on the Y axis in machine coordinates
o Z – the current position on the Z axis in machine coordinates
o A (W) – the current position on the A (or W) axis in machine coordinates
• Program
o X – the current position on the X axis in program coordinates
o Y – the current position on the Y axis in program coordinates
o Z – the current position on the Z axis in program coordinates
o A (W) – the current position on the A (or W) axis in program coordinates
• Program Zero Offset
o X – the current offset from machine to program coordinates on the X axis
o Y – the current offset from machine to program coordinates on the Y axis
o Z – the current offset from machine to program coordinates on the Z axis
o A (W) – the current offset from machine to program coordinates on the A
(or W) axis
• Tool Offset
o X – the currently applied tool offset on the X axis
o Y – the currently applied tool offset on the Y axis
o Z – the currently applied tool offset on the Z axis
Since these variables represent objects rather than simple types, there is a special
way to use them. The values represented by these variables can be accessed by
specifying the desired property using a period (dot) followed by the property
name. For instance,
#Machine.X
is how you would access the current position on the X axis in machine
coordinates.
126 FlashCut CNC Section 4 System Programming
Array variables are groups of variable values that are indexed. They can be
accessed by supplying the desired index value (position in the array). An array
variable is declared in much the same way as any other variable, except that the
size of the group, also known as the dimension of the array, must be specified.
Example:
REAL #XPositions{5}
The above code declares a REAL array variable called #XPosition that contains 5
values. Arrays can be created for any type (INTEGER, REAL, BOOLEAN, or
STRING). The name of the array variable must be followed by a pair of braces,
{}, that surround a number. The lowest number allowed for an array dimension is
1. An array of 1 is exactly the same as a non-array variable. The highest number
allowed for an array dimension is 10,000. In other words,
INTEGER #Val{0}
BOOLEAN #MyArray{10001}
will both result in errors when the program is loaded.
An array value is accessed in the same manner as any other variable, except that
the index, must be specified. For example,
REAL #XPositions{3} #YPositions{3}
#XPositions{1} = 0.0
#XPositions{2} = 1.0
#XPositions{3} = 2.0
#YPositions{1} = 4.0
#YPositions{2} = 3.0
#YPositions{3} = 2.0
The lowest index number is 1, and the highest index number is the dimension of
the array variable. In other words, if an array variable is declared with a
dimension of 3, the highest index number is 3.
The index itself can be a literal value or a variable value.
REAL #XPositions{3} #YPositions{3}
#XPositions{#CurrTool} = 0.0
#YPositions{#CurrTool} = 2.0
In the above example, if no tool is loaded (ie. #CurrTool = 0), an error will result
because the lowest index number is 1. Similarly, if #CurrTool = 4 or higher, an
error will result because both array variables were declared with a dimension of 3.
FlashCut CNC Section 4 System Programming 127
The system variables #Tool, #RefPoint, #FixOff, and #TlRackPos are array
variables. However, they have special meaning because their types are not any of
the built-in types (INTEGER, REAL, BOOLEAN, or STRING). Instead, these
variables refer to objects (defined in the Configuration dialog box) that in turn
have properties. Specifically, #Tool refers to tools, #RefPoint refers to reference
points, #FixOff refers to fixture offsets, and #TlRackPos refers to tool rack
positions. Here are the properties of each object:
• Tool
o X – the X offset of the tool
o Y – the Y offset of the tool
o Z – the Z offset of the tool
o DIAM – the diameter of the tool
o DESC – the description of the tool
• Reference Point
o X – the X coordinate of the reference point
o Y – the Y coordinate of the reference point
o Z – the Z coordinate of the reference point
o A(W) – the A (or W) coordinate of the reference point
o DESC – the description of the reference point
• Fixture Offset
o X – the X coordinate of the fixture offset
o Y – the Y coordinate of the fixture offset
o Z – the Z coordinate of the fixture offset
o A(W) – the A (or W) coordinate of the fixture offset
o DESC – the description of the fixture offset
• Tool Rack
o X – the X coordinate of the tool rack position
o Y – the Y coordinate of the tool rack position
o Z – the Z coordinate of the tool rack position
o RAISED – the position to which the tool is to be raised
o NEARGRIP – the position to which the machine tool will move rapidly
prior to moving into position to grip the tool
128 FlashCut CNC Section 4 System Programming
Operators
In addition to declaring variables, setting their values, and using their values,
FlashCut supports the use of several operators to make G-Code programs more
flexible and powerful. There are mathematical, grouping, string, and comparison
operators.
Mathematical
The mathematical operators work for INTEGER and REAL values. They are:
+ adds two values
- subtracts two values
* multiplies two values
/ divides two values
FlashCut CNC Section 4 System Programming 129
Examples:
INTEGER #Count #Index
REAL #X #Y #Z
#Count = 0
#Index = #Count + 1
#Count = #Count – 2
#X = 1.0
#Y = #X * 2.0
#Z = #Y / #X
More than one mathematical operator can be used on one line. For example,
INTEGER #Val
#Val = 1 + 2 – 3
When using mathematical operators, the arithmetic precedence applies. This
means that multiplication and division operators are interpreted first, then addition
and subtraction. If more than one multiplication or division operator is on the
same line, the operators are processed from left to right. The same is true for
addition and subtraction operators. Here are some examples:
INTEGER #Val
#Val = 2 + 2 – 3 #Val = 1; 2 + 2 is evaluated first, then 3 is
subtracted from the result
#Val = 4 / 2 * 3 #Val = 6; 4 / 2 first, then result multiplied by 3
#Val = 1 + 2 * 3 #Val = 7; 2 * 3 first, then added to 1
#Val = 1 – 2 * 3 + 4 #Val = -1; 2 * 3 first, then subtracted from 1,
then 4 added to result
#Val = 4 / 2 – 3 * 1 #Val = -1; 4 / 2 first, then 3 * 1, then second
result subtracted from first
Grouping
If a different order of evaluation is desired, FlashCut recognizes grouping
operators. These are like parentheses in mathematics, except brackets [] are used.
Brackets are used because in G-Code the left parenthesis starts a comment. Any
expression inside a pair of brackets is evaluated before operators outside the
brackets. For example,
INTEGER #Val
#Val = 1 + 2 * 3 #Val = 7 as explained above
#Val = [1 + 2] * 3 #Val = 9; 1 + 2 first, then result multiplied by 3
130 FlashCut CNC Section 4 System Programming
String
The only string operator is the concatenation operator.
& combines two strings to form a single string
Example:
STRING #Message1 #Message2
#Message1 = “Please change tool”
#Message2 = “ and close enclosure”
M00 #Message1 & #Message2
The above code will cause the following message to appear:
Please change tool and close enclosure
Since any other type of value can be converted to a STRING, numbers can be
displayed very easily. For example,
M00 “The currently loaded tool is “ & #CurrTool
Here, the system variable #CurrTool is automatically converted to a STRING. If
#CurrTool is 1, the message is
The currently loaded tool is 1
Note: Do not surround the variable name in quotes, otherwise the variable name
itself will be displayed. Surrounding the name in quotes will turn it into a literal
value. For example,
M00 “The currently loaded tool is “ & “#CurrTool”
will cause the following message to be displayed:
The currently loaded tool is #CurrTool
FlashCut CNC Section 4 System Programming 131
Several concatenation operators can be used on the same line. This allows
complicated text messages to be built. Example:
M00 “Tool #“ & #CurrTool &
“ will be replaced by tool #” & #NextTool
If the current tool is 1 and the next tool is 2, the message displayed will be:
Tool #1 will be replaced by tool #2
Mathematical operators can appear on the same line as the concatenation operator.
If this is the case, all mathematical operations are evaluated first. The results of
the mathematical operations are converted to strings and the concatenation takes
place. Example:
M00 “The result “ & 1 + 2 &
“ was obtained by adding 2 to 1”
The expression 1 + 2 is evaluated first, then the result is converted to a STRING
and concatenated with the string literals. The message that is displayed is:
The result 3 was obtained by adding 2 to 1
Comparison
The comparison operators work for any type of value, but both values must be the
same type (or must be convertible to the same type). The comparison operators
are:
= TRUE if both values are equal, FALSE if not
!= TRUE if the values are different, FALSE if they are the same
> TRUE if the value to the left of the operator is greater than the value to the
right, FALSE if not
>= TRUE if the value to the left of the operator is greater than or equal to the
value to the right, FALSE if not
< TRUE if the value to the left of the operator is less than the value to the
right, FALSE if not
<= TRUE if the value to the left of the operator is less than or equal to the
value to the right, FALSE if not
Examples of comparison operator use appear in the following sections.
Flow Of Control
Flow of control commands let you build simple or complex logic into your G-
Code programs. FlashCut provides two types of flow of control: Branches and
Loops. Branches make it possible for a G-Code program to execute different
sections of the code based on a condition. The syntax for a Branch is:
132 FlashCut CNC Section 4 System Programming
IF condition THEN
…
ENDIF
where condition is a Boolean value or expression. If condition is TRUE, the code
between the IF line and the ENDIF line is executed. If condition is FALSE, the
code is skipped and execution continues with the first line after ENDIF.
At times there is a need to execute some code if a condition is true and execute
different code if that condition is FALSE. This can be done by using an ELSE
statement:
IF condition THEN
…
ELSE
…
ENDIF
In this case, the code between the IF and the ELSE is executed if condition is
TRUE, and the code between ELSE and ENDIF is executed if condition is
FALSE. Example,
IF #NextTool = 1 THEN
M00 “Please load tool #1”
ELSE
M00 “Please load tool #2”
ENDIF
In this example, if #NextTool (a system variable) is 1, the user will see a message
to load tool number 1; otherwise a message to load tool number 2 will appear.
The above example includes an example of the use of the ‘=’ comparison operator
as well. Remember that the comparison operator result is BOOLEAN (that is,
TRUE or FALSE).
For even greater flexibility, additional conditions can be specified:
IF #NextTool = 1 THEN
M00 “Please load tool #1”
ELSEIF #NextTool = 2 THEN
M00 “Please load tool #2”
ELSEIF #NextTool = 3 THEN
M00 “Please load tool #3”
ELSE
M00 “An invalid tool was selected”
ENDIF
The above example lets you display different messages based on the next tool to
be loaded. Note that only one ENDIF was necessary. Also, note that THEN is
required for each IF or ELSEIF.
FlashCut CNC Section 4 System Programming 133
IF statements can be nested. This means that inside a block of code between IF
and ENDIF, one or more IFs can appear. For example,
IF #CurrTool > 0 THEN
IF #CurrTool = 1 THEN
M00 “The first tool is loaded”
ELSEIF #CurrTool = 2 THEN
M00 “The second tool is loaded”
ENDIF
ELSE
IF #CurrTool = 0 THEN
M00 “No tool is loaded”
ELSE
M00 “An invalid tool is loaded”
ENDIF
ENDIF
The lines of code between the first IF and the ELSE will be executed if the
currently loaded tool number is greater than zero. The actual message that will
appear depends on the number of the tool that is loaded. Notice that each block of
code that starts with an IF eventually ends with an ENDIF. These pairings must
be present, or an error will result when the G-Code file is loaded.
The other type of flow of control statement is the Loop. The syntax of the Loop
is:
WHILE condition DO
…
ENDWHILE
The lines of code between the WHILE and the ENDWHILE will be executed as
long as condition is TRUE. When condition is FALSE, the loop is exited and
execution continues with the line of code following the ENDWHILE. Example,
INTEGER #Count
#Count = 0
WHILE #Count < 5 DO
M00 “Loop count = “ & #Count
#Count = #Count + 1
ENDWHILE
M00 “Not in loop”
This code will cause the following messages to appear:
134 FlashCut CNC Section 4 System Programming
Loop count = 0
Loop count = 1
Loop count = 2
Loop count = 3
Loop count = 4
Not in loop
If the condition specified in the loop is initially FALSE, the code in the loop will
be skipped entirely.
Note: When creating loops, you must be careful to ensure that the loop condition
will eventually be FALSE. Otherwise, an infinite loop will result and the
program will never load. In the example above, omitting #Count = #Count + 1
creates an infinite loop.
Loops can appear inside other loops or branches. Branches can appear inside
loops as well as other branches. Here’s a program that illustrates this as well as
most of the other features discussed in this section.
(Use GLOBAL for these variables because their values
(are used in the main routine and in subroutines
GLOBAL INTEGER #Row
GLOBAL INTEGER #Col
GLOBAL REAL #XBase #YBase
GLOBAL REAL #RowSpacing #ColSpacing
GLOBAL REAL #XLoc #YLoc
GLOBAL BOOLEAN #MakeMeSmile
GLOBAL INTEGER #Result
#TotalRows = 3
#TotalCols = 4
#XBase = 0.3
#YBase = 0.3
#RowSpacing = 0.8
#ColSpacing = 0.7
#Row=0
#Col=0
FlashCut CNC Section 4 System Programming 135
F10
WHILE #Row < #TotalRows DO
WHILE #Col < #TotalCols DO
M98 PUpdateLocation
#Result = #Col / 2
IF [#Col - #Result * 2] = 1 THEN
#MakeMeSmile = TRUE
ELSE
#MakeMeSmile = FALSE
ENDIF
M98 PSmiley
#Col=#Col+1
ENDWHILE
#Row=#Row+1
#Col=0
ENDWHILE
G00 X0 Y0
OUpdateLocation
#XLoc = #XBase + #Col * #ColSpacing
#YLoc = #YBase + #Row * #RowSpacing
G00 X#XLoc Y#YLoc
M99
OSmiley
G00 Z0
G91
G00 X-0.15 Y0.1
G01 Z-0.5
G02 I0.05
G01 Z0.5
G00 X0.3
G01 Z-0.5
G02 I-0.05
G01 Z0.5
G00 Y-0.2
G01 Z-0.5
IF #MakeMeSmile THEN
G02 X-0.3 I-0.15 J0.1
136 FlashCut CNC Section 4 System Programming
ELSE
G03 X-0.3 I-0.15 J-0.1
ENDIF
G01 Z0.5
G00 X-0.15 Y0.1
G01 Z-0.5
G02 I0.3
G90
G00 Z0
M99
Additional Keywords
In addition to the G-Code commands supported by Flashcut, there are some
additional commands that you’ll specify using keywords. These keywords extend
the capabilities of a G-Code program.
The EnableFO/DisableFO pair of keywords controls how feedrate override affects
the G-Code program. These keywords are provided because there are cases when
an override to the programmed feedrate cannot be tolerated. For example, in an
automatic tool change macro, feedrate moves are often used. Overriding these
feedrates might cause problems, so DisableFO can be used to ensure that the
programmed feedrate will be enforced.
Here’s an example of EnableFO and DisableFO:
G00 X1 Y1
DisableFO Make sure the programmed feedrate is not
overridden
G01 Z-0.5 F3
EnableFO Override is okay from this point
… Continue
In the above example, the programmer ensures that the tool will plunge at a rate
of 3 inches/minute by disabling feedrate override before performing the plunge.
The SaveState/RestoreState pair of keywords causes certain state variables to be
saved or restored. The specific status items affected are:
• Offset from Machine to Program coordinates
(G92/G54/G55/G56/G57/G58/G59/G54.1/Zero Button/Set Button)
• Absolute vs. relative positioning (G90/G91)
• English vs. Metric units (G20/G21 and G70/G71)
• Canned cycle return position (G98/G99)
FlashCut CNC Section 4 System Programming 137
• Feedrate (F)
• Spindle Speed (S)
• Local coordinate system (G52)
• Arc plane (G17/G18/G19)
• Motion mode (G00/G01/G02/G03/G73/G76/G81/G82/G83/G85)
• Cutter compensation (G41/G42)
• Feedrate override enable/disable (EnableFO/DisableFO)
The SaveState/RestoreState keywords are most useful in macros and subroutines
where you wish to restore the state of the program before exiting from the macro
or subroutine. Here’s an example of keyword use:
OSub1
SaveState
G90
… Do some things
RestoreState
M99
By using SaveState and RestoreState, the programmer does not have to change
back to G91 mode before exiting Sub1. Certainly, a change to G91 would be
sufficient for the above example; however, consider the following example:
G91 Relative positioning mode
… Do some things
M98 PSub1
… Do some more things
G90 Absolute positioning mode
M98 PSub1
… Do some more things
M02
138 FlashCut CNC Section 4 System Programming
OSub1
SaveState
G90
… Do some things
RestoreState
M99
In this example, Sub1 is called when the main program is in G91 mode, and then
called again when the main program is in G90 mode. Without the use of
SaveState and RestoreState, the programmer would not be able to ensure that the
correct mode was in effect when Sub1 was exited.
A powerful feature of SaveState and RestoreState is that they can be nested. This
is important when a subroutine calls another subroutine and both are using
SaveState and RestoreState. Here is the effect of nesting SaveState and
RestoreState:
G91 Relative positioning mode
SaveState
G90 Absolute positioning mode
SaveState
G91 Relative positioning mode
RestoreState This puts the program back into absolute
positioning mode
RestoreState This puts the program back into relative
positioning mode
While the above examples only demonstrated setting the G90/G91 mode,
FlashCut would handle all state variables in similar manner.
Built In Functions
FlashCut provides one built-in function, GetRackIndex, which lets you determine
the tool rack position for a given tool. Example:
INTEGER #Index
#Index = GetRackIndex[2] Get the tool rack position of tool #2