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
2026-09-09 17:35:23 +08:00

615 lines
33 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Interface Parameters | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Interface Parameters | HiAPI-C# 2025 ">
<link rel="icon" href="../../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../../public/main.css">
<meta name="docfx:navrel" content="../../../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../../index.html">
<img id="logo" class="svg" src="../../../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Anatomy-ControllerParameters">
<h1 id="interface-parameters">Interface Parameters</h1>
<p>Two leaves of the Controller branch's machine plane put the controller's non-axis parameters into
domain vocabulary instead of parameter numbers: <strong>Controller Parameters</strong> and <strong>Canned Cycle
(Peck)</strong>. They live on the General Setup page at <code>/general-setup</code> under the Control-Tree ids
<code>equipment/controller/machine/parameters</code> and <code>equipment/controller/machine/canned-cycle</code>. Each value
they edit that is a row of the brand parameter table is also reachable as a raw numbered row on the
sibling leaf, <a class="xref" href="native-parameters.html">Parameters (Native)</a>; the values stored
elsewhere are named below, and they reach no native form at all.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>Anatomy makes no claim that any id named here is stable across versions. The migration hop that
keeps an older <code>?tree=</code> value resolving is described in
<a class="xref" href="../../../platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</p>
</div>
<p>Controller Parameters is ungated: the branch builder pushes it with the brand and the four per-axis
leaves, so it exists wherever a runner resolves. Canned Cycle (Peck) is pushed behind the
<code>hasCannedCycle</code> flag, which is true on all five shipped brand presets — see
<a class="xref" href="../brand-matrix.html">Brand Matrix</a>.</p>
<h2 id="the-five-fields-and-which-brand-shows-which">The Five Fields, and Which Brand Shows Which</h2>
<p>Controller Parameters renders at most five controls, in one column, in this fixed order. There is no
tab, no group box and no scroll region; a field the brand does not have is not disabled but absent.</p>
<table>
<thead>
<tr>
<th>Field the user reads</th>
<th>Control</th>
<th>Backed by</th>
<th>Fanuc, Mazak</th>
<th>Syntec</th>
<th>Siemens</th>
<th>Heidenhain</th>
</tr>
</thead>
<tbody>
<tr>
<td>Max spindle speed</td>
<td>numeric, <code>rpm</code>, minimum 0</td>
<td>the brand parameter table</td>
<td>#3741</td>
<td>Pr3741</td>
<td>MD35100</td>
<td>MP100</td>
</tr>
<tr>
<td>Cutter compensation startup / cancel type</td>
<td>select — Type A / Type B / Type C</td>
<td>the brand parameter table</td>
<td>#5003</td>
<td>Pr5003</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>Tool-axis direction</td>
<td>select — Z / Y / X</td>
<td>the brand parameter table</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>MP101</td>
</tr>
<tr>
<td>GOTO — max jumps per N target †</td>
<td>numeric, minimum 1</td>
<td>an iteration-guard dependency</td>
<td>Fanuc guard</td>
<td>Fanuc guard</td>
<td>Siemens guard</td>
<td>—</td>
</tr>
<tr>
<td>WHILE/DO — max iterations per loop †</td>
<td>numeric, minimum 1</td>
<td>an iteration-guard dependency</td>
<td>Fanuc guard</td>
<td>Fanuc guard</td>
<td>Siemens guard</td>
<td>—</td>
</tr>
</tbody>
</table>
<p>† The Fanuc-family spelling. Siemens spells both guard labels differently — the two pairs are below.</p>
<p>The last two sit under a separator and the caption <em>Macro loop guards (advanced)</em>, and that whole
group is rendered only when at least one of the two guard values resolves. On Heidenhain neither
does, so the separator, the caption and both fields are absent together; that brand shows two fields
in total.</p>
<p><strong>The two guard labels are chosen from the brand marker, not from the dependency that answered.</strong> The
Siemens spellings — <em>GOTOF/GOTOB — max jumps per label</em> and <em>WHILE / FOR / REPEAT / LOOP — max
iterations per loop</em> — are used when the brand marker string reads <code>Siemens</code>, and the Fanuc spellings
otherwise. Syntec and Mazak therefore read the Fanuc spellings, which is correct: both presets carry
the Fanuc guard types. The label and the value are independent lookups, so a runner whose brand
marker was edited apart from its dependency list can show one brand's wording over the other brand's
guard.</p>
<p>The three select options <em>Type A</em> / <em>Type B</em> / <em>Type C</em> are translated strings; the three tool-axis
options <code>Z</code>, <code>Y</code> and <code>X</code> are literal letters written into the component and are the same in every
locale.</p>
<h2 id="visibility-is-null-driven-not-flag-driven">Visibility Is Null-Driven, Not Flag-Driven</h2>
<p>Which fields appear is decided <strong>per field, by a null in the read</strong>, and not by the shared runner
snapshot the tree shape is built from. The reader answers one object with <code>present</code> plus five
nullable numbers, computed by type-switching on the resolved dependencies:</p>
<ul>
<li><strong>Max spindle speed</strong> is non-null for each of the four brand parameter-table types, so it is
present on all five brands. A <code>ControllerParameterTableBase</code> subclass outside those four answers
null, and the field disappears while <code>present</code> stays true.</li>
<li><strong>Cutter compensation type</strong> is non-null only for the Fanuc and the Syntec table.</li>
<li><strong>Tool-axis direction</strong> is non-null only for the Heidenhain table.</li>
<li>Each <strong>guard</strong> is the Fanuc dependency's value if one resolves, otherwise the Siemens dependency's,
otherwise null.</li>
</ul>
<p>The panel's own conditions are <code>!= null</code> on those five keys. No snapshot flag decides a field on this
leaf; the only one read at all is the shared no-runner guard. The snapshot's brand marker is read
twice more, but only to choose between the two guard label pairs — never to show or hide anything.</p>
<p><strong>Three flags in the snapshot describe exactly these fields and are read by nothing.</strong>
<code>hasCutterComp</code>, <code>hasToolAxisDirection</code> and <code>hasIterationGuards</code> are computed server-side, typed,
defaulted and parsed in the client's API layer, and no component consults any of them. They remain a
live part of the REST snapshot for any other client. Two notes about the third:</p>
<ul>
<li><code>hasIterationGuards</code> probes the Fanuc and the Siemens jump-guard types only. The Heidenhain preset
carries a jump guard of its own type, so the flag reports false for a brand that has one. That
matches what the panel shows on the shipped presets — the reader probes the same two types, so the
Heidenhain guard has no field either — while under-describing the runner.</li>
<li>Its doc comment names the Fanuc GOTO / WHILE-DO guards alone while the code also matches the
Siemens jump guard. The code is what ships.</li>
</ul>
<p>The panel's whole body — the guards included — is hidden behind <code>present</code>, which reports the
<strong>parameter table</strong> and nothing else: <em>&quot;No controller parameter table on the active runner.&quot;</em> The
guards live on separate dependencies with their own write endpoints, so a runner carrying guards but
no parameter table would hide two reachable fields. All five brand presets carry a parameter-table
proxy, so the combination does not arise on a shipped preset.</p>
<h2 id="units-edited-versus-stored">Units: Edited Versus Stored</h2>
<p>Every value but one is stored in the unit it is edited in.</p>
<table>
<thead>
<tr>
<th>Value</th>
<th>Edited as</th>
<th>Stored as</th>
</tr>
</thead>
<tbody>
<tr>
<td>Max spindle speed</td>
<td>rpm</td>
<td>rpm, in the table's system-parameter row</td>
</tr>
<tr>
<td>Cutter compensation type</td>
<td>one of three named options</td>
<td>the option's index, 0 / 1 / 2, as a number in the same row set</td>
</tr>
<tr>
<td>Tool-axis direction</td>
<td>one of <code>Z</code> / <code>Y</code> / <code>X</code></td>
<td>0 / 1 / 2 in the same row set</td>
</tr>
<tr>
<td>Macro guards</td>
<td>a plain count</td>
<td>the same count, on the guard dependency</td>
</tr>
<tr>
<td>Peck retraction clearance</td>
<td>mm</td>
<td>mm on Fanuc and Mazak, <strong>microns on Syntec</strong>, mm on the generic fallback</td>
</tr>
</tbody>
</table>
<p><strong>Syntec is the one brand whose stored unit differs from the edited one, and the peck clearance is
the one value it happens to.</strong> The Syntec table's accessor divides its stored row by 1000 on read and
the write multiplies by 1000, so this leaf shows <code>5</code> on every brand while the native leaf shows
<code>5000</code> under Pr4002 on Syntec and <code>5</code> under #4002 on Fanuc and Mazak. An operator copying a number
off a real controller reads the native form; an operator entering a clearance in millimetres reads
this one. The two are the same setting.</p>
<p>The two select fields are the second unit hazard, in a milder form: the native leaf shows their
stored number, <code>0</code>, <code>1</code> or <code>2</code>, with the brand table's own description of that number under the id,
and never the words <em>Type A</em> or <code>Z</code>.</p>
<p>Not every value reaches the native form at all. The two macro guards are properties of their own
runner-owned dependencies rather than rows of any table, so they appear there on no brand; the peck
clearance does the same on Siemens and Heidenhain, where the generic fallback supplies it.</p>
<h2 id="peck-retraction-clearance">Peck Retraction Clearance</h2>
<p>Canned Cycle (Peck) is a single numeric field labelled <em>Peck retraction clearance (G83)</em>, in
millimetres, at zero or above, with a caption naming where the value is stored. Its model is
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ICannedCycleConfig.html#Hi_NcParsers_Dependencys_ICannedCycleConfig_PeckRetractionDistance_mm">PeckRetractionDistance_mm</a>, and the read reports
which implementation answered. Three can, and between them they cover every shipped preset:</p>
<table>
<thead>
<tr>
<th>Caption the user reads</th>
<th>Answered by</th>
<th>Brands</th>
</tr>
</thead>
<tbody>
<tr>
<td><em>Stored in the Fanuc parameter table (#4002, mm).</em></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Fanuc.FanucParameterTable.html">FanucParameterTable</a></td>
<td>Fanuc, Mazak</td>
</tr>
<tr>
<td><em>Stored in the Syntec parameter table (Pr4002, microns) — edited here in mm.</em></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Syntec.SyntecParameterTable.html">SyntecParameterTable</a></td>
<td>Syntec</td>
</tr>
<tr>
<td><em>This brand takes the clearance per call (CYCLE83 / CYCL DEF); this value is the fallback used when a call omits it.</em></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Generic.FallbackConfig.html">FallbackConfig</a></td>
<td>Siemens, Heidenhain</td>
</tr>
</tbody>
</table>
<p>That third caption describes an override the mapping does not implement. The Siemens and Heidenhain
front-end syntaxes translate their own cycle vocabulary into the shared ISO cycle section, whose key
set is fixed at X, Y, Z, R, Q, F, P and K — and none of those eight is a retraction clearance. The
CYCLE83 mapping fills the R plane, the hole bottom Z and the first peck depth Q; the klartext cycle
mapping fills the same three plus a bottom dwell and a feed, and folds the klartext set-up clearance
into the R plane rather than keeping a slot of its own. The shared G83 expansion then reads the
clearance from this dependency unconditionally. So on those two brands the value here is not a
fallback for an omitted argument: it is the clearance every pecking cycle uses.</p>
<p>An <code>ICannedCycleConfig</code> implementation outside those three answers a fourth source token, which no
caption is written for: the field renders at the value that implementation supplies and the line
under it is blank. It is the peck counterpart of the null a parameter table outside the four returns
on the other leaf.</p>
<p>Which storage answered also decides where the value lives. On Fanuc, Mazak and Syntec it is a row of
the project's parameter table and appears in the native form; on Siemens and Heidenhain it is a field
of a plain runner-owned dependency, so it appears in <strong>no</strong> native form and a brand apply returns it
to the preset default — see <a class="xref" href="index.html">Machine and Controller Plane</a>.</p>
<p>The value is consumed by two cycle expansions and they use it differently. In G83 it is the clearance
the tool rapids down to above the previous stroke bottom before feeding deeper; in G73 it is the
whole chip-break retract distance between strokes. The field's label names G83 only. G73 expands on
Fanuc, Mazak, Syntec and Siemens; the Heidenhain syntax list registers the G83 expansion without it.</p>
<h2 id="what-the-values-reach">What the Values Reach</h2>
<p>Four of the six values are read by the parsing pipeline; the other two are stored declarations.</p>
<ul>
<li><strong>Peck retraction clearance</strong> drives the two cycle expansions above.</li>
<li><strong>Tool-axis direction</strong> is read where a Heidenhain <code>PLANE SPATIAL … COORD ROT</code> block is resolved:
it decides which spatial angle may be non-zero for the rotation to count as purely about the tool
axis, which is the only case where COORD ROT suppresses rotary positioning and rotates the
coordinate system instead.</li>
<li><strong>The macro guards</strong> are soft caps with runtime counters. Above the cap the consuming block emits
an iteration-limit warning and stops firing the jump or the loop back-edge, so a runaway macro ends
as a diagnostic instead of an unbounded run. Each is keyed per source file and per target — per N
target, per label or per loop — and the counters reset on the session-init edge while the cap does
not.</li>
<li><strong>Max spindle speed</strong> and <strong>cutter compensation type</strong> are stored, edited and serialized, and no
syntax or semantic in the shipped pipeline reads either. Cutter radius compensation itself <em>is</em>
resolved, by the G41 / G42 / G40 pass over the motion sections; what that pass does not consult is
the A / B / C startup-and-cancel vector style this field records.</li>
</ul>
<h2 id="defaults-a-freshly-seeded-table-opens-on">Defaults a Freshly Seeded Table Opens On</h2>
<p>Each brand's default table decides what the fields show once that brand's table is cloned fresh into
a project; the guards are plain preset entries and are re-created at their type defaults on every
apply.</p>
<table>
<thead>
<tr>
<th>Value</th>
<th>Fanuc, Mazak</th>
<th>Syntec</th>
<th>Siemens</th>
<th>Heidenhain</th>
</tr>
</thead>
<tbody>
<tr>
<td>Max spindle speed</td>
<td>60000</td>
<td>24000</td>
<td>60000</td>
<td>60000</td>
</tr>
<tr>
<td>Cutter compensation type</td>
<td>Type A</td>
<td>Type A</td>
<td>—</td>
<td>—</td>
</tr>
<tr>
<td>Tool-axis direction</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td>Z</td>
</tr>
<tr>
<td>GOTO jump cap</td>
<td>1000</td>
<td>1000</td>
<td>1000</td>
<td>—</td>
</tr>
<tr>
<td>Loop cap</td>
<td>10000</td>
<td>10000</td>
<td>10000</td>
<td>—</td>
</tr>
<tr>
<td>Peck retraction clearance</td>
<td>5 mm</td>
<td>5 mm (5000 stored)</td>
<td>5 mm (fallback)</td>
<td>5 mm (fallback)</td>
</tr>
</tbody>
</table>
<p>The table-backed values — the first three rows, and the peck clearance on the three brands whose
parameter table stores it — are reached only by an apply that leaves the project holding no table of
the incoming proxy's type: the outgoing brand's table is swept and the incoming proxy clones its seed
in place of it. Fanuc and Mazak share one table type, so the hop between those two re-binds the
project's existing table instead, and every value in it survives with its edits. The two guards and
the fallback clearance are runner-owned and return to the preset's on every apply, whichever brands
it runs between.</p>
<p>The two caps differ by an order of magnitude on purpose: a jump is not the legitimate bulk-iteration
primitive, so its cap stays tight, while loops are what generated drill grids and calibration sweeps
are built from.</p>
<h2 id="reading-a-field-can-create-its-row">Reading a Field Can Create Its Row</h2>
<p>Both readers reach the stored values through accessors that <strong>write a default into the table when the
row is absent</strong>. Opening either leaf on a table whose max-spindle, cutter-comp, tool-axis or peck
row was deleted from <a class="xref" href="native-parameters.html">Parameters (Native)</a> therefore
re-creates that row at the type's default, in the live project-owned table, with no edit and no
request from the user. On Heidenhain — which has neither a cutter-comp row nor a peck row — the
max-spindle and tool-axis rows are the whole set. The native leaf's delete removes the row; the next
read of this leaf puts it back.</p>
<p>The guard dependencies have no such behaviour — their values are ordinary properties with field
initializers.</p>
<h2 id="editing-a-field">Editing a Field</h2>
<p>Both leaves follow the branch's shared commit, rollback and toast rules, which are
<a class="xref" href="../editing-contract.html">Editing Contract</a>. Four details are specific to these two
leaves:</p>
<ul>
<li><strong>The numeric fields commit on blur or on Enter</strong>, never per keystroke; their full contract is
<a class="xref" href="../../../widget/numeric-input.html">Numeric Input</a>. The two selects commit on the pick.</li>
<li><strong>Each write is one field.</strong> Every control has its own endpoint and sends only its own value; no
edit here resends a neighbouring field.</li>
<li><strong>A value the handler refuses is left on screen.</strong> Clearing a field parses to null and the handler
returns before the request; a guard field additionally refuses anything that is not a whole number,
and every numeric handler here refuses a non-finite one — the field accepts the words <code>Infinity</code>
and <code>NaN</code> as text and turns them into numbers, and the handlers are what stop them. In each case
the box keeps what was typed — blank, where the field was cleared — while the stored value stands,
because nothing re-writes the box until the panel is remounted by selecting another node and coming
back.</li>
<li><strong>A bound violation never reaches a handler at all.</strong> The numeric field itself refuses a value
below its minimum and shows an untranslated <em>Must be ≥ …</em> under the box. Each handler carries a
lower-bound test of its own — 1 on a guard, 0 on the peck clearance — but the field's own minimum
is the same number and stops every finite value first, so those tests decide nothing.</li>
</ul>
<h2 id="layout">Layout</h2>
<ul>
<li><strong>General Setup</strong> Control Tree — the left dock of <code>/general-setup</code>
<ul>
<li><strong>Controller</strong> Node Row
<ul>
<li><strong>Machine / Controller</strong> Group Row
<ul>
<li><strong>Controller Parameters</strong> Node Row — <code>equipment/controller/machine/parameters</code></li>
<li><strong>Canned Cycle (Peck)</strong> Node Row — <code>equipment/controller/machine/canned-cycle</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Editor Row — the panel of whichever node is selected
<ul>
<li><strong>Controller Parameters</strong> Panel — one column, gutter-spaced
<ul>
<li><strong>Max spindle speed</strong> Numeric Field — dense, outlined, suffixed <code>rpm</code>, minimum 0</li>
<li><strong>Cutter compensation startup / cancel type</strong> Select — dense, outlined; options <strong>Type A</strong>,
<strong>Type B</strong>, <strong>Type C</strong></li>
<li><strong>Tool-axis direction</strong> Select — dense, outlined; options <strong>Z</strong>, <strong>Y</strong>, <strong>X</strong></li>
<li>Guard Group — rendered only when at least one guard value resolves
<ul>
<li>Separator</li>
<li><strong>Macro loop guards (advanced)</strong> Caption</li>
<li>Jump-Guard Numeric Field — minimum 1; labelled <strong>GOTO — max jumps per N target</strong> or
<strong>GOTOF/GOTOB — max jumps per label</strong></li>
<li>Loop-Guard Numeric Field — minimum 1; labelled <strong>WHILE/DO — max iterations per loop</strong> or
<strong>WHILE / FOR / REPEAT / LOOP — max iterations per loop</strong></li>
</ul>
</li>
<li>No-Table Block — replaces every field above:
<em>&quot;No controller parameter table on the active runner.&quot;</em></li>
</ul>
</li>
<li><strong>Canned Cycle (Peck)</strong> Panel — one column, gutter-spaced
<ul>
<li><strong>Peck retraction clearance (G83)</strong> Numeric Field — dense, outlined, suffixed <code>mm</code>, minimum 0</li>
<li>Source Caption — one of the three sentences in the table above, or empty where a fourth
implementation answered</li>
<li>No-Config Block — replaces both:
<em>&quot;No canned-cycle config on the active runner.&quot;</em></li>
</ul>
</li>
<li>Shared Empty State — replaces either panel's whole body while the snapshot reports no runner:
<em>&quot;No NC runner — load a project first.&quot;</em></li>
</ul>
</li>
</ul>
<p>Neither panel has a table, an add-row control, a delete control or a Save button.</p>
<h2 id="source-code-path">Source Code Path</h2>
<p>See <a class="xref" href="../../../index.html">HiNC App Anatomy</a> for git repository links.</p>
<h3 id="web-application">Web Application</h3>
<p>HiNC-2025-webservice (Quasar CLI SPA):</p>
<ul>
<li><code>wwwroot-src/src/components/controlTree/SoftNcControllerParamsPanel.vue</code> — the five-field panel:
the per-field <code>!= null</code> conditions, the guard group's combined condition, the brand-marker choice
between the two guard label pairs, the translated compensation-type options beside the literal
tool-axis letters, and the three commit handlers with their null, non-finite and integer refusals
beside the lower-bound tests the field's own minimum shadows.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcCannedCyclePanel.vue</code> — the peck panel: the single
field, the presence layer, and the caption chosen from the read's source token.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue</code> — the shared no-runner line both
panels open with.</li>
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the numeric field: the unit rendered as a
suffix, commit on blur or Enter, the empty-text-to-null parse both panels reject, and the
untranslated bound message that stops a value before it is emitted.</li>
<li><code>wwwroot-src/src/components/controlTree/softNcItemTypes.ts</code> — the two node ids and their labels:
Controller Parameters among the unconditional machine leaves, Canned Cycle (Peck) behind the
peck-provider flag.</li>
<li><code>wwwroot-src/src/api/softNcRunner.ts</code> — the two readers and their setters, the five nullable
parameter keys, the peck source token, and the three snapshot flags that describe these fields and
are declared, defaulted and parsed without a consumer.</li>
<li><code>wwwroot-src/src/composables/useSoftNcRunner.ts</code> — the shared runner snapshot the first empty layer
reads.</li>
<li><code>wwwroot-src/src/i18n/en/softNc.ts</code> — the two node labels, the five field labels, the two guard
label pairs, the compensation-type options, the macro-guard caption, the three peck source
sentences and the two empty-state lines quoted above.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the REST surface: the parameter read's type switches and its
table-only presence flag, one write per field, the guard writes that fall back from the Fanuc
dependency to the Siemens one, the peck read with its source token, and the peck write that
converts to microns for the Syntec table.</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiMech/NcParsers/Dependencys/ControllerParameterTableBase.cs</code> — the base every brand table
extends, and the raw system-parameter dictionary the first three fields are rows of.</li>
<li><code>HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTable.cs</code> — the Fanuc and Mazak table: the
max-spindle, peck-clearance and cutter-comp parameter numbers, the compensation-type enum with its
three vector styles, the millimetre peck accessor, and the default seed.</li>
<li><code>HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTable.cs</code> — the Syntec table: the same three
parameter numbers, the micron peck row and the accessor that converts it, and the default seed.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTable.cs</code> — the Siemens table: the
max-spindle machine datum, and the absence of any compensation-type or peck member.</li>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTable.cs</code> — the Heidenhain table: the
max-spindle and tool-axis-direction machine parameters and their default seed.</li>
<li><code>HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTableProxy.cs</code> — the proxy shape all four brand
tables share: the seed clone that fires only where the project holds no table of that type, and
the pure take afterwards.</li>
<li><code>HiMech/NcParsers/Dependencys/ICannedCycleConfig.cs</code> — the peck-clearance contract and its three
implementations.</li>
<li><code>HiMech/NcParsers/Dependencys/Generic/FallbackConfig.cs</code> — the runner-owned clearance the Siemens
and Heidenhain presets carry, and its millimetre default.</li>
<li><code>HiMech/NcParsers/Dependencys/Fanuc/FanucGotoIterationDependency.cs</code>,
<code>HiMech/NcParsers/Dependencys/Fanuc/FanucWhileDoIterationDependency.cs</code>,
<code>HiMech/NcParsers/Dependencys/Siemens/SiemensGotoIterationDependency.cs</code>,
<code>HiMech/NcParsers/Dependencys/Siemens/SiemensLoopIterationDependency.cs</code> — the four guards the two
advanced fields write: their caps, their per-file counters and the session reset that clears the
counters alone.</li>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainGotoIterationDependency.cs</code> — the fifth guard,
the one the reader does not probe and no field edits.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the five brand presets: which parameter-table proxy, which
guards and whether a fallback clearance each one carries.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/CannedCycleSyntaxUtil.cs</code> — the shared ISO cycle section: the fixed
eight-key parameter set none of whose keys is a retraction clearance, and the modal merge that
consumes them.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/PeckDrillingCycleSyntax.cs</code> — the G83 expansion, which reads the
clearance from the dependency rather than from the block.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/HighSpeedPeckCycleSyntax.cs</code> — the G73 expansion that spends the
same value as the chip-break retract distance.</li>
<li><code>HiMech/NcParsers/Syntaxs/FanucSyntaxUtil.cs</code>,
<code>HiMech/NcParsers/Syntaxs/MazakSyntaxUtil.cs</code>,
<code>HiMech/NcParsers/Syntaxs/SyntecSyntaxUtil.cs</code>,
<code>HiMech/NcParsers/Syntaxs/SiemensSyntaxUtil.cs</code>,
<code>HiMech/NcParsers/Syntaxs/HeidenhainSyntaxUtil.cs</code> — the five brand syntax lists, and which of
them register both peck expansions against the one that registers the G83 expansion alone.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/Siemens/SiemensModalCycleSyntax.cs</code> — the CYCLE83 mapping onto the
shared cycle section, and the arguments it drops.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainCannedCycleSyntax.cs</code> — the klartext cycle
mapping onto the same section.</li>
<li><code>HiMech/NcParsers/LogicSyntaxs/Heidenhain/HeidenhainPlaneTiltSyntax.cs</code> — the one consumer of the
tool-axis direction: the pure-tool-axis test that decides whether COORD ROT suppresses rotary
positioning.</li>
<li><code>HiMech/NcParsers/PostLogicSyntaxs/RadiusCompensationSyntax.cs</code> — the cutter radius compensation
that is resolved, and that does not consult the stored startup-and-cancel type.</li>
<li><code>HiGeom/Common/Collections/DictionaryUtil.cs</code> — the get-or-create the table accessors read through,
and therefore why a read re-creates a deleted parameter row.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="index.html">Machine and Controller Plane</a> — the plane these two leaves sit on, and which half of the project
each of their values is stored in</li>
<li><a class="xref" href="../brand-matrix.html">Brand Matrix</a> — why one of the two leaves is gated and the other is not, and
which brand resolves which parameter table</li>
<li><a class="xref" href="../editing-contract.html">Editing Contract</a> — the fetch, commit, rollback and empty-layer rules these
panels share with the rest of the branch</li>
<li><a class="xref" href="native-parameters.html">Native Parameters</a> — the same rows by number, in their raw stored units,
including the peck clearance this page shows converted</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>