This commit is contained in:
2026-09-09 18:06:21 +08:00
parent 161af68fe3
commit 45b9f9ed5d
79 changed files with 1167 additions and 1532 deletions
@@ -655,9 +655,18 @@ active frame for one block; in this pipeline all of those reduce to
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>) are left to
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcSyntax.html">McAbcSyntax</a> — same behavior as ISO G53, where rotary
axes flow through the normal rotary path.
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>
@@ -1138,6 +1147,40 @@ Downstream syntaxes that need to reset modal state on program end
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>