Archived
574 lines
28 KiB
HTML
574 lines
28 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>General NC Code Support | HiAPI-C# 2025 </title>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="title" content="General NC Code Support | HiAPI-C# 2025 ">
|
||
|
||
|
||
<link rel="icon" href="../../img/HiAPI.favicon.ico">
|
||
<link rel="stylesheet" href="../../public/docfx.min.css">
|
||
<link rel="stylesheet" href="../../public/main.css">
|
||
<meta name="docfx:navrel" content="../../toc.html">
|
||
<meta name="docfx:tocrel" content="toc.html">
|
||
|
||
<meta name="docfx:rel" content="../../">
|
||
|
||
|
||
|
||
<meta name="loc:inThisArticle" content="In this article">
|
||
<meta name="loc:searchResultsCount" content="{count} results for "{query}"">
|
||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||
<meta name="loc:tocFilter" content="Filter by title">
|
||
<meta name="loc:nextArticle" content="Next">
|
||
<meta name="loc:prevArticle" content="Previous">
|
||
<meta name="loc:themeLight" content="Light">
|
||
<meta name="loc:themeDark" content="Dark">
|
||
<meta name="loc:themeAuto" content="Auto">
|
||
<meta name="loc:changeTheme" content="Change theme">
|
||
<meta name="loc:copy" content="Copy">
|
||
<meta name="loc:downloadPdf" content="Download PDF">
|
||
|
||
<script type="module" src="./../../public/docfx.min.js"></script>
|
||
|
||
<script>
|
||
const theme = localStorage.getItem('theme') || 'auto'
|
||
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
|
||
</script>
|
||
|
||
</head>
|
||
|
||
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
|
||
<header class="bg-body border-bottom">
|
||
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
|
||
<div class="container-xxl flex-nowrap">
|
||
<a class="navbar-brand" href="../../index.html">
|
||
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
|
||
|
||
</a>
|
||
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
|
||
<i class="bi bi-three-dots"></i>
|
||
</button>
|
||
<div class="collapse navbar-collapse" id="navpanel">
|
||
<div id="navbar">
|
||
<form class="search" role="search" id="search">
|
||
<i class="bi bi-search"></i>
|
||
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
</header>
|
||
|
||
<main class="container-xxl">
|
||
<div class="toc-offcanvas">
|
||
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
|
||
<div class="offcanvas-header">
|
||
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
|
||
</div>
|
||
<div class="offcanvas-body">
|
||
<nav class="toc" id="toc"></nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content">
|
||
<div class="actionbar">
|
||
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
|
||
<i class="bi bi-list"></i>
|
||
</button>
|
||
|
||
<nav id="breadcrumb"></nav>
|
||
</div>
|
||
|
||
<article data-uid="Technique-GeneralNcCodeSupport">
|
||
<h1 id="general-nc-code-support">General NC Code Support</h1>
|
||
|
||
<p>The vocabulary HiNC interprets is decided by the controller brand selected for the project. This page
|
||
covers the ISO-family presets — <strong>Fanuc</strong>, <strong>Syntec</strong> and <strong>Mazak</strong> — and <strong>Siemens SINUMERIK</strong>.
|
||
Heidenhain is a different language and has its own page: <a href="controller-heidenhain.html">Heidenhain Support</a>.</p>
|
||
<h2 id="how-to-read-this-page">How to read this page</h2>
|
||
<p>Coverage is stated in three states.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>State</th>
|
||
<th>What happens when the construct appears in your program</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong>Supported</strong></td>
|
||
<td>interpreted, and its effect is simulated.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Recognized, not simulated</strong></td>
|
||
<td>consumed on purpose and reported under its own message id. The block keeps running and the construct's effect does not apply — but it can never be silently misread as something else.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Not supported</strong></td>
|
||
<td>the words are left over, and the block reports <code>Parsing--Unconsumed</code> naming them.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="TIP">
|
||
<h5>Tip</h5>
|
||
<p>The message list a run produces is the coverage report for <strong>your</strong> program. Every word the
|
||
interpreter could not use is named on the block that carried it, so you never have to infer
|
||
coverage from the simulated result. An unknown code does not stop the run — it is reported and
|
||
skipped.</p>
|
||
</div>
|
||
<h2 id="iso-core">ISO core</h2>
|
||
<p>Fanuc, Syntec and Mazak share the vocabulary below. Siemens spells most of it the same way and adds
|
||
its own for the rest — see <a href="#siemens-sinumerik">Siemens SINUMERIK</a>.</p>
|
||
<h3 id="motion">Motion</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Meaning</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>G00</code></td>
|
||
<td>Rapid positioning.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G01</code></td>
|
||
<td>Linear interpolation at the programmed feedrate.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G02</code> / <code>G03</code></td>
|
||
<td>Circular interpolation, clockwise / counter-clockwise. The centre may be given as <code>I</code> / <code>J</code> / <code>K</code> offsets or as a radius <code>R</code>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G04</code></td>
|
||
<td>Dwell. <code>X</code> / <code>U</code> are seconds, <code>P</code> is milliseconds, <code>S</code> is spindle revolutions. Both the <code>G4</code> and <code>G04</code> spellings are read.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G28</code></td>
|
||
<td>Reference-point (home) return through an intermediate point. Under <code>G91</code> a rotary word gives the intermediate as an increment on the previous modal angle.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G53</code></td>
|
||
<td>One-shot machine-coordinate move — work offsets are bypassed for that block only.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h3 id="plane-units-and-positioning-mode">Plane, units and positioning mode</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Meaning</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>G17</code> / <code>G18</code> / <code>G19</code></td>
|
||
<td>Plane selection — XY / ZX / YZ. Arcs and canned cycles follow the active plane.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G21</code></td>
|
||
<td>Metric. This is the HiNC default.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G71</code></td>
|
||
<td>Metric — the RS-274-D / Fanuc G-code system C / Syntec spelling of <code>G21</code>, accepted the same way on the Fanuc and Syntec presets. Mazak EIA stays <code>G20</code> / <code>G21</code> only.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G20</code></td>
|
||
<td>Inch — <strong>not supported</strong>. The block reports <code>Unit--InchNotSupported</code>; post the program in metric.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G70</code></td>
|
||
<td>Inch — the RS-274-D / Fanuc G-code system C / Syntec spelling of <code>G20</code>, read on the Fanuc and Syntec presets. <strong>Not supported</strong>; the block reports <code>Unit--InchNotSupported</code>; post the program in metric.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G90</code> / <code>G91</code></td>
|
||
<td>Absolute / incremental positioning. Under <code>G91</code> a bare rotary word is an increment too; a per-word directive (<code>C=AC(90)</code>, <code>ACP</code> / <code>ACN</code>, <code>IC()</code>) overrides the modal state.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G94</code> / <code>G95</code></td>
|
||
<td>Feed per minute / feed per revolution.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h3 id="work-coordinates">Work coordinates</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Meaning</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>G54</code>–<code>G59</code></td>
|
||
<td>Standard work coordinate systems.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G59.1</code>–<code>G59.9</code></td>
|
||
<td>Extended work coordinate systems, backed by the brand-neutral table the Fanuc, Mazak and Syntec presets carry behind their brand table. Like <code>G54</code>–<code>G59</code>, a row left at zero is read as an authoring convention and stays silent.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G54.1 P1</code>–<code>P48</code></td>
|
||
<td>Fanuc additional work coordinate systems, backed by the extended work offset table. Also read in the manual's second spelling <code>G54 P1</code>–<code>P48</code>, with or without the space; a <code>G54</code> with no P word is the plain G54 above. A selected row nobody has entered reports <code>Coord-WorkOffset--AdditionalZero</code>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G52</code></td>
|
||
<td>Local coordinate offset, applied on top of the active work coordinate system.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h3 id="tool-compensation">Tool compensation</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Meaning</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>G43</code> / <code>G44</code> / <code>G49</code></td>
|
||
<td>Tool length compensation, positive / negative / cancel. <code>H</code> selects the offset row.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G41</code> / <code>G42</code> / <code>G40</code></td>
|
||
<td>Cutter radius compensation, left / right / cancel. <code>D</code> selects the offset row.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Radius compensation is resolved against the blocks that actually travel in the compensation plane. A
|
||
block whose own words command no movement in that plane — a bare <code>G41</code> / <code>G42</code>, a comment, an empty
|
||
line, a plunge along the plane normal (Z under G17) — takes no offset of its own and no part in a
|
||
corner:</p>
|
||
<ul>
|
||
<li><strong>Start-up waits for motion.</strong> A <code>G41</code> or <code>G42</code> block that does not move in the plane does not
|
||
start the offset; the first block that travels in the plane is the start-up block and takes the
|
||
perpendicular (type A) offset. The blocks between them carry the previous block's offset vector,
|
||
so nothing moves on their account.</li>
|
||
<li><strong>Corners are resolved between travelling blocks.</strong> Wordless blocks sitting between two moves are
|
||
passed over, and the corner is the intersection of the two real segments. Running axes are the
|
||
in-plane part of each displacement, so a ramping move keeps its full offset and a plunge along
|
||
the plane normal stays on the offset line.</li>
|
||
<li><strong>The plane cannot change inside a region.</strong> <code>G17</code> / <code>G18</code> / <code>G19</code> selects the
|
||
compensation plane, and it may only be selected while compensation is cancelled. A plane
|
||
code that resolves to a different plane while <code>G41</code> / <code>G42</code> is active — including one
|
||
sharing its block with the <code>G40</code> that cancels the region — is reported as
|
||
<code>RadiusComp--PlaneChangeInRegion</code>, because the corner spanning the change would be built
|
||
from one running axis per plane. A control alarms there (Fanuc PS0037 CAN NOT CHANGE
|
||
PLANE IN CRC). Re-selecting the plane already in force is not a change and is accepted.</li>
|
||
<li><strong>A bare <code>G40</code> closes the region.</strong> The last compensated block ends on its own perpendicular
|
||
offset rather than turning toward the first uncompensated move after the cancel. A <code>G40</code> that
|
||
carries motion is the last corner's partner instead, and the compensated path meets the cancel
|
||
line at their intersection (Fanuc type B); the legacy interpreter
|
||
(<a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_EnableSoftNcRunner">EnableSoftNcRunner</a> set <code>false</code>) ends that case
|
||
perpendicular.</li>
|
||
<li><strong>The D row must match the program's strategy.</strong> A zero-based program (the CAM path is the
|
||
tool-centre path, <code>G41 D..</code> kept for wear only) needs a D row whose geometry radius is 0; a
|
||
cutter-radius program (the NC is the part contour) needs the tool radius there. An offset larger
|
||
than an inner arc or groove of the contour makes the compensated path run against the programmed
|
||
direction — a control stops with an interference alarm (Fanuc PS0041), HiNC reports
|
||
<code>RadiusComp--Interference</code> and keeps playing the swapped-side path. The radius basis of the
|
||
tool-house refresh is chosen on <a class="xref" href="../../anatomy/general-setup/controller/program-data/tool-offsets.html">Tool Offsets</a>.</li>
|
||
</ul>
|
||
<h3 id="rotation-tilted-planes-and-five-axis">Rotation, tilted planes and five-axis</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Meaning</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>G68</code></td>
|
||
<td>Coordinate rotation in the active plane, around a centre point by angle <code>R</code>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G68.2</code></td>
|
||
<td>Tilted work plane — Euler angles <code>I</code> / <code>J</code> / <code>K</code> with origin <code>X</code> / <code>Y</code> / <code>Z</code>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G69</code></td>
|
||
<td>Cancels <code>G68</code> and <code>G68.2</code>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G53.1</code></td>
|
||
<td>Tool-axis direction — swings the rotary axes into line with the active <code>G68.2</code> plane.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G43.4</code></td>
|
||
<td>RTCP / tool centre point management. The Siemens equivalent is <code>TRAORI</code>, the Heidenhain equivalent <code>M128</code>.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h3 id="canned-cycles">Canned cycles</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Cycle</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>G73</code></td>
|
||
<td>High-speed peck drilling — <code>Q</code> increments with a partial retract.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G74</code></td>
|
||
<td>Left-hand tapping.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G76</code></td>
|
||
<td>Fine boring — oriented spindle stop, <code>Q</code> shift, rapid out.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G81</code></td>
|
||
<td>Drilling.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G82</code></td>
|
||
<td>Drilling with a dwell at the bottom.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G83</code></td>
|
||
<td>Peck drilling — <code>Q</code> increments with a full retract to the <code>R</code> point.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G84</code></td>
|
||
<td>Right-hand tapping.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G85</code></td>
|
||
<td>Boring, feed out.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G86</code></td>
|
||
<td>Boring, spindle stop then rapid out.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G87</code></td>
|
||
<td>Back boring.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G89</code></td>
|
||
<td>Boring with a dwell at the bottom.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G80</code></td>
|
||
<td>Cancel.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>G98</code> / <code>G99</code></td>
|
||
<td>Retract to the initial level / to the <code>R</code> level.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>A cycle is expanded into the individual strokes it performs — approach, peck, dwell, retract — each
|
||
with its own feedrate, so material removal and cycle time come out of the real motion rather than an
|
||
approximation. Modal repetition and <code>G91</code> incremental cycle data are resolved before the strokes are
|
||
built.</p>
|
||
<p>A repeat block carrying an A / B / C word indexes the table and drills again, the standard way to
|
||
drill a bolt circle: a rotary-only repeat fires the cycle (any axis word repeats it), a mixed block
|
||
pre-positions XYZ and the table in one simultaneous move before the strokes, and under <code>G68.2</code>
|
||
without RTCP the feature frame stays pinned in machine space so the hole stays put while the
|
||
workpiece turns. Under <code>G91</code> only the words the block itself spoke are increments — an X-pitch
|
||
repeat does not move Y again.</p>
|
||
<h3 id="polar-interpolation">Polar interpolation</h3>
|
||
<p><code>G12.1</code> turns polar coordinate interpolation on and <code>G13.1</code> turns it off. Inside a polar section the
|
||
<code>X</code> word is a <strong>diameter</strong> and the <code>C</code> word is a hypothetical Cartesian axis in millimetres, not
|
||
rotary degrees. HiNC halves <code>X</code>, resolves <code>G90</code> / <code>G91</code>, writes both the polar and the derived
|
||
Cartesian positions along with the machine C angle, and simulates polar linear and polar arc motion —
|
||
the arc as real spiral geometry that stays continuous across ±180°. <code>G41</code> / <code>G42</code> compensation is
|
||
resolved on the hypothetical plane, and <code>YA</code> / <code>ZB</code> axis pairs work the same way. G codes that
|
||
conflict with polar mode are checked before the mode is entered.</p>
|
||
<h3 id="path-smoothing">Path smoothing</h3>
|
||
<p><code>G05.1 Q1</code> enables high-precision contour control (AICC / Nano Smoothing) and <code>Q0</code> disables it. The
|
||
optional <code>R</code> precision level is preserved.</p>
|
||
<p><strong>Bare <code>G05</code> (or <code>G5</code>) is a different feature under a confusingly similar name</strong>, and the two are
|
||
tracked separately so they cannot cancel one another. It selects a function through its <code>P</code> word, on
|
||
the Fanuc, Syntec and Mazak presets:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><code>P</code></th>
|
||
<th>Reading</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>P10000</code></td>
|
||
<td>HPCC — RISC-based high-precision contour control. Recognized, deliberately not simulated: it changes the machine's look-ahead, acceleration and servo behaviour, never the programmed coordinates. Reports <code>Hpcc--NoOp</code>.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>P0</code></td>
|
||
<td>Cancels HPCC. Consumed silently — cancelling a no-op needs no message.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>P10001</code>–<code>P10999</code></td>
|
||
<td>High-speed cycle machining. The real machine executes cycle data pre-registered in its variable area, which is <strong>actual axis motion HiNC cannot see</strong>, so the simulated result misses that machining. Reports <code>Hpcc--HighSpeedCycleIgnored</code> as a warning.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>anything else</td>
|
||
<td>Not supported offline and ignored, reported as <code>Hpcc--UnsupportedFunction</code>. Small <code>P</code> values select the high-speed remote buffer modes.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>no <code>P</code> at all</td>
|
||
<td>Not supported offline and ignored, reported as <code>Hpcc--MissingFunctionWord</code>.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>An unevaluated macro variable or expression in <code>P</code> is tolerated — it reports
|
||
<code>Hpcc--UnevaluatedFunction</code> rather than failing the block.</p>
|
||
<h3 id="m-codes">M codes</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Code</th>
|
||
<th>Meaning</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>M00</code> / <code>M01</code></td>
|
||
<td>Program stop / optional stop.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>M02</code> / <code>M30</code></td>
|
||
<td>Program end. On SoftNc the next block starts with tool-length compensation (including TCP), tilt, cutter-radius compensation and canned cycles cancelled; the <code>M02</code> / <code>M30</code> block itself still runs under the modal state it executed with. The HardNc fallback does not apply that reset.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>M03</code> / <code>M04</code> / <code>M05</code></td>
|
||
<td>Spindle clockwise / counter-clockwise / stop.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>M06</code></td>
|
||
<td>Tool change. The axis travel the change requires is synthesized rather than teleported.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>M07</code> / <code>M08</code> / <code>M09</code></td>
|
||
<td>Mist coolant on / flood coolant on / coolant off.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>M98</code> / <code>M99</code></td>
|
||
<td>Subprogram call (<code>M98 P{program} L{repeat}</code>) and return, including <code>M99 P{sequence}</code> early return.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>M198</code></td>
|
||
<td>Subprogram call from external storage — same shape as <code>M98</code>, different lookup folder.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="NOTE">
|
||
<h5>Note</h5>
|
||
<p><strong>Composite and OEM M-codes are not built in — they are declared on the machine.</strong> An <code>M13</code> that
|
||
means “spindle CW plus flood coolant”, an M-code that triggers a tool change, or turret <code>T</code>-word
|
||
semantics are stated once in the machine's own M-code table and expanded into the ISO effects the
|
||
rest of the pipeline already understands. A code declared with no modelled effect is voiced once as
|
||
<code>DeclaredMCode--UnmodeledEffects</code> instead of raising an unknown-code warning on every occurrence.</p>
|
||
</div>
|
||
<div class="NOTE">
|
||
<h5>Note</h5>
|
||
<p>If a program states a spindle speed greater than zero but never issues a direction, HiNC assumes
|
||
clockwise and reports <code>SpindleDirection--AssumedCw</code>. Without that assumption the cutting-force
|
||
model would silently produce zero mechanics for the whole file.</p>
|
||
</div>
|
||
<h2 id="fanuc">Fanuc</h2>
|
||
<p>Everything in the ISO core, plus:</p>
|
||
<p><strong>Custom Macro B.</strong> <code>#</code> variable assignment and arithmetic, with each range routed to the store it
|
||
belongs to — <code>#1</code>–<code>#33</code> local to the macro frame, <code>#100</code>–<code>#499</code> volatile and cleared on <code>M02</code> /
|
||
<code>M30</code>, <code>#500</code>–<code>#999</code> retained and saved with the project, <code>#3000</code>–<code>#3999</code> system control. Boolean and
|
||
logical operators, <code>IF [..] GOTO n</code>, <code>IF [..] THEN <statement></code>, and <code>WHILE [..] DO m</code> / <code>END m</code> with
|
||
a bounded-loop watchdog. Position and tool-offset system variables read back into expressions.</p>
|
||
<p><strong>Macro and subprogram calls.</strong> <code>G65</code> one-shot macro call, binding arguments <code>A</code>–<code>Z</code> onto <code>#1</code>–<code>#26</code>;
|
||
<code>G66</code> / <code>G67</code> modal macro, firing at every positioning block until cancelled; <code>M98</code> / <code>M198</code> / <code>M99</code>.
|
||
A callee's blocks are spliced into the program at the call site, so the rest of the run treats them
|
||
exactly as if they had been written in the main file.</p>
|
||
<p><strong>Not supported.</strong> <code>G10</code> programmable data setting, <code>G50</code> spindle speed clamp, <code>G31</code> skip.</p>
|
||
<h2 id="syntec">Syntec</h2>
|
||
<p>Syntec runs the ISO core plus the Fanuc-family macro and subprogram vocabulary and polar
|
||
interpolation.</p>
|
||
<p><strong>Not supported.</strong> Custom <code>G</code> macros defined on the controller, <code>Pr</code> parameter mapping, and
|
||
twin-head / twin-turret program syntax.</p>
|
||
<h2 id="mazak">Mazak</h2>
|
||
<p>Mazak reads EIA/ISO with the Fanuc-family macro and subprogram vocabulary and polar interpolation.</p>
|
||
<p><strong>Not supported.</strong> MAZATROL conversational sections, and switching between MAZATROL and EIA/ISO
|
||
inside one program. Export the EIA/ISO program from the controller.</p>
|
||
<h2 id="siemens-sinumerik">Siemens SINUMERIK</h2>
|
||
<p>Real <code>.mpf</code> / <code>.spf</code> programs replay end to end — this is not an ISO subset with a Siemens label on
|
||
it.</p>
|
||
<p><strong>Modal vocabulary.</strong> <code>SUPA</code> / <code>G153</code> suppress all frames for one block; <code>G70</code> / <code>G71</code> units; the
|
||
path-smoothing family (<code>G60x</code> / <code>G64x</code>, <code>FNORM</code> / <code>SOFT</code> / <code>FFWON</code> / <code>COMP*</code> / <code>UPATH</code>, <code>CYCLE832</code>);
|
||
<code>MSG()</code> and <code>STOPRE</code>; <code>CR=</code> and <code>TURN=</code> arcs. Tail comments are quote-aware, so a <code>;</code> inside
|
||
<code>MSG("A;B")</code> does not truncate the block. <code>G74</code> / <code>G75</code> fixed-point return is claimed as a whole
|
||
block, so the dummy axis values it carries never mint a rapid to those coordinates and its <code>F</code> never
|
||
reaches the modal feedrate.</p>
|
||
<p><strong>Tools.</strong> <code>T="NAME"</code> string tool calls with <code>D</code> cutting-edge offsets, resolved through the <code>$TC_DP</code>
|
||
tool table — lengths and radius plus additive wear.</p>
|
||
<p><strong>Variables and expressions.</strong> R parameters <code>R0</code>–<code>R999</code> are held as per-project data, <code>DEF REAL</code> /
|
||
<code>DEF INT</code> declarations lower into assignments, and a full expression evaluator means <code>Z=R63+150</code> and
|
||
<code>X=SIN(R10)*20</code> drive real motion. <code>$P_UIFR[n,axis,TR]</code> binds both ways to the frame table. Any other
|
||
<code>$</code> variable is recorded with an unsupported note rather than silently dropped.</p>
|
||
<p><strong>Frames and five-axis.</strong> <code>TRANS</code> / <code>ATRANS</code> / <code>ROT</code> / <code>AROT</code> (with <code>RPL=</code>) and the solid-angle
|
||
forms <code>ROTS</code> / <code>AROTS</code> compose into the tilt chain in Sinumerik RPY order (<code>ROTS</code> / <code>AROTS</code> behave
|
||
as <code>ROT</code> / <code>AROT</code>: at most two angles, first-named axis first); <code>TRAORI</code> is a real RTCP mode, the
|
||
sibling of ISO <code>G43.4</code>, with <code>TRAFOOF</code> handing the offset back; <code>CYCLE800</code> is decoded from its MODE
|
||
bits across all four swivel modes.</p>
|
||
<p><strong>Calls and control flow.</strong> <code>L</code>-prefixed and named subprogram calls, inlined with their <code>P</code> repetition
|
||
count; <code>M17</code> / <code>RET</code>; <code>REPEAT</code> over a labelled slice; <code>MCALL CYCLE81</code> / <code>82</code> / <code>83</code> / <code>85</code> mapped onto
|
||
the shared canned-cycle machinery; <code>PROC</code> headers and labels. <code>GOTOF</code> / <code>GOTOB</code>, <code>IF</code> / <code>ELSE</code> /
|
||
<code>ENDIF</code>, and <code>WHILE</code> / <code>FOR</code> / <code>REPEAT-UNTIL</code> / <code>LOOP</code>. Jumps and loop iterations are capped rather
|
||
than hanging the session — over the cap the construct warns and falls through.</p>
|
||
<p><strong>Per-word coordinate functions.</strong> <code>AC()</code> / <code>IC()</code> / <code>DC()</code> / <code>ACP()</code> / <code>ACN()</code>, including on <code>I</code> /
|
||
<code>J</code> / <code>K</code> circle centres, so <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute program.
|
||
<code>ACP()</code> takes the forward window, <code>ACN()</code> the backward one, and <code>DC()</code> the shortest swing.</p>
|
||
<p><strong>Coded positions.</strong> <code>CAC</code> / <code>CIC</code> / <code>CDC</code> / <code>CACP</code> / <code>CACN</code> take a 1-based indexing position number
|
||
instead of a coordinate, resolved against the machine's own indexing-position tables.</p>
|
||
<p><strong>OEM auxiliary M-codes.</strong> The preset declares <code>M12</code> / <code>M13</code> / <code>M22</code> / <code>M23</code> and <code>M330</code> / <code>M331</code> as
|
||
note-only, so each occurrence voices <code>DeclaredMCode--UnmodeledEffects</code> rather than an unknown-code
|
||
warning. A machine's own table overrides the declaration once the real effects are known.</p>
|
||
<p><strong>Recognized, not simulated.</strong> <code>SCALE</code> / <code>ASCALE</code>, <code>MIRROR</code> / <code>AMIRROR</code> and <code>CROTS</code> — each
|
||
reported as <code>SiemensFrame--Unsupported</code>.</p>
|
||
<p><strong>Not supported.</strong> <code>SETAL</code>.</p>
|
||
<h2 id="see-also">See Also</h2>
|
||
<ul>
|
||
<li><a href="controller-heidenhain.html">Heidenhain Support</a> — klartext and Heidenhain DIN/ISO.</li>
|
||
<li><a class="xref" href="nc-parsing.html">NC Parsing Engine</a> — the pipeline behind these codes, the
|
||
brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without
|
||
changing HiNC.</li>
|
||
</ul>
|
||
|
||
</article>
|
||
|
||
<div class="contribution d-print-none">
|
||
</div>
|
||
|
||
<div class="next-article d-print-none border-top" id="nextArticle"></div>
|
||
|
||
</div>
|
||
|
||
<div class="affix">
|
||
<nav id="affix"></nav>
|
||
</div>
|
||
</main>
|
||
|
||
<div class="container-xxl search-results" id="search-results"></div>
|
||
|
||
<footer class="border-top text-secondary">
|
||
<div class="container-xxl">
|
||
<div class="flex-fill">
|
||
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</body>
|
||
</html>
|