Table of Contents

Native Parameters

Parameters (Native) is the machine plane's escape hatch: the brand parameter table rendered as a flat numbered form under HiNC's storage keys, modeled on controller parameter numbers — which does not make every number the control's — with no domain vocabulary and no unit conversion in between. It lives on the Equipment page at /equipment as a Group at the Control-Tree id equipment/controller/machine/native whose three leaves are the table's three raw dictionaries: equipment/controller/machine/native/system (System Parameters), equipment/controller/machine/native/axis (Axis Parameters) and equipment/controller/machine/native/int-axis (Axis Parameters (Integer)). One panel serves all three and keys off the id's last segment; on this page the leaf is whichever of the three holds the section in question. The Group is one of the two items the hasNativeTable 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 that is a row of the brand parameter table 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.

Important

Anatomy makes no claim that any id named here is stable across versions. The migration hop that keeps an older ?tree= value resolving is described in Tree Ids and Routes.

The Group is pushed behind hasNativeTable, which reports whether any ControllerParameterTableBase 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 Brand Matrix.

How a Parameter Is Addressed

The table stores its numbers in three dictionaries, and each leaf is one of them; the panel prints no heading of its own, so the leaf's label in the tree is the section's name:

Leaf Backing storage Cell
System Parameters SystemParams one value per id
Axis Parameters AxisParams one floating-point value per id per axis
Axis Parameters (Integer) IntAxisParams one integer value per id per axis

An id is a bare number in storage: the table's storage key, the number its value is kept under, which the project file writes as each row's id attribute. What the panel prints in front of it is the brand's prefix, and that prefix is the whole of the addressing convention:

Brand marker Prefix shown Table that answers Id attribute in the project file Example row
Fanuc # FanucParameterTable ParamId #1420 rapid traverse rate
Mazak # the Fanuc table ParamId #1420 rapid traverse rate
Syntec Pr SyntecParameterTable PrId Pr1420 rapid traverse rate
Siemens MD SiemensMachineDataTable MdId MD32000 max axis velocity
Heidenhain MP HeidenhainParameterTable MpId MP1010 rapid traverse rate

Mazak borrows the Fanuc table outright. The Mazak preset carries the Fanuc parameter-table proxy rather than one of its own, so the prefix resolves to # and every number on this leaf is a Fanuc table key under a Mazak 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 Brand Matrix. The storage-key line is the opposite case: a MAZATROL control names its parameters by letter group, not by FANUC's numbers, so under a Mazak brand marker the read flags every captioned row but the work-offset addresses, and that rule is read from the marker string — which keys are marked has it.

A ControllerParameterTableBase subclass outside those four resolves an empty prefix, and the ids then render bare. No shipped preset produces that.

The prefix the panel renders comes from the leaf's own read of the parameter form. The shared runner snapshot carries a prefix field of its own, and nothing renders it.

A key is modeled on a controller's parameter number, which does not make it the control's number. The Fanuc table numbers its keys after FANUC's parameters, the Siemens table after SINUMERIK machine data and the Heidenhain table after the TNC's MP numbering, while the Syntec table keeps the Fanuc table's numbers under its own prefix; and a key is what every saved project holds its value under, so it stays as it is once written. Where the table knows its key is not the control's own number for the value it holds, it says so, and the panel flags the row; which keys those are is below. A key left unflagged makes no claim either way. The Syntec example above, Pr1420, is one of the flagged ones, and so is the Mazak example, #1420, under its brand marker.

The caption under the id

Each id cell carries the number in bold and, beneath it, a short usage caption — Rapid traverse rate (mm/min or deg/min), Axis type (0 linear / 1 rotary / 2 spindle), G54 X offset, Tool change M function code. The same text repeats as the cell's hover title. A caption that names a unit gives the unit of its row, and every stroke-limit, reference-position and rapid-rate caption names one: Positive stroke limit (mm or deg) and Negative stroke limit (mm or deg) on every brand, G28 first reference position (mm or deg) on the Fanuc and Syntec tables and Reference point position (mm or deg) on the Siemens and Heidenhain ones, and the rapid rate's (mm/min or deg/min).

The caption is the brand table's own description of a well-known number, produced by DescribeSystemParam(API) and its two per-axis counterparts, and it travels down the wire with the row. It is therefore engine text, not an interface string: 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.

A row whose key the table marks carries a second line beneath that caption, on whichever of the three leaves it sits: a warning icon beside "HiNC storage key — not the controller's parameter number for this value. Copy a value by its meaning and in the unit its caption names, not by matching the number." Unlike the caption above it, this line is an interface string: it comes from the locale bundle and reads in the application's language, and the id cell's hover title repeats it on a line after the caption. Which rows get it is the read's to say, not the panel's: every row of all three sections arrives with a storageKeyOnly flag, true where the table's storage-key marker, IsStorageKeyOnly(API), flags a key the row's own section models — one that carries a caption there — and, under a Mazak brand marker, on every captioned row but a work-offset address. A free extra is never flagged, even under a marked number: Syntec's Pr1020 is flagged on System Parameters, where it is the controlled-axis count, but a Pr1020 row added to Axis Parameters through the footer is an uncaptioned extra there and carries no line. A row without the line is not thereby the controller's number; the hint above the table says as much.

Which keys are marked

Each brand table marks the keys it knows not to be the control's own number for the value they hold. The base class marks the stroke-limit pair on every brand, and each brand table adds the keys it knows. The Fanuc table's marks are checked against the FANUC 0i-C's numbering. The Mazak preset carries that same table, and under a Mazak brand marker the read flags more than the table marks: that rule is the web service's, and the second row below gives it.

Table System Parameters Axis Parameters Axis Parameters (Integer)
Fanuc #1020 controlled axes, #4002 peck retraction #1300, #1320 stroke limits —
Fanuc, under a Mazak brand marker every captioned row but the work-offset addresses: #1020, #3741, #4002, #5003 every captioned row: #1240, #1300, #1320, #1420 #1006
Syntec every captioned row but Pr4002: Pr1020 controlled axes, Pr3741 max spindle speed, Pr5003 cutter-comp type, and every work-offset address Pr1240 reference position, Pr1300, Pr1320 stroke limits, Pr1420 rapid rate Pr1006 axis type
Siemens — MD34010 reference position, MD36100, MD36110 stroke limits —
Heidenhain MP100 max spindle speed, MP101 tool-axis direction MP410 reference position, MP420, MP430 stroke limits MP400 axis type

On the Syntec table that leaves Pr4002 the one modelled key without the line, and on the Heidenhain table MP1010. Each mark was checked against the control's documentation, which records what the control keeps under that number, or where it keeps the value:

  • FANUC (FANUC Series 0i-C / 0i Mate-C Parameter Manual B-64120EN/01): stored stroke check 1 is No. 1320 for the positive end and No. 1321 for the negative end, and No. 1300 is a bit parameter (pp. 53, 50); No. 1020 is each axis' program axis name, the number of controlled axes being No. 1010 (pp. 41, 38). #4002 is the table's key for the peck-drilling retract — the G73 return and the G83 clearance alike, in mm — while on a FANUC 0i-C milling (M series) control No. 5114 is the G73 return value and No. 5115 the G83 clearance, both in the least input increment, and on the lathe (T) series No. 5114 is the G83 return or clearance value (B-64120EN/01 pp. 240–241).
  • Mazak (MAZATROL MATRIX Programming EIA/ISO H740PB0030E): a MAZATROL control names its parameters by letter group — F91, M1 and so on — so no number of the Fanuc table is its parameter number. The work-offset addresses are the exception, and stay unmarked under a Mazak brand marker: G54–G59 from #5221 and G54.1 P from #7001 are Mazak's own system variables, as the same manual's G54 #5221 #5222 #5223 shows.
  • SINUMERIK (SINUMERIK 840D sl Extended Functions Function Manual 09/2011, 6FC5397-1BP40-2BA0): MD36100 is POS_LIMIT_MINUS, the minus software limit switch, and MD36110 is POS_LIMIT_PLUS, the plus one — the reverse of the table's two keys; the reference point value is MD34100, $MA_REFP_SET_POS.
  • TNC 426 / TNC 430: the software limit switches are MP910.x for the positive end and MP920.x for the negative end, MP420 turns the Hirth coupling on or off and MP430 is the Hirth increment (HEIDENHAIN Technical Manual TNC 426 / TNC 430, 11/2003, §4.3.1; the same in the Technical Manual TNC 407/415/425, 01/1998); MP410 assigns the axis keys IV and V; MP100 designates the axes, the maximum spindle speeds being MP3515.x. Neither MP400 nor MP101 exists on a TNC 426 or TNC 430, nor on a TNC 407, 415 or 425: their machine-parameter lists go from MP340 straight to MP410 and from MP100 straight to MP110, and there an axis is rotary through its letter in the axis designation, MP100 / MP410. A TNC 640 or TNC7 numbers its machine parameters in six digits, so no MP420 exists there at all.
  • Syntec (SYNTEC CNC Parameters, 2019-05-30): software stroke limit 1 is Pr2401~Pr2440, while Pr1300 is the 20th axis' backlash critical speed and Pr1320 the 20th axis' pitch error compensation type (§1.142, §1.87, §1.88); Pr1001~Pr1020 set each axis' fast return home, a block that takes in both Pr1006 and Pr1020; Pr1221~Pr1240 enable each axis' backlash compensation; Pr1401~Pr1420 are each axis' mechanical compensation time constant; Pr3741 is the axis ID of the first rotary axis' auxiliary brake; Pr5001~Pr5500 are user parameters, the locals #5001~#5500 of customized macros, a range that takes in Pr5003 and the G54–G59 addresses from Pr5221; and Pr7001~Pr7200, where the G54.1 P addresses begin, are straightness compensation (§1.271, §1.273–1.276).

The marker claims only what it marks, and an unmarked key is not thereby the control's number. Some are known to be: on a FANUC 0i-C, No. 1240 (first reference position), No. 1420 (rapid traverse rate) and No. 3741 (maximum spindle speed for gear 1; No. 3772 is a separate maximum-speed clamp); Syntec's Pr4002, the retraction distance of drilling (see Raw Values, Raw Units); SINUMERIK's MD32000, MAX_AX_VELO; and MP1010, the rapid traverse, on a TNC 426 or TNC 430. Two more are the FANUC 0i-C's numbers with another encoding: it holds bit flags at No. 1006 and No. 5003, where the table stores the axis-type and the cutter-compensation-type ordinals, so neither value copies across as it is. None of these FANUC rows is marked on the Fanuc brand, because the number itself is right; under a Mazak brand marker they are flagged with the rest.

Raw Values, Raw Units

The caption at the top of the panel states the rule: "Raw stored values, as HiNC stores them — no unit conversion is applied here; a caption that names a unit gives the unit of its row. The ids are HiNC's storage keys: a row known not to be the controller's number says so under its id, and a row without that line is not thereby the controller's number. The interface-form nodes edit the same backing table."

No cell carries a unit suffix, and none can: the unit belongs to the row, not to the column, and the row's caption names it where the table models one. 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. A value read off a real control therefore goes in by its meaning and in the unit its caption names, which is not always the unit the control shows it in: a control that keeps a travel as an integer count of its least increment shows a number far larger than the millimetres this table holds — the cases are on Per-Axis Tables.

The peck clearance is the case where the two forms visibly disagree, and it ships. Canned Cycle (Peck) always speaks millimetres; the Fanuc-family table stores millimetres at #4002, and the Syntec table stores microns at Pr4002. A machine at a 5 mm clearance therefore reads 5 on Interface Parameters on every brand, and reads 5 here on Fanuc and Mazak but 5000 here on Syntec. The write endpoint converts on the way in; this leaf does not, which is the point of it. Pr4002 is Syntec's own number for the value — the retraction distance of drilling, which a Syntec control keeps in its least input unit — and the Syntec table reads it as microns and seeds it at 5000, so the number an operator reads off a real Syntec control is the number this row holds. #4002 is the other case: a marked key, the table's one key for the G73 return and the G83 clearance, in mm, where a FANUC 0i-C milling (M series) control keeps the G73 return value at No. 5114 and the G83 clearance at No. 5115, both in the least input increment (B-64120EN/01 pp. 240–241).

Two further asymmetries follow from where a value is stored rather than from its unit:

  • On Siemens and Heidenhain the peck clearance has no row here at all. 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.
  • On the Fanuc-family and Syntec tables the work-coordinate offsets are rows of this table. The G54–G59 triads start at #5221 and the G54.1 P1–P48 triads at #7001, both on a stride of 20, all on the System Parameters leaf. That mixing is why the machine plane's parameter table is stored on the project rather than on the runner — see Machine and Controller Plane. On the Fanuc-family table those two address ranges are also what an NC program's #-variable read resolves against, so those rows are live in both directions. On the Syntec table every one of those rows carries the storage-key line; on the Fanuc table none does, under a Mazak brand marker included.

What Only This Leaf Reaches

Most rows have a domain-grouped twin. These do not.

The axis roster itself. Every per-axis leaf of the branch — Machine Limits (Stroke), Rapid Feedrates, Home / G28 Reference, Tool-Change Position — lists the axes named by the axis-type row of this table (#1006, Pr1006, MD30300, MP400), because AxisNames 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, and their writers refuse any axis name their own read does not list; their columns are handed to them. Inside the Controller branch the axis-type row is editable here and nowhere else, on the Axis Parameters (Integer) leaf: the row's own cell in an axis column changes that axis' type in place, and the footer adds an axis, with the table's axis-type number as the id, an axis name, and a value of 0 linear, 1 rotary or 2 spindle. The one other writer is outside the branch entirely: ConfigureByMachiningChain(API) stamps the machining chain's axis codes into the same row at every re-bind of the suit: when the project opens, at the start of every session, on a setup-equipment edit made outside a session, and whenever the chain or the active suit changes. An axis the chain does not name stays in the row, but a chain axis gets its chain type back, so a type edited here on a chain axis holds only until the next re-bind. The type is the one value that call writes over. On the Axis Parameters leaf it only adds what is missing — a reference-position cell of 0 for a chain axis that has none, and a rapid-rate cell of 36000 deg/min for a rotary chain axis that has none — and leaves every cell already there as it is, so a value typed into either of those two rows reaches the play.

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 — until the next re-bind, which writes the row again with the chain's axes when a machine tool is attached. 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.

The Siemens indexing machine data, all four numbers. MD30500, the per-axis assignment that decides which axis consumes which position table, is shown on Indexing Position Tables as display-only text and is written here as an Axis Parameters (Integer) row; the REST surface carries no assignment writer at all. The equidistant definition — the numerator MD30501 and the offset MD30503 as axis parameters, the denominator MD30502 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 the two per-axis leaves. The engine is its reader: an axis whose MD30500 is 3 places its first station at the offset MD30503 and spaces the rest by the numerator over the denominator, while a modular rotary axis (on the Siemens table, one whose MD30310 row is 1) instead divides 360° by the denominator MD30502 and ignores the numerator. Indexing Position Tables prints that axis' assignment as Equidistant (MD30501–MD30503), 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.

Numbers with no interface field. The controlled-axis count (#1020, Pr1020) is read by nothing in the web service. The Siemens fixed-point position MD30600, the G75 target, likewise. So is the Siemens tool-change M function MD22560, 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 MD22550 is a half case: where the row already exists, the T word performs the tool change itself 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.

Any number the model does not name. 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.

A Fractional Number Is Refused Where It Is Typed

The Axis Parameters (Integer) leaf takes whole numbers only, and every numeric control on it refuses a fraction with a message under the box. Nothing is rounded, truncated or silently dropped.

The cell is the shared numeric widget with its integer rule turned on, and it commits on blur or Enter. Typing 2.5, Infinity or NaN is refused on that commit: “Must be a whole number” appears under the box, nothing reaches the panel, and the table keeps its old integer. The refused text stays in the box under its message until a whole number is committed over it or the panel mounts afresh, as it does when the selection leaves this leaf and comes back. An add or a removal re-reads the whole form, but the re-read hands the cell the same integer it already held, and the widget rewrites its text only when its bound value changes, so the refused 2.5 survives the refetch.

The footer follows the same rule. On this leaf its Value (raw) field refuses a fraction the same way, and its Parameter id field refuses one on every leaf, as it refuses a negative id. Add / Set checks both fields before it sends anything. While either one shows a refusal, or the id or the value is empty, it answers "Enter a non-negative integer id and a value." and writes nothing, so it never sends the last accepted value from under a refused one.

Clearing any cell is the one commit the panel accepts and drops. An emptied field commits null, and both cell handlers — the system one and the per-axis one — return early on null, 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 Numeric Input; what is particular here is that the widget did nothing wrong — the panel accepted the commit and dropped it.

Adding, Overwriting and Removing a Row

The footer is one control set for both adding and overwriting, and the button says so: Add / Set. 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.

  • The Axis field appears only on the two per-axis leaves, 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 — unlike the writers of the four domain-grouped per-axis leaves, which refuse a name their own read does not list, so this footer stays the one surface that adds an axis.
  • A successful add re-reads the whole form. The footer's own fields are not cleared, and Enter does not submit — see Editing Contract for how the branch's add footers differ from one another.
  • The client-side refusals are the id, which must be a non-negative whole number, the value, which must be a number and, on the integer leaf, a whole one, and, on the two per-axis leaves, a non-empty axis name. A fractional or negative id and a fractional integer value are also marked under their field when committed. At Add / Set each refusal raises a negative toast and sends nothing.

Delete is per row, not per cell. 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 Remove parameter and reading Remove <prefixed id> from the <section> section?, where the section word is the storage kind — system, axis, int-axis — rather than the leaf's label. The removal is not optimistic: the request is awaited and the whole form is re-read.

A deleted well-known row can come back on its own. 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 #3741 here, open Controller 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.

What a Freshly Switched Brand Shows

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 leaf opens with two rows and the Axis Parameters (Integer) leaf with one. The System Parameters leaf is where they part company.

Brand System Parameters Axis Parameters Axis Parameters (Integer)
Fanuc, Mazak 166 rows — controlled axes, max spindle speed, peck retraction, cutter-comp type, and 162 seeded work-offset addresses at zero reference position, rapid rate axis type
Syntec 166 rows — the same four under Pr numbering, the peck retraction in microns, and the same 162 offsets reference position, rapid rate axis type
Siemens 1 row — max spindle speed reference position, max axis velocity axis type
Heidenhain 2 rows — max spindle speed, tool-axis direction reference position, rapid rate axis type

The 162 offset rows are SeedAllDefaults(API) 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 Parameters leaf on the three brands that carry them, and their captions — G54 X offset, G54.1P12 Z offset — are what separates them from machine configuration in the same list.

Many seeded rows already carry the storage-key line. On Fanuc it is #1020 and #4002; on Mazak, every seeded row but the 162 work-offset addresses; on Syntec, every seeded row but Pr4002, the 162 offsets included, across all three leaves; on Siemens, MD34010; and on Heidenhain, every seeded row but MP1010 — MP100, MP101, MP410 and MP400. No brand seeds a stroke limit, so the positive and negative stroke-limit rows, marked on every brand, are absent from the Axis Parameters leaf until Machine Limits (Stroke) or that leaf's footer creates them, and their line arrives with them.

The Two Empty Layers, and Which One Is Reachable

The panel opens through the branch's shared two-layer gate. The first layer is the shared "No NC runner — load a project first." from the runner snapshot; the second is "No controller parameter table on the active runner." from the leaf's own read — the same line M-Code Declarations and Controller Parameters show, and honest in all three, because every one of those reads reports presence from the same parameter-table lookup.

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 No ControllerParameterTableBase on the active runner — and surfaces as one negative toast, three seconds, the panel's localized context followed by that raw English sentence. The full rule is Editing Contract.

Layout

  • Equipment Control Tree — the tree column of /equipment
    • Controller Node Row
      • Machine / Controller Group Row
        • Parameters (Native) Group Row — equipment/controller/machine/native, the last item of the plane, after Indexing Position Tables where that Siemens leaf is grown
          • System Parameters Node Row — equipment/controller/machine/native/system
          • Axis Parameters Node Row — equipment/controller/machine/native/axis
          • Axis Parameters (Integer) Node Row — equipment/controller/machine/native/int-axis
  • Editor Column — beside the tree column, at the page's full height: the panel of whichever node is selected
    • Parameters (Native) Group Panel — the Group's info text, "The brand parameter table in its native form — raw stored values under the ids HiNC stores them by. The ids are HiNC's storage keys, modeled on controller parameter numbers but not always the controller's own; a row known to differ says so under its id. Copy a value by its meaning and in the unit its row names, not by its number. Its three sections are the system parameters, the per-axis parameters and the per-axis integer parameters; the interface-form nodes edit the same backing table.", over a clickable list of the three leaves, each row selecting that leaf
    • System Parameters / Axis Parameters / Axis Parameters (Integer) Panel — one component, its section taken from the selected id's last segment; one column, gutter-spaced
      • Hint Caption — "Raw stored values, as HiNC stores them — no unit conversion is applied here; a caption that names a unit gives the unit of its row. The ids are HiNC's storage keys: a row known not to be the controller's number says so under its id, and a row without that line is not thereby the controller's number. The interface-form nodes edit the same backing table."
      • System Table — on the System Parameters leaf; dense, flat, bordered
        • Header Row — Id, Value, and an unlabelled action column
        • Data Row — the prefixed id in bold over its usage caption (absent on a free extra), a numeric cell, and a delete button
          • Storage-Key Line — orange, under the usage caption of a row the read flags storageKeyOnly: a warning icon beside "HiNC storage key — not the controller's parameter number for this value. Copy a value by its meaning and in the unit its caption names, not by matching the number.", the text marked data-storage-key-only="true"
      • Axis Table — on the two per-axis leaves, over the double or the integer dictionary; dense, flat, bordered
        • Header Row — Id, then one column per axis name, then an unlabelled action column
        • 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
          • Storage-Key Line — the same line, under the usage caption of a row the read flags storageKeyOnly
      • Separator
      • Add Row — one line, bottom-aligned; it adds to the leaf's own section
        • Parameter id Numeric Field — minimum 0, whole numbers only
        • Axis Text Field — present on the two per-axis leaves only
        • Value (raw) Numeric Field — whole numbers only on the Axis Parameters (Integer) leaf
        • Add / Set Button — primary
      • No-Table Body — replaces everything above: "No controller parameter table on the active runner."
      • Shared Empty State — replaces the whole body while the snapshot reports no runner: "No NC runner — load a project first."
    • Remove Dialog — Remove parameter over Remove <prefixed id> from the <section> section?, with a cancel
    • Toast — negative, three seconds, the panel's context followed by the server's own message

The axis columns of the two per-axis leaves 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.

Source Code Path

See HiNC App Anatomy for git repository links.

Web Application

HiNC-2025-webservice (Quasar CLI SPA):

  • wwwroot-src/src/components/controlTree/SoftNcNativeParamsPanel.vue — this panel, shared by the three leaves: the section it shows is the node id's last segment, the prefixed id column with its usage caption and, on a row of any section the read flags, the storage-key line and its hover title, the axis-column union, the system and per-axis commit handlers, the integer rule turned on for the integer leaf's cells and value field and for the id field on every leaf, the confirm-then-remove flow, and the add footer with its refusals, which also read the two fields' refused state.
  • wwwroot-src/src/components/controlTree/softNcItemTypes.ts — the Group and its three leaves (ids, labels and label keys), and the snapshot flag the Group is pushed behind, last on the machine plane.
  • wwwroot-src/src/api/softNcRunner.ts — the reader that parses the prefix and the three row families, each row with its storage-key flag, the three per-cell writers and the three per-id removals, and the snapshot field carrying a prefix this panel does not use.
  • wwwroot-src/src/composables/useSoftNcRunner.ts — the shared snapshot the first empty layer and the axis-column union read.
  • wwwroot-src/src/components/widgets/NumericInput.vue — the cell: commit on blur or Enter, the parsed value written back into the box, and the integer rule that refuses a fraction under the box.
  • wwwroot-src/src/components/controlTree/SoftNcEmptyState.vue — the shared no-runner line.
  • wwwroot-src/src/components/controlTree/GroupInfoPanel.vue — the Group's panel: its info text over the clickable list of the three leaves.
  • wwwroot-src/src/components/controlTree/SoftNcIndexingPositionsPanel.vue — the sibling that displays the MD30500 assignment this leaf writes, and points here for it.
  • wwwroot-src/src/api/http.ts — the shared fetch helper that turns both a non-2xx status and a success: false body into one thrown error.
  • wwwroot-src/src/i18n/en/softNc.ts — the Group label and its three leaf labels, the Group's info text, the raw-units hint, the storage-key line, the Parameter id and Value (raw) footer labels, the two footer refusals and the five error contexts — one read and four writes, the two per-axis savers sharing a context.
  • wwwroot-src/src/i18n/en/common.ts — the shared Id, Value, Axis and Add / Set strings.
  • wwwroot-src/src/i18n/en/dialog.ts — the remove dialog's title, its message, and the three storage kind words it interpolates.
  • Mech/SoftNcRunnerController.cs — the REST surface: the read that orders each dictionary by id, attaches the brand's usage description to every row and the storage-key flag to every row of all three — true where the row's own section models a key the table marks and, under a Mazak brand marker, on every captioned row but a work-offset address — 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, the per-axis writers beside them that refuse a name those reads do not list, and the M-code read bound to the stored declaration map rather than the overlaid view.

HiAPI Engine

  • HiMech/NcParsers/Dependencys/ControllerParameterTableBase.cs — 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 with the per-axis captions that name each row's unit, the storage-key marker the base sets on the two stroke-limit ids and each brand table extends, the rotary-axis helper that writes type, reference position and rapid rate in one call, and the XML round-trip that persists every row, free extras included, under the brand's id attribute.
  • HiMech/NcParsers/Dependencys/Fanuc/FanucParameterTable.cs — the # vocabulary: the well-known keys, the four it marks documented beside the FANUC 0i-C's numbers for the same values, the bit-flag note on #1006 and #5003, 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.
  • HiMech/NcParsers/Dependencys/Syntec/SyntecParameterTable.cs — the Pr vocabulary on the Fanuc table's numbers, every modelled key but Pr4002 marked, the work-offset addresses included, each documented beside what a Syntec control keeps under those numbers, and the peck clearance, Syntec's own Pr4002, stored in microns with the conversion kept in its accessor.
  • HiMech/NcParsers/Dependencys/Siemens/SiemensMachineDataTable.cs — the MD vocabulary: the stroke pair documented as the reverse of the SINUMERIK's own software limit switches and the reference-position key beside MD34100, 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.
  • HiMech/NcParsers/Dependencys/Heidenhain/HeidenhainParameterTable.cs — the MP vocabulary, the six keys it marks — every modelled key but MP1010 — each documented beside the TNC 426/430 machine parameter that number holds or the absence of one, and its two-row seed.
  • HiMech/NcParsers/Dependencys/IsoCoordinateAddressMap.cs — 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.
  • HiMech/NcParsers/Dependencys/IMachineAxisConfig.cs — the axis contract, and the axis-type enumeration a cell of the integer section stores.
  • HiMech/NcParsers/Dependencys/Generic/ToolingMcConfig.cs — 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.
  • HiMech/NcParsers/SoftNcRunner.cs — 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 that adds a reference-position cell to a chain axis without one and a rapid-rate cell to a rotary chain axis without one.

See Also

  • Machine and Controller Plane — the plane this leaf sits on, and why the table it exposes is stored on the project rather than on the runner file
  • Brand Matrix — the flag that grows this node, why it never reports false on a shipped preset, and why Mazak resolves the Fanuc table
  • Editing Contract — the commit, rollback, confirm and toast rules this panel shares with the branch, and the add-footer details it differs on
  • Interface Parameters — the same values in domain vocabulary, including the peck clearance this leaf shows in the brand's own unit
  • Indexing Position Tables — the leaf that displays the MD30500 assignment and the equidistant definition that are written here
  • Per-Axis Tables — the per-axis rows in domain vocabulary, every key by role with its mark, the unit a value copied off a real control has to be in, the writers that take only the axes their reads list, and the Stroke limit check switch on Machine Limits (Stroke)