Archived
334 lines
29 KiB
HTML
334 lines
29 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Brand NC language coverage | HiAPI-C# 2025 </title>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="title" content="Brand NC language coverage | HiAPI-C# 2025 ">
|
||
|
||
|
||
<link rel="icon" href="../../img/HiAPI.favicon.ico">
|
||
<link rel="stylesheet" href="../../public/docfx.min.css">
|
||
<link rel="stylesheet" href="../../public/main.css">
|
||
<meta name="docfx:navrel" content="../../toc.html">
|
||
<meta name="docfx:tocrel" content="toc.html">
|
||
|
||
<meta name="docfx:rel" content="../../">
|
||
|
||
|
||
|
||
<meta name="loc:inThisArticle" content="In this article">
|
||
<meta name="loc:searchResultsCount" content="{count} results for "{query}"">
|
||
<meta name="loc:searchNoResults" content="No results for "{query}"">
|
||
<meta name="loc:tocFilter" content="Filter by title">
|
||
<meta name="loc:nextArticle" content="Next">
|
||
<meta name="loc:prevArticle" content="Previous">
|
||
<meta name="loc:themeLight" content="Light">
|
||
<meta name="loc:themeDark" content="Dark">
|
||
<meta name="loc:themeAuto" content="Auto">
|
||
<meta name="loc:changeTheme" content="Change theme">
|
||
<meta name="loc:copy" content="Copy">
|
||
<meta name="loc:downloadPdf" content="Download PDF">
|
||
|
||
<script type="module" src="./../../public/docfx.min.js"></script>
|
||
|
||
<script>
|
||
const theme = localStorage.getItem('theme') || 'auto'
|
||
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
|
||
</script>
|
||
|
||
</head>
|
||
|
||
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
|
||
<header class="bg-body border-bottom">
|
||
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
|
||
<div class="container-xxl flex-nowrap">
|
||
<a class="navbar-brand" href="../../index.html">
|
||
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
|
||
|
||
</a>
|
||
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
|
||
<i class="bi bi-three-dots"></i>
|
||
</button>
|
||
<div class="collapse navbar-collapse" id="navpanel">
|
||
<div id="navbar">
|
||
<form class="search" role="search" id="search">
|
||
<i class="bi bi-search"></i>
|
||
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
</header>
|
||
|
||
<main class="container-xxl">
|
||
<div class="toc-offcanvas">
|
||
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
|
||
<div class="offcanvas-header">
|
||
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
|
||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
|
||
</div>
|
||
<div class="offcanvas-body">
|
||
<nav class="toc" id="toc"></nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content">
|
||
<div class="actionbar">
|
||
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
|
||
<i class="bi bi-list"></i>
|
||
</button>
|
||
|
||
<nav id="breadcrumb"></nav>
|
||
</div>
|
||
|
||
<article data-uid="Release-Upgrading-BrandCoverage">
|
||
<h1 id="brand-nc-language-coverage">Brand NC language coverage</h1>
|
||
|
||
<p>The SoftNc pipeline is the default NC engine, and this is where most of the release went.</p>
|
||
<h2 id="siemens-sinumerik">Siemens SINUMERIK</h2>
|
||
<p>Real <code>.mpf</code> / <code>.spf</code> programs replay end to end, not an ISO subset. At 3.1.175 a program that declared
|
||
its tool as <code>T="NAME"</code>, shifted with <code>SUPA</code>, computed with R-parameters, called L-subprograms or
|
||
looped with <code>WHILE</code> was not interpreted past that point.</p>
|
||
<ul>
|
||
<li><strong>Modal vocabulary</strong> — <code>SUPA</code> / <code>G153</code> suppress all frames for one block; <code>T="NAME"</code> string tool
|
||
calls with <code>D</code> cutting-edge offsets resolved through
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensToolOffsetTable.html">SiemensToolOffsetTable</a> (<code>$TC_DP</code> lengths and radius plus
|
||
additive wear); <code>G70</code> / <code>G71</code> units; path smoothing (<code>G60x</code> / <code>G64x</code>, <code>FNORM</code> / <code>SOFT</code> / <code>FFWON</code> /
|
||
<code>COMP*</code> / <code>UPATH</code>, <code>CYCLE832</code>); <code>MSG()</code> and <code>STOPRE</code>; <code>CR=</code> and <code>TURN=</code> arcs. Tail comments became
|
||
quote-aware, so a <code>;</code> inside <code>MSG("A;B")</code> no longer truncates the block, and the preset stops
|
||
misreading <code>L</code> and <code>G74</code> as Fanuc-family codes.</li>
|
||
<li><strong>Evaluation</strong> — <a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Siemens.SiemensExpressionParser.html">SiemensExpressionParser</a> feeds the
|
||
shared expression engine, so <code>Z=R63+150</code> and <code>X=SIN(R10)*20</code> drive motion.
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensRParameterTable.html">SiemensRParameterTable</a> holds R0–R999 as per-case project
|
||
data, <code>DEF REAL/INT</code> declarations lower into assignments, and <code>$P_UIFR[n,axis,TR]</code> binds both ways
|
||
to <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensFrameTable.html">SiemensFrameTable</a>. Any other <code>$</code>-variable is recorded
|
||
with an unsupported note rather than dropped.</li>
|
||
<li><strong>Five axis</strong> — <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensProgrammableFrameSyntax.html">SiemensProgrammableFrameSyntax</a> simulates
|
||
<code>TRANS</code> / <code>ATRANS</code> / <code>ROT</code> / <code>AROT</code> (with <code>RPL=</code>) into the tilt-transform chain in Sinumerik RPY
|
||
order; <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensTraoriSyntax.html">SiemensTraoriSyntax</a> makes <code>TRAORI</code> a real RTCP mode,
|
||
the sibling of ISO G43.4, with <code>TRAFOOF</code> handing the offset back;
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensCycle800TiltSyntax.html">SiemensCycle800TiltSyntax</a> decodes <code>CYCLE800</code>'s MODE bits for
|
||
all four swivel modes. <code>ROTS</code> / <code>SCALE</code> / <code>MIRROR</code> are recognized and reported, not simulated.</li>
|
||
<li><strong>Calls</strong> — L-prefixed and named subprogram calls resolve against
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Generic.SubProgramFolderConfig.html">SubProgramFolderConfig</a> (<code>{name}.SPF</code>, then <code>.MPF</code>, then the
|
||
bare name) and inline with their <code>P</code> repetition count; <code>M17</code> / <code>RET</code> pop a frame; <code>REPEAT</code> re-runs a
|
||
labelled slice; <code>MCALL CYCLE81/82/83/85</code> maps onto the shared canned-cycle machinery; <code>PROC</code> headers
|
||
and labels are claimed whole.</li>
|
||
<li><strong>Control flow</strong> — <code>GOTOF</code> / <code>GOTOB</code>, <code>IF</code> / <code>ELSE</code> / <code>ENDIF</code>, and <code>WHILE</code> / <code>FOR</code> / <code>REPEAT-UNTIL</code> /
|
||
<code>LOOP</code>. Runaway programs are bounded rather than hanging the session:
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensGotoIterationDependency.html">SiemensGotoIterationDependency</a> caps jumps per (file, label)
|
||
and <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensLoopIterationDependency.html">SiemensLoopIterationDependency</a> caps iterations per
|
||
(file, loop-entry line); over the cap the construct warns and falls through.</li>
|
||
<li><strong>Per-word coordinate functions</strong> — <code>AC()</code> / <code>IC()</code> / <code>DC()</code> / <code>ACP()</code> / <code>ACN()</code>, including on
|
||
<code>I</code> / <code>J</code> / <code>K</code> circle centres. <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute
|
||
program. Direction resolution lives in <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>:
|
||
<code>ACP()</code> takes the <code>[anchor, anchor+360)</code> window, <code>ACN()</code> the <code>(anchor-360, anchor]</code> window, <code>DC()</code>
|
||
the shortest swing, with the exact 180° tie going negative. On a machine-coordinate block the
|
||
increment is a distance in the <em>machine</em> frame, because
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.MachineCoordSelectSyntax.html">MachineCoordSelectSyntax</a> is ordered ahead of
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.IncrementalResolveSyntax.html">IncrementalResolveSyntax</a> in all five brand presets — Fanuc,
|
||
Mazak, Syntec, Siemens and Heidenhain — so <code>G53 X=IC(10)</code> and <code>SUPA Y=IC(-10)</code> add the raw word to
|
||
the previous machine position rather than being re-based through the program frame first. That
|
||
order is not something a saved-file patch can express: a project saved before 3.2.21 keeps the old
|
||
order for that block shape until its pipeline is re-created from the brand preset.</li>
|
||
<li><strong>Coded positions</strong> — <code>CAC</code> / <code>CIC</code> / <code>CDC</code> / <code>CACP</code> / <code>CACN</code> take a 1-based indexing position
|
||
number rather than a coordinate, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.IIndexingPositionConfig.html">IIndexingPositionConfig</a>,
|
||
implemented by <a class="xref" href="../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a> from the real machine
|
||
data (the MD30500 axis assignment, the MD10910 / MD10930 position tables, the equidistant
|
||
MD30501–30503 definition).</li>
|
||
<li><strong><code>G74</code> / <code>G75</code> fixed-point return</strong> is claimed as a whole block, so its dummy axis values no longer
|
||
mint a rapid to the coordinates written in the block and its <code>F</code> never reaches the modal feedrate.</li>
|
||
<li><strong>OEM auxiliary M-codes</strong> — the preset declares <code>M12</code> / <code>M13</code> / <code>M22</code> / <code>M23</code> and <code>M330</code> / <code>M331</code>
|
||
note-only, so each occurrence voices <code>DeclaredMCode--UnmodeledEffects</code> instead of an unknown-code
|
||
warning, without inventing simulated effects. A machine's own table overrides a declaration when the
|
||
real effects are known.</li>
|
||
</ul>
|
||
<h2 id="heidenhain">Heidenhain</h2>
|
||
<p>Both dialects play on one preset, <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_HeidenhainNcRunner">HeidenhainNcRunner</a>.</p>
|
||
<ul>
|
||
<li><strong>Klartext motion and setup</strong> — the <code>L</code> statement and its axis words, <code>FMAX</code>, <code>M91</code> as a one-shot
|
||
machine-coordinate move, <code>TOOL CALL</code> wired to tool change and spindle speed with the table height
|
||
and <code>DL</code>. Datum handling follows TNC semantics: <code>CYCL DEF 247</code> sets the preset and <code>CYCL DEF 7</code> is an
|
||
<em>additive</em> shift on top of it, composing as separate transform-chain entries instead of replacing
|
||
each other, resolved against <a class="xref" href="../../api/Hi.NcParsers.Dependencys.HeidenhainDatumTable.html">HeidenhainDatumTable</a>. Arcs (<code>CC</code> pole
|
||
plus <code>C</code> statement, <code>DR-</code> = CW, closed arc = full circle), <code>RL</code> / <code>RR</code> / <code>R0</code> radius compensation,
|
||
the <code>M126</code> / <code>M127</code> rotary-wrap state, <code>M140 MB</code> retract, and <code>CYCL DEF 32 TOLERANCE</code>. A <code>C</code> block
|
||
never states its own centre: each in-plane component comes from the <code>CC</code> block's own axis word,
|
||
else from the previous <code>CC</code> section's same axis, else from the arc's own start point. A bare <code>CC</code>
|
||
is the one spelling that states all of them at once — it takes the last programmed position, read
|
||
at the <code>CC</code> block, and replaces the modal centre rather than inheriting it. A centre that lands on
|
||
the arc's own start point leaves the block with no radius, so it warns
|
||
<code>Arc-CircleCenter--OnStartPoint</code> and is degraded to a linear move to the endpoint.</li>
|
||
<li><strong>Klartext incremental axis words</strong> — the <code>I</code>-prefixed word (<code>IX+20</code>, <code>IY-15</code>, rotary <code>IC+90</code>) is
|
||
the same axis word as its absolute twin, read as a distance from the last programmed position. It
|
||
is per word rather than per block: <code>L X+60 IY-10</code> mixes an absolute X with an incremental Y and
|
||
stamps only the Y. One shared grab serves five statement heads — <code>L</code>, <code>C</code>, <code>CC</code>, <code>LN</code> and
|
||
<code>CYCL CALL POS</code> — each writing the value under the <em>plain</em> axis key of its own section plus a
|
||
<code>"PositioningOverride": { "Y": "Incremental" }</code> entry on the block root. That is the same per-word
|
||
section the Siemens <code>IC()</code> wrapper writes, so the existing resolve consumers convert it and no
|
||
second incremental mechanism exists. Coverage differs by head: <code>L</code>, <code>C</code> and <code>LN</code> take the whole
|
||
axis tag list, rotary included, while <code>CC</code> and <code>CYCL CALL POS</code> take <code>X</code> / <code>Y</code> / <code>Z</code> only — a <code>CC</code>
|
||
never positions a rotary axis, and the stamp is keyed by axis on the block root, where a rotary
|
||
letter would read as a rotary word of the block. The sign is optional (<code>L IX5</code>), a <code>Q</code> reference
|
||
resolves behind the prefix (<code>L IZ+Q2</code>), and the glued post-processed run <code>LIX+20IY-15</code> parses.
|
||
Before these words were read the plain grab could not see the <code>X</code> inside <code>IX</code> — its prefix guard
|
||
demands a word boundary, a digit or whitespace before the tag, and <code>I</code> is a word character — so
|
||
<code>L X+60 IY-10</code> took the X and dropped the Y: a motion to the wrong place, not a missing one.</li>
|
||
<li><strong>What an incremental word is measured from</strong> depends on the statement. An <code>L</code> / <code>C</code> / <code>LN</code>
|
||
endpoint and a <code>CC</code> centre are distances from the last programmed tool position, so
|
||
<code>CC IX+0 IY+11</code> is a stated centre resolved against that position — never against the previous
|
||
centre — and it is no longer the spelling whose coordinates the parser could not read.
|
||
<code>CYCL CALL POS</code> has its own reference: an <code>IX</code> / <code>IY</code> / <code>IZ</code> word there is a distance from the
|
||
coordinates the <em>previous</em> <code>CYCL CALL POS</code> programmed, which is the control's own rule behind its
|
||
error 1A0-0108. An axis that no earlier call programmed has no reference: the control refuses the
|
||
call, and the simulation warns <code>HeidenhainCyclCall--IncrementalNoReference</code> and falls back to the
|
||
last programmed position. A tool move between the two calls makes the two candidate references
|
||
differ, and that divergence warns <code>HeidenhainCyclCall--IncrementalAfterMove</code>, the control's stated
|
||
reference winning. With <code>M91</code> on the block the increment is a machine-frame distance, per the
|
||
ordering note under Siemens above. A rotary increment is a signed traverse the wrap pass keeps
|
||
verbatim — <code>IC+270</code> from 75° stays 345° instead of folding into the ±180° shortest-path window,
|
||
while an absolute rotary word on the same block still folds. The <code>CYCL DEF 7</code> datum-shift <code>I</code>
|
||
words are a different mechanism: <code>CYCL DEF 7.2 IY+5</code> shifts by the value on top of the shift last
|
||
valid, stays under prefixed keys in the cycle's own record, and writes no per-word stamp at all.</li>
|
||
<li><strong>Q-parameters</strong> — <a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.Heidenhain.HeidenhainExpressionParser.html">HeidenhainExpressionParser</a> lexes
|
||
<code>Q</code> / <code>QR</code> / <code>QL</code> / <code>QS</code>, the <code>DIV</code> keyword of FN 4 and the prefix <code>SQRT</code> of FN 5, so <code>FQ1</code> reaches
|
||
the feedrate, <code>L X+Q2</code> reaches the program XYZ and <code>TOOL CALL SQ3</code> reaches the spindle speed.
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.Heidenhain.HeidenhainQParameterTable.html">HeidenhainQParameterTable</a> holds Q0–Q99 free and QR0–QR499
|
||
permanent parameters as per-case project data. Unimplemented opcodes (FN 14 / 16 / 18…) are claimed
|
||
and reported rather than half-read, so an <code>FN 18 SYSREAD</code> target stays vacant instead of taking a
|
||
fabricated value. <strong>FN 9–12 conditional jumps execute</strong>, with a (file, label)-keyed iteration cap.</li>
|
||
<li><strong>Tilt and RTCP</strong> — <code>PLANE</code> (SPATIAL fully composed with <code>SEQ</code> / <code>COORD ROT</code> / <code>TABLE ROT</code> and
|
||
<code>STAY</code> / <code>MOVE</code> / <code>TURN</code> positioning; VECTOR structurally captured; EULER / POINTS / RELATIV /
|
||
AXIAL / PROJECTED consumed and warned with the previous tilt retained, so a <code>PLANE AXIAL B+45</code> B
|
||
word can never be mistaken for a rotary axis command), <code>FUNCTION TCPM</code>, and real <code>M128</code> / <code>M129</code>
|
||
tool-centre-point control.</li>
|
||
<li><strong>Cycles and calls</strong> — <code>CYCL DEF 2xx</code> bodies with their Q parameters mirrored into the block
|
||
assignments, cycles 200 / 232 / 251 / 252 / 253 mapped onto the shared G81 / G82 / G83 slots,
|
||
<code>CYCL CALL</code> / <code>CYCL CALL POS</code> / <code>M99</code> / <code>M89</code> splitting call-once from modal firing, <code>CALL LBL</code>
|
||
inlining up to <code>LBL 0</code>, <code>CALL LBL n REP m</code> as a section repeat, and <code>CALL PGM</code> resolved by file
|
||
name. The multi-line tilde continuation form is joined at segmentation
|
||
(<a class="xref" href="../../api/Hi.NcParsers.Segmenters.HeidenhainSegmenter.html#Hi_NcParsers_Segmenters_HeidenhainSegmenter_JoinTildeContinuations">JoinTildeContinuations</a>, on by default).</li>
|
||
<li><strong>Post-processed spellings</strong> — some post-processors write a whole klartext body with no separators
|
||
at all, which used to yield zero motion. Glued line shapes (<code>LX-26.3Y+43.1</code>, <code>FMAXM03M08</code>,
|
||
<code>…R0FMAX</code>) and the detached feed spelling (<code>F 20000</code>) now parse, with <code>M140</code>, <code>M128</code> and
|
||
<code>PLANE MOVE</code> widening their own <code>F</code> capture so a retract or feed-limit value cannot leak into the
|
||
modal feedrate. <code>BLK FORM</code> is recorded as a brand-neutral stock declaration without replacing the
|
||
project workpiece setup, and the klartext <code>STOP</code> word joins <code>M00</code> / <code>M01</code>.</li>
|
||
<li><strong>DIN/ISO dialect</strong> — <code>%</code> tape header, <code>N</code> block numbers, <code>T</code> + <code>M06</code>, absolute <code>I</code> / <code>J</code> / <code>K</code> arc
|
||
centres with the modal pole carried forward, the ISO label family (<code>G98 L<n></code> definitions and the
|
||
head-anchored <code>L<n>,<m></code> call mapping the comma count onto <code>REP</code>), <code>G247 Q339</code> stamping the same
|
||
datum preset as <code>CYCL DEF 247</code>, <code>G54</code> with axis words read as a datum-shift declaration, and
|
||
<code>G70</code> / <code>G71</code>.</li>
|
||
</ul>
|
||
<h2 id="fanuc-and-iso-common">Fanuc and ISO common</h2>
|
||
<ul>
|
||
<li><strong>Polar coordinate interpolation</strong> — <code>G12.1</code> / <code>G13.1</code> on the SoftNc pipeline. Before this a polar
|
||
section parsed silently wrong: the <code>X</code> word (a diameter) and the <code>C</code> word (a hypothetical Cartesian
|
||
axis in mm) were consumed as ordinary XYZ and rotary degrees.
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.ProgramRxczSyntax.html">ProgramRxczSyntax</a> halves <code>X</code> from diameter, resolves G90/G91, writes
|
||
the polar and derived Cartesian positions and the machine C angle, and classifies motion into polar
|
||
linear and polar arc — the latter emitting <a class="xref" href="../../api/Hi.Numerical.Acts.ActMcPolarSpiralContour.html">ActMcPolarSpiralContour</a>, which
|
||
keeps spiral geometry in central polar coordinates and stays continuous across ±180°. <code>G41</code> / <code>G42</code>
|
||
compensation is resolved on the hypothetical plane, a C-axis speed clamp applies, and YA / ZB axis
|
||
pairs are supported. <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PolarGCodeCheckSyntax.html">PolarGCodeCheckSyntax</a> scans for incompatible G
|
||
codes before the mode syntaxes consume them.</li>
|
||
<li><strong>Custom Macro B</strong> — <code>#var</code> assignment with range-routed stores (<code>#1</code>–<code>#33</code> local per macro frame,
|
||
<code>#100</code>–<code>#499</code> volatile cleared on M02/M30, <code>#500</code>–<code>#999</code> retained and persisted in the project,
|
||
<code>#3000</code>–<code>#3999</code> system-control), boolean and logical operators, <code>IF[..]GOTO n</code>, <code>IF[..]THEN <stmt></code>,
|
||
<code>WHILE[..]DO m / END m</code> with a bounded-loop watchdog, and position and tool-offset system variables.
|
||
<code>M98 P_ L_</code>, <code>M198</code> external call, <code>M99</code> return and <code>M99 P{seq}</code> early return; <code>G65</code> one-shot macro
|
||
call with A–Z → <code>#1</code>–<code>#26</code> argument binding, and <code>G66</code> / <code>G67</code> modal macro.</li>
|
||
</ul>
|
||
<h2 id="cross-brand">Cross-brand</h2>
|
||
<ul>
|
||
<li><strong>A shared <code>DwellSyntax</code></strong> consumes <code>G4</code> and <code>G04</code> with the dialect held on the instance:
|
||
Fanuc-family <code>X</code> / <code>U</code> seconds, <code>P</code> milliseconds, <code>S</code> spindle revolutions; the Siemens instance reads
|
||
<code>F</code> seconds and <code>S</code> revolutions. Capturing the <code>G04</code> spelling fixes a real defect — the un-captured
|
||
spelling fell through to the flag and axis syntaxes, where a Fanuc <code>G04 X0.5</code> dwell time became a
|
||
ghost X motion word.</li>
|
||
<li><strong>Machine-declared M-codes</strong> — <a class="xref" href="../../api/Hi.NcParsers.Dependencys.IMCodeDeclarationConfig.html">IMCodeDeclarationConfig</a> and
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.MCodeEffects.html">MCodeEffects</a> let a machine state what its own OEM codes do (composite
|
||
spindle+coolant codes, a tool-change trigger, turret <code>T</code>-word semantics), and
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.MCodeExpansionSyntax.html">MCodeExpansionSyntax</a> expands a declared code into the canonical ISO
|
||
flags the shared consumers already understand.</li>
|
||
<li><strong>Custom spindle M-codes</strong> drive the spindle direction through a machine-level
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.ISpindleControlConfig.html">ISpindleControlConfig</a>; ISO <code>M03</code> / <code>M04</code> / <code>M05</code> remain the built-in
|
||
fallback. An <code>S</code> greater than zero with no direction ever issued assumes clockwise and emits
|
||
<code>SpindleDirection--AssumedCw</code>, so the physics gate no longer silently produces zero mechanics for a
|
||
whole file.</li>
|
||
<li><strong>Tool changes synthesize their axis travel.</strong>
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.ToolChangeMotionSyntax.html">ToolChangeMotionSyntax</a> overlays the per-axis tooling position from
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.IToolingMcConfig.html">IToolingMcConfig</a> onto the current pose (a NaN or missing axis stays
|
||
put) and stamps a one-item rapid compound motion, and
|
||
<a class="xref" href="../../api/Hi.NcParsers.Semantics.ToolChangeSemantic.html">ToolChangeSemantic</a> moves behind
|
||
<a class="xref" href="../../api/Hi.NcParsers.Semantics.CompoundMotionSemantic.html">CompoundMotionSemantic</a> so the tooling step lands at the tooling point.
|
||
Programs that retract on their own overlay to a zero-length move and emit nothing extra.</li>
|
||
<li><strong>Per-brand pivot gates.</strong> <a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html">PivotTransformationSyntax</a> reverts to the
|
||
ISO/Fanuc vocabulary (G43.4 plus the G68.x family),
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPivotTransformationSyntax.html">SiemensPivotTransformationSyntax</a> gates TRAORI / CYCLE800, and
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.Heidenhain.HeidenhainPivotTransformationSyntax.html">HeidenhainPivotTransformationSyntax</a> gates the M128 /
|
||
PLANE vocabulary. All three compose the identical entry through the shared
|
||
<a class="xref" href="../../api/Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a>. <strong>Exactly one brand gate belongs in a pipeline
|
||
list — never register two.</strong></li>
|
||
<li><strong>Controller presets are writable and shipped.</strong> A controller resource file is one serialized
|
||
<a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> — the whole pipeline that decides how a brand's NC code is
|
||
interpreted. <a class="xref" href="../../api/Hi.NcParsers.ControllerPresetWriter.html">ControllerPresetWriter</a> serializes the built-in brand presets
|
||
(<code>CreateBrandPreset</code>, <code>WriteBrandPresetFile</code>, <a class="xref" href="../../api/Hi.NcParsers.ControllerPresetWriter.html#Hi_NcParsers_ControllerPresetWriter_WriteAllBrandPresetFiles_">WriteAllBrandPresetFiles</a>)
|
||
under <code>Resource/Controller/</code> with the <code>.Controller</code> extension, and HiNc-Resource ships all five so the
|
||
load browser starts populated. The static brand properties remain the source of truth; the files are
|
||
regenerable snapshots. Writing needs no <code>XFactory</code> registration — reading one back does, because the
|
||
loader drops unregistered pipeline entries silently rather than failing the load.</li>
|
||
<li><strong>Saved pipelines back-fill their system-wired dependencies on load.</strong> A project saved before a
|
||
system-wired dependency existed never self-healed by round-tripping, because re-saving stamped a
|
||
fresh API version on the same incomplete list. The <a class="xref" href="../../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> XML constructor
|
||
now appends the missing ones after the legacy version patches. A runner rehydrated from an older
|
||
file still keeps the <em>syntax</em> list it was saved with, though — take the regenerated preset, or a
|
||
fresh <a class="xref" href="../../api/Hi.NcParsers.NcRunnerSuit.html">NcRunnerSuit</a> built from it, rather than expecting an old file to grow new
|
||
syntaxes.</li>
|
||
<li><strong>Machine-coordinate and tilted-plane failures report.</strong> G53 and G53.1 record their source G-code
|
||
on the parsed block and emit <code>Coord-MachCoord--005</code> / <code>--006</code> / <code>--007</code> on paths that used to fail
|
||
silently. A G68.2 tilted plane the machine cannot reach emits <code>Coord-Tilt--001</code> / <code>--002</code>, with a
|
||
tool-axis-only IK retry that avoids a spurious warning on a machine with fewer than three rotary
|
||
axes.</li>
|
||
<li><strong>Session-global sentence indexing.</strong> <code>SyntaxPiece.SentenceIndex</code> used to be assigned by two
|
||
independent sequences, so indices collided as soon as a call was inlined mid-stream. The new
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.SystemWired.SentenceIndexCounterDependency.html">SentenceIndexCounterDependency</a> supplies every index at
|
||
one chokepoint, so values are session-globally unique and strictly increasing in execution order,
|
||
including nested and repeated calls.</li>
|
||
<li><strong>Inline plays can loop and jump, and playing a file no longer holds it open.</strong> Inline NC-code plays
|
||
stamp their pieces with the command title as a pseudo-path, and every control-flow re-segmentation
|
||
re-read the host file by that path — the existence check always failed, so loops fell through
|
||
without looping. <code>RunNc</code> now registers the raw lines on
|
||
<a class="xref" href="../../api/Hi.NcParsers.Dependencys.SystemWired.NcLineSourceDependency.html">NcLineSourceDependency</a> and
|
||
<a class="xref" href="../../api/Hi.NcParsers.EvaluationSyntaxs.LabelScanUtil.html">LabelScanUtil</a> reads memory first, disk second.</li>
|
||
</ul>
|
||
|
||
</article>
|
||
|
||
<div class="contribution d-print-none">
|
||
</div>
|
||
|
||
<div class="next-article d-print-none border-top" id="nextArticle"></div>
|
||
|
||
</div>
|
||
|
||
<div class="affix">
|
||
<nav id="affix"></nav>
|
||
</div>
|
||
</main>
|
||
|
||
<div class="container-xxl search-results" id="search-results"></div>
|
||
|
||
<footer class="border-top text-secondary">
|
||
<div class="container-xxl">
|
||
<div class="flex-fill">
|
||
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</body>
|
||
</html>
|