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/api/Hi.NcParsers.LogicSyntaxs.html
T
2026-09-13 19:45:24 +08:00

1591 lines
113 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>Namespace Hi.NcParsers.LogicSyntaxs | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Namespace Hi.NcParsers.LogicSyntaxs | 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="ManagedReference">
<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="Hi.NcParsers.LogicSyntaxs">
<h1 id="Hi_NcParsers_LogicSyntaxs" data-uid="Hi.NcParsers.LogicSyntaxs" class="text-break">Namespace Hi.NcParsers.LogicSyntaxs</h1>
<div class="markdown level0 summary"></div>
<div class="markdown level0 conceptual"></div>
<div class="markdown level0 remarks"></div>
<h3 id="classes">
Classes
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.BackBoringSyntax.html">BackBoringSyntax</a></dt>
<dd><p>G87 back boring cycle. Supports modal repetition.
Cuts upward from Z to R — used to bore the back side of a workpiece.</p>
<p>
Cycle sequence:
<ol><li>Oriented spindle stop (OSS) at current position</li><li>Rapid (shifted) to init position, then down to bottom Z
— tool enters pre-drilled hole without contacting bore wall</li><li>Shift back to hole center at bottom</li><li>Spindle start (CW)</li><li>Feed upward from Z to R-point (back boring cut)</li><li>Oriented spindle stop at R</li><li>Tool shift, rapid retract (shifted) to final Z</li><li>Shift back to center, spindle restart</li></ol>
<p>
Q specifies the lateral shift distance (mm).
Shift direction defaults to +X (OSS angle 0°).
</p>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> before this
syntax runs.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.BoringCycleSyntax.html">BoringCycleSyntax</a></dt>
<dd><p>G85/G86/G89 boring cycles.</p>
<p>
Cycle sequence:
<ol><li>Rapid to init position (target XY, previous Z)</li><li>Rapid from init to R-point</li><li>Feed from R-point to bottom Z</li><li>[G86 only] Spindle stop at bottom</li><li>[G89 only] Dwell P seconds at bottom</li><li>Retract: G85/G89 → feed retract, G86 → rapid retract</li><li>[G86 only] Spindle restart (CW) after retract</li></ol>
<p>
G85: feed to Z, feed retract — smooth bore finish.
G86: feed to Z, spindle stop (implicit), rapid retract.
G89: feed to Z, dwell P, feed retract — like G85 with bottom dwell.
</p>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> (modal repetition,
G91 conversion, missing-axis fallback) before this syntax runs.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> and before
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in the syntax chain.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a></dt>
<dd><p>Resolves the canned-cycle Group-09 state for the current block
and writes the result to the <a class="xref" href="Hi.NcParsers.Keywords.CannedCycle.html">CannedCycle</a> section.</p>
<ul><li><b>Active cycle</b> (direct G81..G89 or modal repeat): merges
<code>Parsing</code> overrides with previous-cycle stored params, applies
G91 incremental-to-absolute conversion and missing-axis fallback,
writes <a class="xref" href="Hi.NcParsers.Keywords.CannedCycle.html">CannedCycle</a> with <a class="xref" href="Hi.NcParsers.Keywords.ICannedCycleDef.html#Hi_NcParsers_Keywords_ICannedCycleDef_Term">Term</a>,
<a class="xref" href="Hi.NcParsers.Keywords.ICannedCycleDef.html#Hi_NcParsers_Keywords_ICannedCycleDef_ReturnMode">ReturnMode</a>, and
<a class="xref" href="Hi.NcParsers.Keywords.ICannedCycleDef.html#Hi_NcParsers_Keywords_ICannedCycleDef_Params">Params</a>. The resolved cycle sub-section
is left in <code>Parsing</code> under the cycle code for downstream cycle
syntaxes (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.DrillingCycleSyntax.html">DrillingCycleSyntax</a>, etc.) to read.</li><li><b>Explicit cancel</b> (G80 flag present on a non-cycle block):
consumes the G80 flag and writes
<a class="xref" href="Hi.NcParsers.Keywords.CannedCycle.html">CannedCycle</a> = <code>{ Term: "G80" }</code>, acting as a hard
sentinel for <span class="xref">Hi.NcParsers.LogicSyntaxs.CannedCycleSyntaxUtil</span> modal lookback.</li><li><b>No Group-09 activity</b>: leaves the block untouched.</li></ul>
<p>
A rotary-only block (<code>C40.</code>) reaches this syntax without a
<code>Parsing</code> node — <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> consumed the word into
<code>MachineCoordinateState</code> and dropped the emptied node — but its
one-shot <a class="xref" href="Hi.NcParsers.Keywords.RotaryWords.html">RotaryWords</a> record marks it as a block that
spoke an axis word, so under an active cycle it is a modal repeat like
any X/Y block (Fanuc's any-axis-word rule; HardNc indexes the table and
drills again). The cycle's pre-positioning item then carries the
block's ABC (<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a>).
</p>
<p>
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PositioningSyntax.html">PositioningSyntax</a> and before
the individual cycle syntaxes in the chain.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html">CircularMotionSyntax</a></dt>
<dd><p>Writes <a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_McArc">McArc</a> motion for circular commands
(ISO G02/G03).
Detects motion mode from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a>, reads
I/J/K center offsets or R radius from <a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a>,
computes arc center in program coordinates, and writes a one-shot
<a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a> (form + arc params) plus a modal
<a class="xref" href="Hi.NcParsers.Keywords.MotionState.html">MotionState</a> (Term).</p>
<p>
G02/G03 mode is modal (Group 01) — persists across blocks via
<a class="xref" href="Hi.NcParsers.Keywords.MotionState.html#Hi_NcParsers_Keywords_MotionState_Term">Term</a>. Arc parameters (I/J/K/R) are
per-block and must be present in every arc block.
</p>
<p>
Must be placed before <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> in the
syntax chain. Both share the Group 01 motion slot; whichever
writes a <a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a> first claims it.
</p>
<p>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html#Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_IsIjkAbsolute">IsIjkAbsolute</a> switches the I/J/K reading to absolute
center coordinates (Heidenhain DIN/ISO — the ISO twin of the
Klartext CC pole; the Heidenhain list sets it, every other brand
keeps the offset default). In that mode the center is modal: letters
not written in a block inherit the previous absolute pole
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html#Hi_NcParsers_LogicSyntaxs_CircularMotionSyntax_AbsoluteIjkPoleKey">AbsoluteIjkPoleKey</a>, carried by the brand's
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>), a letter never
written falls back to the arc start's component, a letters-free
block that commands an endpoint continues the modal arc off the
pole (a flags-only block stays motionless), a G91 block reads
offsets again and breaks the pole chain, and the plane-normal letter
is a center coordinate — never the per-turn helix pitch. Behavior
mirrors <code>HardNcLine.BuildArcNcArg</code> +
<code>ArcNcArg.GetCenterOrCenterOnBeginPlane</code> (HiUniNc 3.1.152.2)
bit for bit.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.CodedPositionUtil.html">CodedPositionUtil</a></dt>
<dd><p>Shared coded-position resolution for the write-stage consumers
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> for rotary words,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> for linear words): turns a
per-word <a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> entry of the coded family
(<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedAbsolute">CodedAbsolute</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedIncremental">CodedIncremental</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedShortest">CodedShortest</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedPositiveOnly">CodedPositiveOnly</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedNegativeOnly">CodedNegativeOnly</a> — stamped by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensAcIcSyntax.html">SiemensAcIcSyntax</a> for
<code>CAC()</code>/<code>CIC()</code>/<code>CDC()</code>/<code>CACP()</code>/<code>CACN()</code>)
plus the evaluated position number into an axis coordinate via
<a class="xref" href="Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a>, and names the plain override
value the caller rewrites the entry to — so the
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> tail-pass and every other
downstream reader only ever see the established non-coded vocabulary.</p>
<p>
Failure semantics mirror the Siemens alarms as far as a simulator can:
an invalid position number (alarm 17510) or a missing table reports an
error diagnostic and resolves to "hold" — the caller writes the anchor
so the axis does not move. <code>CIC(0)</code> also resolves to hold, by
specification ("the indexing axis is not traversed") and silently.
A <code>CIC</code> from between two indexing positions advances to the n-th
next position in the programmed direction. On a cyclic indexing axis
the incremental sign becomes a directional
(<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a>) approach; increments spanning
more than one revolution reach the correct position but collapse the
extra full turns (the tail-pass windows cover one revolution).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.CoolantSyntax.html">CoolantSyntax</a></dt>
<dd><p>Consumes M07 (mist ON), M08 (flood ON), and M09 (coolant OFF) from
<a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a> and writes the <a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html">ICoolantDef</a>
section with both <a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html#Hi_NcParsers_Keywords_ICoolantDef_IsOn">IsOn</a> (convenience flag)
and <a class="xref" href="Hi.NcParsers.Keywords.ICoolantDef.html#Hi_NcParsers_Keywords_ICoolantDef_Mode">Mode</a> (abstract mode name:
<a class="xref" href="Hi.NcParsers.Keywords.Coolant.html#Hi_NcParsers_Keywords_Coolant_Flood">Flood</a> / <a class="xref" href="Hi.NcParsers.Keywords.Coolant.html#Hi_NcParsers_Keywords_Coolant_Mist">Mist</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Coolant.html#Hi_NcParsers_Keywords_Coolant_Off">Off</a>).
Modal — persists via backward lookback.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.CoordinateOffsetUtil.html">CoordinateOffsetUtil</a></dt>
<dd><p>Shared utilities for all coordinate offset syntaxes
(ISO, Siemens, Heidenhain). Handles section IO,
backward lookback, and <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> composition.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.DrillingCycleSyntax.html">DrillingCycleSyntax</a></dt>
<dd><p>G81/G82 drilling cycle (rapid retract). Supports modal repetition.
G82 covers G81 — the only difference is an optional dwell (P) at the bottom.</p>
<p>
Cycle sequence:
<ol><li>Rapid to init position (target XY, previous Z)</li><li>Rapid from init to R-point</li><li>Feed from R-point to bottom Z</li><li>[G82 only] Dwell P seconds at bottom</li><li>Rapid from bottom to final (G98 → init Z, G99 → R)</li></ol>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> (modal repetition,
G91 conversion, missing-axis fallback) before this syntax runs.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> and before
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in the syntax chain.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.DwellSyntax.html">DwellSyntax</a></dt>
<dd><p>Consumes the non-modal G4/G04 dwell sub-section captured by
<a class="xref" href="Hi.NcParsers.Syntaxs.GenericSyntaxKit.html#Hi_NcParsers_Syntaxs_GenericSyntaxKit_G4Syntax">G4Syntax</a>
(<code>Parsing.G4</code> / <code>Parsing.G04</code>) and emits a
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a> with a single <a class="xref" href="Hi.NcParsers.Keywords.Dwell.html">Dwell</a> item,
which <span class="xref">Hi.NcParsers.Semantics.CompoundMotionSemanticUtil</span> resolves into
an <a class="xref" href="Hi.Numerical.Acts.ActDelay.html">ActDelay</a> of the dwell duration.</p>
<p>
Argument dialects are configured per brand preset:
</p>
<ul><li>Fanuc-family default — <a class="xref" href="Hi.NcParsers.LogicSyntaxs.DwellSyntax.html#Hi_NcParsers_LogicSyntaxs_DwellSyntax_SecondsPrefixes">SecondsPrefixes</a> =
<code>X</code>/<code>U</code> (seconds), <a class="xref" href="Hi.NcParsers.LogicSyntaxs.DwellSyntax.html#Hi_NcParsers_LogicSyntaxs_DwellSyntax_MillisecondsPrefixes">MillisecondsPrefixes</a> =
<code>P</code> (milliseconds), <a class="xref" href="Hi.NcParsers.LogicSyntaxs.DwellSyntax.html#Hi_NcParsers_LogicSyntaxs_DwellSyntax_SpindleRevPrefixes">SpindleRevPrefixes</a> = <code>S</code>
(spindle revolutions).</li><li>Siemens — <code>G4 F&lt;seconds&gt;</code> / <code>G4 S&lt;revolutions&gt;</code>:
the preset sets <a class="xref" href="Hi.NcParsers.LogicSyntaxs.DwellSyntax.html#Hi_NcParsers_LogicSyntaxs_DwellSyntax_SecondsPrefixes">SecondsPrefixes</a> = <code>F</code>, clears the
milliseconds list, keeps <code>S</code> revolutions.</li></ul>
<p>
Because the capture layer owns the whole argument (the F/X/P word
lands inside the dwell sub-section, never in <code>Parsing.F</code> /
<code>Parsing.X</code>), a dwell block cannot poison the modal
<a class="xref" href="Hi.NcParsers.Keywords.Feedrate.html">Feedrate</a> and its X-word cannot mint a ghost motion —
structural fixes for the <code>G04 F60000</code> feed-poison and
<code>G04 X0.5</code> ghost-motion hazards.
</p>
<p>
Spindle-revolution dwell needs the modal spindle speed: this syntax
must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.SpindleSpeedSyntax.html">SpindleSpeedSyntax</a> in the Logic
bundle so the block's own modal <a class="xref" href="Hi.NcParsers.Keywords.SpindleSpeed.html">SpindleSpeed</a> section is
already written. When no positive rpm is known the dwell is consumed
and recorded via an Unsupported Message (<code>Dwell--SpindleRevUnresolved</code>)
instead of being time-simulated — no act is emitted.
</p>
<p>
When several recognized argument prefixes appear on one block the
resolution priority is seconds → milliseconds → revolutions; every
recognized key is consumed either way. Unrecognized keys inside the
sub-section are left in place so they surface through
<a class="xref" href="Hi.NcParsers.InspectionSyntaxs.UnconsumedCheckSyntax.html">UnconsumedCheckSyntax</a>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.FanucPathSmoothingSyntax.html">FanucPathSmoothingSyntax</a></dt>
<dd><p>Consumes Fanuc G05.1 (high-precision contour / AICC II / Nano Smoothing)
and records the modal state in the <a class="xref" href="Hi.NcParsers.Keywords.PathSmoothing.html">PathSmoothing</a> JSON
section using the <a class="xref" href="Hi.NcParsers.Keywords.FanucPathSmoothing.html">FanucPathSmoothing</a> schema. Q1 enables,
Q0 disables; the optional R{n} precision-level is preserved as
<a class="xref" href="Hi.NcParsers.Keywords.IFanucPathSmoothingDef.html#Hi_NcParsers_Keywords_IFanucPathSmoothingDef_Level">Level</a>. The simulation does not
alter the tool path — this is a controller-internal interpolation black
box; the captured state exists for bidirectional NC-text reconstruction.</p>
<p>
Modal carry to subsequent blocks is handled by
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.ModalCarrySyntax.html">ModalCarrySyntax</a>, which already tracks the
<code>PathSmoothing</code> section key and deep-clones it forward.
</p>
<p>
Also consumes the bare <code>G05 P{n}</code> HPCC family (captured by
<a class="xref" href="Hi.NcParsers.Syntaxs.FanucSyntaxUtil.html#Hi_NcParsers_Syntaxs_FanucSyntaxUtil_G05Syntax">G05Syntax</a>) into the block-local
<a class="xref" href="Hi.NcParsers.Keywords.FanucHpcc.html">FanucHpcc</a> section — recognized, intentionally not
simulated (the <a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensStopreSyntax.html">SiemensStopreSyntax</a> pattern).
Ignoring P10000/P0 is safe offline; an ignored high-speed cycle
machining call (P10001–P10999) means the simulation misses that
machining, surfaced as a Warning. See <a class="xref" href="Hi.NcParsers.Keywords.IFanucHpccDef.html">IFanucHpccDef</a> for
the P function-selection semantics. The section is deliberately
separate from the modal <code>PathSmoothing</code> section and is not
modal-carried.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.FeedrateSyntax.html">FeedrateSyntax</a></dt>
<dd><p>Consumes F (feedrate) from <a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a> and
G94/G95 mode from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a>.
Both are modal — persist across blocks via backward node lookback.
Writes resolved state to a <a class="xref" href="Hi.NcParsers.Keywords.IFeedrateDef.html">IFeedrateDef</a> section.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.FineBoringSyntax.html">FineBoringSyntax</a></dt>
<dd><p>G76 fine boring cycle. Supports modal repetition.</p>
<p>
Cycle sequence:
<ol><li>Rapid to init position (target XY, previous Z)</li><li>Rapid from init to R-point</li><li>Feed from R-point to bottom Z</li><li>Oriented spindle stop (OSS)</li><li>Tool shift by Q in +X direction (clear bore wall)</li><li>Rapid retract (shifted) to final Z</li><li>Tool shift back to center</li><li>Spindle restart (CW)</li></ol>
<p>
Q specifies the lateral shift distance (mm) to avoid dragging
the tool across the finished bore surface during retract.
Shift direction defaults to +X (OSS angle 0°).
</p>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> before this
syntax runs.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a></dt>
<dd><p>Handles G43.4 RTCP (Rotary Tool Center Point) activation. Writes
the <a class="xref" href="Hi.NcParsers.Keywords.IToolHeightCompensationDef.html">IToolHeightCompensationDef</a> section and the
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_ToolHeightCompensationSource">ToolHeightCompensationSource</a> entry
in <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> — a
tool-normal · offset_mm translation at the block endpoint ABC. The
chain entry is tagged <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindDynamic">KindDynamic</a>
when RTCP is active and ABC changes across the block, and
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindStatic">KindStatic</a> otherwise.</p>
<p>
The RTCP kinematic rotary part (Pn→MC rigid transform) is orthogonal
to this syntax and is written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a>
on <b>every</b> block, because rotary state remains in effect beyond
the RTCP modal (e.g. a non-RTCP <code>G01</code> after <code>G49</code> still
inherits the last ABC from the program).
</p>
<p>
The "rotary dynamic" distinction lives on the chain entry's
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindKey">KindKey</a> alone and is read via
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_HasDynamicEntry_System_Text_Json_Nodes_JsonObject_">HasDynamicEntry(JsonObject)</a> by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> to pick
<a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_ClLinear">ClLinear</a> vs <a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_McLinear">McLinear</a>.
</p>
<p>
G43.4 is used by Fanuc, Mazak, Syntec, and Okuma. Siemens (TRAORI) and
Heidenhain (M128) are handled by separate syntaxes. Must be placed
<b>after</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolHeightOffsetSyntax.html">ToolHeightOffsetSyntax</a> (to override the
ToolHeightCompensation entry when RTCP is active) and <b>before</b>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a> (which runs last in the chain).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.G53p1RotaryPositionSyntax.html">G53p1RotaryPositionSyntax</a></dt>
<dd><p>G53.1 — non-modal, one-shot rotary axis positioning.
Positions the rotary axes (A/B/C) to align the physical tool axis
with the active tilted work plane defined by G68.2.
XYZ position is unchanged; only rotary axes move via rapid traverse.</p>
<p>
Requires <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a> (or equivalent) to have
written the tilt transform. Uses <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a>
to solve for the target A/B/C via inverse kinematics.
</p>
<p>
Must be placed <b>after</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a>
(needs tilt data) and <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a>
in the syntax chain. Writes A/B/C into
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>.
Motion is handled by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> via modal G00/G01.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.HighSpeedPeckCycleSyntax.html">HighSpeedPeckCycleSyntax</a></dt>
<dd><p>G73 high-speed peck drilling cycle (chip breaking). Supports modal repetition.
Drills in increments of depth Q, partially retracting by
<a class="xref" href="Hi.NcParsers.Dependencys.ICannedCycleConfig.html#Hi_NcParsers_Dependencys_ICannedCycleConfig_PeckRetractionDistance_mm">PeckRetractionDistance_mm</a> between strokes
(instead of fully back to R like <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PeckDrillingCycleSyntax.html">PeckDrillingCycleSyntax</a>).</p>
<p>
Cycle sequence:
<ol><li>Rapid to init position (target XY, previous Z)</li><li>Rapid from init to R-point</li><li>For each stroke: feed Q deeper, rapid retract by d</li><li>If remainder exists: feed to bottom Z, rapid retract by d</li><li>Rapid to final (G98 → init Z, G99 → R)</li></ol>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> (modal repetition,
G91 conversion, missing-axis fallback) before this syntax runs.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> and before
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in the syntax chain.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a></dt>
<dd><p>Resolves G91 incremental axis values to absolute in-place
within <a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a> and its sub-sections.
Reads <a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html#Hi_NcParsers_Keywords_IPositioningDef_Term">Term</a> written
by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PositioningSyntax.html">PositioningSyntax</a>.</p>
<p>
Per-word override: a block-root
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> section (written by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensAcIcSyntax.html">SiemensAcIcSyntax</a> for the
Siemens per-word coordinate functions, and by the Heidenhain L / C /
CC / CYCL CALL POS parsers for the klartext I-prefixed words — see
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Heidenhain.HeidenhainIncrementalAxisWordUtil.html">HeidenhainIncrementalAxisWordUtil</a>;
the CYCL CALL POS words never reach this syntax,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainCannedCycleSyntax.html">HeidenhainCannedCycleSyntax</a> resolves them on
the spot ahead of it)
beats the modal
term for the listed axes on this block only: an
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a> entry converts that word even
under G90, an <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Absolute">Absolute</a> entry skips it even
under G91 — as does, deliberately, every other non-Incremental value
(the rotary-family <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Shortest">Shortest</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a> entries are absolute targets;
their swing resolution lives in <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>,
not here). A coded-position entry
(<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedAbsolute">CodedAbsolute</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_CodedIncremental">CodedIncremental</a> — Siemens
<code>CAC()</code>/<code>CIC()</code> on a linear indexing axis) carries an
indexing position <b>number</b> instead of a coordinate: the number
is resolved through <a class="xref" href="Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a>
via <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CodedPositionUtil.html#Hi_NcParsers_LogicSyntaxs_CodedPositionUtil_TryResolveCodedTarget_Hi_NcParsers_Dependencys_IIndexingPositionConfig_System_String_System_String_System_Double_System_Double_Hi_NcParsers_ISentenceCarrier_Hi_NcParsers_NcDiagnosticProgress_System_Double__System_String__">TryResolveCodedTarget(IIndexingPositionConfig, string, string, double, double, ISentenceCarrier, NcDiagnosticProgress, out double, out string)</a>, the word
is rewritten to the resolved absolute coordinate, and the entry to
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Absolute">Absolute</a>; a failed resolve reports an error
and holds the last program position. Axes without an entry follow the
modal term unchanged, so brands that never write the section
(Fanuc/...) keep the exact legacy behavior.
</p>
<p>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html#Hi_NcParsers_LogicSyntaxs_IncrementalResolveSyntax_WorkingPathList">WorkingPathList</a> specifies which JSON paths
contain axis values that need incremental-to-absolute conversion.
Default: <code>[["Parsing"], ["Parsing", "G28"]]</code>; the Heidenhain
bundle instead walks <code>["Parsing", "CC"]</code> for the klartext
circle-center record
(<a class="xref" href="Hi.NcParsers.Syntaxs.HeidenhainSyntaxUtil.html#Hi_NcParsers_Syntaxs_HeidenhainSyntaxUtil_CcAwareIncrementalResolveSyntax">CcAwareIncrementalResolveSyntax</a>).
All matching paths are converted against the same last program
position — a nested record's words are distances from where the
tool stands, exactly like the root's.
</p>
<p>
Canned cycle paths (Parsing.G81, G82, G83, …) are intentionally
excluded — their Z/R incremental semantics differ from normal axes
(R is relative to init level, Z is relative to R-point).
Resolution is handled by
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">ResolveCycleCoordinates(JsonObject, Vec3d, double?, double?, double, double, HashSet&lt;string&gt;)</a>
inside each cycle syntax class, which runs before this syntax.
</p>
<p>
Uses <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html#Hi_NcParsers_Dependencys_IMachineAxisConfig_AxisNames">AxisNames</a> to determine
which tags are motion axes. Traces backward nodes for last known
<a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> to resolve incremental values.
After this syntax, all axis values in the working paths are absolute —
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> can consume them without
incremental logic.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoCoordinateOffsetSyntax.html">IsoCoordinateOffsetSyntax</a></dt>
<dd><p>ISO/Fanuc/Mazak/Okuma/Syntec: resolves the G54–G59.9 work coordinate
offset and the Fanuc-family additional work coordinate systems
(<code>G54.1 Pn</code>, also spelled <code>G54 Pn</code>).
Reads G54/G55/.../G59.9 from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a> and the
captured <code>Parsing.G54.1 = {P: n}</code> object (written by
<a class="xref" href="Hi.NcParsers.Syntaxs.FanucSyntaxUtil.html#Hi_NcParsers_Syntaxs_FanucSyntaxUtil_G54p1Syntax">G54p1Syntax</a> for both spellings),
which resolves to the coordinate id <code>&quot;G54.1P{n}&quot;</code> that the brand
parameter tables map to <code>#7001+</code>
(<a class="xref" href="Hi.NcParsers.Dependencys.IsoCoordinateAddressMap.html">IsoCoordinateAddressMap</a>). Looks the offset Vec3d up via
the <a class="xref" href="Hi.NcParsers.Dependencys.IIsoCoordinateConfig.html">IIsoCoordinateConfig</a> dependencies (brand parameter
table or <a class="xref" href="Hi.NcParsers.Dependencys.Generic.IsoCoordinateTable.html">IsoCoordinateTable</a>) and composes it into
<a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a>.
Modal — the active coordinate persists via backward lookback.
Default coordinate ID is set by <a class="xref" href="Hi.NcParsers.Initializers.StaticInitializer.html">StaticInitializer</a>.</p>
<p>
A block that selects a work coordinate system nobody has configured is
reported on that block (never on the modal re-query of the following
blocks): <code>Coord-WorkOffset--AdditionalZero</code> when an additional
system (<code>G54.1 Pn</code>) resolves to no entry or to (0, 0, 0) — the
brand tables seed every P row with zero, hardware-faithfully, so a zero
there is the "never entered" state, whereas a zero row of the standard
series (G54–G59 and the G59.1–G59.9 extension alike) is a legitimate
authoring convention and stays silent;
<code>Coord-WorkOffset--NoTableEntry</code> when no provider resolves the id
at all (e.g. a <code>G59.x</code> on a runner carrying no brand-neutral table
beside its brand table); and
<code>Coord-WorkOffset--IndexUnresolved</code> when the P word is not a
positive integer (vacant variable, non-integer), in which case the
active system is kept. A bare <code>G54.1</code> without P is not this
syntax's business: the parameterized capture consumes nothing without
a parameter, the dotted number lands in <code>Parsing.Flags</code> where it
is not a G54-series member, so the active system is kept and the
unconsumed check reports the flag.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68RotationSyntax.html">IsoG68RotationSyntax</a></dt>
<dd><p>ISO/Fanuc: resolves G68 (2D coordinate rotation) and G69 (cancel).
Computes a rotation <a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a> around the active plane normal
and composes it into <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a>.</p>
<p>
No <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a> dependency needed —
G68 is pure geometric rotation.
</p>
<p>
Managed commands: G68, G69 (idempotent with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a>).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a></dt>
<dd><p>ISO/Fanuc: resolves G68.2 (tilted work plane) and G69 (cancel).
Computes a tilt <a class="xref" href="Hi.Geom.Mat4d.html">Mat4d</a> from I/J/K euler angles
(Fanuc ZXZ convention) and composes it into
<a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a>.</p>
<p>
Managed commands: G68.2, G69 (idempotent with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68RotationSyntax.html">IsoG68RotationSyntax</a>).
Siemens equivalent: CYCLE800 (separate syntax).
Heidenhain equivalent: PLANE SPATIAL (separate syntax).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoLocalCoordinateOffsetSyntax.html">IsoLocalCoordinateOffsetSyntax</a></dt>
<dd><p>ISO G52: Local coordinate system offset (additive to G54-series).</p>
<p>
<code>G52 X10 Y20 Z5</code> → sets local offset.
<code>G52 X0 Y0 Z0</code> → cancels (resets to zero).
M30 (program end) → also cancels.
</p>
Reads <code>Parsing.G52</code> (from <a class="xref" href="Hi.NcParsers.Syntaxs.GenericSyntaxKit.html#Hi_NcParsers_Syntaxs_GenericSyntaxKit_G52Syntax">G52Syntax</a>),
writes <a class="xref" href="Hi.NcParsers.Keywords.IsoLocalCoordinateOffset.html">IsoLocalCoordinateOffset</a> section,
and adds an <code>"IsoLocalCoordinateOffset"</code> entry to the transformation chain.
Modal — persists via backward lookback until changed or cancelled.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a></dt>
<dd><p>Writes <a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_McLinear">McLinear</a> motion for linear commands
(ISO G00/G01, Heidenhain L/LN). Detects motion mode from
<a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a>, writes a one-shot
<a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a> section (form + isRapid) plus a modal
<a class="xref" href="Hi.NcParsers.Keywords.MotionState.html">MotionState</a> section (Term) when
<a class="xref" href="Hi.NcParsers.Keywords.MachineCoordinateState.html">MachineCoordinateState</a> exists on the block.</p>
<p>
<a class="xref" href="Hi.NcParsers.Semantics.McLinearMotionSemantic.html">McLinearMotionSemantic</a> discriminates between
XYZ-only and XYZABC motion by checking whether rotary axis values
are present in <a class="xref" href="Hi.NcParsers.Keywords.MachineCoordinateState.html">MachineCoordinateState</a>.
</p>
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> in the syntax chain.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.MCodeExpansionSyntax.html">MCodeExpansionSyntax</a></dt>
<dd><p>Expands machine-declared M-codes (<a class="xref" href="Hi.NcParsers.Dependencys.IMCodeDeclarationConfig.html">IMCodeDeclarationConfig</a>
on the controller parameter table) into the canonical ISO flags the
regular consumers already understand: tool change → <code>M06</code>, spindle
direction → <code>M03</code>/<code>M04</code>/<code>M05</code>, coolant →
<code>M07</code>/<code>M08</code>/<code>M09</code>. Must run ahead of
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.SpindleSpeedSyntax.html">SpindleSpeedSyntax</a>, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CoolantSyntax.html">CoolantSyntax</a>, and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html">ToolChangeSyntax</a> — expanding early is what lets one
composite OEM code (e.g. <code>M13</code> = spindle CW + flood coolant) feed
several downstream consumers without any of them fighting over who
removes the original flag. Same rewrite-into-shared-vocabulary pattern
as <a class="xref" href="Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainRadiusCompSyntax.html">HeidenhainRadiusCompSyntax</a> (RL/RR/R0 →
G41/G42/G40).</p>
<p>
Two deliberate boundaries keep the rewrite faithful. Declarations whose
sole content is a spindle direction
(<a class="xref" href="Hi.NcParsers.Dependencys.MCodeEffects.html#Hi_NcParsers_Dependencys_MCodeEffects_IsSpindleDirectionOnly">IsSpindleDirectionOnly</a>) are NOT expanded —
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.SpindleSpeedSyntax.html">SpindleSpeedSyntax</a> resolves them in place via
<a class="xref" href="Hi.NcParsers.Dependencys.ISpindleControlConfig.html#Hi_NcParsers_Dependencys_ISpindleControlConfig_TryResolveDirection_System_String_Hi_Numerical_SpindleDirection__">TryResolveDirection(string, out SpindleDirection)</a>, which keeps
legacy <code>&lt;SpindleMCode&gt;</code> configs bit-identical and avoids the
expansion product being re-translated by that same custom-first map
(e.g. a mirrored M03↔M04 remap would otherwise flip direction).
Expansion codes are inserted at the declared flag's own position, and a
code whose raw twin also appears un-declared elsewhere in the block is
not emitted — the block's textual order keeps deciding last-wins
conflicts exactly as it did before.
</p>
<p>
Declared-but-unmodeled behavior stays loud: a declaration carrying an
<a class="xref" href="Hi.NcParsers.Dependencys.MCodeEffects.html#Hi_NcParsers_Dependencys_MCodeEffects_UnmodeledNote">UnmodeledNote</a> emits one
<code>DeclaredMCode--UnmodeledEffects</code> informational diagnostic per
occurrence — a declaration replaces the raw <code>Parsing--Unconsumed</code>
warning with an explanation, never with silence. A declaration with no
effects and no note consumes its code silently by explicit intent.
Undeclared codes are untouched and keep falling through to
<a class="xref" href="Hi.NcParsers.InspectionSyntaxs.UnconsumedCheckSyntax.html">UnconsumedCheckSyntax</a>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a></dt>
<dd><p>Handles machine coordinate selection — non-modal, one-shot.
The axis values (X/Y/Z) in the block are interpreted as machine
coordinates, bypassing all work offsets, local coordinates,
tool height compensation, and coordinate rotations.
If G91 (incremental) is active, the code is ignored per ISO standard.
A per-word incremental stamp on the block (block-root
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> entry <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a>
— Siemens <code>SUPA Y=IC(-10)</code>, klartext <code>L IY-10 M91</code>) is a
distance in the <b>machine</b> frame: the word is added to the
previous machine position of that axis.</p>
<p>
Defaults to ISO <code>G53</code>. Brands with additional one-shot
machine-coordinate codes widen <a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html#Hi_NcParsers_LogicSyntaxs_MachineCoordSelectSyntax_SupportedCodes">SupportedCodes</a> — the
Siemens preset adds <code>G153</code> and <code>SUPA</code> (both suppress every
active frame for one block; in this pipeline all of those reduce to
"bypass the composed <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a>",
which the ProgramXyz back-derivation below already models). The
matched code is stamped verbatim into
<a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html#Hi_NcParsers_Keywords_IMotionEventDef_Term">Term</a> for bidirectional source recovery.
Rotary words on the same block (e.g. <code>SUPA G0 B0</code>,
<code>G53 A0 C0</code>) are consumed by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> ahead of
this syntax — machine and program rotary coincide while no rotary
offsets are modeled — and the block is still a machine-coordinate
positioning: the linear axes <b>hold their machine position</b>
when no X/Y/Z word is given, and the motion is always
<a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_McLinear">McLinear</a>. A machine-coordinate block never
takes the RTCP tool-center-point linkage: on a real controller G53
applies no compensation, so a rotary swing commanded through it
turns the axis in place instead of dragging X/Y/Z to pin the tool
tip (the tip's post-swing program coordinate is what the
back-derivation reports).
</p>
<p>
Must be placed <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a>
and <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> in the syntax chain. When a
supported code is active, this syntax consumes X/Y/Z from
<a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a> and writes
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> directly,
preventing <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> from processing them as
program coordinates — and, ahead of the resolve, reading a per-word
incremental word raw instead of re-based into the program frame.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a></dt>
<dd><p>Resolve modular rotary axes to the shortest cyclic path relative to the previous node.
Uses <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html#Hi_NcParsers_Dependencys_IMachineAxisConfig_IsModularRotary_System_String_">IsModularRotary(string)</a> to determine which axes
within <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> need cyclic resolution.
Falls back to hardcoded A/B/C if no <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html">IMachineAxisConfig</a> is available.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> in <a class="xref" href="Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_NcSyntaxList">NcSyntaxList</a>.</p>
<p>
Two stages, mirroring <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a>:
<ol><li>Root <code>MachineCoordinateState</code> — anchored at the previous
block's modal rotary state.</li><li><a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a>.<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html#Hi_NcParsers_Keywords_CompoundMotion_ItemsKey">ItemsKey</a>[*]
— sequential walk through items, anchoring item 0 at the previous
block's modal state and item <code>i &gt; 0</code> at item <code>i-1</code>'s
post-cycle value (per-axis chain). Items without a rotary
<code>MachineCoordinateState</code> are skipped.</li></ol>
The items pass enables rotary motion (e.g. G28 ABC intermediate /
home stages) to surface as motion <a class="xref" href="Hi.Numerical.Acts.IAct.html">IAct</a>
segments rather than a single root-MC stamp.
<p>
Per-word directional override: a block-root
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> entry (stamped by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensAcIcSyntax.html">SiemensAcIcSyntax</a>) valued
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a> (Siemens <code>ACP()</code>) or
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a> (<code>ACN()</code>) swaps that
axis's window for this block only: [anchor, anchor+360°) /
(anchor-360°, anchor] instead of the default ±180° — the approach
direction is forced even when it is the longer way around. A target
congruent with the anchor (within an ULP-scale epsilon) keeps the
anchor value verbatim — no move, never a spurious full turn, and no
deg→rad→deg drift. <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Shortest">Shortest</a> (<code>DC()</code>)
is the default window and needs no special path here. The override
is read from the current block only (it is one-shot, never carried —
deliberately unlike the modal <code>RotaryWrap</code> gate's one-step
previous fallback) and applies to the root MC stage, not to
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a> items in general (G28/G74/G75 expansions
capture their words in sub-objects the stamping syntax never sees, so
an override can only ever describe a root word) — with one exception:
an item whose value for an axis equals the root's pre-pass value
verbatim carries that same root word (the canned-cycle
pre-positioning item that
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a> stamps
from the root MC) and inherits the root's directive for that axis, so
the default window cannot fold the forced swing the root resolved
into the short way. Directional/shortest
entries keyed by an axis outside the modular set are reported as
<code>Coord-McAbc--003</code> — the promise cannot be honored there and
silence would mis-read the program's intent; an entry with no anchor
to resolve against (first rotary value in the stream) is reported as
<code>Coord-McAbc--004</code> and adopted unwrapped, matching the default
path.
</p>
<p>
Per-word incremental override: an <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a>
entry (Siemens <code>IC()</code>, klartext <code>IC+270</code>) is a signed
traverse by definition — <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> already wrote
anchor + delta — so this pass keeps that value verbatim for the
axis instead of folding it into the ±180° window (a +270° chain
dimension must not become a -90° swing). Incremental entries on
non-modular axes need no warning: the literal value is what the
axis would do anyway.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a></dt>
<dd><p>Writes rotary axis values (A/B/C) into
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> from
<a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a> and modal lookback.</p>
<p>
Only active when <a class="xref" href="Hi.NcParsers.Dependencys.IMachineAxisConfig.html">IMachineAxisConfig</a> declares rotary axes.
Works for both 3+2-axis (no <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a>)
and simultaneous 5-axis configurations.
</p>
<p>
This syntax is intentionally ABC-only. When the block is rotary-only
(no <code>ProgramXyz</code>, e.g. <code>G00 A30.</code>) the section is created
with ABC but <b>without</b> X/Y/Z. <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcXyzFallbackSyntax.html">McAbcXyzFallbackSyntax</a>
— placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> — copies X/Y/Z from the
previous block's <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>
to finish the section. Splitting the XYZ fill out lets this syntax
run <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> (and before
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>) without accidentally filling X/Y/Z
from prev and thereby short-circuiting
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">DeriveMcXyz(JsonObject, Mat4d)</a>.
</p>
<p>
Missing rotary axes are filled from previous
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> lookback,
unless the current section already has the value
(e.g., from <a class="xref" href="Hi.NcParsers.Initializers.HomeMcInitializer.html">HomeMcInitializer</a>).
Values are stored in degrees (matching <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>).
</p>
<p>
Per-word override: a block-root
<a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> section (written by
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensAcIcSyntax.html">SiemensAcIcSyntax</a> for the
Siemens <code>AC()</code>/<code>IC()</code> coordinate functions, and by the
Heidenhain L / C parsers for the klartext <code>IA+</code>/<code>IB+</code>/<code>IC+</code>
words) marks a rotary
word <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Incremental">Incremental</a>: the parsed value is then
added to the previous modal value of that axis (previous
<code>MachineCoordinateState</code> lookback, falling back to a value
already present in the current section, then 0) instead of being
written as an absolute angle. The accumulated raw degrees stay
monotonic across iterations: the <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>
tail-pass keeps an Incremental-stamped axis literal (a chain
dimension is a signed traverse, never re-shortened), so even a
+270° step survives as net rotation. An
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Absolute">Absolute</a> entry (from <code>AC()</code>) matches
the default write and needs no special path — and so, deliberately,
do the rotary-family entries <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Shortest">Shortest</a>
(<code>DC()</code>) / <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a>
(<code>ACP()</code>) / <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a>
(<code>ACN()</code>): this syntax writes the raw absolute target and the
shortest/directional swing is resolved by the
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> tail-pass, which owns the wrap
math. Brands that never write the section keep the exact legacy
behavior.
</p>
<p>
Coded-position overrides (Siemens
<code>CAC()</code>/<code>CIC()</code>/<code>CDC()</code>/<code>CACP()</code>/<code>CACN()</code>)
carry an indexing position <b>number</b> instead of an angle: the
number is resolved through <a class="xref" href="Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a> via
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CodedPositionUtil.html#Hi_NcParsers_LogicSyntaxs_CodedPositionUtil_TryResolveCodedTarget_Hi_NcParsers_Dependencys_IIndexingPositionConfig_System_String_System_String_System_Double_System_Double_Hi_NcParsers_ISentenceCarrier_Hi_NcParsers_NcDiagnosticProgress_System_Double__System_String__">TryResolveCodedTarget(IIndexingPositionConfig, string, string, double, double, ISentenceCarrier, NcDiagnosticProgress, out double, out string)</a> and the override
entry is rewritten to the plain vocabulary
(<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Absolute">Absolute</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_Shortest">Shortest</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_PositiveOnly">PositiveOnly</a> /
<a class="xref" href="Hi.NcParsers.Keywords.Positioning.html#Hi_NcParsers_Keywords_Positioning_NegativeOnly">NegativeOnly</a> — a cyclic <code>CIC</code> keeps
its programmed direction through the directional values) before the
tail-pass runs, so the tail-pass never sees a coded value. A failed
resolve (invalid number, missing table) reports an error and holds
the axis at its previous value.
</p>
<p>
Every rotary word the block actually carried is also recorded, as
programmed, in the one-shot block-root <a class="xref" href="Hi.NcParsers.Keywords.RotaryWords.html">RotaryWords</a>
section (<code>{ "C": 40 }</code>) — the resolved angle goes into
<code>MachineCoordinateState</code>, which after the modal carry can no
longer tell "commanded" from "carried". Downstream consumers that need
that distinction (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> repeating an
active canned cycle on a rotary-only block,
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">WriteCompoundMotion(JsonObject, string, JsonArray, Vec3d)</a> riding the
block's ABC on the cycle's pre-positioning item) read the record; the
section is never modal-carried.
</p>
<p>
Must be placed <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> so syntaxes
that need the current-block ABC to compute transforms
(e.g. <a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>) can see it; and <b>before</b>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> and <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcXyzFallbackSyntax.html">McAbcXyzFallbackSyntax</a></dt>
<dd><p>Fills missing <code>X/Y/Z</code> on an ABC-only
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> section.
Behaviour depends on whether the block is under RTCP with rotary
motion, as indicated by
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_HasDynamicEntry_System_Text_Json_Nodes_JsonObject_">HasDynamicEntry(JsonObject)</a>:</p>
<ul><li>
<b>Non-dynamic</b> (no RTCP or RTCP with ABC stable) — the
programmed tool tip stays put in MC while rotary axes (if any) are
unchanged, so we simply copy X/Y/Z from the previous block's
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>. This matches
NC modal XYZ carry-forward for rotary-only blocks such as
<code>G00 A30.</code> (non-RTCP pivoting).
</li><li>
<b>Dynamic</b> (RTCP active + ABC changing) — the programmed tool tip
must stay fixed in <i>program</i> coordinates while MC XYZ shifts to
compensate the new rotary state. Looks up the last
<a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> and re-derives
<code>MC = inheritedProgramXyz × composedTransform</code>, where the
composed transform is the block's endpoint chain (now including
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_PivotTransformSource">PivotTransformSource</a> as a full
rotation+translation Mat4d, so the chain already encodes the
kinematic IK). The carried <code>ProgramXyz</code> is also stamped onto
the current block so downstream consumers see a consistent
ProgramXyz + MC pair.
</li></ul>
<p>
Pair with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>, which runs early to write ABC
but deliberately leaves X/Y/Z empty so <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> can
still derive MC XYZ from <code>ProgramXyz</code> via the transform chain
when the block carries linear motion. If <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a>
has nothing to derive (no <code>ProgramXyz</code>), this syntax completes
the MC section as described above.
</p>
<p>
Does nothing when the section already carries all three of X/Y/Z
(normal linear-motion blocks), or when there is no section at all
(pure parse-only block that introduces no MC). Must be placed
<b>after</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> and <b>before</b>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> / <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a></dt>
<dd><p>Derives <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> from
<a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> by applying the composed
<a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a>.</p>
<p>
Processes two stages:
<ol><li>Root <code>ProgramXyz</code> → root <code>MachineCoordinate</code></li><li><a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a>.<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html#Hi_NcParsers_Keywords_CompoundMotion_ItemsKey">ItemsKey</a>[*]
— derives <code>MachineCoordinate</code> from <code>ProgramXyz</code> for items
that have <code>ProgramXyz</code> but no <code>MachineCoordinate</code></li></ol>
Must be placed after syntaxes that write <code>ProgramXyz</code>
(e.g., <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html">ReferenceReturnSyntax</a>)
and before syntaxes that read <code>MachineCoordinate</code>
(e.g., <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a>).
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.OrientationVectorResolveSyntax.html">OrientationVectorResolveSyntax</a></dt>
<dd><p>Shared vector-orientation resolve — the brand-independent half of
tool-axis-vector 5-axis programming (Heidenhain LN <code>TX/TY/TZ</code>;
the Fanuc/Syntec/Mazak <code>G43.5 I/J/K</code> and Siemens
<code>A3=/B3=/C3=</code> slots when their adapters land). Consumes the
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.OrientationVectorResolveSyntax.html#Hi_NcParsers_LogicSyntaxs_OrientationVectorResolveSyntax_ToolOrientationKey">ToolOrientationKey</a> section a brand adapter wrote —
<code>{ &ldquo;Vector&rdquo;: {X,Y,Z}, &ldquo;Term&rdquo;: &ldquo;&lt;brand word&gt;&rdquo; }</code>, unit
vector in program coordinates — and resolves it into rotary-axis
degrees on <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>
via <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html#Hi_Numerical_Xyzabc_IMachineKinematics_OrientationToMcAbc_Hi_Geom_Vec3d_Hi_Geom_Vec3d__">OrientationToMcAbc(Vec3d, out Vec3d)</a>
(axial-only: rotation about the tool axis is free). Everything
downstream is the existing RTCP pipeline untouched: the brand RTCP
syntax sees the endpoint ABC, marks the tool-height entry
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindDynamic">KindDynamic</a> on a rotary change, and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> routes the block to
<a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_ClLinear">ClLinear</a> per-step IK.</p>
<p>
Branch continuity is seeded explicitly: before solving, the chain is
set to the previous block's rotary state
(<a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html#Hi_Numerical_Xyzabc_IMachineKinematics_McAbcToMat_Hi_Geom_Vec3d_">McAbcToMat(Vec3d)</a> on the per-axis MC
lookback) so the solver follows the current solution branch
deterministically — the implicit chain state cannot be trusted under
lazy or out-of-order rebuilds — and the solved angles are unwrapped
to the nearest ±360° window of that anchor.
</p>
<p>
Must run <b>after</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> (explicit rotary
words and lookback land first; a vector on the same block overrides
them) and <b>before</b> the brand RTCP syntax and
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> (the section is created rotary-only, so
the XYZ derivation still runs — the <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>
rotary-only discipline). Registered per brand list by the brand that
has a vector adapter.
</p>
<p>
Degradation is diagnosed, never silent: no
<a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a> → <code>Orientation-Vector--NoKinematics</code>;
no rotary axes → <code>Orientation-Vector--NoRotaryAxes</code>; solver
failure → <code>Orientation-Vector--IkFailed</code>. In every case the
XYZ motion proceeds and the posture holds at its previous value
(deliberately unlike the CLSF path, which drops the motion on IK
failure — divergence recorded on the plan card). The section itself
stays on the block as the semantic record.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PeckDrillingCycleSyntax.html">PeckDrillingCycleSyntax</a></dt>
<dd><p>G83 peck drilling cycle. Supports modal repetition.
Drills in increments of depth Q, fully retracting to R between strokes.</p>
<p>
Cycle sequence (per stroke):
<ol><li>Rapid to init position (target XY, previous Z)</li><li>Rapid from init to R-point</li><li>For each stroke: rapid to clearance above previous depth,
feed Q deeper, rapid back to R</li><li>If remainder exists: feed to bottom Z, rapid to R</li><li>Rapid from R/bottom to final (G98 → init Z, G99 → R)</li></ol>
<p>
Retraction distance is read from <a class="xref" href="Hi.NcParsers.Dependencys.ICannedCycleConfig.html">ICannedCycleConfig</a>
(Fanuc #4002 / Syntec Pr4002, or <a class="xref" href="Hi.NcParsers.Dependencys.Generic.FallbackConfig.html">FallbackConfig</a>
fallback).
</p>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> (modal repetition,
G91 conversion, missing-axis fallback) before this syntax runs.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> and before
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in the syntax chain.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a></dt>
<dd><p>Shared engine for the brand pivot-gate syntaxes
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a> — ISO/Fanuc family,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPivotTransformationSyntax.html">SiemensPivotTransformationSyntax</a> — Siemens).
Each brand syntax owns only its gate (which modal terms mean
&ldquo;commanded XYZ needs the Pn→MC kinematic rigid transform&rdquo;); the
endpoint-ABC resolution and the <code>PivotTransform</code> chain entry
composition live here so every brand writes the identical JSON
vocabulary.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a></dt>
<dd><p>ISO/Fanuc-family pivot gate: writes the
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_PivotTransformSource">PivotTransformSource</a> entry
into <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> on blocks
where the controller is interpreting commanded XYZ in a frame that
needs the Pn→MC kinematic rigid transform — namely active RTCP
(G43.4) or active tilted plane (G68/G68.2). On plain-mode blocks
(no RTCP, no tilted plane), the controller treats commanded XYZ as
machine-frame directly, so the indexed rotary angle is a positioning
value only and must <b>not</b> fold into the linear axes; this
syntax skips those blocks and leaves the chain at identity (or
whatever non-kinematic offsets earlier syntaxes contributed).
Brand variants with their own modal vocabulary gate the same shared
engine (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a>): Siemens TRAORI/CYCLE800 →
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPivotTransformationSyntax.html">SiemensPivotTransformationSyntax</a>; Heidenhain
M128/PLANE SPATIAL would follow the same pattern.</p>
<p>
Mirrors real Fanuc semantics: plain G43 offsets along the active
tilted-plane normal (or machine Z when no tilt is active), and
plain XYZ moves map directly to machine axis registers regardless
of indexed table/head rotary position. Only G43.4 follows the live
tool vector and only G68.2 redefines the work-plane orientation —
both of which this guard detects via the existing chain markers.
</p>
<p>
Chain position: must run <b>after</b> all Pn-frame writers
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a>, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolHeightOffsetSyntax.html">ToolHeightOffsetSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoCoordinateOffsetSyntax.html">IsoCoordinateOffsetSyntax</a>,
brand-specific coord offset syntaxes) so the guard sees the
finalised mode markers and the <code>PivotTransform</code> entry — when
emitted — naturally lands as the <b>last</b> chain element. Must
run <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> /
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> so they see the completed chain.
</p>
<p>
Silently no-ops when <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a> is absent
(3-axis configurations without rotary kinematics).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PlaneSelectSyntax.html">PlaneSelectSyntax</a></dt>
<dd><p>Consumes G17/G18/G19 plane selection from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a>
and writes <a class="xref" href="Hi.NcParsers.Keywords.IPlaneSelectDef.html">IPlaneSelectDef</a> section using conventional
axis-pair names (XY/ZX/YZ).
Modal — persists via backward lookback. Default is XY (G17).</p>
<p>
Downstream consumers (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.CircularMotionSyntax.html">CircularMotionSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68RotationSyntax.html">IsoG68RotationSyntax</a>) call
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PlaneSelectSyntax.html#Hi_NcParsers_LogicSyntaxs_PlaneSelectSyntax_GetPlaneNormalDir_System_Text_Json_Nodes_JsonObject_">GetPlaneNormalDir(JsonObject)</a> to read the resolved plane.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PolarGCodeCheckSyntax.html">PolarGCodeCheckSyntax</a></dt>
<dd><p>Warns on G-codes that Fanuc disallows during Polar Coordinate
Interpolation (G12.1), per the manual whitelist mirrored from HardNc
<code>IsGCodePolarModeCompatible</code>
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PolarInterpolationSyntax.html#Hi_NcParsers_LogicSyntaxs_PolarInterpolationSyntax_IncompatibleDiagId">IncompatibleDiagId</a>).</p>
<p>
Placed FIRST in the Logic bundle so the scan sees
<a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a> Flags before the mode/plane/offset
syntaxes consume their codes — at the old in-place check position,
G17/G18/G19, G20/G21, G49, G53.1 and G68/G69 cancels had already been
eaten and passed silently. Polar-active detection needs no valve of its
own: the PREVIOUS block's
<a class="xref" href="Hi.NcParsers.Keywords.IPolarInterpolationDef.html#Hi_NcParsers_Keywords_IPolarInterpolationDef_PolarInterpolationState">PolarInterpolationState</a> is already
final (the whole Logic bundle ran for it) unless this block exits with
G13.1; a block entering with G12.1 is checked too.
</p>
<p>
Residual blind spot (documented): codes captured as Parsing sub-objects
by <code>ParameterizedFlagSyntax</code> in the Parsing bundle (G28, G43/G44,
G43.4, G05.1, G52, G54.1, G68/G68.2, canned cycles) never reach Flags
and stay outside the scan. They cannot corrupt the polar trajectory —
the plane normal is fixed by the polar pair — so the gap is
diagnostic-only, same as HardNc's own per-code parse-time check.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PolarInterpolationSyntax.html">PolarInterpolationSyntax</a></dt>
<dd><p>Maintains the modal Polar Coordinate Interpolation valve section
(<a class="xref" href="Hi.NcParsers.Keywords.IPolarInterpolationDef.html#Hi_NcParsers_Keywords_IPolarInterpolationDef_PolarInterpolationState">PolarInterpolationState</a>) for Fanuc
G12.1/G13.1.</p>
<p>
On a G12.1 block: consumes the flag, reads the block's own X/C words as
the anchor (<a class="xref" href="Hi.NcParsers.Keywords.PolarInterpolation.html#Hi_NcParsers_Keywords_PolarInterpolation_InitRxcz">InitRxcz</a>; the X word is a
diameter and is halved), converts the previous program position
(program X/Z + machine C angle) onto the polar hypothetical plane via
<a class="xref" href="Hi.Numerical.MechNcUtil.html#Hi_Numerical_MechNcUtil_GetProgramPolarRxczByOrdinaryProgramXcz_Hi_Geom_Vec3d_">GetProgramPolarRxczByOrdinaryProgramXcz(Vec3d)</a>, and
writes both the state section and the entry
<a class="xref" href="Hi.NcParsers.Keywords.IPolarInterpolationDef.html#Hi_NcParsers_Keywords_IPolarInterpolationDef_ProgramPolarRxcz">ProgramPolarRxcz</a> position.
Mirrors HardNc <code>HardNcLine</code> case <code>12_100</code>.
</p>
<p>
On a G13.1 block: consumes the flag and stops carrying the state — the
block itself is already Cartesian, matching HardNc case <code>13_100</code>.
</p>
<p>
On other blocks: re-materializes the previous block's state section
(single-step lookback carry, the <a class="xref" href="Hi.NcParsers.LogicSyntaxs.PositioningSyntax.html">PositioningSyntax</a> pattern),
and warns <code>FanucPolar--IncompatibleGCode</code> for G-codes outside the
Fanuc polar-mode whitelist (mirrors HardNc
<code>IsGCodePolarModeCompatible</code>).
</p>
Must be placed <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> so the downstream
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramRxczSyntax.html">ProgramRxczSyntax</a> can consume the hypothetical C word before
it is interpreted as a rotary machine axis.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.PositioningSyntax.html">PositioningSyntax</a></dt>
<dd><p>Detects G90/G91 positioning mode from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a>
(or by modal lookback) and writes a <a class="xref" href="Hi.NcParsers.Keywords.Positioning.html">Positioning</a> section
(<a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html#Hi_NcParsers_Keywords_IPositioningDef_Term">Term</a>, <a class="xref" href="Hi.NcParsers.Keywords.IPositioningDef.html#Hi_NcParsers_Keywords_IPositioningDef_Mode">Mode</a>)
to the block JSON.</p>
<p>
Fanuc/ISO: reads G90/G91 from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a> (global modal).
Heidenhain: klartext has no modal word — the modal state stays at the
G90 default and the I-prefixed words (<code>IX+20</code>) ride on the same
per-word override as Siemens, stamped by the L / C / CC / CYCL CALL
POS parsers (see
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Heidenhain.HeidenhainIncrementalAxisWordUtil.html">HeidenhainIncrementalAxisWordUtil</a>);
the DIN/ISO dialect on that brand uses G90/G91 like Fanuc.
Siemens: the AC()/IC() per-word override rides on top of this modal
state — <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensAcIcSyntax.html">SiemensAcIcSyntax</a>
writes a <a class="xref" href="Hi.NcParsers.Keywords.PositioningOverride.html">PositioningOverride</a> section the
downstream consumers (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>) honor per axis.
</p>
<p>
Does NOT convert incremental values — that is handled by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> which can be placed later
in the syntax chain, after canned cycle syntaxes have consumed
their parameters with cycle-specific G91 semantics.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndCleanSyntax.html">ProgramEndCleanSyntax</a></dt>
<dd><p>Clears the per-block <code>Vars.Volatile</code> dictionary on blocks that
triggered program end (M02 / M30, identified by the
<a class="xref" href="Hi.NcParsers.Keywords.ProgramEnd.html">ProgramEnd</a> section written by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndSyntax.html">ProgramEndSyntax</a>).</p>
<p>
Real Fanuc clears non-retained common variables (#100-#499) on program
end + reset; this syntax models that behaviour at the simulator level.
The clear happens on the same block that carried M02/M30 — the next
block's <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VolatileVariableReadingSyntax.html">VolatileVariableReadingSyntax</a> carry then sees an
empty dictionary on the predecessor and starts fresh.
</p>
<p>
Pipeline placement: must run after both <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndSyntax.html">ProgramEndSyntax</a>
(which writes the <a class="xref" href="Hi.NcParsers.Keywords.ProgramEnd.html">ProgramEnd</a> section this syntax checks)
and <a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.VolatileVariableReadingSyntax.html">VolatileVariableReadingSyntax</a> (so the carry has
already happened on this block; this syntax overwrites the result).
</p>
<p>
Retained common variables (<code>#500-#999</code>, owned by
<a class="xref" href="Hi.NcParsers.Dependencys.Fanuc.RetainedCommonVariableTable.html">RetainedCommonVariableTable</a>) are
untouched — they survive program end on real hardware (NV-RAM).
Local variables (<code>#1-#33</code>, scope: macro call frame) are also
untouched here; their lifecycle belongs to G65/G66/M99 push/pop, not
program end.
</p>
<p>
Also clears any active <a class="xref" href="Hi.NcParsers.Keywords.FanucModalMacro.html">FanucModalMacro</a> on the same
edge: a G66 modal that was still active when M02/M30 hit is
implicitly cancelled, matching real Fanuc reset behaviour. The
section is overwritten with a <code>G67</code>-shaped cancel marker so
the carry mechanism in
<a class="xref" href="Hi.NcParsers.EvaluationSyntaxs.Fanuc.FanucModalMacroSyntax.html">FanucModalMacroSyntax</a> sees the boundary
and does not propagate the modal past the program-end edge.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndSyntax.html">ProgramEndSyntax</a></dt>
<dd><p>Consumes M02/M30 (program end) from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a>
and writes <a class="xref" href="Hi.NcParsers.Keywords.IProgramEndDef.html">IProgramEndDef</a> section.</p>
<p>
Downstream syntaxes that need to reset modal state on program end
(e.g. <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoLocalCoordinateOffsetSyntax.html">IsoLocalCoordinateOffsetSyntax</a> for G52 reset)
should read the <a class="xref" href="Hi.NcParsers.Keywords.ProgramEnd.html">ProgramEnd</a> section rather than
scanning for M30 in Flags directly.
</p>
<p>
<b>The program-end edge.</b> On a real controller M02/M30 ends the
program and enters the reset state: the modal G codes return to their
power-on defaults — tool length compensation is cancelled (G49, which
also ends tool-center-point control: Fanuc TCP is cancelled by G49 or
reset), the tilted work plane and coordinate rotation are cancelled
(G69), cutter radius compensation is cancelled (G40), the canned cycle
is cancelled (G80). A simulator that plays a file with several
programs chained by M02 must keep playing, so the reset is modelled as
an <i>edge</i> between the program-end block and its successor: the
program-end block itself keeps the modal state it executed under (its
own motion — <code>G0 Z100. M30</code> — still sees the compensation), and
the successor starts from the reset defaults. Each modal owner tests
the edge with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndSyntax.html#Hi_NcParsers_LogicSyntaxs_ProgramEndSyntax_IsResetEdge_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__">IsResetEdge(LazyLinkedListNode&lt;SyntaxPiece&gt;)</a> in its single-step
<code>node.Previous</code> lookback and writes its cancel state on the
successor instead of carrying: <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolHeightOffsetSyntax.html">ToolHeightOffsetSyntax</a>
(G43/G44 → G49), <a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a> (G43.4 → G49),
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensTraoriSyntax.html">SiemensTraoriSyntax</a> (TRAORI → TRAFOOF, the
D compensation itself stays — Siemens retains the active tool on
reset), <a class="xref" href="Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainRtcpSyntax.html">HeidenhainRtcpSyntax</a> (M128 / TCPM
→ off, TOOL CALL compensation stays), <a class="xref" href="Hi.NcParsers.LogicSyntaxs.TiltTransformUtil.html">TiltTransformUtil</a>
(every tilt / rotation / frame term → G69),
<a class="xref" href="Hi.NcParsers.PostLogicSyntaxs.RadiusCompensationSyntax.html">RadiusCompensationSyntax</a> (G41/G42 →
G40, the modal D is kept) and <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a>
(→ G80). Deliberately not reset: G00/G01, G90/G91, G17–G19, G94/G95,
the work offset (G54–G59) and the path-smoothing mode — their reset
defaults are controller-parameter dependent and they do not enter the
program→machine transform chain; G20/G21 is retained by the controller
itself. G52 keeps its existing behaviour of clearing on the
program-end block (HardNc parity). A block right after the edge that
has no words at all (a comment line) is still the edge — every owner
handles it before any "no Parsing" early return, or the modal carry
would clone the active section across it.
</p>
Must be placed before syntaxes that depend on the ProgramEnd section.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramRxczSyntax.html">ProgramRxczSyntax</a></dt>
<dd><p>Polar-mode sibling of <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a>: while the
<a class="xref" href="Hi.NcParsers.Keywords.IPolarInterpolationDef.html#Hi_NcParsers_Keywords_IPolarInterpolationDef_PolarInterpolationState">PolarInterpolationState</a> valve section
is present, consumes the block's X/C/Z words as polar hypothetical-plane
coordinates (X = diameter, halved; C = hypothetical axis in mm) and writes:</p>
<ol><li><a class="xref" href="Hi.NcParsers.Keywords.IPolarInterpolationDef.html#Hi_NcParsers_Keywords_IPolarInterpolationDef_ProgramPolarRxcz">ProgramPolarRxcz</a> — the
anchor-relative polar position (G90/G91 resolved against the previous
block's position, mirroring HardNc <code>NcGroup03.GetNcFromSyntax</code>);</li><li><a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> — the derived ordinary
program position (radius, previous program Y, Z), so the downstream
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> derives machine XYZ through the normal
transform chain — <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> itself naturally
no-ops because the axis words are already consumed;</li><li>the machine C angle (degrees) into
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> —
placed before <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>, which then preserves the
value instead of treating C as a directly-commanded rotary word;</li><li>on motion-programmed blocks, <a class="xref" href="Hi.NcParsers.Keywords.MotionState.html">MotionState</a> and a
<a class="xref" href="Hi.NcParsers.Keywords.MotionEvent.html">MotionEvent</a> with <a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_McPolarLinear">McPolarLinear</a>
(G00/G01) or <a class="xref" href="Hi.NcParsers.Keywords.Generic.MotionForm.html#Hi_NcParsers_Keywords_Generic_MotionForm_McPolarArc">McPolarArc</a> (G02/G03 with R or
I/J/K resolved on the hypothetical plane).</li></ol>
The G12.1 entry block is skipped (its position was anchored by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PolarInterpolationSyntax.html">PolarInterpolationSyntax</a>). Angle-branch resolution mirrors
HardNc: <a class="xref" href="Hi.Numerical.MechNcUtil.html#Hi_Numerical_MechNcUtil_GetOrdinaryProgramXcz_rad_Hi_Geom_Vec3d_System_Double_Hi_Geom_Vec3d_">GetOrdinaryProgramXcz_rad(Vec3d, double, Vec3d)</a> chained from
the previous machine C angle.
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramStopSyntax.html">ProgramStopSyntax</a></dt>
<dd><p>Consumes the program-stop words in <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramStopSyntax.html#Hi_NcParsers_LogicSyntaxs_ProgramStopSyntax_SupportedCodes">SupportedCodes</a>
(default M00 unconditional / M01 optional) from
<a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a> and writes a
<a class="xref" href="Hi.NcParsers.Keywords.IProgramStopDef.html">IProgramStopDef</a> section on the block that carried the
flag. Non-modal: the section is written only on the exact block
where the stop code appears.</p>
<p>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramStopSyntax.html#Hi_NcParsers_LogicSyntaxs_ProgramStopSyntax_SupportedCodes">SupportedCodes</a> is ordered by priority: when several
listed words share a block the first listed one wins and stamps
<code>Term</code> with its literal; every listed word is removed from the
block either way. A brand preset widens the list for its own
vocabulary (the Heidenhain <code>STOP</code> word — the
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html#Hi_NcParsers_LogicSyntaxs_MachineCoordSelectSyntax_SupportedCodes">SupportedCodes</a> precedent).
</p>
<p>
Siblings with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramEndSyntax.html">ProgramEndSyntax</a> (M02/M30) which handles
end-of-program, not in-program stops.
</p>
<p>
The parsing layer only records NC intent. Whether M01 actually
pauses the run is a runtime/semantic decision gated by the operator's
"Optional Stop" switch (analogous to
<a class="xref" href="Hi.NcParsers.Dependencys.IBlockSkipConfig.html">IBlockSkipConfig</a> for block skip).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a></dt>
<dd><p>Resolves ProgramXyz (leaf coordinate) from syntax XYZ tags.
Writes <a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> sub-object to
<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>.<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html#Hi_NcParsers_Syntaxs_SyntaxPiece_JsonObject">JsonObject</a>.
Must be placed after <a class="xref" href="Hi.NcParsers.Syntaxs.BundleSyntax.html">BundleSyntax</a> since it uses
cross-node lookback for last position.</p>
<p>
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> (placed after this in the chain) reads
<a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> and writes
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.html">ProgramXyzUtil</a></dt>
<dd><p>Shared utilities for <a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> and
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a> lookback and
resolution. Used by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html">ReferenceReturnSyntax</a>, and semantic resolvers that need
position lookback.</p>
<p>
<b>Two strategies for "what's the program coordinate at a block's
endpoint?"</b> — both invert an MC value through an
<a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> chain,
but they pick the chain from <i>different</i> nodes:
</p>
<ul><li>
<b>By current-state transform</b>
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.html#Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_ComputeProgramXyzByCurrentTransform_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__Hi_Geom_Vec3d_">ComputeProgramXyzByCurrentTransform(LazyLinkedListNode&lt;SyntaxPiece&gt;, Vec3d)</a>) — modal anchor is
<a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>. Re-expresses an
MC value (typically a predecessor's modal MC) into the <i>current</i>
block's program frame using the current block's chain. Suitable for
chain-change blocks where the spindle physically stays put while the
chain (G54 swap, G68.2 activation, G43.4 toggle, tool-height change,
...) re-anchors the program frame; mirrors legacy
<code>HardNcLine.RebuildProgramXyzByMc</code>.
</li><li>
<b>By corresponding-state transform</b>
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.html#Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_ComputeProgramXyzByCorrespondingTransform_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__">ComputeProgramXyzByCorrespondingTransform(LazyLinkedListNode&lt;SyntaxPiece&gt;)</a>) — modal
anchor is <a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a>. Recovers the
program coordinate that <code>nodeCarryingMc</code> was originally commanded
at, by inverting <i>that same node's</i> own transform on its own MC.
Suitable for RTCP rotary-dynamic inheritance, where the modal
invariant is "tool tip in workpiece frame stays put while rotary axes
turn" — the recovered Vec3d carries forward as the next rotary block's
modal ProgramXyz unchanged, regardless of how its
<code>PivotTransform</code> differs.
</li></ul>
<p>
Both strategies yield the same Vec3d when prev and current share the
same chain modal state; they only diverge across chain boundaries
(RTCP toggle, coord-system swap, tilt activation) and at rotary motion
(PivotTransform difference). Pick the wrong one and the result lands
in a stale frame:
</p>
<ul><li>
Non-RTCP using "corresponding" — leaves the pre-chain-change values,
so a block emitted right after <code>G43.4 H03</code> would inherit
ProgramXyz still in the G49 frame and the next motion's MC.Z drifts
by the introduced tool-height offset. (This was the 2026-04-25
SoftNc / HardNc divergence found on a five-axis sample program.)
</li><li>
RTCP using "current" — double-counts the rotary
<code>PivotTransform</code> difference, so the inherited workpiece anchor
rotates by the C delta on every rotary block.
</li></ul>
<p>
Direct callers of the two strategy helpers are rare — typically you
call the dispatcher <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.html#Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_ResolveBlockProgramXyz_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__Hi_Geom_Vec3d_">ResolveBlockProgramXyz(LazyLinkedListNode&lt;SyntaxPiece&gt;, Vec3d)</a> (block's own
MC vs predecessor lookback, picks strategy from
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_HasDynamicEntry_System_Text_Json_Nodes_JsonObject_">HasDynamicEntry(JsonObject)</a>) or
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.html#Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_GetLastProgramXyz_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__">GetLastProgramXyz(LazyLinkedListNode&lt;SyntaxPiece&gt;)</a> (pure predecessor lookback).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html">ReferenceReturnSyntax</a></dt>
<dd><p>Writes <a class="xref" href="Hi.NcParsers.Keywords.ICompoundMotionDef.html">ICompoundMotionDef</a> section for G28 reference point return.
Reads intermediate XYZ from <code>Parsing.G28</code>
(written by <a class="xref" href="Hi.NcParsers.Syntaxs.GenericSyntaxKit.html#Hi_NcParsers_Syntaxs_GenericSyntaxKit_G28Syntax">G28Syntax</a>)
and converts to machine coordinates via
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzUtil.html#Hi_NcParsers_LogicSyntaxs_ProgramXyzUtil_ResolveProgramXyz_System_Text_Json_Nodes_JsonNode_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__Hi_NcParsers_ISentenceCarrier_Hi_NcParsers_NcDiagnosticProgress_">ResolveProgramXyz(JsonNode, LazyLinkedListNode&lt;SyntaxPiece&gt;, ISentenceCarrier, NcDiagnosticProgress)</a>.</p>
<p>
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> in the syntax chain.
Removes the <a class="xref" href="Hi.NcParsers.Keywords.IMotionEventDef.html">IMotionEventDef</a> section written by
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> (G28 handles its own motion).
Overwrites root <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>
and <a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> with reference position
for subsequent block lookback.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.RotaryAxisUtil.html">RotaryAxisUtil</a></dt>
<dd><p>Shared utilities for rotary axis (A/B/C) resolution.
Used by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.G53p1RotaryPositionSyntax.html">G53p1RotaryPositionSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a>, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a>,
and other syntaxes that read or write rotary axis values.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.SpindleSpeedSyntax.html">SpindleSpeedSyntax</a></dt>
<dd><p>Consumes S (spindle speed) and spindle direction M-codes
from <a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a>.
Both are modal — persist across blocks via backward node lookback.
Writes resolved state to a <a class="xref" href="Hi.NcParsers.Keywords.ISpindleSpeedDef.html">ISpindleSpeedDef</a> section.
Direction is converted from M-codes to the conventional
<a class="xref" href="Hi.Numerical.SpindleDirection.html">SpindleDirection</a> enum at this layer.</p>
<p>
Direction M-codes: the ISO defaults M03 (CW) / M04 (CCW) / M05 (STOP)
always apply; a machine that starts/stops its spindle with custom
M-codes (e.g., ultrasonic <code>M203</code>/<code>M205</code>) declares them on an
<a class="xref" href="Hi.NcParsers.Dependencys.ISpindleControlConfig.html">ISpindleControlConfig</a> dependency
(<a class="xref" href="Hi.NcParsers.Dependencys.ControllerParameterTableBase.html">ControllerParameterTableBase</a>), which this
syntax consults first — mapped flags are consumed like the ISO ones.
</p>
<p>
Fallback: an S &gt; 0 with no direction ever issued is contradictory
(physics would silently never run). The build assumes CW and emits a
one-shot <code>SpindleDirection--AssumedCw</code> validation warning — once is
structural, not stateful: the stamped CW propagates modally, so later
blocks no longer lack a direction. An explicit M05 (STOP) is a real
direction and never triggers the fallback.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.TappingCycleSyntax.html">TappingCycleSyntax</a></dt>
<dd><p>G84 (right-hand) / G74 (left-hand) tapping cycles.
Supports modal repetition.</p>
<p>
Cycle sequence:
<ol><li>Rapid to init position (target XY, previous Z)</li><li>Rapid from init to R-point</li><li>Feed from R-point to bottom Z</li><li>Spindle reverse at bottom</li><li>Feed retract to final Z (G98 → init Z, G99 → R)</li><li>Spindle restore to forward direction</li></ol>
<p>
G84: forward = CW (M03), reverse = CCW (M04).
G74: forward = CCW (M04), reverse = CW (M03).
</p>
<p>
Reads absolute coordinates from the cycle section, which is
resolved by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> (modal repetition,
G91 conversion, missing-axis fallback) before this syntax runs.
Must be placed after <a class="xref" href="Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a> and before
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in the syntax chain.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.TiltTransformUtil.html">TiltTransformUtil</a></dt>
<dd><p>Shared utilities for all tilt transform syntaxes
(ISO, Siemens, Heidenhain). Handles section IO,
backward lookback, and <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> composition.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeMotionSyntax.html">ToolChangeMotionSyntax</a></dt>
<dd><p>Synthesizes the machine motion of a tool change: on a block whose
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_SectionName">SectionName</a> section carries
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_IsChangeKey">IsChangeKey</a> = true AND whose tool number
actually differs from the previously equipped tool, overlays
<a class="xref" href="Hi.NcParsers.Dependencys.IToolingMcConfig.html">IToolingMcConfig</a>'s per-axis tooling position onto the
current machine pose (NaN / missing axis = stays) and emits a one-item
rapid <a class="xref" href="Hi.NcParsers.Keywords.ICompoundMotionDef.html">ICompoundMotionDef</a> to that target — the axis travel
a real machine's M06 macro performs before the changer cycle runs.
Root <a class="xref" href="Hi.NcParsers.Keywords.IProgramXyzDef.html#Hi_NcParsers_Keywords_IProgramXyzDef_ProgramXyz">ProgramXyz</a> (and the moved rotary axes
in root <a class="xref" href="Hi.NcParsers.Keywords.IMachineCoordinateStateDef.html#Hi_NcParsers_Keywords_IMachineCoordinateStateDef_MachineCoordinateState">MachineCoordinateState</a>)
are overwritten for subsequent-block modal lookback, mirroring
<code>HardNcLine</code>'s M06 handling (<code>McXyz</code>/<code>McAbc_rad</code> overlay +
<code>RebuildProgramXyzByMc</code>).</p>
<p>
A same-number tool call (M06 without an actual change) emits no motion —
the parity twin of HardNc's <code>preT != T</code> overlay gate. A block with
its own motion words folds them into the single rapid: the overlay
applies on top of the block's commanded position and the stamped
<a class="xref" href="Hi.NcParsers.Keywords.CompoundMotion.html">CompoundMotion</a> makes <a class="xref" href="Hi.NcParsers.LogicSyntaxs.LinearMotionSyntax.html">LinearMotionSyntax</a> skip
the block, so one contour covers both — the HardNc M06 branch shape.
Placement: the <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html">ReferenceReturnSyntax</a> (G28) slot — after
the offset/frame syntaxes (the ProgramXyz back-derivation needs the
composed transform), before <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> /
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a> (root MC XYZ backfill; rotary
targets wrapped shortest-path by the cyclic tail-pass).
</p>
<p>
Programs that retract on their own (G75/G28/SUPA before M06 — every
healthy post) reach the tooling position before the M06 block, so the
synthesized move is zero-length and
<a class="xref" href="Hi.NcParsers.Semantics.CompoundMotionSemantic.html">CompoundMotionSemantic</a> emits nothing. Only a
program that leaves the tool elsewhere (typically hand-edited) gets an
actual synthesized travel — and the machining steps along it surface
any material contact, plus the runtime's <code>ToolChange--UnsafePose</code>
diagnostic.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html">ToolChangeSyntax</a></dt>
<dd><p>Consumes T (tool number) and M06 (tool change) from
<a class="xref" href="Hi.NcParsers.Keywords.IParsingDef.html#Hi_NcParsers_Keywords_IParsingDef_Parsing">Parsing</a>.
T is modal — persists across blocks. M06 triggers the change.
Writes resolved state to a <code>ToolChange</code> section:
<code>{ &ldquo;ToolId&rdquo;: 1, &ldquo;IsChange&rdquo;: true, &ldquo;Term&rdquo;: &ldquo;M06&rdquo; }</code>.
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_TermKey">TermKey</a> records the trigger command and is only written
when <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_IsChangeKey">IsChangeKey</a> is true (i.e. the block actually carried
the tool-change M code); modal-only blocks omit it.</p>
<p>
Two more keys mirror HardNc's <code>T</code> / <code>PreparationT</code> split.
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_PreparedToolIdKey">PreparedToolIdKey</a> holds the second T of a dual tool word
(<code>T10 T2 M06</code>: 10 is loaded, 2 is pre-selected) and is carried
until the next change loads it. <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_EquippedToolIdKey">EquippedToolIdKey</a> is
written on non-change blocks and names the tool in the spindle — the
ToolId of the last change — because <code>ToolId</code> on such a block may
already be a pre-selection (<code>T2</code> alone). Consumers read it through
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_ReadEquippedToolId_System_Text_Json_Nodes_JsonObject_">ReadEquippedToolId(JsonObject)</a>.
</p>
<p>
<code>ToolId</code> is an int for numeric calls (<code>T5</code>) and a string for
Siemens string tool calls (<code>T="D8R1"</code>, captured by
<a class="xref" href="Hi.NcParsers.ParsingSyntaxs.Siemens.SiemensToolCallSyntax.html">SiemensToolCallSyntax</a>); both
shapes carry modally. String names are resolved to tool numbers at the
semantic layer (<a class="xref" href="Hi.NcParsers.Semantics.ToolChangeSemantic.html">ToolChangeSemantic</a>) — this
syntax records the call verbatim.
</p>
<p>
The trigger is machine-configurable. A custom tool-change M-code
(Siemens MD22560 <code>$MC_TOOL_CHANGE_M_CODE</code>) is declared on the
controller parameter table
(<a class="xref" href="Hi.NcParsers.Dependencys.MCodeEffects.html#Hi_NcParsers_Dependencys_MCodeEffects_IsToolChange">IsToolChange</a>) and reaches this
syntax already expanded to M06 by <a class="xref" href="Hi.NcParsers.LogicSyntaxs.MCodeExpansionSyntax.html">MCodeExpansionSyntax</a>.
Turret/lathe machines where the <code>T</code> word itself performs the
change (Siemens MD22550 <code>$MC_TOOL_CHANGE_MODE</code> = 0) set
<a class="xref" href="Hi.NcParsers.Dependencys.IToolChangeTriggerConfig.html#Hi_NcParsers_Dependencys_IToolChangeTriggerConfig_ToolWordTriggersChange">ToolWordTriggersChange</a>;
the block then triggers with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_ToolWordTerm">ToolWordTerm</a> recorded as
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolChangeSyntax.html#Hi_NcParsers_LogicSyntaxs_ToolChangeSyntax_TermKey">TermKey</a>. Without that config a bare <code>T</code> block stays
pre-selection only — magazine rotation is the PLC's business and moves
no feed axis.
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolHeightOffsetSyntax.html">ToolHeightOffsetSyntax</a></dt>
<dd><p>Resolves ISO tool height offset (G43/G44/G49) to the effective offset
value (mm) and composes the offset as a translation into the accumulated
<a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> matrix.</p>
<p>
RTCP modes (G43.4, TRAORI, M128) are handled by separate brand-specific
syntaxes (e.g., <a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>).
</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.UnitModeSyntax.html">UnitModeSyntax</a></dt>
<dd><p>Detects the unit-system code (ISO Group 06: G20 inch / G21 metric)
from <a class="xref" href="Hi.NcParsers.Keywords.IFlagsDef.html#Hi_NcParsers_Keywords_IFlagsDef_Flags">Flags</a> and writes a <a class="xref" href="Hi.NcParsers.Keywords.Unit.html">Unit</a>
section (<a class="xref" href="Hi.NcParsers.Keywords.IUnitDef.html#Hi_NcParsers_Keywords_IUnitDef_Term">Term</a>, <a class="xref" href="Hi.NcParsers.Keywords.IUnitDef.html#Hi_NcParsers_Keywords_IUnitDef_System">System</a>).
Modal — absence of an explicit flag inherits the previous block's
unit, defaulting to <a class="xref" href="Hi.NcParsers.Keywords.Unit.html#Hi_NcParsers_Keywords_Unit_Metric">Metric</a> at program start.</p>
<p>
The code vocabulary is configurable per brand: <a class="xref" href="Hi.NcParsers.LogicSyntaxs.UnitModeSyntax.html#Hi_NcParsers_LogicSyntaxs_UnitModeSyntax_InchCodes">InchCodes</a>
/ <a class="xref" href="Hi.NcParsers.LogicSyntaxs.UnitModeSyntax.html#Hi_NcParsers_LogicSyntaxs_UnitModeSyntax_MetricCodes">MetricCodes</a> default to ISO G20 / G21; the Siemens
preset uses G70+G700 / G710+G71 instead (G70/G71 switch geometry-word
interpretation only, G700/G710 also switch feedrate interpretation —
a distinction preserved via the verbatim <a class="xref" href="Hi.NcParsers.Keywords.IUnitDef.html#Hi_NcParsers_Keywords_IUnitDef_Term">Term</a>
but irrelevant to this record-only syntax; both inch variants warn
identically). The first <a class="xref" href="Hi.NcParsers.LogicSyntaxs.UnitModeSyntax.html#Hi_NcParsers_LogicSyntaxs_UnitModeSyntax_MetricCodes">MetricCodes</a> entry doubles as the
program-start default <code>Term</code>. RS-274-D, Syntec and Fanuc turning
G-code system C all spell the units G70 inch / G71 metric, and the
Fanuc milling dialects (RS-274-D descendants) read them the same way,
so the Fanuc/Syntec presets carry all four codes. The
finishing/roughing-cycle collision exists only on Fanuc turning
G-code systems A/B (system C moved those cycles to G72/G73) — a
future turning preset for those systems must not inherit this milling
preset's vocabulary.
</p>
<p>
The HiNC pipeline works exclusively in millimetres. When an inch code
is detected this syntax emits an <code>Unit--InchNotSupported</code>
Unsupported Error so upstream callers are forced to pre-convert the
NC program to metric — while still recording what the program said.
Metric codes are accepted as no-op confirmations of the default.
</p>
</dd>
</dl>
<h3 id="enums">
Enums
</h3>
<dl class="jumplist">
<dt><a class="xref" href="Hi.NcParsers.LogicSyntaxs.BareG28Behavior.html">BareG28Behavior</a></dt>
<dd><p>Configurable handling for a G28 block with no axis specifiers
(&ldquo;bare G28&rdquo;) — value of <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html#Hi_NcParsers_LogicSyntaxs_ReferenceReturnSyntax_BareG28">BareG28</a>.
Real Fanuc-class controllers vary: older 0i-M alarms (PS010), some
30i variants send every configured axis to home. Default to
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.BareG28Behavior.html#Hi_NcParsers_LogicSyntaxs_BareG28Behavior_Alarm">Alarm</a> so silent NC bugs surface; opt into
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.BareG28Behavior.html#Hi_NcParsers_LogicSyntaxs_BareG28Behavior_AllAxesHome">AllAxesHome</a> per syntax instance.</p>
</dd>
</dl>
</article>
<div class="contribution d-print-none">
</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>