deploy fixed MRR drift and webservice CylindroidHolder buckle branch update issue.

This commit is contained in:
2026-05-28 19:42:05 +08:00
parent d7836db45f
commit 95b5790622
140 changed files with 8079 additions and 14099 deletions
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Enum BareG28Behavior | HiAPI-C# 2025 ">
<meta name="description" content="Writes section for G28 reference point return. Reads intermediate XYZ from Parsing.G28 (written by ) and converts to machine coordinates via . Must be placed after in the syntax chain. Removes the section written by (G28 handles its own motion). Overwrites root and with reference position for subsequent block lookback.">
<meta name="description" content="Configurable handling for a G28 block with no axis specifiers (&amp;ldquo;bare G28&amp;rdquo;) — value of . Real Fanuc-class controllers vary: older 0i-M alarms (PS010), some 30i variants send every configured axis to home. Default to so silent NC bugs surface; opt into per syntax instance.">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
@@ -98,19 +98,12 @@ Enum BareG28Behavior
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
</div>
<div class="markdown summary"><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>
<div class="markdown summary"><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>
</div>
<div class="markdown conceptual"></div>
@@ -172,193 +165,6 @@ the syntax falls back to <a class="xref" href="Hi.NcParsers.LogicSyntaxs.BareG28
</dd>
</dl>
<h2 id="Hi_NcParsers_LogicSyntaxs_BareG28Behavior_examples">Examples</h2>
<p>All cases hardcode a <code>TestDeps.HomeMc</code> with X/Y home at 0 and Z
home at 100 (typical mill where Z-home is above the table) and leave
the <code>ProgramToMcTransform</code> chain at identity so the final
<code>ProgramXyz</code> equals <code>MachineCoordinateState</code>. The G28
pattern emits a 2-item <code>CompoundMotion</code>: item 0 is the
intermediate point in <code>ProgramXyz</code>, item 1 is the final position
in <code>MachineCoordinateState</code>. Axes not present in the G28 block
keep the previous-block MC value rather than going home.</p>
<p>
<code>G91 G28 X0 Y0 Z0</code> with a <code>#Previous:</code> block carrying
<code>MachineCoordinateState=(50,60,70)</code> — all three axes go home,
so the final MC is the configured home <code>(0,0,100)</code>:
</p>
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "X": 50, "Y": 60, "Z": 70 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": { "X": 0, "Y": 0, "Z": 0 } } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"CompoundMotion": {
"Term": "G28",
"Items": [
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"ProgramXyz": { "X": 0, "Y": 0, "Z": 0 }
},
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"MachineCoordinateState": { "X": 0, "Y": 0, "Z": 100 }
}
]
},
"ProgramXyz": { "X": 0, "Y": 0, "Z": 100 }
}</code></pre>
<code>G91 G28 Z0</code> — only Z goes to its home; X/Y inherit from the
previous block's MC. Item 0's intermediate <code>ProgramXyz</code> takes
X/Y from the inherited program XYZ (= previous MC under identity
transform) and Z from the literal 0 in the G28 block:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "X": 50, "Y": 60, "Z": 70 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": { "Z": 0 } } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"CompoundMotion": {
"Term": "G28",
"Items": [
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"ProgramXyz": { "X": 50, "Y": 60, "Z": 0 }
},
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"MachineCoordinateState": { "X": 50, "Y": 60, "Z": 100 }
}
]
},
"ProgramXyz": { "X": 50, "Y": 60, "Z": 100 }
}</code></pre>
No <a class="xref" href="Hi.NcParsers.Dependencys.IHomeMcConfig.html">IHomeMcConfig</a> dep on the dependency list — the
syntax early-returns and the G28 sub-section stays in <code>Parsing</code>
for an upstream consumer or downstream syntax to handle:
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": { "X": 0, "Y": 0, "Z": 0 } } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": { "X": 0, "Y": 0, "Z": 0 } } }</code></pre>
<p>
Rotary cases below add <code>TestDeps.AxisConfig</code> declaring B as
rotary and extend <code>HomeMc</code> with the conventional B home at 0°.
Each rotary block uses literal B = 45° so item 0's intermediate
(45°), item 1's home (0°), and <code>#Previous:</code> modal B (30°) are
pairwise distinct — a test that swaps any two values for any other
is caught by the assertion. The wrap pass
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McAbcCyclicPathSyntax.html">McAbcCyclicPathSyntax</a>) is a different syntax, so
these per-SUT conformance assertions show only the raw literal /
canonical-home values written by this syntax, before any cyclic
normalization runs.
</p>
<code>G91 G28 B45.</code> — pure rotary G28. Emits a 2-item
<code>CompoundMotion</code> whose items carry only ABC keys in MC; no XYZ
<code>ProgramXyz</code> and no XYZ MC because the block doesn't reference
X/Y/Z (and the conformance harness doesn't run
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> downstream — in the full pipeline that
syntax fills root <code>MachineCoordinateState</code>'s XYZ from root
<code>ProgramXyz</code>, but with no XYZ in the block there's nothing to
fill anyway). Root MC.B holds the canonical home for modal
carry-forward; root <code>ProgramXyz</code> is not written:
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": { "B": 45 } } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 0 },
"CompoundMotion": {
"Term": "G28",
"Items": [
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"MachineCoordinateState": { "B": 45 }
},
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"MachineCoordinateState": { "B": 0 }
}
]
}
}</code></pre>
<code>G28 X0. B45.</code> mixed XYZ + rotary. Both axis kinds occupy the
same two items: item 0 carries the XYZ intermediate
<code>ProgramXyz</code> alongside the rotary literal in MC; item 1
carries the final XYZ MC alongside the rotary home in MC. Root
<code>MachineCoordinateState</code> here holds only the rotary modal value
(B = 0, the home); the XYZ portion of root MC would be filled by
the downstream <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> in the full pipeline
(out of scope for this per-SUT conformance). Root
<code>MachineCoordinateState</code> appears first because the
rotary-home write happens before <code>CompoundMotion</code> /
<code>ProgramXyz</code> are inserted. <code>#Previous:</code> carries B = 30 so
the prev rotary modal is distinct from both the literal (45) and
the home (0):
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "X": 50, "Y": 60, "Z": 70, "B": 30 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": { "X": 0, "B": 45 } } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 0 },
"CompoundMotion": {
"Term": "G28",
"Items": [
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"ProgramXyz": { "X": 0, "Y": 60, "Z": 70 },
"MachineCoordinateState": { "B": 45 }
},
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"MachineCoordinateState": { "X": 0, "Y": 60, "Z": 70, "B": 0 }
}
]
},
"ProgramXyz": { "X": 0, "Y": 60, "Z": 70 }
}</code></pre>
<p>
Bare <code>G28</code> — no axis specifiers — exercises the configurable
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html#Hi_NcParsers_LogicSyntaxs_ReferenceReturnSyntax_BareG28">BareG28</a> policy. Default <a class="xref" href="Hi.NcParsers.LogicSyntaxs.BareG28Behavior.html#Hi_NcParsers_LogicSyntaxs_BareG28Behavior_Alarm">Alarm</a>
emits <code>Coord-RefReturn--003</code> and consumes the G28 without
motion (the diagnostic surfaces through the
<a class="xref" href="Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a> sink, not the block JSON, so the
canonical <code>#AfterBuild</code> is just an empty object):
</p>
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": {} } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{}</code></pre>
Bare <code>G28</code> with <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ReferenceReturnSyntax.html#Hi_NcParsers_LogicSyntaxs_ReferenceReturnSyntax_BareG28">BareG28</a> set to
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.BareG28Behavior.html#Hi_NcParsers_LogicSyntaxs_BareG28Behavior_AllAxesHome">AllAxesHome</a>: the syntax synthesises a
literal at the inherited program position for every configured
linear axis and the previous modal angle for every configured
rotary axis (here X/Y/Z taken from the <code>#Previous:</code> MC under
the identity <code>ProgramToMcTransform</code>, B taken from the prev
modal). Item 0's intermediate therefore equals current (no motion
in stage 1) and item 1 sends each axis to its home:
#Previous:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "X": 10, "Y": 20, "Z": 30, "B": 45 } }</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{ "Parsing": { "G28": {} } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"MachineCoordinateState": { "B": 0 },
"CompoundMotion": {
"Term": "G28",
"Items": [
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"ProgramXyz": { "X": 10, "Y": 20, "Z": 30 },
"MachineCoordinateState": { "B": 45 }
},
{
"MotionEvent": { "Form": "McLinear", "IsRapid": true },
"MachineCoordinateState": { "X": 0, "Y": 0, "Z": 100, "B": 0 }
}
]
},
"ProgramXyz": { "X": 0, "Y": 0, "Z": 100 }
}</code></pre>
</article>