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/anatomy/general-setup/controller/machine/native-parameters.html
T
2026-09-09 18:06:21 +08:00

561 lines
35 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>Native Parameters | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Native 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-ControllerNativeParameters">
<h1 id="native-parameters">Native Parameters</h1>
<p>Parameters (Native) is the machine plane's escape hatch: the brand parameter table rendered as the
flat numbered form an operator reads off the real control, with no domain vocabulary and no unit
conversion in between. It lives on the General Setup page at <code>/general-setup</code> under the Control-Tree
id <code>equipment/controller/machine/native</code>, and it is one of the two leaves the <code>hasNativeTable</code>
snapshot flag grows — the other, M-Code Declarations, edits a different part of the same object.
Every value the domain-grouped leaves beside it edit <em>that is a row of the brand parameter table</em> is
a row here; the ones stored elsewhere — the tool-change pose, the block-skip layers, the subprogram
folders and the indexing position lists among them — reach no native form at all. Several rows here
reach no domain-grouped face.</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>The leaf is pushed behind <code>hasNativeTable</code>, which reports whether any
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html">ControllerParameterTableBase</a> resolves in the runner's effective
dependency list. All five shipped presets carry one, so the flag is a gate in code and unconditional
in practice — see <a class="xref" href="../brand-matrix.html">Brand Matrix</a>.</p>
<h2 id="how-a-parameter-is-addressed">How a Parameter Is Addressed</h2>
<p>The table stores its numbers in three dictionaries, and the panel is those three dictionaries with a
heading over each:</p>
<table>
<thead>
<tr>
<th>Section heading the user reads</th>
<th>Backing storage</th>
<th>Cell</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>System parameters</strong></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html#Hi_NcParsers_Dependencys_ControllerParameterTableBase_SystemParams">SystemParams</a></td>
<td>one value per id</td>
</tr>
<tr>
<td><strong>Axis parameters</strong></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html#Hi_NcParsers_Dependencys_ControllerParameterTableBase_AxisParams">AxisParams</a></td>
<td>one floating-point value per id <strong>per axis</strong></td>
</tr>
<tr>
<td><strong>Axis parameters (integer)</strong></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html#Hi_NcParsers_Dependencys_ControllerParameterTableBase_IntAxisParams">IntAxisParams</a></td>
<td>one integer value per id <strong>per axis</strong></td>
</tr>
</tbody>
</table>
<p>An id is a bare number in storage. What the panel prints in front of it is the brand's prefix, and
that prefix is the whole of the addressing convention:</p>
<table>
<thead>
<tr>
<th>Brand marker</th>
<th>Prefix shown</th>
<th>Table that answers</th>
<th>Example row</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fanuc</td>
<td><code>#</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Fanuc.FanucParameterTable.html">FanucParameterTable</a></td>
<td><code>#1420</code> rapid traverse rate</td>
</tr>
<tr>
<td>Mazak</td>
<td><code>#</code></td>
<td>the <strong>Fanuc</strong> table</td>
<td><code>#1420</code> rapid traverse rate</td>
</tr>
<tr>
<td>Syntec</td>
<td><code>Pr</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Syntec.SyntecParameterTable.html">SyntecParameterTable</a></td>
<td><code>Pr1420</code> rapid traverse rate</td>
</tr>
<tr>
<td>Siemens</td>
<td><code>MD</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a></td>
<td><code>MD32000</code> max axis velocity</td>
</tr>
<tr>
<td>Heidenhain</td>
<td><code>MP</code></td>
<td><a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.Heidenhain.HeidenhainParameterTable.html">HeidenhainParameterTable</a></td>
<td><code>MP1010</code> rapid traverse rate</td>
</tr>
</tbody>
</table>
<p><strong>Mazak borrows the Fanuc table outright.</strong> The Mazak preset carries the Fanuc parameter-table proxy
rather than one of its own, so the prefix resolves to <code>#</code> and every number on this leaf is a Fanuc
parameter number under a <code>Mazak</code> brand badge. The prefix is not taken from the brand marker string
but from the type of the parameter table that resolved, so the two cannot drift apart the way a
brand-marker label can — see <a class="xref" href="../brand-matrix.html">Brand Matrix</a>.</p>
<p>A <code>ControllerParameterTableBase</code> subclass outside those four resolves an empty prefix, and the ids
then render bare. No shipped preset produces that.</p>
<p>The prefix the panel renders comes from the leaf's <strong>own</strong> read of the parameter form. The shared
runner snapshot carries a prefix field of its own, and nothing renders it.</p>
<h3 id="the-caption-under-the-id">The caption under the id</h3>
<p>Each id cell carries the number in bold and, beneath it, a short usage caption — <em>Rapid traverse rate
(mm/min or deg/min)</em>, <em>Axis type (0 linear / 1 rotary / 2 spindle)</em>, <em>G54 X offset</em>, <em>Tool change M
function code</em>. The same text repeats as the cell's hover title.</p>
<p>The caption is the brand table's own description of a well-known number, produced by
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html#Hi_NcParsers_Dependencys_ControllerParameterTableBase_DescribeSystemParam_">DescribeSystemParam</a><small>(API)</small>
and its two per-axis counterparts, and it travels down the wire with the row. It is therefore
<strong>engine text, not an interface string</strong>: it is written in English in the brand table and belongs to
no locale bundle, so it reads the same under every language the application offers. An id the brand
table does not model has no caption at all, which is how a modelled row and a free extra are told
apart on screen.</p>
<h2 id="raw-values-raw-units">Raw Values, Raw Units</h2>
<p>The caption at the top of the panel states the rule: <em>&quot;Raw stored values in native units — no unit
conversion is applied here. The interface-form nodes edit the same backing table.&quot;</em></p>
<p>No cell carries a unit suffix, and none can: the unit belongs to the number, not to the column. What
a cell means is whatever the brand stores at that address — millimetres or degrees on a stroke limit,
mm/min or deg/min on a rapid rate, rpm on a spindle limit, an enumeration ordinal on an axis type, a
count on a controlled-axis parameter.</p>
<p><strong>The peck clearance is the case where the two forms visibly disagree, and it ships.</strong> Canned Cycle
(Peck) always speaks millimetres; the Fanuc-family table stores millimetres at <code>#4002</code>, and the
Syntec table stores <strong>microns</strong> at <code>Pr4002</code>. A machine at a 5 mm clearance therefore reads <code>5</code> on
<a class="xref" href="interface-parameters.html">Interface Parameters</a> on every brand, and reads <code>5</code> here on Fanuc
and Mazak but <code>5000</code> here on Syntec. The write endpoint converts on the way in; this leaf does not,
which is the point of it — an operator copying from a real Syntec control reads the micron form.</p>
<p>Two further asymmetries follow from where a value is stored rather than from its unit:</p>
<ul>
<li><strong>On Siemens and Heidenhain the peck clearance has no row here at all.</strong> Those two presets supply
it through a generic fallback config, a plain runner entry rather than a parameter table, so the
interface leaf shows a field whose backing has no place in this form.</li>
<li><strong>On the Fanuc-family and Syntec tables the work-coordinate offsets are rows of this table.</strong> The
G54–G59 triads start at <code>#5221</code> and the G54.1 P1–P48 triads at <code>#7001</code>, both on a stride of 20, all
in the System parameters section. That mixing is why the machine plane's parameter table is stored
on the project rather than on the runner — see
<a class="xref" href="index.html">Machine and Controller Plane</a>. On the Fanuc-family table those two
address ranges are also what an NC program's <code>#</code>-variable read resolves against, so those rows are
live in both directions.</li>
</ul>
<h2 id="what-only-this-leaf-reaches">What Only This Leaf Reaches</h2>
<p>Most rows have a domain-grouped twin. These do not.</p>
<p><strong>The axis roster itself.</strong> Every per-axis leaf of the branch — Machine Limits (Stroke), Rapid
Feedrates, Home / G28 Reference, Tool-Change Position — lists the axes named by the <strong>axis-type row</strong>
of this table (<code>#1006</code>, <code>Pr1006</code>, <code>MD30300</code>, <code>MP400</code>), because
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html#Hi_NcParsers_Dependencys_ControllerParameterTableBase_AxisNames">AxisNames</a> is that row's key set. None of
those leaves can add an axis, rename one, remove one, or change one from linear to rotary; their
columns are handed to them. Inside the Controller branch the axis-type row is editable here and
nowhere else, through the footer with the section set to <strong>Axis (integer)</strong>, the brand's axis-type
number as the id, an axis name, and a value of <code>0</code> linear, <code>1</code> rotary or <code>2</code> spindle. The one other
writer is outside the branch entirely:
<a class="xref" href="../../../../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_ConfigureByMachiningChain_">ConfigureByMachiningChain</a><small>(API)</small> stamps the machining
chain's axis codes into the same row when a machine tool is attached to the project; an axis the
chain does not name stays in the row. That call does not stop at the axis-type row: a chain axis it
marks rotary also has its reference position set to <code>0</code> and its rapid rate to <code>36000</code> deg/min,
whatever those two Axis parameters rows held.</p>
<p>The inverse holds, with one exception. Deleting the axis-type row leaves the table with no named
axes, so Machine Limits (Stroke), Rapid Feedrates and Home / G28 Reference have no rows left to
draw. Tool-Change Position keeps its own: its reader falls back to the tool-change configuration's
own axis keys when the axis set is empty, and every shipped preset seeds that configuration with X,
Y and Z. Rows recovered that way carry no axis type and are reported linear.</p>
<p><strong>The Siemens indexing machine data, all four numbers.</strong> <code>MD30500</code>, the per-axis assignment that
decides which axis consumes which position table, is <em>shown</em> on
<a class="xref" href="indexing-positions.html">Indexing Position Tables</a> as display-only text and is
written here as an <strong>Axis parameters (integer)</strong> row; the REST surface carries no assignment writer
at all. The equidistant definition — the numerator <code>MD30501</code> and the offset <code>MD30503</code> as axis
parameters, the denominator <code>MD30502</code> as an integer axis parameter — has no endpoint that reads or
writes it and no panel that offers a cell for it: it is three ordinary rows on this leaf. The engine is its reader: an axis whose <code>MD30500</code> is 3 resolves its station spacing from
the trio, and Indexing Position Tables prints that axis' assignment as <em>Equidistant
(MD30501–MD30503)</em>, naming the three numbers it offers no cell for. The two position lists
themselves are the mirror image, stored as list properties outside all three dictionaries and so
absent from this form entirely.</p>
<p><strong>Numbers with no interface field.</strong> The controlled-axis count (<code>#1020</code>, <code>Pr1020</code>) is read by nothing
in the web service. The Siemens fixed-point position <code>MD30600</code>, the G75 target, likewise. So is the
Siemens tool-change M function <code>MD22560</code>, whose presence overlays a tool-change effect onto the named
code in the declaration view the parsers resolve against. M-Code Declarations renders the stored map
rather than that view, so the overlaid row is on no screen at all: the effect is honoured in every
program the machine runs, and the one number that shows anywhere is this row. The Siemens tool-change
mode <code>MD22550</code> is a half case: where the row already exists, the <em>T word performs the tool change
itself</em> toggle on M-Code Declarations writes it, and where it does not, that toggle writes a
brand-neutral flag instead; creating the row is possible only here.</p>
<p><strong>Any number the model does not name.</strong> The three writers are get-or-create, so an id outside the
brand's well-known set is accepted, stored, serialized into the project file and read back. It
carries no usage caption, and the engine consumes only the numbers its brand table models — a free
extra is a record, not a setting.</p>
<h2 id="a-fractional-number-has-three-fates">A Fractional Number Has Three Fates</h2>
<p>The <strong>Axis parameters (integer)</strong> section is the one place on the branch where a value can be typed,
accepted by the field, and silently discarded.</p>
<p>The cell is the shared numeric widget, which commits on blur or Enter and carries no integer rule.
Typing <code>2.5</code> parses cleanly: the widget clears its own error state, emits <code>2.5</code> to the panel, and
rewrites its text to the parsed form. The panel's integer handler is where the value stops — it
returns without assigning and without raising anything when the number is not whole. Because the
bound value never changed, nothing pushes the stored integer back into the box. <strong>The cell goes on
reading <code>2.5</code> over a table that still holds the old integer</strong>, with no error message, no toast and no
console line. The row corrects itself only when the panel refetches: after an add, after a removal,
or on a fresh mount when the selection leaves this leaf and comes back.</p>
<p>The footer does not behave the same way. <strong>Add / Set</strong> with <strong>Axis (integer)</strong> selected <em>truncates</em> a
fractional value toward zero and writes the truncation, so the same <code>2.5</code> becomes a stored <code>2</code>; and
the same button refuses a fractional <strong>Parameter id</strong> outright, with the message <em>&quot;Enter a
non-negative integer id and a value.&quot;</em> That refusal belongs to the button, not to the box — the
<strong>Parameter id</strong> field is the shared numeric widget with a minimum of 0 and no integer rule, so it
accepts and keeps <code>2.5</code> the way any other cell does, and the one message answers an empty <strong>Value
(raw)</strong> as well. Three controls, one number, three outcomes.</p>
<p><strong>Clearing any cell ends the same way for a different reason.</strong> An emptied field commits <code>null</code>, and
all three handlers return early on <code>null</code>, so the box is blank and the stored value is untouched.
There is no way to unset one cell of a table; the value stands until it is overwritten or its whole
row is removed. The general rule for a box that disagrees with its model is
<a class="xref" href="../../../widget/numeric-input.html">Numeric Input</a>; what is particular here is that the widget did nothing
wrong — the panel accepted the commit and dropped it.</p>
<h2 id="adding-overwriting-and-removing-a-row">Adding, Overwriting and Removing a Row</h2>
<p>The footer is one control set for both adding and overwriting, and the button says so: <strong>Add / Set</strong>.
The write is get-or-create at every level — an unknown id creates its row, an unknown axis name
creates its column — so setting an existing cell and creating a new one are the same request.</p>
<ul>
<li>The <strong>Axis</strong> field appears only while the section is not <em>System</em>, is free text, and is trimmed and
checked for emptiness only. It is not validated against the machine's axes: any name is accepted
and becomes a new column.</li>
<li>A successful add re-reads the whole form. The footer's own fields are <strong>not</strong> cleared, and Enter
does not submit — see <a class="xref" href="../editing-contract.html">Editing Contract</a> for how the
branch's add footers differ from one another.</li>
<li>The two client-side refusals are the id, which must be a non-negative whole number, and, for the
two per-axis sections, a non-empty axis name. Each raises a negative toast and sends nothing.</li>
</ul>
<p><strong>Delete is per row, not per cell.</strong> The trailing button on a row of either per-axis table removes
the id from that dictionary entirely — every axis column of it at once, not the cell it sits beside.
A confirmation dialog comes first, titled <em>Remove parameter</em> and reading <em>Remove <code>&lt;prefixed id&gt;</code> from
the <code>&lt;section&gt;</code> section?</em>, where the section word is the storage kind — <em>system</em>, <em>axis</em>, <em>int-axis</em> —
rather than the heading printed above the table. The removal is not optimistic: the request is
awaited and the whole form is re-read.</p>
<p><strong>A deleted well-known row can come back on its own.</strong> The brand tables' modelled accessors are
get-or-create with a default, so a read through a sibling leaf re-materializes the row it wants. The
clearest case is the maximum spindle speed: delete <code>#3741</code> here, open Interface Parameters, and that
read stores the brand's default back — 60000 on Fanuc, Mazak, Siemens and Heidenhain, 24000 on
Syntec — so the row reappears at that value. The cutter-compensation type, the tool-axis direction
and the peck clearance behave the same way. A free extra id has no accessor and stays deleted.</p>
<h2 id="what-a-freshly-switched-brand-shows">What a Freshly Switched Brand Shows</h2>
<p>The seed each brand's proxy clones decides what the three tables open with. All five declare a linear
X, Y and Z in the axis-type row, a reference position of zero per axis and a rapid rate per axis, so
on every brand the Axis parameters section opens with two rows and the Axis parameters (integer)
section with one. The System section is where they part company.</p>
<table>
<thead>
<tr>
<th>Brand</th>
<th>System parameters</th>
<th>Axis parameters</th>
<th>Axis parameters (integer)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fanuc, Mazak</td>
<td>166 rows — controlled axes, max spindle speed, peck retraction, cutter-comp type, and 162 seeded work-offset addresses at zero</td>
<td>reference position, rapid rate</td>
<td>axis type</td>
</tr>
<tr>
<td>Syntec</td>
<td>166 rows — the same four under <code>Pr</code> numbering, the peck retraction in microns, and the same 162 offsets</td>
<td>reference position, rapid rate</td>
<td>axis type</td>
</tr>
<tr>
<td>Siemens</td>
<td>1 row — max spindle speed</td>
<td>reference position, max axis velocity</td>
<td>axis type</td>
</tr>
<tr>
<td>Heidenhain</td>
<td>2 rows — max spindle speed, tool-axis direction</td>
<td>reference position, rapid rate</td>
<td>axis type</td>
</tr>
</tbody>
</table>
<p>The 162 offset rows are
<a class="xref" href="../../../../api/Hi.NcParsers.Dependencys.IsoCoordinateAddressMap.html#Hi_NcParsers_Dependencys_IsoCoordinateAddressMap_SeedAllDefaults_">SeedAllDefaults</a><small>(API)</small> writing
every G54–G59 and G54.1 P1–P48 triad as zero, so that a managed address always has a value the way a
real control with a fresh battery reads zero rather than nothing. They dominate the System section on
the three brands that carry them, and their captions — <em>G54 X offset</em>, <em>G54.1P12 Z offset</em> — are what
separates them from machine configuration in the same list.</p>
<p>No brand seeds a stroke limit, so the positive and negative stroke-limit rows are absent from the
Axis parameters section until Machine Limits (Stroke) or this leaf creates them.</p>
<h2 id="the-two-empty-layers-and-which-one-is-reachable">The Two Empty Layers, and Which One Is Reachable</h2>
<p>The panel opens through the branch's shared two-layer gate. The first layer is the shared <em>&quot;No NC
runner — load a project first.&quot;</em> from the runner snapshot; the second is <em>&quot;No controller parameter
table on the active runner.&quot;</em> from the leaf's own read — the same line M-Code Declarations and
Interface Parameters show, and honest in all three, because every one of those reads reports presence
from the same parameter-table lookup.</p>
<p>Neither line is normally reached by navigating, because the node itself exists only while the
snapshot reported a parameter table. The second line is also what a failed read leaves on screen: the
presence flag starts false and the failure path only raises a toast. A failed write answers inside a
success envelope — HTTP 200 carrying <code>No ControllerParameterTableBase on the active runner</code> — and
surfaces as one negative toast, three seconds, the panel's localized context followed by that raw
English sentence. The full rule is <a class="xref" href="../editing-contract.html">Editing Contract</a>.</p>
<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>Parameters (Native)</strong> Node Row — <code>equipment/controller/machine/native</code>, the last leaf of the
plane, after <strong>Indexing Position Tables</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Editor Row — the panel of the selected node
<ul>
<li><strong>Parameters (Native)</strong> Panel — one column, gutter-spaced
<ul>
<li>Hint Caption — <em>&quot;Raw stored values in native units — no unit conversion is applied here. The
interface-form nodes edit the same backing table.&quot;</em></li>
<li><strong>System parameters</strong> Section Heading</li>
<li>System Table — dense, flat, bordered
<ul>
<li>Header Row — <strong>Id</strong>, <strong>Value</strong>, and an unlabelled action column</li>
<li>Data Row — the prefixed id in bold over its usage caption (absent on a free extra), a numeric
cell, and a delete button</li>
</ul>
</li>
<li><strong>Axis parameters</strong> Section Heading</li>
<li>Axis Table — dense, flat, bordered
<ul>
<li>Header Row — <strong>Id</strong>, then one column per axis name, then an unlabelled action column</li>
<li>Data Row — the prefixed id in bold over its usage caption, one numeric cell per axis column
(blank where the row has no entry for that axis), and a delete button that removes the whole
id</li>
</ul>
</li>
<li><strong>Axis parameters (integer)</strong> Section Heading</li>
<li>Integer Axis Table — the same shape as the Axis Table, over the integer dictionary</li>
<li>Separator</li>
<li>Add Row — one line, bottom-aligned
<ul>
<li><strong>Section</strong> Select — <em>System</em> / <em>Axis (double)</em> / <em>Axis (integer)</em></li>
<li><strong>Parameter id</strong> Numeric Field — minimum 0</li>
<li><strong>Axis</strong> Text Field — present only while the section is not <em>System</em></li>
<li><strong>Value (raw)</strong> Numeric Field</li>
<li><strong>Add / Set</strong> Button — primary</li>
</ul>
</li>
<li>No-Table Body — replaces everything above: <em>&quot;No controller parameter table on the active
runner.&quot;</em></li>
<li>Shared Empty State — replaces the whole body while the snapshot reports no runner: <em>&quot;No NC
runner — load a project first.&quot;</em></li>
</ul>
</li>
<li>Remove Dialog — <em>Remove parameter</em> over <em>Remove <code>&lt;prefixed id&gt;</code> from the <code>&lt;section&gt;</code> section?</em>,
with a cancel</li>
<li>Toast — negative, three seconds, the panel's context followed by the server's own message</li>
</ul>
</li>
</ul>
<p>The axis columns of the two per-axis tables are computed independently of each other, and each is the
union of the shared snapshot's axis names with every axis key present in that table's own rows. An
axis created here therefore gets its column from the rows even before the shared snapshot is next
refreshed, and an axis the snapshot knows about with no entry in a row shows an empty cell rather
than being omitted.</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/SoftNcNativeParamsPanel.vue</code> — this panel: the three tables
over the three dictionaries, the prefixed id column with its usage caption, the axis-column union,
the three commit handlers with the integer test that drops a fractional value, the
confirm-then-remove flow, and the add footer with its truncation and its two refusals.</li>
<li><code>wwwroot-src/src/components/controlTree/softNcItemTypes.ts</code> — the node's id, label and label key,
and the snapshot flag it is pushed behind, last on the machine plane.</li>
<li><code>wwwroot-src/src/api/softNcRunner.ts</code> — the reader that parses the prefix and the three row
families, the three per-cell writers and the three per-id removals, and the snapshot field carrying
a prefix this panel does not use.</li>
<li><code>wwwroot-src/src/composables/useSoftNcRunner.ts</code> — the shared snapshot the first empty layer and the
axis-column union read.</li>
<li><code>wwwroot-src/src/components/widgets/NumericInput.vue</code> — the cell: commit on blur or Enter, the
parsed value written back into the box, and the absence of any integer rule.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue</code> — the shared no-runner line.</li>
<li><code>wwwroot-src/src/components/controlTree/SoftNcIndexingPositionsPanel.vue</code> — the sibling that
displays the MD30500 assignment this leaf writes, and points here for it.</li>
<li><code>wwwroot-src/src/api/http.ts</code> — the shared fetch helper that turns both a non-2xx status and a
<code>success: false</code> body into one thrown error.</li>
<li><code>wwwroot-src/src/i18n/en/softNc.ts</code> — the node label, the raw-units hint, the three section
headings, the three add-footer section options, the two footer refusals and the five error
contexts — one read and four writes, the two per-axis savers sharing a context.</li>
<li><code>wwwroot-src/src/i18n/en/common.ts</code> — the shared <strong>Id</strong>, <strong>Value</strong>, <strong>Axis</strong> and <strong>Add / Set</strong>
strings.</li>
<li><code>wwwroot-src/src/i18n/en/dialog.ts</code> — the remove dialog's title, its message, and the three storage
kind words it interpolates.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the REST surface: the read that orders each dictionary by id and
attaches the brand's usage description to every row, the prefix computed from the resolved table's
type, the three get-or-create writers and the three whole-row removals, the shared dependency
wrapper that answers a missing table inside a success envelope, and the neighbouring readers this
form's rows also feed — the three per-axis reads that take the axis-type row's key set bare, the
tool-change read that falls back to its own configuration's keys when that set is empty, and the
M-code read bound to the stored declaration map rather than the overlaid view.</li>
</ul>
<h3 id="hiapi-engine">HiAPI Engine</h3>
<ul>
<li><code>HiMech/NcParsers/Dependencys/ControllerParameterTableBase.cs</code> — the three dictionaries this leaf
is, the get-or-create bucket accessors, the role interfaces that let the domain-grouped leaves read
the same rows, the axis-name set taken from the axis-type row, the three usage-description methods,
the rotary-axis helper that writes type, reference position and rapid rate in one call, and the XML
round-trip that persists every row including free extras.</li>
<li><code>HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTable.cs</code> — the <code>#</code> vocabulary: the well-known
numbers, the get-or-create defaults behind the modelled accessors, the macro-variable lookup over
the work-offset address ranges, and the seed a fresh Fanuc or Mazak runner opens on.</li>
<li><code>HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTable.cs</code> — the <code>Pr</code> vocabulary, and the peck
clearance stored in microns with the conversion kept in its accessor.</li>
<li><code>HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTable.cs</code> — the <code>MD</code> vocabulary: the
indexing assignment, the three equidistant numbers this leaf alone edits and the spacing
resolution that reads them, the tool-change mode, the tool-change M function with the read-time
declaration overlay that never enters the stored map, the fixed-point position, and the seed that
declares one system row.</li>
<li><code>HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTable.cs</code> — the <code>MP</code> vocabulary and its
two-row seed.</li>
<li><code>HiMech/NcParsers/Dependencys/IsoCoordinateAddressMap.cs</code> — the work-offset address scheme shared by
the Fanuc and Syntec tables, the per-address description that captions those rows, and the seeding
of every triad to zero.</li>
<li><code>HiMech/NcParsers/Dependencys/IMachineAxisConfig.cs</code> — the axis contract, and the axis-type
enumeration a cell of the integer section stores.</li>
<li><code>HiMech/NcParsers/Dependencys/Generic/ToolingMcConfig.cs</code> — the tool-change pose, stored outside
the three dictionaries, whose own X / Y / Z keys are what Tool-Change Position falls back to when
the axis-type row is gone.</li>
<li><code>HiMech/NcParsers/SoftNcRunner.cs</code> — the five brand presets and which parameter-table proxy each
carries, the Fanuc proxy inside the Mazak preset among them, the tool-change configuration every
preset seeds, and the chain configuration that is the only other writer of the axis-type row and,
on a rotary chain axis, of that axis' reference position and rapid rate.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="index.html">Machine and Controller Plane</a> — the plane this leaf sits on, and why the table it exposes is
stored on the project rather than on the runner file</li>
<li><a class="xref" href="../brand-matrix.html">Brand Matrix</a> — the flag that grows this node, why it never reports false on
a shipped preset, and why Mazak resolves the Fanuc table</li>
<li><a class="xref" href="../editing-contract.html">Editing Contract</a> — the commit, rollback, confirm and toast rules this panel
shares with the branch, and the add-footer details it differs on</li>
<li><a class="xref" href="interface-parameters.html">Interface Parameters</a> — the same values in domain vocabulary, including the peck
clearance this leaf shows in the brand's own unit</li>
<li><a class="xref" href="indexing-positions.html">Indexing Position Tables</a> — the leaf that displays the MD30500 assignment and the
equidistant definition that are written here</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>