This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/release-note/upgrading-to-3.2/brand-nc-language-coverage.html
T
2026-09-16 00:00:49 +08:00

372 lines
33 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Brand NC language coverage | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Brand NC language coverage | 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 &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<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="Release-Upgrading-BrandCoverage">
<h1 id="brand-nc-language-coverage">Brand NC language coverage</h1>
<p>The SoftNc pipeline is the default NC engine, and this is where most of the release went.</p>
<h2 id="siemens-sinumerik">Siemens SINUMERIK</h2>
<p>Real <code>.mpf</code> / <code>.spf</code> programs replay end to end, not an ISO subset. At 3.1.175 a program that declared
its tool as <code>T=&quot;NAME&quot;</code>, shifted with <code>SUPA</code>, computed with R-parameters, called L-subprograms or
looped with <code>WHILE</code> was not interpreted past that point.</p>
<ul>
<li><strong>Modal vocabulary</strong> — <code>SUPA</code> / <code>G153</code> suppress all frames for one block; <code>T=&quot;NAME&quot;</code> string tool
calls with <code>D</code> cutting-edge offsets resolved through
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensToolOffsetTable.html">SiemensToolOffsetTable</a> (<code>$TC_DP</code> lengths and radius plus
additive wear); <code>G70</code> / <code>G71</code> units; path smoothing (<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 became
quote-aware, so a <code>;</code> inside <code>MSG(&quot;A;B&quot;)</code> no longer truncates the block, and the preset stops
misreading <code>L</code> and <code>G74</code> as Fanuc-family codes.</li>
<li><strong>Evaluation</strong> — <a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensExpressionParser.html">SiemensExpressionParser</a> feeds the
shared expression engine, so <code>Z=R63+150</code> and <code>X=SIN(R10)*20</code> drive motion.
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensRParameterTable.html">SiemensRParameterTable</a> holds R0–R999 as per-case project
data, <code>DEF REAL/INT</code> declarations lower into assignments, and <code>$P_UIFR[n,axis,TR]</code> binds both ways
to <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensFrameTable.html">SiemensFrameTable</a>. Any other <code>$</code>-variable is recorded
with an unsupported note rather than dropped.</li>
<li><strong>Five axis</strong> — <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensProgrammableFrameSyntax.html">SiemensProgrammableFrameSyntax</a> simulates
<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> into the
tilt-transform 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); <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensTraoriSyntax.html">SiemensTraoriSyntax</a> makes
<code>TRAORI</code> a real RTCP mode, the sibling of ISO G43.4, with <code>TRAFOOF</code> handing the offset back;
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensCycle800TiltSyntax.html">SiemensCycle800TiltSyntax</a> decodes <code>CYCLE800</code>'s MODE bits for
all four swivel modes. <code>SCALE</code> / <code>MIRROR</code> / <code>CROTS</code> are recognized and reported
(<code>SiemensFrame--Unsupported</code>), not simulated.</li>
<li><strong>Calls</strong> — L-prefixed and named subprogram calls resolve against
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html">SubProgramFolderConfig</a> (<code>{name}.SPF</code>, then <code>.MPF</code>, then the
bare name) and inline with their <code>P</code> repetition count; <code>M17</code> / <code>RET</code> pop a frame; <code>REPEAT</code> re-runs a
labelled slice; <code>MCALL CYCLE81/82/83/85</code> maps onto the shared canned-cycle machinery; <code>PROC</code> headers
and labels are claimed whole.</li>
<li><strong>Control flow</strong> — <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>. Runaway programs are bounded rather than hanging the session:
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensGotoIterationDependency.html">SiemensGotoIterationDependency</a> caps jumps per (file, label)
and <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensLoopIterationDependency.html">SiemensLoopIterationDependency</a> caps iterations per
(file, loop-entry line); over the cap the construct warns and falls through.</li>
<li><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. <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute
program. Direction resolution lives in <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>:
<code>ACP()</code> takes the <code>[anchor, anchor+360)</code> window, <code>ACN()</code> the <code>(anchor-360, anchor]</code> window, <code>DC()</code>
the shortest swing, with the exact 180° tie going negative. On a machine-coordinate block the
increment is a distance in the <em>machine</em> frame, because
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a> is ordered ahead of
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in all five brand presets — Fanuc,
Mazak, Syntec, Siemens and Heidenhain — so <code>G53 X=IC(10)</code> and <code>SUPA Y=IC(-10)</code> add the raw word to
the previous machine position rather than being re-based through the program frame first. That
order is not something a saved-file patch can express: a project saved before 3.2.21 keeps the old
order for that block shape until its pipeline is re-created from the brand preset.</li>
<li><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 rather than a coordinate, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a>,
implemented by <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a> from the real machine
data (the MD30500 axis assignment, the MD10910 / MD10930 position tables, the equidistant
MD30501–30503 definition).</li>
<li><strong><code>G74</code> / <code>G75</code> fixed-point return</strong> is claimed as a whole block, so its dummy axis values no longer
mint a rapid to the coordinates written in the block and its <code>F</code> never reaches the modal feedrate.</li>
<li><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>
note-only, so each occurrence voices <code>DeclaredMCode--UnmodeledEffects</code> instead of an unknown-code
warning, without inventing simulated effects. A machine's own table overrides a declaration when the
real effects are known.</li>
</ul>
<h2 id="heidenhain">Heidenhain</h2>
<p>Both dialects play on one preset, <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_HeidenhainNcRunner">HeidenhainNcRunner</a>.</p>
<ul>
<li><strong>Klartext motion and setup</strong> — the <code>L</code> statement and its axis words, <code>FMAX</code>, <code>M91</code> as a one-shot
machine-coordinate move, <code>TOOL CALL</code> wired to tool change and spindle speed with the table height
and <code>DL</code>. Datum handling follows TNC semantics: <code>CYCL DEF 247</code> sets the preset and <code>CYCL DEF 7</code> is an
<em>additive</em> shift on top of it, composing as separate transform-chain entries instead of replacing
each other, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a>. Arcs (<code>CC</code> pole
plus <code>C</code> statement, <code>DR-</code> = CW, closed arc = full circle), <code>RL</code> / <code>RR</code> / <code>R0</code> radius compensation,
the <code>M126</code> / <code>M127</code> rotary-wrap state, <code>M140 MB</code> retract, and <code>CYCL DEF 32 TOLERANCE</code>.
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainLnOrientationSyntax.html">HeidenhainLnOrientationSyntax</a> resolves an <code>LN</code> vector
block into rotary axes through the same RTCP machinery the rotary-word programs use: <code>T</code> present
plus <code>M128</code> / <code>FUNCTION TCPM</code> keeps the tool on T; <code>T</code> absent plus RTCP holds the tool on the
surface normal N; RTCP inactive ignores T (<code>Orientation-Vector--IgnoredNoTcpm</code>), as the control
does. A <code>C</code> block never states its own centre: each in-plane component comes from the <code>CC</code> block's
own axis word, else from the previous <code>CC</code> section's same axis, else from the arc's own start point. A bare <code>CC</code>
is the one spelling that states all of them at once — it takes the last programmed position, read
at the <code>CC</code> block, and replaces the modal centre rather than inheriting it. A centre that lands on
the arc's own start point leaves the block with no radius, so it warns
<code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a linear move to the endpoint.</li>
<li><strong>Klartext incremental axis words</strong> — the <code>I</code>-prefixed word (<code>IX+20</code>, <code>IY-15</code>, rotary <code>IC+90</code>) is
the same axis word as its absolute twin, read as a distance from the last programmed position. It
is per word rather than per block: <code>L X+60 IY-10</code> mixes an absolute X with an incremental Y and
stamps only the Y. One shared grab serves five statement heads — <code>L</code>, <code>C</code>, <code>CC</code>, <code>LN</code> and
<code>CYCL CALL POS</code> — each writing the value under the <em>plain</em> axis key of its own section plus a
<code>&quot;PositioningOverride&quot;: { &quot;Y&quot;: &quot;Incremental&quot; }</code> entry on the block root. That is the same per-word
section the Siemens <code>IC()</code> wrapper writes, so the existing resolve consumers convert it and no
second incremental mechanism exists. Coverage differs by head: <code>L</code>, <code>C</code> and <code>LN</code> take the whole
axis tag list, rotary included, while <code>CC</code> and <code>CYCL CALL POS</code> take <code>X</code> / <code>Y</code> / <code>Z</code> only — a <code>CC</code>
never positions a rotary axis, and the stamp is keyed by axis on the block root, where a rotary
letter would read as a rotary word of the block. The sign is optional (<code>L IX5</code>), a <code>Q</code> reference
resolves behind the prefix (<code>L IZ+Q2</code>), and the glued post-processed run <code>LIX+20IY-15</code> parses.
Before these words were read the plain grab could not see the <code>X</code> inside <code>IX</code> — its prefix guard
demands a word boundary, a digit or whitespace before the tag, and <code>I</code> is a word character — so
<code>L X+60 IY-10</code> took the X and dropped the Y: a motion to the wrong place, not a missing one.</li>
<li><strong>What an incremental word is measured from</strong> depends on the statement. An <code>L</code> / <code>C</code> / <code>LN</code>
endpoint and a <code>CC</code> centre are distances from the last programmed tool position, so
<code>CC IX+0 IY+11</code> is a stated centre resolved against that position — never against the previous
centre — and it is no longer the spelling whose coordinates the parser could not read.
<code>CYCL CALL POS</code> has its own reference: an <code>IX</code> / <code>IY</code> / <code>IZ</code> word there is a distance from the
coordinates the <em>previous</em> <code>CYCL CALL POS</code> programmed, which is the control's own rule behind its
error 1A0-0108. An axis that no earlier call programmed has no reference: the control refuses the
call, and the simulation warns <code>HeidenhainCyclCall--IncrementalNoReference</code> and falls back to the
last programmed position. A tool move between the two calls makes the two candidate references
differ, and that divergence warns <code>HeidenhainCyclCall--IncrementalAfterMove</code>, the control's stated
reference winning. With <code>M91</code> on the block the increment is a machine-frame distance, per the
ordering note under Siemens above. A rotary increment is a signed traverse the wrap pass keeps
verbatim — <code>IC+270</code> from 75° stays 345° instead of folding into the ±180° shortest-path window,
while an absolute rotary word on the same block still folds. The <code>CYCL DEF 7</code> datum-shift <code>I</code>
words are a different mechanism: <code>CYCL DEF 7.2 IY+5</code> shifts by the value on top of the shift last
valid, stays under prefixed keys in the cycle's own record, and writes no per-word stamp at all.</li>
<li><strong>Q-parameters</strong> — <a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.html">HeidenhainExpressionParser</a> lexes
<code>Q</code> / <code>QR</code> / <code>QL</code> / <code>QS</code>, the <code>DIV</code> keyword of FN 4 and the prefix <code>SQRT</code> of FN 5, so <code>FQ1</code> reaches
the feedrate, <code>L X+Q2</code> reaches the program XYZ and <code>TOOL CALL SQ3</code> reaches the spindle speed.
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Heidenhain.HeidenhainQParameterTable.html">HeidenhainQParameterTable</a> holds Q0–Q99 free and QR0–QR499
permanent parameters as per-case project data. Unimplemented opcodes (FN 14 / 16 / 18…) are claimed
and reported rather than half-read, so an <code>FN 18 SYSREAD</code> target stays vacant instead of taking a
fabricated value. <strong>FN 9–12 conditional jumps execute</strong>, with a (file, label)-keyed iteration cap.</li>
<li><strong>Tilt and RTCP</strong> — <code>PLANE</code> (SPATIAL fully composed with <code>SEQ</code> / <code>COORD ROT</code> / <code>TABLE ROT</code> and
<code>STAY</code> / <code>MOVE</code> / <code>TURN</code> positioning; VECTOR structurally captured; EULER / POINTS / RELATIV /
AXIAL / PROJECTED consumed and warned with the previous tilt retained, so a <code>PLANE AXIAL B+45</code> B
word can never be mistaken for a rotary axis command), <code>FUNCTION TCPM</code>, and real <code>M128</code> / <code>M129</code>
tool-centre-point control. A centre-referenced <code>FUNCTION TCPM REFPNT</code> (<code>TIP-CENTER</code> /
<code>CENTER-CENTER</code>) is recorded and reported (<code>Orientation-RefPoint--CntNotSimulated</code>) rather than
silently read as TIP-TIP.</li>
<li><strong>Cycles and calls</strong> — <code>CYCL DEF 2xx</code> bodies with their Q parameters mirrored into the block
assignments, cycles 200 / 232 / 251 / 252 / 253 mapped onto the shared G81 / G82 / G83 slots,
<code>CYCL CALL</code> / <code>CYCL CALL POS</code> / <code>M99</code> / <code>M89</code> splitting call-once from modal firing, <code>CALL LBL</code>
inlining up to <code>LBL 0</code>, <code>CALL LBL n REP m</code> as a section repeat, and <code>CALL PGM</code> resolved by file
name. The multi-line tilde continuation form is joined at segmentation
(<a class="xref" href="../../api/Hi.NcParsers.Segmenters.HeidenhainSegmenter.html#Hi_NcParsers_Segmenters_HeidenhainSegmenter_JoinTildeContinuations">JoinTildeContinuations</a>, on by default).</li>
<li><strong>Post-processed spellings</strong> — some post-processors write a whole klartext body with no separators
at all, which used to yield zero motion. Glued line shapes (<code>LX-26.3Y+43.1</code>, <code>FMAXM03M08</code>,
<code>…R0FMAX</code>) and the detached feed spelling (<code>F 20000</code>) now parse, with <code>M140</code>, <code>M128</code> and
<code>PLANE MOVE</code> widening their own <code>F</code> capture so a retract or feed-limit value cannot leak into the
modal feedrate. <code>BLK FORM</code> is recorded as a brand-neutral stock declaration without replacing the
project workpiece setup, and the klartext <code>STOP</code> word joins <code>M00</code> / <code>M01</code>.</li>
<li><strong>DIN/ISO dialect</strong> — <code>%</code> tape header, <code>N</code> block numbers, <code>T</code> + <code>M06</code>, absolute <code>I</code> / <code>J</code> / <code>K</code> arc
centres with the modal pole carried forward, the ISO label family (<code>G98 L&lt;n&gt;</code> definitions and the
head-anchored <code>L&lt;n&gt;,&lt;m&gt;</code> call mapping the comma count onto <code>REP</code>), <code>G247 Q339</code> stamping the same
datum preset as <code>CYCL DEF 247</code>, <code>G54</code> with axis words read as a datum-shift declaration, and
<code>G70</code> / <code>G71</code>.</li>
</ul>
<h2 id="fanuc-and-iso-common">Fanuc and ISO common</h2>
<ul>
<li><strong>Polar coordinate interpolation</strong> — <code>G12.1</code> / <code>G13.1</code> on the SoftNc pipeline. Before this a polar
section parsed silently wrong: the <code>X</code> word (a diameter) and the <code>C</code> word (a hypothetical Cartesian
axis in mm) were consumed as ordinary XYZ and rotary degrees.
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.ProgramRxczSyntax.html">ProgramRxczSyntax</a> halves <code>X</code> from diameter, resolves G90/G91, writes
the polar and derived Cartesian positions and the machine C angle, and classifies motion into polar
linear and polar arc — the latter emitting <a class="xref" href="../../api/Hi.Numerical.Acts.ActMcPolarSpiralContour.html">ActMcPolarSpiralContour</a>, which
keeps spiral geometry in central polar coordinates and stays continuous across ±180°. <code>G41</code> / <code>G42</code>
compensation is resolved on the hypothetical plane, a C-axis speed clamp applies, and YA / ZB axis
pairs are supported. <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PolarGCodeCheckSyntax.html">PolarGCodeCheckSyntax</a> scans for incompatible G
codes before the mode syntaxes consume them.</li>
<li><strong>Custom Macro B</strong> — <code>#var</code> assignment with range-routed stores (<code>#1</code>–<code>#33</code> local per macro frame,
<code>#100</code>–<code>#499</code> volatile cleared on M02/M30, <code>#500</code>–<code>#999</code> retained and persisted in the project,
<code>#3000</code>–<code>#3999</code> system-control), boolean and logical operators, <code>IF[..]GOTO n</code>, <code>IF[..]THEN &lt;stmt&gt;</code>,
<code>WHILE[..]DO m / END m</code> with a bounded-loop watchdog, and position and tool-offset system variables.
<code>M98 P_ L_</code>, <code>M198</code> external call, <code>M99</code> return and <code>M99 P{seq}</code> early return; <code>G65</code> one-shot macro
call with A–Z → <code>#1</code>–<code>#26</code> argument binding, and <code>G66</code> / <code>G67</code> modal macro.</li>
<li><strong>Additional work coordinate systems</strong> — <code>G54.1 Pn</code>, also written <code>G54 Pn</code>, resolves against the
extended table (P1–P48). A selected row nobody has entered reports <code>Coord-WorkOffset--AdditionalZero</code>.
<code>G59.1</code>–<code>G59.9</code> have a provider on the Fanuc, Mazak and Syntec presets. See
<a href="../../anatomy/general-setup/controller/program-data/work-coordinates.html">Work Coordinates</a> and
<a href="../../technique/nc-dialects/controller-iso.html">ISO core</a>.</li>
<li><strong>Fanuc / Syntec unit codes and G05.</strong> <code>G71</code> is the metric spelling of <code>G21</code>; <code>G70</code> is the inch
spelling of <code>G20</code> and reports <code>Unit--InchNotSupported</code> rather than silently switching units.
<code>G05.1 Q1</code> / <code>Q0</code> is AICC / Nano Smoothing (recognized). Bare <code>G05 P{n}</code> is a different feature
(HPCC) and is consumed without changing programmed coordinates, reported under the <code>Hpcc--*</code> ids.</li>
<li><strong>Canned-cycle repeats take rotary words on SoftNc.</strong> The G73–G89 family expands XYZ / R / Q /
F / P / K strokes, and a repeat block carrying an A / B / C word indexes the table and drills
again, the way a control does: a rotary-only repeat fires the cycle, a mixed block pre-positions
XYZ and the table in one simultaneous move before the strokes, and under G68.2 without RTCP the
feature frame stays pinned in machine space so the hole stays put while the workpiece turns. Under
G91 only the words the block itself spoke are increments. The hold that 3.2.24 placed on these
programs is lifted; <code>EnableSoftNcRunner = false</code> is no longer needed for them.</li>
<li><strong>A rotary word under modal G91 is an increment on SoftNc.</strong> A bare A / B / C word follows the
block's modal positioning onto the same anchor + delta path as Siemens <code>IC()</code> and klartext <code>IC+</code>:
<code>G91 … C20.</code> then <code>C20.</code> leaves the table at 40. A per-word directive (<code>C=AC(90)</code>, <code>ACP</code> / <code>ACN</code>,
<code>IC()</code>) still beats the modal state, and a spoken <code>G91 B270.</code> stays a +270° traverse instead of
folding to −90°. A <code>G91 G28</code> rotary intermediate anchors on the previous modal angle, then
returns home. HardNc keeps its absolute reading of a rotary word under G91 and warns. The
programmed deltas are recorded in <a class="xref" href="../../api/Hi.NcParsers.Keywords.IncrementalWords.html">IncrementalWords</a>, beside the
<a class="xref" href="../../api/Hi.NcParsers.Keywords.RotaryWords.html">RotaryWords</a> the block spoke.</li>
</ul>
<h2 id="cross-brand">Cross-brand</h2>
<ul>
<li><strong>A shared <code>DwellSyntax</code></strong> consumes <code>G4</code> and <code>G04</code> with the dialect held on the instance:
Fanuc-family <code>X</code> / <code>U</code> seconds, <code>P</code> milliseconds, <code>S</code> spindle revolutions; the Siemens instance reads
<code>F</code> seconds and <code>S</code> revolutions. Capturing the <code>G04</code> spelling fixes a real defect — the un-captured
spelling fell through to the flag and axis syntaxes, where a Fanuc <code>G04 X0.5</code> dwell time became a
ghost X motion word.</li>
<li><strong>Machine-declared M-codes</strong> — <a class="xref" href="../../api/Hi.NcParsers.Dependencys.IMCodeDeclarationConfig.html">IMCodeDeclarationConfig</a> and
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.MCodeEffects.html">MCodeEffects</a> let a machine state what its own OEM codes do (composite
spindle+coolant codes, a tool-change trigger, turret <code>T</code>-word semantics), and
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.MCodeExpansionSyntax.html">MCodeExpansionSyntax</a> expands a declared code into the canonical ISO
flags the shared consumers already understand.</li>
<li><strong>Custom spindle M-codes</strong> drive the spindle direction through a machine-level
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.ISpindleControlConfig.html">ISpindleControlConfig</a>; ISO <code>M03</code> / <code>M04</code> / <code>M05</code> remain the built-in
fallback. An <code>S</code> greater than zero with no direction ever issued assumes clockwise and emits
<code>SpindleDirection--AssumedCw</code>, so the physics gate no longer silently produces zero mechanics for a
whole file.</li>
<li><strong>Tool changes synthesize their axis travel.</strong>
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.ToolChangeMotionSyntax.html">ToolChangeMotionSyntax</a> overlays the per-axis tooling position from
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.IToolingMcConfig.html">IToolingMcConfig</a> onto the current pose (a NaN or missing axis stays
put) and stamps a one-item rapid compound motion, and
<a class="xref" href="../../api/Hi.NcParsers.Semantics.ToolChangeSemantic.html">ToolChangeSemantic</a> moves behind
<a class="xref" href="../../api/Hi.NcParsers.Semantics.CompoundMotionSemantic.html">CompoundMotionSemantic</a> so the tooling step lands at the tooling point.
Programs that retract on their own overlay to a zero-length move and emit nothing extra.</li>
<li><strong>Per-brand pivot gates.</strong> <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a> reverts to the
ISO/Fanuc vocabulary (G43.4 plus the G68.x family),
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPivotTransformationSyntax.html">SiemensPivotTransformationSyntax</a> gates TRAORI / CYCLE800, and
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainPivotTransformationSyntax.html">HeidenhainPivotTransformationSyntax</a> gates the M128 /
PLANE vocabulary. All three compose the identical entry through the shared
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a>. <strong>Exactly one brand gate belongs in a pipeline
list — never register two.</strong></li>
<li><strong>Controller presets are writable and shipped.</strong> A controller resource file is one serialized
<a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> — the whole pipeline that decides how a brand's NC code is
interpreted. <a class="xref" href="../../api/Hi.NcParsers.ControllerPresetWriter.html">ControllerPresetWriter</a> serializes the built-in brand presets
(<code>CreateBrandPreset</code>, <code>WriteBrandPresetFile</code>, <a class="xref" href="../../api/Hi.NcParsers.ControllerPresetWriter.html#Hi_NcParsers_ControllerPresetWriter_WriteAllBrandPresetFiles_">WriteAllBrandPresetFiles</a>)
under <code>Resource/Controller/</code> with the <code>.Controller</code> extension, and HiNc-Resource ships all five so the
load browser starts populated. The static brand properties remain the source of truth; the files are
regenerable snapshots. Writing needs no <code>XFactory</code> registration — reading one back does, because the
loader drops unregistered pipeline entries silently rather than failing the load.</li>
<li><strong>Saved pipelines back-fill their system-wired dependencies on load.</strong> A project saved before a
system-wired dependency existed never self-healed by round-tripping, because re-saving stamped a
fresh API version on the same incomplete list. The <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> XML constructor
now appends the missing ones after the legacy version patches. A runner rehydrated from an older
file still keeps the <em>syntax</em> list it was saved with, though — take the regenerated preset, or a
fresh <a class="xref" href="../../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> built from it, rather than expecting an old file to grow new
syntaxes.</li>
<li><strong>Machine-coordinate and tilted-plane failures report.</strong> G53 and G53.1 record their source G-code
on the parsed block and emit <code>Coord-MachCoord--005</code> / <code>--006</code> / <code>--007</code> on paths that used to fail
silently. A G68.2 tilted plane the machine cannot reach emits <code>Coord-Tilt--001</code> / <code>--002</code>, with a
tool-axis-only IK retry that avoids a spurious warning on a machine with fewer than three rotary
axes.</li>
<li><strong>Session-global sentence indexing.</strong> <code>SyntaxPiece.SentenceIndex</code> used to be assigned by two
independent sequences, so indices collided as soon as a call was inlined mid-stream. The new
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.SystemWired.SentenceIndexCounterDependency.html">SentenceIndexCounterDependency</a> supplies every index at
one chokepoint, so values are session-globally unique and strictly increasing in execution order,
including nested and repeated calls.</li>
<li><strong>Inline plays can loop and jump, and playing a file no longer holds it open.</strong> Inline NC-code plays
stamp their pieces with the command title as a pseudo-path, and every control-flow re-segmentation
re-read the host file by that path — the existence check always failed, so loops fell through
without looping. <code>RunNc</code> now registers the raw lines on
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.SystemWired.NcLineSourceDependency.html">NcLineSourceDependency</a> and
<a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.LabelScanUtil.html">LabelScanUtil</a> reads memory first, disk second.</li>
<li><strong><code>M02</code> / <code>M30</code> / <code>END PGM</code> is a reset edge.</strong> SoftNc models program-end as the edge <em>between</em> that
block and the next, so a concatenated multi-program file does not keep TCP, tilt, CRC or a canned
cycle alive into the next program. Each modal owner writes an explicit cancel section on the
successor (G49 / G69 / G40 / G80); the end-of-program block itself still runs under the modal state
it executed with. HardNc still carries G43.4 across <code>M02</code> — see
<a href="results-that-change-on-upgrade.html">Results that change on upgrade</a>.</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>