This commit is contained in:
2026-09-09 17:35:23 +08:00
parent 2a98ae7556
commit 161af68fe3
1271 changed files with 58251 additions and 98639 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Component Assembly and Anchors | HiAPI-C# 2025 </title>
<title>Anchor | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Component Assembly and Anchors | HiAPI-C# 2025 ">
<meta name="title" content="Anchor | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,29 +85,125 @@
</div>
<article data-uid="">
<h1 id="component-assembly-and-anchors">Component Assembly and Anchors</h1>
<h1 id="anchor">Anchor</h1>
<p><strong>Anchors</strong> are used for assembly purposes. When anchors between geometries coincide, assembly is completed.</p>
<p>Strictly speaking, an <strong>Anchor</strong> is not a point, but a coordinate system. For two coordinate systems to be equal, their origins must coincide and their rotation directions must be the same.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Anchor Assembly Example</strong></p>
<p>As shown in the figure below, there are two components, each with two anchors, {<code>AnchorA</code>,<code>AnchorB</code>} and {<code>AnchorC</code>,<code>AnchorD</code>} respectively.
The two components are assembled by making <code>AnchorB</code> and <code>AnchorC</code> coincide.</p>
<p><img src="anchor-img/Anchor%20for%20contact.png" alt="anc-contact"></p>
</div>
<h2 id="worktable-anchor-and-workpiece-anchor">Worktable Anchor and Workpiece Anchor</h2>
<p>Both workpiece and fixture have a workpiece anchor (<code>WorkpieceBuckle</code>), and both machine tool and fixture have a worktable anchor (<code>TableBuckle</code>), used to assemble workpiece, fixture, and machine tool.</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Workpiece Fixture Assembly Example</strong></p>
<p>Workpiece and fixture are assembled by making their workpiece anchors (<code>WorkpieceBuckle</code>) coincide.</p>
<p><img src="anchor-img/Anchor%20for%20contact%20workpiece%20and%20fixture.png" alt=""></p>
</div>
<p>If no fixture is set, the workpiece will be assembled with the machine tool through the workpiece anchor and the machine tool through the worktable anchor.</p>
<h2 id="spindle-anchor-and-tool-holder-anchor">Spindle Anchor and Tool Holder Anchor</h2>
<p>Both tool holder and machine tool have a spindle anchor (<code>SpindleBuckle</code>), and both tool holder and tool head have a tool holder anchor (<code>HolderBuckle</code>), used to assemble tool head, tool holder, and machine tool.</p>
<p>If no tool holder is set, the tool head will be assembled with the machine tool through the tool holder anchor and the machine tool through the spindle anchor.</p>
<p>Placing the workpiece, the fixture and the tool relative to the machine. Each of them carries named
anchors, and the setup task is to give each geometry the transform that puts its anchor where it
belongs — four transforms in all, on two branches of the Control Tree.</p>
<p>What an anchor is — a coordinate system rather than a point — and which named buckles hold the scene
together is <a class="xref" href="../../technique/mechanism/assembly-anchors.html">Assembly Anchors</a>. This page is where they are set.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>. The transforms hang from the two branches that own the
geometry being placed, each under an <strong>Anchor</strong> group:</p>
<table>
<thead>
<tr>
<th>Branch</th>
<th>Node</th>
<th>What it places</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fixture</td>
<td><strong>Geom To Table</strong><br><code>equipment/fixture/geom-to-table</code></td>
<td>The fixture geometry onto the machine's table buckle</td>
</tr>
<tr>
<td>Fixture</td>
<td><strong>Geom To Workpiece</strong><br><code>equipment/fixture/geom-to-workpiece</code></td>
<td>The workpiece buckle — the place the workpiece attaches — relative to the fixture geometry</td>
</tr>
<tr>
<td>Workpiece</td>
<td><strong>Geom To Fixture</strong><br><code>equipment/workpiece/anchor/geom-to-fixture</code></td>
<td>The workpiece geometry onto that workpiece buckle</td>
</tr>
<tr>
<td>Workpiece</td>
<td><strong>Geom To Program Zero</strong><br><code>equipment/workpiece/anchor/geom-to-program-zero</code></td>
<td>Program zero, the NC origin, relative to the workpiece geometry</td>
</tr>
</tbody>
</table>
<p>The tool is not placed here. It arrives on the spindle through the tool house, and how far it stands
out of the holder is part of the tool itself — see <a href="cutter.html">Cutter</a>.</p>
<h2 id="the-order-to-work-in">The order to work in</h2>
<ol>
<li><strong>Attach a machine tool first.</strong> The table buckle the fixture is placed against belongs to the
machine chain, so there is nothing to place against until one is loaded —
<a href="machine-tool.html">Machine Tool</a>.</li>
<li><strong>Place the fixture on the table</strong> with Geom To Table.</li>
<li><strong>Place the workpiece on the fixture</strong> — Geom To Workpiece on the fixture side, then Geom To
Fixture on the workpiece side. A project carrying no fixture skips both: the workpiece is then
assembled onto the machine's table buckle directly.</li>
<li><strong>Set program zero last</strong>, once the workpiece is where it belongs. Which direction to align it,
and what to align it against, are <a href="program-zero-alignment.html">Program Zero Alignment</a>.</li>
</ol>
<h2 id="the-numbers-are-on-the-child-node">The numbers are on the child node</h2>
<p>Each of the four nodes is a <strong>kind picker and nothing else</strong>. Its panel offers one field,
<strong>Transformer type</strong>, and the editor holding the actual numbers is the <strong>child</strong> node underneath it —
which is why a node that looks empty has an expand arrow beside it.</p>
<p><strong>Geom To Program Zero</strong> selected on a demo project, at
<code>/general-setup?tree=equipment/workpiece/anchor/geom-to-program-zero</code>. The panel under the tree
carries only <strong>Transformer type</strong>, reading <em>Static Translation</em>; the node's own child, one level
deeper in the tree, is where that translation's values are typed.</p>
<p><img src="anchor-img/geom-to-program-zero.en.png" alt="The Workpiece branch of the Control Tree fully expanded, showing Raw Geometry, Target Geometry, an Anchor group holding Geom To Fixture and Geom To Program Zero, Mesh, and a Material group; Geom To Program Zero is selected and its panel below the tree shows a single Transformer type field reading Static Translation"></p>
<p>Seven kinds are offered on all four nodes:</p>
<table>
<thead>
<tr>
<th>Kind</th>
<th>Use it for</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Static Translation</strong></td>
<td>A fixed offset. The usual answer for all four.</td>
</tr>
<tr>
<td><strong>Static Rotation</strong></td>
<td>A fixed turn — stock clamped at an angle, a fixture mounted rotated.</td>
</tr>
<tr>
<td><strong>Static Freeform</strong></td>
<td>A fixed transform given as a matrix.</td>
</tr>
<tr>
<td><strong>General Transform</strong></td>
<td>Several transforms composed into one.</td>
</tr>
<tr>
<td><strong>Dynamic Translation</strong> / <strong>Dynamic Rotation</strong></td>
<td>A value that moves at run time. These are what a machine's own axes carry; a setup placement is not one of them.</td>
</tr>
<tr>
<td><strong>No Transform</strong></td>
<td>No offset at all — the two things coincide.</td>
</tr>
</tbody>
</table>
<p>Changing the kind replaces the editor beneath it, so a value typed under one kind does not carry
over to another.</p>
<h2 id="checking-the-result">Checking the result</h2>
<p>The <strong>Scene</strong> dropdown above the canvas has an <strong>Anchors</strong> group that draws what has just been
placed: <strong>Fixture Geometry Anchor</strong>, <strong>Workpiece Buckle</strong>, <strong>Table Buckle</strong>, <strong>Workpiece Geometry
Anchor</strong> and <strong>Program-Zero Anchor</strong>. Turning on the two ends of a transform you have just set is the
quickest way to see whether it landed where you meant — a workpiece sitting a plate's thickness
below the fixture is obvious as soon as both buckles are drawn.</p>
<p>The same dropdown's <strong>Solid</strong> group has a <strong>Machine</strong> checkbox, cleared to begin with, which brings
the machine chain into the same scene so the assembly can be checked against the table it is
supposed to be sitting on.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../technique/mechanism/assembly-anchors.html">Assembly Anchors</a> — what an anchor is, and the named buckles the scene is assembled at</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — aligning the program origin once the workpiece is placed</li>
<li><a href="machine-tool.html">Machine Tool</a> — the chain that carries the table and spindle anchors</li>
<li><a href="fixture.html">Fixture</a> — the branch carrying the two fixture transforms named above</li>
<li><a href="workpiece.html">Workpiece</a> — the branch carrying the two workpiece transforms named above, and the rest of the workpiece setup</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
</article>
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

@@ -1,129 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>APT Tool Definition | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="APT Tool Definition | 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="MillingTool-APT">
<h1 id="apt-tool-definition">APT Tool Definition</h1>
<p>APT (Automatically Programmed Tool) is a universal tool definition. Refer to the APT parameter diagram:</p>
<div class="NOTE">
<h5>Note</h5>
<p><img src="apt-img/APT.svg" alt="APT"></p>
</div>
<p>APT parameter description:</p>
<ul>
<li><code>D</code>: Diameter</li>
<li><code>Rc</code>: Corner radius</li>
<li><code>Rr</code>: Distance from corner center to tool centerline</li>
<li><code>Rz</code>: Distance from corner center to tool tip horizontal plane</li>
<li><code>Alpha</code>: Angle between horizontal plane and tool tip cone surface</li>
<li><code>Beta</code>: Angle between tool centerline and tool wall cone surface</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>
@@ -1,353 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Heidenhain Controller Support | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Heidenhain Controller Support | 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="Controllers/HeidenhainSupport">
<h1 id="heidenhain-controller-support">Heidenhain Controller Support</h1>
<p>Heidenhain programs run on a single controller preset that reads <strong>both</strong> dialects — TNC klartext
(TNC 640 / TNC 530 conversational) and Heidenhain <strong>DIN/ISO</strong>. There is no separate selection to
make: pick Heidenhain as the project's controller and the program is read in whichever dialect it is
written in.</p>
<p>Coverage is stated in the same three states as
<a href="controller-iso.html#how-to-read-this-page">General NC Code Support</a> — supported, recognized but not
simulated, and not supported. <em>Recognized but not simulated</em> is a deliberate state: the construct is
consumed and reported under its own message id, so it can never be silently misread as something
else. A <code>PLANE AXIAL B+45</code> will never be mistaken for a rotary-axis command.</p>
<h2 id="program-format">Program format</h2>
<h3 id="separators-are-optional">Separators are optional</h3>
<p>Klartext is normally written with spaces between the letter instructions, and that is what the
control shows. Some post-processors emit the same program with no separators at all. <strong>Both forms
parse</strong>, and so does the detached feed spelling.</p>
<blockquote>
<p>Equivalent, all parsed:</p>
<ul>
<li><code>L X-26.3 Y+43.1 Z+100.3 A-90.0 C+13.123 FQ3</code> and <code>LX-26.3Y+43.1Z+100.3A-90.0C+13.123FQ3</code></li>
<li><code>L X+0 Y+0 R0 FMAX</code> and <code>LX+0Y+0R0FMAX</code></li>
<li><code>FMAX M03 M08</code> and <code>FMAXM03M08</code></li>
<li><code>F20000</code> and <code>F 20000</code></li>
</ul>
</blockquote>
<h3 id="multi-line-blocks">Multi-line blocks</h3>
<p>A statement broken across lines with the tilde continuation — the usual shape of a <code>CYCL DEF</code> body or
a long <code>PLANE</code> statement — is joined back into one block before parsing, so it is read as the single
statement it is.</p>
<h2 id="motion">Motion</h2>
<table>
<thead>
<tr>
<th>Construct</th>
<th>Support</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>L</code></td>
<td>Straight-line motion with its axis words.</td>
</tr>
<tr>
<td><code>FMAX</code></td>
<td>Rapid traverse.</td>
</tr>
<tr>
<td><code>CC</code> / <code>C</code></td>
<td>Circular motion — <code>CC</code> sets the pole, <code>C</code> states the end point. <code>DR-</code> is clockwise and <code>DR+</code> counter-clockwise, the centre may be left implicit, and an arc that closes on its start point is a full circle.</td>
</tr>
<tr>
<td><code>RL</code> / <code>RR</code> / <code>R0</code></td>
<td>Radius compensation left / right / off.</td>
</tr>
<tr>
<td><code>M91</code></td>
<td>One-shot machine-coordinate move for that block.</td>
</tr>
<tr>
<td><code>M126</code> / <code>M127</code></td>
<td>Shortest-path rotary traverse on / off. With neither stated, shortest path is the default.</td>
</tr>
<tr>
<td><code>M140 MB+n</code> / <code>M140 MB MAX</code></td>
<td>Tool-axis retract — by <code>n</code> mm, or to the positive Z stroke limit. Without a configured stroke limit, <code>MB MAX</code> reports <code>M140--NoStrokeLimit</code> and is skipped. The statement's own <code>F</code> drives the retract without entering the modal feedrate.</td>
</tr>
<tr>
<td><code>STOP</code></td>
<td>Program stop, alongside <code>M00</code> / <code>M01</code>.</td>
</tr>
<tr>
<td><code>CYCL DEF 32 TOLERANCE</code></td>
<td>Path-smoothing tolerance.</td>
</tr>
<tr>
<td><code>BLK FORM</code></td>
<td>Recorded as a stock declaration. It does <strong>not</strong> replace the workpiece configured in the project.</td>
</tr>
</tbody>
</table>
<h2 id="tools">Tools</h2>
<p><code>TOOL CALL</code> performs the tool change on its own — klartext has no separate <code>M06</code> trigger. A tool
number or a quoted tool name is accepted.</p>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>TOOL CALL 1 Z S5000</code></li>
<li><code>TOOL CALL &quot;1&quot; Z S5000</code></li>
<li><code>TOOL CALL &quot;B40R&quot; Z S3000 DL+0.5</code></li>
</ul>
</blockquote>
<ul>
<li>The spindle speed <code>S</code> is recorded modally.</li>
<li><code>DL</code> is a length delta — the effective tool height is the tool-table height <strong>plus</strong> <code>DL</code>.</li>
<li><code>DR</code> is read and recorded but <strong>not applied</strong>: radius compensation uses the tool-table radius as-is,
and the block reports <code>ToolChange--DeltaUnsupported</code>.</li>
<li>A tool axis other than <code>Z</code> reports <code>ToolChange--AxisUnsupported</code>.</li>
<li>A <code>TOOL CALL</code> whose tool number could not be captured — an unevaluated variable, for example —
reports <code>ToolChange--MissingToolId</code>.</li>
</ul>
<h2 id="datums">Datums</h2>
<p><code>CYCL DEF 247</code> sets the datum preset and <code>CYCL DEF 7</code> is an <strong>additive</strong> shift on top of it, which is
the TNC semantic. The two compose as separate entries in the coordinate chain instead of replacing
each other.</p>
<blockquote>
<p>Parsed:</p>
<pre><code>CYCL DEF 247 Q339=+1
</code></pre>
<pre><code>CYCL DEF 7.0 DATUM SHIFT
CYCL DEF 7.1 X10.123
CYCL DEF 7.2 Y22.223
CYCL DEF 7.3 Z32.97
</code></pre>
</blockquote>
<h2 id="q-parameters-and-fn">Q parameters and FN</h2>
<p><code>Q</code>, <code>QR</code>, <code>QL</code> and <code>QS</code> parameters are read wherever a value is expected, so <code>FQ1</code> reaches the
feedrate, <code>L X+Q2</code> reaches the program position and <code>TOOL CALL SQ3</code> reaches the spindle speed. <code>Q0</code>–<code>Q99</code>
free parameters and <code>QR0</code>–<code>QR499</code> permanent parameters are held as per-project data and saved with
the project.</p>
<table>
<thead>
<tr>
<th>Construct</th>
<th>Support</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>FN 0</code>–<code>FN 5</code></td>
<td>Assignment and arithmetic, including the <code>DIV</code> keyword of FN 4 and the prefix <code>SQRT</code> of FN 5.</td>
</tr>
<tr>
<td><code>FN 9</code>–<code>FN 12</code></td>
<td>Conditional jumps — <strong>executed</strong>, with a per-label iteration cap so a corrupt or hostile program cannot spin forever.</td>
</tr>
<tr>
<td>Other <code>FN</code> opcodes (<code>FN 14</code>, <code>FN 16</code>, <code>FN 18 SYSREAD</code>, …)</td>
<td>Recognized, not simulated. The statement is claimed and reported, so its target parameter stays empty instead of taking a fabricated value.</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>Q1 = 5000</code></li>
<li><code>FN0: Q1 = 5000</code></li>
<li><code>FN1: Q1 = -Q2 + -5</code></li>
<li><code>FN2: Q1 = +10 - +5</code></li>
<li><code>FN3: Q2 = +3 * +3</code></li>
</ul>
</blockquote>
<h2 id="tilted-planes-and-rtcp">Tilted planes and RTCP</h2>
<table>
<thead>
<tr>
<th>Construct</th>
<th>Support</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>PLANE SPATIAL</code></td>
<td>Fully composed, including <code>SEQ+</code> / <code>SEQ-</code>, <code>COORD ROT</code> / <code>TABLE ROT</code>, and the <code>STAY</code> / <code>MOVE</code> / <code>TURN</code> positioning behaviours.</td>
</tr>
<tr>
<td><code>PLANE RESET</code></td>
<td>Cancels the tilt.</td>
</tr>
<tr>
<td><code>PLANE VECTOR</code></td>
<td>Structurally captured, not simulated.</td>
</tr>
<tr>
<td><code>PLANE EULER</code> / <code>POINTS</code> / <code>RELATIV</code> / <code>AXIAL</code> / <code>PROJECTED</code></td>
<td>Recognized, not simulated — consumed and reported as <code>HeidenhainPlane--Unsupported</code>, with the previous tilt retained.</td>
</tr>
<tr>
<td><code>FUNCTION TCPM</code></td>
<td>Supported.</td>
</tr>
<tr>
<td><code>M128</code> / <code>M129</code></td>
<td>Tool centre point control on / off — real RTCP, the Heidenhain sibling of ISO <code>G43.4</code> and Siemens <code>TRAORI</code>.</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Parsed:</p>
<ul>
<li><code>PLANE SPATIAL SPA-60.3 SPB+0 SPC-19.88 STAY SEQ- TABLE ROT</code></li>
<li><code>PLANE RESET STAY</code></li>
</ul>
</blockquote>
<h2 id="cycles-and-calls">Cycles and calls</h2>
<ul>
<li><strong><code>CYCL DEF 2xx</code></strong> bodies are read with their <code>Q</code> parameters mirrored into the block. Cycles <strong>200</strong>,
<strong>232</strong>, <strong>251</strong>, <strong>252</strong> and <strong>253</strong> are mapped onto the shared drilling machinery and simulated;
the mapping follows the cycle's own <code>Q</code> values, so a <code>Q202</code> peck increment routes to peck drilling
and a <code>Q211</code> bottom dwell to dwell drilling.</li>
<li>A <code>CYCL DEF</code> body that is not one of those is recognized, not simulated — reported as
<code>HeidenhainCycl--Unsupported</code>.</li>
<li><strong><code>CYCL CALL</code></strong> and <strong><code>CYCL CALL POS</code></strong> fire the cycle once; <code>M99</code> fires once and <code>M89</code> arms modal
firing.</li>
<li><strong><code>CALL LBL n</code></strong> inlines the label body up to <code>LBL 0</code>; <strong><code>CALL LBL n REP m</code></strong> repeats that section
<code>m</code> times.</li>
<li><strong><code>CALL PGM</code></strong> resolves the called program by file name.</li>
<li><strong>Mirror image</strong> in both spellings — the klartext <code>CYCL DEF 8</code> form and the DIN/ISO <code>G28</code> form.</li>
</ul>
<h2 id="diniso-dialect">DIN/ISO dialect</h2>
<p>The same preset, with nothing to switch.</p>
<ul>
<li><code>%</code> tape header and <code>N</code> block numbers.</li>
<li><code>T</code> plus <code>M06</code> tool change.</li>
<li><strong>Arc centres <code>I</code> / <code>J</code> / <code>K</code> are absolute pole coordinates</strong>, not incremental offsets from the
start point. This is the Heidenhain reading, and the pole carries forward modally.</li>
<li>The ISO label family — <code>G98 L&lt;n&gt;</code> definitions, and the head-anchored <code>L&lt;n&gt;,&lt;m&gt;</code> call whose comma
count maps onto the repeat count.</li>
<li><code>G247 Q339</code> stamps the same datum preset as <code>CYCL DEF 247</code>.</li>
<li><code>G54</code> with axis words is read as a datum-shift declaration.</li>
<li><code>G70</code> / <code>G71</code> units.</li>
</ul>
<div class="WARNING">
<h5>Warning</h5>
<p><strong><code>G28</code> on Heidenhain is MIRROR IMAGE, not a reference-point return.</strong> The Fanuc reading of <code>G28</code>
is deliberately absent from the Heidenhain preset. Select the Heidenhain controller for a
Heidenhain DIN/ISO file — read as Fanuc, every mirror statement becomes a home move.</p>
</div>
<h2 id="not-supported">Not supported</h2>
<p><code>TOOL DEF</code>, <code>FK</code> free-contour programming, <code>SL</code> cycles, <code>PATTERN DEF</code>, and <code>TCH PROBE</code>. These are left
unconsumed, and the block that carried them reports <code>Parsing--Unconsumed</code> naming the words.</p>
<p>Machine-specific M-codes that are not part of the Heidenhain vocabulary above are declared on the
machine rather than built in — see the M-code note on
<a href="controller-iso.html#m-codes">General NC Code Support</a>.</p>
<h2 id="see-also">See also</h2>
<ul>
<li><a href="controller-iso.html">General NC Code Support</a> — Fanuc, Syntec, Mazak and Siemens SINUMERIK.</li>
<li><a href="../../fundamentals/nc-parsing/index.html">NC Parsing Engine</a> — the pipeline behind these constructs, the
brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without
changing HiNC.</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

@@ -1,489 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>General NC Code Support | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="General NC Code Support | 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="">
<h1 id="general-nc-code-support">General NC Code Support</h1>
<p>The vocabulary HiNC interprets is decided by the controller brand selected for the project. This page
covers the ISO-family presets — <strong>Fanuc</strong>, <strong>Syntec</strong> and <strong>Mazak</strong> — and <strong>Siemens SINUMERIK</strong>.
Heidenhain is a different language and has its own page: <a href="controller-heidenhain.html">Heidenhain Support</a>.</p>
<h2 id="how-to-read-this-page">How to read this page</h2>
<p>Coverage is stated in three states.</p>
<table>
<thead>
<tr>
<th>State</th>
<th>What happens when the construct appears in your program</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Supported</strong></td>
<td>interpreted, and its effect is simulated.</td>
</tr>
<tr>
<td><strong>Recognized, not simulated</strong></td>
<td>consumed on purpose and reported under its own message id. The block keeps running and the construct's effect does not apply — but it can never be silently misread as something else.</td>
</tr>
<tr>
<td><strong>Not supported</strong></td>
<td>the words are left over, and the block reports <code>Parsing--Unconsumed</code> naming them.</td>
</tr>
</tbody>
</table>
<div class="TIP">
<h5>Tip</h5>
<p>The message list a run produces is the coverage report for <strong>your</strong> program. Every word the
interpreter could not use is named on the block that carried it, so you never have to infer
coverage from the simulated result. An unknown code does not stop the run — it is reported and
skipped.</p>
</div>
<h2 id="iso-core">ISO core</h2>
<p>Fanuc, Syntec and Mazak share the vocabulary below. Siemens spells most of it the same way and adds
its own for the rest — see <a href="#siemens-sinumerik">Siemens SINUMERIK</a>.</p>
<h3 id="motion">Motion</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G00</code></td>
<td>Rapid positioning.</td>
</tr>
<tr>
<td><code>G01</code></td>
<td>Linear interpolation at the programmed feedrate.</td>
</tr>
<tr>
<td><code>G02</code> / <code>G03</code></td>
<td>Circular interpolation, clockwise / counter-clockwise. The centre may be given as <code>I</code> / <code>J</code> / <code>K</code> offsets or as a radius <code>R</code>.</td>
</tr>
<tr>
<td><code>G04</code></td>
<td>Dwell. <code>X</code> / <code>U</code> are seconds, <code>P</code> is milliseconds, <code>S</code> is spindle revolutions. Both the <code>G4</code> and <code>G04</code> spellings are read.</td>
</tr>
<tr>
<td><code>G28</code></td>
<td>Reference-point (home) return through an intermediate point.</td>
</tr>
<tr>
<td><code>G53</code></td>
<td>One-shot machine-coordinate move — work offsets are bypassed for that block only.</td>
</tr>
</tbody>
</table>
<h3 id="plane-units-and-positioning-mode">Plane, units and positioning mode</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G17</code> / <code>G18</code> / <code>G19</code></td>
<td>Plane selection — XY / ZX / YZ. Arcs and canned cycles follow the active plane.</td>
</tr>
<tr>
<td><code>G21</code></td>
<td>Metric. This is the HiNC default.</td>
</tr>
<tr>
<td><code>G20</code></td>
<td>Inch — <strong>not supported</strong>. The block reports <code>Unit--InchNotSupported</code>; post the program in metric.</td>
</tr>
<tr>
<td><code>G90</code> / <code>G91</code></td>
<td>Absolute / incremental positioning.</td>
</tr>
<tr>
<td><code>G94</code> / <code>G95</code></td>
<td>Feed per minute / feed per revolution.</td>
</tr>
</tbody>
</table>
<h3 id="work-coordinates">Work coordinates</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G54</code>–<code>G59</code></td>
<td>Standard work coordinate systems.</td>
</tr>
<tr>
<td><code>G59.1</code>–<code>G59.9</code></td>
<td>Extended work coordinate systems.</td>
</tr>
<tr>
<td><code>G54.1 P1</code>–<code>P48</code></td>
<td>Fanuc extended work offset table.</td>
</tr>
<tr>
<td><code>G52</code></td>
<td>Local coordinate offset, applied on top of the active work coordinate system.</td>
</tr>
</tbody>
</table>
<h3 id="tool-compensation">Tool compensation</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G43</code> / <code>G44</code> / <code>G49</code></td>
<td>Tool length compensation, positive / negative / cancel. <code>H</code> selects the offset row.</td>
</tr>
<tr>
<td><code>G41</code> / <code>G42</code> / <code>G40</code></td>
<td>Cutter radius compensation, left / right / cancel. <code>D</code> selects the offset row.</td>
</tr>
</tbody>
</table>
<h3 id="rotation-tilted-planes-and-five-axis">Rotation, tilted planes and five-axis</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G68</code></td>
<td>Coordinate rotation in the active plane, around a centre point by angle <code>R</code>.</td>
</tr>
<tr>
<td><code>G68.2</code></td>
<td>Tilted work plane — Euler angles <code>I</code> / <code>J</code> / <code>K</code> with origin <code>X</code> / <code>Y</code> / <code>Z</code>.</td>
</tr>
<tr>
<td><code>G69</code></td>
<td>Cancels <code>G68</code> and <code>G68.2</code>.</td>
</tr>
<tr>
<td><code>G53.1</code></td>
<td>Tool-axis direction — swings the rotary axes into line with the active <code>G68.2</code> plane.</td>
</tr>
<tr>
<td><code>G43.4</code></td>
<td>RTCP / tool centre point management. The Siemens equivalent is <code>TRAORI</code>, the Heidenhain equivalent <code>M128</code>.</td>
</tr>
</tbody>
</table>
<h3 id="canned-cycles">Canned cycles</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Cycle</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>G73</code></td>
<td>High-speed peck drilling — <code>Q</code> increments with a partial retract.</td>
</tr>
<tr>
<td><code>G74</code></td>
<td>Left-hand tapping.</td>
</tr>
<tr>
<td><code>G76</code></td>
<td>Fine boring — oriented spindle stop, <code>Q</code> shift, rapid out.</td>
</tr>
<tr>
<td><code>G81</code></td>
<td>Drilling.</td>
</tr>
<tr>
<td><code>G82</code></td>
<td>Drilling with a dwell at the bottom.</td>
</tr>
<tr>
<td><code>G83</code></td>
<td>Peck drilling — <code>Q</code> increments with a full retract to the <code>R</code> point.</td>
</tr>
<tr>
<td><code>G84</code></td>
<td>Right-hand tapping.</td>
</tr>
<tr>
<td><code>G85</code></td>
<td>Boring, feed out.</td>
</tr>
<tr>
<td><code>G86</code></td>
<td>Boring, spindle stop then rapid out.</td>
</tr>
<tr>
<td><code>G87</code></td>
<td>Back boring.</td>
</tr>
<tr>
<td><code>G89</code></td>
<td>Boring with a dwell at the bottom.</td>
</tr>
<tr>
<td><code>G80</code></td>
<td>Cancel.</td>
</tr>
<tr>
<td><code>G98</code> / <code>G99</code></td>
<td>Retract to the initial level / to the <code>R</code> level.</td>
</tr>
</tbody>
</table>
<p>A cycle is expanded into the individual strokes it performs — approach, peck, dwell, retract — each
with its own feedrate, so material removal and cycle time come out of the real motion rather than an
approximation. Modal repetition and <code>G91</code> incremental cycle data are resolved before the strokes are
built.</p>
<h3 id="polar-interpolation">Polar interpolation</h3>
<p><code>G12.1</code> turns polar coordinate interpolation on and <code>G13.1</code> turns it off. Inside a polar section the
<code>X</code> word is a <strong>diameter</strong> and the <code>C</code> word is a hypothetical Cartesian axis in millimetres, not
rotary degrees. HiNC halves <code>X</code>, resolves <code>G90</code> / <code>G91</code>, writes both the polar and the derived
Cartesian positions along with the machine C angle, and simulates polar linear and polar arc motion —
the arc as real spiral geometry that stays continuous across ±180°. <code>G41</code> / <code>G42</code> compensation is
resolved on the hypothetical plane, and <code>YA</code> / <code>ZB</code> axis pairs work the same way. G codes that
conflict with polar mode are checked before the mode is entered.</p>
<h3 id="path-smoothing">Path smoothing</h3>
<p><code>G05.1 Q1</code> enables high-precision contour control (AICC / Nano Smoothing) and <code>Q0</code> disables it. The
optional <code>R</code> precision level is preserved.</p>
<h3 id="m-codes">M codes</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>M00</code> / <code>M01</code></td>
<td>Program stop / optional stop.</td>
</tr>
<tr>
<td><code>M02</code> / <code>M30</code></td>
<td>Program end.</td>
</tr>
<tr>
<td><code>M03</code> / <code>M04</code> / <code>M05</code></td>
<td>Spindle clockwise / counter-clockwise / stop.</td>
</tr>
<tr>
<td><code>M06</code></td>
<td>Tool change. The axis travel the change requires is synthesized rather than teleported.</td>
</tr>
<tr>
<td><code>M07</code> / <code>M08</code> / <code>M09</code></td>
<td>Mist coolant on / flood coolant on / coolant off.</td>
</tr>
<tr>
<td><code>M98</code> / <code>M99</code></td>
<td>Subprogram call (<code>M98 P{program} L{repeat}</code>) and return, including <code>M99 P{sequence}</code> early return.</td>
</tr>
<tr>
<td><code>M198</code></td>
<td>Subprogram call from external storage — same shape as <code>M98</code>, different lookup folder.</td>
</tr>
</tbody>
</table>
<div class="NOTE">
<h5>Note</h5>
<p><strong>Composite and OEM M-codes are not built in — they are declared on the machine.</strong> An <code>M13</code> that
means &ldquo;spindle CW plus flood coolant&rdquo;, an M-code that triggers a tool change, or turret <code>T</code>-word
semantics are stated once in the machine's own M-code table and expanded into the ISO effects the
rest of the pipeline already understands. A code declared with no modelled effect is voiced once as
<code>DeclaredMCode--UnmodeledEffects</code> instead of raising an unknown-code warning on every occurrence.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>If a program states a spindle speed greater than zero but never issues a direction, HiNC assumes
clockwise and reports <code>SpindleDirection--AssumedCw</code>. Without that assumption the cutting-force
model would silently produce zero mechanics for the whole file.</p>
</div>
<h2 id="fanuc">Fanuc</h2>
<p>Everything in the ISO core, plus:</p>
<p><strong>Custom Macro B.</strong> <code>#</code> variable assignment and arithmetic, with each range routed to the store it
belongs to — <code>#1</code>–<code>#33</code> local to the macro frame, <code>#100</code>–<code>#499</code> volatile and cleared on <code>M02</code> /
<code>M30</code>, <code>#500</code>–<code>#999</code> retained and saved with the project, <code>#3000</code>–<code>#3999</code> system control. Boolean and
logical operators, <code>IF [..] GOTO n</code>, <code>IF [..] THEN &lt;statement&gt;</code>, and <code>WHILE [..] DO m</code> / <code>END m</code> with
a bounded-loop watchdog. Position and tool-offset system variables read back into expressions.</p>
<p><strong>Macro and subprogram calls.</strong> <code>G65</code> one-shot macro call, binding arguments <code>A</code>–<code>Z</code> onto <code>#1</code>–<code>#26</code>;
<code>G66</code> / <code>G67</code> modal macro, firing at every positioning block until cancelled; <code>M98</code> / <code>M198</code> / <code>M99</code>.
A callee's blocks are spliced into the program at the call site, so the rest of the run treats them
exactly as if they had been written in the main file.</p>
<p><strong>Not supported.</strong> <code>G10</code> programmable data setting, <code>G50</code> spindle speed clamp, <code>G31</code> skip.</p>
<h2 id="syntec">Syntec</h2>
<p>Syntec runs the ISO core plus the Fanuc-family macro and subprogram vocabulary and polar
interpolation.</p>
<p><strong>Not supported.</strong> Custom <code>G</code> macros defined on the controller, <code>Pr</code> parameter mapping, and
twin-head / twin-turret program syntax.</p>
<h2 id="mazak">Mazak</h2>
<p>Mazak reads EIA/ISO with the Fanuc-family macro and subprogram vocabulary and polar interpolation.</p>
<p><strong>Not supported.</strong> MAZATROL conversational sections, and switching between MAZATROL and EIA/ISO
inside one program. Export the EIA/ISO program from the controller.</p>
<h2 id="siemens-sinumerik">Siemens SINUMERIK</h2>
<p>Real <code>.mpf</code> / <code>.spf</code> programs replay end to end — this is not an ISO subset with a Siemens label on
it.</p>
<p><strong>Modal vocabulary.</strong> <code>SUPA</code> / <code>G153</code> suppress all frames for one block; <code>G70</code> / <code>G71</code> units; the
path-smoothing family (<code>G60x</code> / <code>G64x</code>, <code>FNORM</code> / <code>SOFT</code> / <code>FFWON</code> / <code>COMP*</code> / <code>UPATH</code>, <code>CYCLE832</code>);
<code>MSG()</code> and <code>STOPRE</code>; <code>CR=</code> and <code>TURN=</code> arcs. Tail comments are quote-aware, so a <code>;</code> inside
<code>MSG(&quot;A;B&quot;)</code> does not truncate the block. <code>G74</code> / <code>G75</code> fixed-point return is claimed as a whole
block, so the dummy axis values it carries never mint a rapid to those coordinates and its <code>F</code> never
reaches the modal feedrate.</p>
<p><strong>Tools.</strong> <code>T=&quot;NAME&quot;</code> string tool calls with <code>D</code> cutting-edge offsets, resolved through the <code>$TC_DP</code>
tool table — lengths and radius plus additive wear.</p>
<p><strong>Variables and expressions.</strong> R parameters <code>R0</code>–<code>R999</code> are held as per-project data, <code>DEF REAL</code> /
<code>DEF INT</code> declarations lower into assignments, and a full expression evaluator means <code>Z=R63+150</code> and
<code>X=SIN(R10)*20</code> drive real motion. <code>$P_UIFR[n,axis,TR]</code> binds both ways to the frame table. Any other
<code>$</code> variable is recorded with an unsupported note rather than silently dropped.</p>
<p><strong>Frames and five-axis.</strong> <code>TRANS</code> / <code>ATRANS</code> / <code>ROT</code> / <code>AROT</code> (with <code>RPL=</code>) compose into the tilt
chain in Sinumerik RPY order; <code>TRAORI</code> is a real RTCP mode, the sibling of ISO <code>G43.4</code>, with
<code>TRAFOOF</code> handing the offset back; <code>CYCLE800</code> is decoded from its MODE bits across all four swivel
modes.</p>
<p><strong>Calls and control flow.</strong> <code>L</code>-prefixed and named subprogram calls, inlined with their <code>P</code> repetition
count; <code>M17</code> / <code>RET</code>; <code>REPEAT</code> over a labelled slice; <code>MCALL CYCLE81</code> / <code>82</code> / <code>83</code> / <code>85</code> mapped onto
the shared canned-cycle machinery; <code>PROC</code> headers and labels. <code>GOTOF</code> / <code>GOTOB</code>, <code>IF</code> / <code>ELSE</code> /
<code>ENDIF</code>, and <code>WHILE</code> / <code>FOR</code> / <code>REPEAT-UNTIL</code> / <code>LOOP</code>. Jumps and loop iterations are capped rather
than hanging the session — over the cap the construct warns and falls through.</p>
<p><strong>Per-word coordinate functions.</strong> <code>AC()</code> / <code>IC()</code> / <code>DC()</code> / <code>ACP()</code> / <code>ACN()</code>, including on <code>I</code> /
<code>J</code> / <code>K</code> circle centres, so <code>G90 C=IC(360/17)</code> is one incremental index inside an absolute program.
<code>ACP()</code> takes the forward window, <code>ACN()</code> the backward one, and <code>DC()</code> the shortest swing.</p>
<p><strong>Coded positions.</strong> <code>CAC</code> / <code>CIC</code> / <code>CDC</code> / <code>CACP</code> / <code>CACN</code> take a 1-based indexing position number
instead of a coordinate, resolved against the machine's own indexing-position tables.</p>
<p><strong>OEM auxiliary M-codes.</strong> The preset declares <code>M12</code> / <code>M13</code> / <code>M22</code> / <code>M23</code> and <code>M330</code> / <code>M331</code> as
note-only, so each occurrence voices <code>DeclaredMCode--UnmodeledEffects</code> rather than an unknown-code
warning. A machine's own table overrides the declaration once the real effects are known.</p>
<p><strong>Recognized, not simulated.</strong> <code>ROTS</code> / <code>AROTS</code>, <code>SCALE</code> / <code>ASCALE</code>, and <code>MIRROR</code> / <code>AMIRROR</code> — each
reported as <code>SiemensFrame--Unsupported</code>.</p>
<p><strong>Not supported.</strong> <code>SETAL</code>.</p>
<h2 id="see-also">See also</h2>
<ul>
<li><a href="controller-heidenhain.html">Heidenhain Support</a> — klartext and Heidenhain DIN/ISO.</li>
<li><a href="../../fundamentals/nc-parsing/index.html">NC Parsing Engine</a> — the pipeline behind these codes, the
brand-by-brand support matrix in one table, and how a machine's own vocabulary is added without
changing HiNC.</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>
@@ -0,0 +1,222 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Controller | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Controller | 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="">
<h1 id="controller">Controller</h1>
<p>The controller is the NC parser a project reads its programs with: a brand, the machine and control
settings that brand assumes, and the coordinate, offset and variable tables an NC program addresses.
Setting it up is picking the brand first, then filling in the tables that brand grew.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown. Select
the <strong>Controller</strong> branch of the Control Tree (<code>/general-setup?tree=equipment/controller</code>); it sits
after Workpiece, and whichever node you select opens its editor below the tree in the same dock.</p>
<p>The branch grows children only with a project open and a controller resolved on it, so a Controller
node standing alone is the state before a project is open rather than a fault; a project file
naming no controller keeps the Fanuc preset. Once a runner resolves, the root's own panel badges the
brand in force and enables an <strong>Object Management</strong> (<code>⋮</code>) menu, whose <strong>Load</strong> installs a
<code>.Controller</code>, <code>.SoftNcRunner</code> or <code>.xml</code> runner file in place of the whole controller and whose
<strong>Save As</strong> writes the current one out, offered as <code>NcRunner.Controller</code>.</p>
<h2 id="pick-the-brand-first">Pick the brand first</h2>
<p>Select <strong>Controller Brand</strong> (<code>equipment/controller/machine/brand</code>), pick one of <strong>Fanuc</strong>,
<strong>Siemens</strong>, <strong>Heidenhain</strong>, <strong>Syntec</strong> and <strong>Mazak</strong>, and press <strong>Apply brand</strong>. Until you do the
pick is only staged: <strong>Revert</strong> drops it, and so does selecting another tree row.</p>
<p>Do it before anything else, because it replaces the whole controller rather than one field:</p>
<ol>
<li><strong>The dialect changes.</strong> Each brand is a different reader; what its G and M words actually do is
<a href="../../technique/nc-dialects/index.html">NC Dialects</a>.</li>
<li><strong>The node set changes.</strong> The branch is regrown, so nodes the new brand has no concept of stop
existing and its own appear.</li>
<li><strong>Machine settings reset</strong> to the new preset's defaults. The runner-owned ones — the tool-change
position, block-skip layers, subprogram folders and the macro iteration guards — reset on every
apply. The travel limits, rapid feedrates, home reference, M-code declarations and native
parameters live in the brand's parameter table and reset only where the switch also sweeps that
table; Fanuc and Mazak share one, so a switch between those two leaves them where they are.</li>
<li><strong>The old brand's own program-data tables are removed</strong> — the ones only that brand proxies:
Siemens frames, <code>$TC_DP</code> offsets and R parameters, Heidenhain datum presets and shifts. Tool
offsets survive every switch, and retained common variables survive among Fanuc, Syntec and
Mazak. What is swept does not come back: switching back builds those tables fresh from the new
preset's defaults.
<strong>Carry work-coordinate XYZ (G54…) into the new brand's table</strong>, ticked by default, moves the
work offsets across — only those, and only for ids the new brand also holds: Fanuc to Siemens
keeps G54–G57 and drops the rest.</li>
</ol>
<p>A brand switch and an Object-Management load are both refused while an NC program is playing — see
<a href="../run/playing-a-program.html">Playing a Program</a>.</p>
<p>The <strong>Controller Brand</strong> leaf on a demo project, at
<code>/general-setup?tree=equipment/controller/machine/brand</code>. The machine plane above it is expanded, so
the eleven leaves this brand grows are all visible; the panel below carries the <strong>Controller brand</strong>
select reading <em>Fanuc</em>, the carry checkbox ticked, and the <strong>Apply brand</strong> and <strong>Revert</strong> buttons
that are enabled only while a different brand is staged.</p>
<p><img src="controller-img/controller-brand.en.png" alt="The Controller branch of the Control Tree with its Machine / Controller plane expanded, listing Controller Brand, Machine Limits (Stroke), Rapid Feedrates, Home / G28 Reference, Tool-Change Position, Controller Parameters, M-Code Declarations, Canned Cycle (Peck), Block Skip / Delete, Subprogram Folders and Parameters (Native); the panel below shows a Controller brand select reading Fanuc, a ticked checkbox reading carry work-coordinate XYZ into the new brand's table, and the Apply Brand and Revert buttons"></p>
<h2 id="the-two-planes">The two planes</h2>
<p>Every other node hangs on one of two group stems, and which one it is on says what it describes;
selecting a stem lists its children.</p>
<table>
<thead>
<tr>
<th>Plane</th>
<th>Tree id</th>
<th>What sits on it</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Machine / Controller</strong></td>
<td><code>equipment/controller/machine</code></td>
<td>What the machine is wired to do: travel limits, rapid feedrates, the home / G28 reference, the tool-change position, the controller parameters in both a grouped and a native form, the peck clearance, M-code declarations, block-skip layers, subprogram folders and, on Siemens, the indexing position tables</td>
</tr>
<tr>
<td><strong>Program Data</strong></td>
<td><code>equipment/controller/program-data</code></td>
<td>The tables a program reads and writes: work coordinates (G54…) and tool offsets on every brand, plus the brand's own — Siemens frames, <code>$TC_DP</code> offsets and R parameters, Heidenhain datum presets and shifts, Fanuc-family retained common variables</td>
</tr>
</tbody>
</table>
<p>The machine plane's per-axis rows are driven by the machine tool's chain: every brand preset already
declares X, Y and Z, and attaching a machine tool adds that chain's own axes beside them. Program
data stays with the project, so loading a controller file of the brand already in force leaves those
tables as they are.</p>
<p><strong>Work Coordinates</strong> always lists the plain <code>G54</code>–<code>G59</code> rows its brand's table holds — Siemens seeds
only G54–G57 — and, on Fanuc, Mazak and Syntec, the extended <code>G59.1</code>–<code>G59.9</code> rows of the
brand-neutral table that sits behind the brand table; it shows the <code>G54.1P</code> and <code>G505</code>–<code>G599</code> rows
once a value is non-zero or the <strong>Show all</strong> toggle is on. Each row carries <strong>P0</strong>, which writes the machine coordinate the
workpiece's program-zero anchor sits at, and <strong>M0</strong>, which writes machine zero; clicking anywhere in
a row also marks that coordinate on the canvas. Aligning program zero <em>onto</em> a row's offset is not
on this branch: <strong>Align P0</strong> is on the Legacy Controller screen's Coordinate Table tab, which edits a
separate controller model — <a href="../utilities/legacy-controller.html">Legacy Controller</a>.</p>
<h2 id="a-table-that-is-not-there">A table that is not there</h2>
<p>A node the active brand has no concept of is never created rather than shown and disabled — Frames
on Fanuc, Retained Common Variables on Siemens, Block Skip / Delete on Heidenhain — and a <code>?tree=</code>
link naming one does nothing on the wrong brand, so name the brand alongside any id shared. Nor is an
id promised to survive a version change — see <a href="../basics/finding-your-way.html">Finding Your Way</a>.</p>
<p>Two further rows may differ from a colleague's tree for an unrelated reason: <strong>CSV Controller</strong> and
<strong>CL Controller</strong> are separate non-brand controllers, absent until their box in the <strong>Preference</strong>
dropdown is switched on, and which box is on is a per-device setting — see
<a href="../basics/preferences.html">Preferences</a>. Unlike a brand-gated node, though, these two are still
reachable by link: a <code>?tree=equipment/controller-csv</code> or <code>?tree=equipment/controller-cl</code> mints the
node and selects it whatever the box says, so a shared bookmark never dead-ends.</p>
<p><strong>The Preference menu answers whether you need either of them.</strong> Under each of the two checkboxes it
reads <em>This project plays CSV</em> / <em>This project plays CL</em>, or <em>Not used by this project</em>, worked out
from what the open project actually plays — the kinds its mission commands name, the play verbs its
scripts call, and, for CL, a machine chain that can only be driven from CL. Neither node is a setup task in its own right:
both are childless leaves with no Object Management, because a CSV or CL pipeline is not loaded,
pasted or saved as a file the way a brand controller is. Switching a box on reveals the pipeline's
settings; leaving it off on a project that plays neither costs nothing.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../../technique/nc-dialects/index.html">NC Dialects</a> — what each brand's G and M vocabulary actually does, once the brand is picked</li>
<li><a href="../utilities/legacy-controller.html">Legacy Controller</a> — the superseded screen that still owns Align P0 and the two switches this branch has no editor for</li>
<li><a href="machine-tool.html">Machine Tool</a> — the chain whose axes fill the per-axis rows on the machine plane</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — the other half of a work offset: where program zero sits on the workpiece</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

@@ -87,9 +87,32 @@
<article data-uid="Equipment/Coolant">
<h1 id="coolant">Coolant</h1>
<p>Models the cutting-zone cooling for the milling temperature FEM. Lives on <a class="xref" href="../../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a><small>(API)</small>; consumed by <a class="xref" href="../../api/Hi.Physics.MillingTemperatureUtil.html">MillingTemperatureUtil</a><small>(API)</small> every simulation step.</p>
<p>Two thermal settings sit beside each other in the equipment tree: how the cutting zone is cooled,
and how warm the shop is around it. Both feed the milling-temperature model, so they move computed
temperatures and everything downstream of them — and setting them needs no heat-transfer numbers at
all, because the cooling types ship as ready-made files.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown.
<strong>Background</strong> (<code>/general-setup?tree=equipment/background</code>) and <strong>Coolant</strong>
(<code>/general-setup?tree=equipment/coolant</code>) are two leaves of the Control Tree, sitting together
between Spindle Capability and Fixture. Both are inert until a project is open: the fields are
disabled and the panel says so.</p>
<p>The <strong>Coolant</strong> leaf selected on a demo project. The panel under the tree opens with the file row —
the <strong>Select</strong> dropdown, the path field reading <em>No coolant file (saved inline)</em>, and <strong>Save As&hellip;</strong>
— then the read-only <strong>Name</strong> and <strong>Note</strong> of whatever file is loaded, and then the condition's own
values. Neither leaf puts anything in the middle column.</p>
<p><img src="coolant-img/coolant-leaf.en.png" alt="The Coolant leaf of the Control Tree selected on the General Setup page, its panel showing the Select dropdown and empty file path above read-only Name and Note fields, then a Coolant Temperature of 25 °C and a Flood Convection Coefficient of 1000 W/(m²·K) with the app's own guidance underneath it"></p>
<h2 id="pick-a-cooling-type">Pick a cooling type</h2>
<p>You do not need to know any heat-transfer numbers to set up cooling. In the Player control tree, open <strong>Equipment Setup → Coolant</strong>, click <strong>Select → Browse Resource&hellip;</strong>, and pick the ready-made <code>.CoolantHeatCondition</code> file for the cooling your machine uses — exactly the way a workpiece material file is picked:</p>
<p>The three standard cooling types ship as ready-made <code>.CoolantHeatCondition</code> files, so picking one
<em>is</em> the cooling-type selection — exactly the way a workpiece material file is picked.</p>
<ol>
<li>Select the <strong>Coolant</strong> leaf.</li>
<li>Open the <strong>Select</strong> dropdown at the left of the file row and choose <strong>Browse Resource&hellip;</strong>. It
opens the file picker in the shipped library's own coolant folder, so the three files below are
what it lists. <strong>Browse&hellip;</strong> above it opens the same picker without that jump, which is how a
condition you saved yourself is reached.</li>
<li>Pick the file that matches the machine.</li>
</ol>
<table>
<thead>
<tr>
@@ -104,7 +127,7 @@
</tr>
<tr>
<td><strong>StandardWaterSolubleCoolant</strong></td>
<td>Water-based emulsion coolant, the common flood coolant. (A fresh project already carries these values.)</td>
<td>Water-based emulsion coolant, the common flood coolant.</td>
</tr>
<tr>
<td><strong>StandardOilBasedCoolant</strong></td>
@@ -112,136 +135,74 @@
</tr>
</tbody>
</table>
<p>Loading a file fills the <strong>Name / Note</strong> and every property field shown below them. For a customized setup, tune the fields directly and keep the result as your own named file with <strong>Save As&hellip;</strong> — it can be loaded back later, or from another project.</p>
<p>That is the whole end-user setup. Everything below explains what the values mean.</p>
<h2 id="nc-program-drives-the-mode">NC program drives the mode</h2>
<p>The parser reads M07/M08/M09 into <a class="xref" href="../../api/Hi.Numerical.CoolantMode.html">CoolantMode</a><small>(API)</small> and carries it on every <a class="xref" href="../../api/Hi.MachiningSteps.MachineMotionStep.html">MachineMotionStep</a><small>(API)</small>. The FEM picks the effective convection coefficient at run time from that mode.</p>
<p>Loading a file fills the read-only <strong>Name</strong> and <strong>Note</strong> and every value below them, and reports the
name it loaded.</p>
<p><strong>A project nobody has touched here is not neutral.</strong> Every project carries a coolant condition from
the moment it exists, and it starts on the water-soluble numbers — 25 °C, a flood baseline of
1000 W/(m²·K), a mist ratio of 0.5 and 50 W/(m²·K) with the coolant off. The read-only <strong>Name</strong> is
blank, because no file has been picked, and that blank is the only sign that nobody chose these
values. A dry-cutting machine left alone therefore simulates as though it were flooded with
water-soluble coolant, and its computed temperatures come out low.</p>
<h2 id="the-four-values">The four values</h2>
<p>They are visible whether or not a file is loaded, and editing one tunes <em>this project's</em> copy rather
than the file it came from. Each carries the app's own working range as a hint:</p>
<table>
<thead>
<tr>
<th>M-code</th>
<th><code>CoolantMode</code></th>
<th>Coefficient source</th>
<th>Field</th>
<th>What it is</th>
<th>Range the panel suggests</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>M08</code></td>
<td><code>Flood</code></td>
<td><code>CoolantConvectionCoefficient_Wdm2K</code> (baseline of the chosen type)</td>
</tr>
<tr>
<td><code>M07</code></td>
<td><code>Mist</code></td>
<td>baseline × <code>MistFloodConvectionRatio</code></td>
</tr>
<tr>
<td><code>M09</code></td>
<td><code>Off</code></td>
<td><code>OffConvectionCoefficient_Wdm2K</code></td>
</tr>
</tbody>
</table>
<p>Before the first M07/M08/M09 the mode is <code>UnDefined</code>; the FEM treats it as <code>Off</code>.</p>
<p>For <strong>StandardForcedAir</strong> (dry cutting) the machine has no liquid circuit, so even <code>M08</code> only means &ldquo;air blast on&rdquo; — its flood baseline is an air-blast coefficient, not a liquid one.</p>
<h2 id="what-each-shipped-file-sets">What each shipped file sets</h2>
<p>Each shipped cooling type is also a static preset on <a class="xref" href="../../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a><small>(API)</small> (<code>StandardForcedAir</code>, <code>StandardWaterSolubleCoolant</code>, <code>StandardOilBasedCoolant</code>) — the same pattern as <code>WorkpieceMaterial.Al6061T6</code>; the resource files are generated from them:</p>
<table>
<thead>
<tr>
<th>Preset / file</th>
<th>Flood baseline W/(m²·K)</th>
<th>Mist ratio</th>
<th>Off W/(m²·K)</th>
<th>Temperature °C</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>StandardForcedAir</code></td>
<td>100</td>
<td>0.5</td>
<td>50</td>
<td>25</td>
</tr>
<tr>
<td><code>StandardWaterSolubleCoolant</code></td>
<td>1 000</td>
<td>0.5</td>
<td>50</td>
<td>25</td>
</tr>
<tr>
<td><code>StandardOilBasedCoolant</code></td>
<td>300</td>
<td>0.5</td>
<td>50</td>
<td>25</td>
</tr>
</tbody>
</table>
<p>The baselines are engineering defaults from the literature ranges below; when you have dynamometer / thermocouple data for your own system, tune the fields and save your own file instead. API side: <code>ApplyPreset</code> copies a preset in place; <code>MatchStandardPreset</code> maps values back to a preset name.</p>
<h2 id="properties">Properties</h2>
<p>These are the fields shown under Name / Note in the Coolant panel:</p>
<table>
<thead>
<tr>
<th>Property</th>
<th>Default</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CoolantTemperature_C</code></td>
<td>25</td>
<td>Room temperature inside the enclosure.</td>
</tr>
<tr>
<td><code>CoolantConvectionCoefficient_Wdm2K</code></td>
<td>1 000</td>
<td>Flood baseline. Water-based emulsion ≈ 1 000–3 000, oil ≈ 100–500, forced air ≈ 10–500.</td>
</tr>
<tr>
<td><code>MistFloodConvectionRatio</code></td>
<td>0.5</td>
<td>MQL is roughly half the heat removal of flood. See below.</td>
</tr>
<tr>
<td><code>OffConvectionCoefficient_Wdm2K</code></td>
<td>50</td>
<td>Forced air inside a running enclosure. Natural air ≈ 5–25.</td>
</tr>
<tr>
<td><code>Name</code> / <code>Note</code></td>
<td><strong>Coolant Temperature</strong> (°C)</td>
<td>The temperature of the coolant as it arrives at the cut</td>
<td>—</td>
<td>From the loaded file / preset; <strong>Save As&hellip;</strong> renames the condition after the file. Legacy projects without a name still work.</td>
</tr>
<tr>
<td><strong>Flood Convection Coefficient</strong> (W/(m²·K))</td>
<td>Heat removal with the coolant on</td>
<td>Forced air 10–500; typical liquid coolant 1000–10000</td>
</tr>
<tr>
<td><strong>Mist / Flood Ratio</strong></td>
<td>Mist heat removal relative to flood</td>
<td>Typically 0.4–0.8</td>
</tr>
<tr>
<td><strong>Off (Air) Convection Coefficient</strong> (W/(m²·K))</td>
<td>Heat removal with the coolant off</td>
<td>Natural air 5–25; forced air inside an enclosure about 50</td>
</tr>
</tbody>
</table>
<h2 id="why-the-mist-ratio-defaults-to-05">Why the mist ratio defaults to 0.5</h2>
<p>MQL removes much less heat than flood because a thin oil aerosol has a tiny thermal mass; its main value is lubrication plus evaporative cooling, not convection. Industry handbooks place it at <strong>roughly half of flood</strong>, which gives the conservative default <code>0.5</code>. Override it when you have dynamometer / thermocouple data for your own MQL system.</p>
<div class="NOTE">
<h5>Note</h5>
<p>Further reading: UNIST <em>MQL Handbook</em> (source of the &ldquo;about half&rdquo; rule), ANEBON mist-vs-flood AISI 1045 tests, Mukesh et al. <em>IEJ</em> May 2023 review on sustainable machining. Use these only to dig deeper — the <code>0.5</code> default is already calibrated from them.</p>
</div>
<h2 id="coolant-files-workpiecematerial-pattern">Coolant files (WorkpieceMaterial pattern)</h2>
<p><code>MachiningEquipment.CoolantHeatConditionFile</code> tracks an optional <code>.CoolantHeatCondition</code> side-file, exactly like <code>Workpiece.WorkpieceMaterialFile</code> tracks a material file:</p>
<p>Negative temperatures are accepted, for cryogenic coolant; the three convection coefficients cannot
go below zero.</p>
<p>Which of the three coefficients is in force at any moment is not decided here — the NC program's own
M07 / M08 / M09 decide it, step by step. That, and what the numbers do to the simulation, are
<a class="xref" href="../../technique/milling-physics/coolant-model.html">Coolant Model</a>.</p>
<h2 id="keeping-a-tuned-condition">Keeping a tuned condition</h2>
<p><strong>Save As&hellip;</strong> writes the current values out as a <code>.CoolantHeatCondition</code> file in the project folder
and starts tracking it, so the project saves a reference to the file instead of a copy of the
values. It offers a name taken from the loaded condition; a file picked from the shipped library
loses its <code>.default</code> marker on the way, because that marker means <em>shipped</em> and a file you saved is
yours.</p>
<p>The result is loadable into the next project through the same <strong>Select</strong> dropdown — which is the
point of saving one: a shop with its own measured coolant performance describes it once.</p>
<h2 id="background-temperature">Background temperature</h2>
<p>The <strong>Background</strong> leaf carries a single field, <strong>Background Temperature</strong> in °C: the surrounding
temperature the thermal model works against. It defaults to 25 °C, it belongs to the project exactly
as the coolant condition does, and it is read by the same milling-temperature model and by the feed
optimizer, so it is not a display setting.</p>
<p>Set it to the shop's real ambient. There is no file to load and nothing else to configure: one
number, applied to the whole project.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><strong>No file (default):</strong> the condition serializes inline in the <code>.hincproj</code>, byte-compatible with pre-pattern readers.</li>
<li><strong>File tracked:</strong> the project save externalizes the condition as <code>&lt;CoolantHeatCondition&gt;&lt;XmlSource&gt;relPath&lt;/XmlSource&gt;&lt;/CoolantHeatCondition&gt;</code> and (re)writes the side-file. Loading a file installs it in place of the current condition and records the reference (<code>XFactory.GenByFile&lt;CoolantHeatCondition&gt;</code>); a file loaded from the resource folder is copied into the project on the next save (self-contained project root).</li>
<li><a class="xref" href="../../technique/milling-physics/coolant-model.html">Coolant Model</a> — the coefficients, the M-code that selects one, the shipped presets and the file format</li>
<li><a class="xref" href="../../anatomy/general-setup/background-coolant.html">Background / Coolant Page</a> — the Control-Tree editor for these values, field by field</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
<h2 id="xml">XML</h2>
<pre><code class="lang-xml">&lt;CoolantHeatCondition&gt;
&lt;Name&gt;StandardOilBasedCoolant&lt;/Name&gt;
&lt;Note&gt;Oil-based cutting fluid (neat oil).&lt;/Note&gt;
&lt;CoolantTemperature_C&gt;25&lt;/CoolantTemperature_C&gt;
&lt;CoolantConvectionCoefficient_Wdm2K&gt;300&lt;/CoolantConvectionCoefficient_Wdm2K&gt;
&lt;MistFloodConvectionRatio&gt;0.5&lt;/MistFloodConvectionRatio&gt;
&lt;OffConvectionCoefficient_Wdm2K&gt;50&lt;/OffConvectionCoefficient_Wdm2K&gt;
&lt;/CoolantHeatCondition&gt;
</code></pre>
<p><code>Name</code>/<code>Note</code> are optional (pre-preset files omit them); omit the last two elements to accept the defaults. The same element saved standalone is the <code>.CoolantHeatCondition</code> file format; inside a <code>.hincproj</code> it may instead appear as the <code>&lt;XmlSource&gt;</code> reference shown above.</p>
</article>
Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title>Cutter Configuration Notes | HiAPI-C# 2025 </title>
<title>Cutter | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Cutter Configuration Notes | HiAPI-C# 2025 ">
<meta name="title" content="Cutter | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
@@ -85,91 +85,118 @@
</div>
<article data-uid="">
<h1 id="cutter-configuration-notes">Cutter Configuration Notes</h1>
<h1 id="cutter">Cutter</h1>
<h2 id="cutter-body-settings">Cutter Body Settings</h2>
<h3 id="cutter-body-types">Cutter Body Types</h3>
<p>Cutter body types include:</p>
<p>A tool is one entry in the project's tool house, identified by its T-number, and it is the whole
assembly the spindle turns: a cutter, the holder it sits in, how far it stands out, and the sensor
settings a smart holder needs. All of it is edited on the Tool House page, one tool at a time and one
aspect per tab.</p>
<p>What each quantity means, and how to choose between the two ways of expressing a cutting envelope,
is <a class="xref" href="../../technique/milling-physics/cutter-geometry.html">Cutter Geometry</a>. This page is where they are entered.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The Tool House page, at <code>/tool-house</code>, reached from the menu bar's <strong>Page</strong> dropdown. Three columns:
the tool house and its tool list on the left, the selected tool's tabs in the middle, and a canvas
drawing that tool on the right. Selecting a different tool keeps the tab you were on, so a walk down
the list stays on the same aspect of each tool.</p>
<p>Tool 1 of a fifteen-tool demo house with the <strong>Cutter</strong> tab open, at <code>/tool-house/1/cutter/profile</code>.
The tool list carries one row per tool — its number badge and its note, or the derived abstract note
where no note has been typed. The tab strip above the editor is the tool's five tabs; below the
cutter's own identity fields is a second strip of section tabs, and <strong>Flute Profile</strong> is the one
selected, showing a <strong>Column APT</strong> profile with its diameter, length of cut and round radius.</p>
<p><img src="cutter-img/flute-profile.en.png" alt="The Tool House page: a left column listing fifteen tools with New Tool above them, a middle column showing the General, Cutter, Holder, Clamping and Int. Holder tabs with Cutter selected, a Cutter Type of Milling Cutter over Shank Mass, Hone Radius and Relief Angle, a section tab strip reading Material, Flute Profile, Flute Contours, Upper Beam and Optimization with Flute Profile selected and a Column APT profile below it, and the cutter drawn on the canvas at the right"></p>
<h2 id="the-tool-house-is-a-file-of-its-own">The tool house is a file of its own</h2>
<p>The list on the left is the project's tool house, and the <strong>Object Management</strong> (<code>⋮</code>) button beside
<strong>New Tool</strong> manages <strong>the whole house rather than one tool</strong> — its file extension is
<code>.MachiningToolHouse</code>. That is how a set of tools is reused: <strong>Save As</strong> writes the house out, and
<strong>Load</strong> on another project installs it in place of whatever that project had. A shop that runs the
same twenty tools across every job describes them once.</p>
<p><strong>New Tool</strong> stays disabled until the project has a tool house at all; a project without one shows an
empty-state block naming that button and the <code>.MachiningToolHouse</code> extension instead of the tool
count.</p>
<h2 id="creating-duplicating-and-deleting-a-tool">Creating, duplicating and deleting a tool</h2>
<p>There is no dialog to fill in first — a new tool arrives with default values and is then set up in
the tabs.</p>
<ol>
<li>Press <strong>New Tool</strong>. The tool takes the next number: one past the largest already in the house, or
1 in an empty one.</li>
<li>Open the <strong>General</strong> tab to give it its identity. <strong>Tool ID</strong> is the T-number, and committing a
change there renames the tool. <strong>Note</strong> is yours to write; the read-only <strong>Abstract Note</strong> beneath
it is derived from the cutter you give the tool in the next step, and carries a one-click copy
button.</li>
<li><strong>Duplicate</strong> and <strong>Delete</strong> are icon buttons on the same tab. A duplicate is inserted at the
first free number past both the tool it was copied from and the largest in the house, so it never
lands on top of an existing tool.</li>
</ol>
<p><strong>A tool number cannot be repeated.</strong> Renaming a tool onto a number the house already holds is
refused as a conflict rather than overwriting anything, so the way to swap two numbers is to move one
of them out of the way first.</p>
<p>Tool 1's <strong>General</strong> tab, at <code>/tool-house/1</code>. The <strong>Abstract Note</strong> below the editable note is
derived from the cutter the tool carries rather than typed, which is why a tool with no note of its
own still reads as something recognisable in the list on the left.</p>
<p><img src="cutter-img/tool-house-general.en.png" alt="The General tab of the Tool House page with tool 1 selected out of fifteen, showing the Tool ID and Note fields above a read-only Abstract Note describing the cutter, and the cutter drawn on the canvas at the right"></p>
<h2 id="giving-it-a-cutter">Giving it a cutter</h2>
<p>The <strong>Cutter</strong> tab chooses what kind of cutter the tool carries — <strong>Milling Cutter</strong>, <strong>Freeform
Remover</strong>, or none — and holds the fields every cutter has: <strong>Shank Mass</strong>, <strong>Hone Radius</strong> and
<strong>Relief Angle</strong>. Assigning a milling cutter grows a second strip of section tabs beneath them, and
that is where the description proper is entered:</p>
<table>
<thead>
<tr>
<th>Section tab</th>
<th>What it holds</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Material</strong></td>
<td>The flute, shank and coating materials. It is there only while the <strong>Show Physics Options</strong> preference is on, and when it is there it is the <strong>first</strong> tab in the strip — so on a device with that preference off the strip has four tabs and opens on Flute Profile instead. See <a href="../basics/preferences.html">Preferences</a>, which also covers why flipping that preference does not change a strip already on screen.</td>
</tr>
<tr>
<td><strong>Flute Profile</strong></td>
<td>The cutting-edge envelope, as one of the five APT types: General, Ball, Column, Cone and Taper.</td>
</tr>
<tr>
<td><strong>Flute Contours</strong></td>
<td>The fluting: how many flutes, and each flute's side and bottom contour.</td>
</tr>
<tr>
<td><strong>Upper Beam</strong></td>
<td>The shank above the flute.</td>
</tr>
<tr>
<td><strong>Optimization</strong></td>
<td>The per-cutter limits the optimizer respects.</td>
</tr>
</tbody>
</table>
<h2 id="holding-it-and-how-far-it-stands-out">Holding it, and how far it stands out</h2>
<p>Three more tabs carry the rest of the tool.</p>
<p><strong>Holder</strong> picks the holder kind — none, a <strong>Cylindroid</strong> holder, or a freeform one — and, for a
cylindroid holder, grows <strong>Geometry</strong> and <strong>Resolution</strong> sub-tabs: the holder's Z-against-radius
profile, and how finely it is meshed.</p>
<p><strong>Clamping</strong> is two numbers that are really one. <strong>Exposed Cutter Height</strong> is how far the cutter
stands out; <strong>Preserved Distance</strong> is the gap between the top of the flute and the spindle nose. They
differ by the flute height, so editing either one moves the other, and the panel says so.</p>
<p>Tool 1's <strong>Clamping</strong> tab, at <code>/tool-house/1/clamping</code>. The two fields read 28 mm and 8 mm, and the
line beneath them states the relation the server keeps between them.</p>
<p><img src="cutter-img/clamping.en.png" alt="The Clamping tab of the Tool House page showing an Exposed Cutter Height of 28 mm above a Preserved Distance field labelled flute top to spindle nose reading 8 mm, with a caption stating that ExposedCutterHeight equals PreservedDistance plus FluteHeight and that changing either field updates the other on the server"></p>
<p><strong>Int. Holder</strong> is the smart holder's <strong>Observation Location</strong>: which anchor the sensor reading is
referenced to — none, the tool tip, the holder anchor or the spindle buckle — then the height above
that anchor and the radius of the observation ring. What those settings mean is
<a class="xref" href="../../technique/measurement/smart-tool-holder.html">Smart Tool Holder</a>.</p>
<h2 id="two-kinds-this-screen-cannot-draw-the-numbers-for">Two kinds this screen cannot draw the numbers for</h2>
<p>The <strong>Freeform Remover</strong> cutter and the freeform holder geometry can be selected here, but this page
carries no editor for either. Picking one leaves whatever the tool already holds untouched — nothing
is cleared — and shows a note naming where that shape can be edited instead. The same is true of the
custom spinning profile: the Flute Profile tab offers the five APT types and nothing else.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><strong>Milling</strong>
Any tool that machines by rotation is classified as milling in HiNC, including drilling and boring.</li>
<li><strong>Freeform Subtraction</strong>
Cutting tools, EDM (electrical discharge machining) dies.</li>
<li><a class="xref" href="../../technique/milling-physics/cutter-geometry.html">Cutter Geometry</a> — what every quantity on these tabs means, and when to prefer an extended cylinder over an explicit shank profile</li>
<li><a class="xref" href="../../technique/measurement/smart-tool-holder.html">Smart Tool Holder</a> — the sensor settings behind the Int. Holder tab</li>
<li><a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a> — what to collect about a tool before creating it</li>
<li><a href="../../technique/milling-physics/index.html">Milling Physics</a> — the models every quantity entered here feeds</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
<h3 id="milling-tool-description-parameters">Milling Tool Description Parameters</h3>
<ul>
<li>Material: Shank material, cutter body material, (multi-layer) coating material and thickness.</li>
<li>Cutting edge rotation envelope: Can use simplified parameters (APT) or a custom ZR table.</li>
<li>Simplified (yield-equivalent) edge center rotation envelope:
<ul>
<li>Solid space ratio of the cutting edge rotation envelope.</li>
<li>Custom ZR table.</li>
</ul>
</li>
<li>Clamping end (non-cutting zone) shape: Custom ZR table.</li>
<li>Per-tooth geometry (including side edges and bottom edges):
<ul>
<li>Simplified parameters: Helix angle position, rake angle, relief angle.</li>
<li>Custom per-Z value: Helix angle position, rake angle, relief angle, radius length.</li>
</ul>
</li>
<li>Hone radius, tool weight, insert weight, and (thermal-equivalent) thickness.</li>
</ul>
<blockquote>
<p>For information on measuring rake angle and relief angle, refer to <a href="../analysis/radial-angle-measurement.html">Radial Angle Measurement</a>.</p>
</blockquote>
<h3 id="upper-beam-clamping-end--shank-geometry">Upper Beam (Clamping End / Shank) Geometry</h3>
<p>The <em>upper beam</em> is the cutter's shank / body above the flute — the non-cutting,
clamping zone. It can be modeled with several geometry types; the two common
choices are:</p>
<ul>
<li><p><strong>Cylindroid</strong> — an explicit ZR table. You author every <code>(Z, r)</code> pair, so the
shank radius (and any stepped / necked profile) is whatever you type in. This
faithfully reproduces a <em>known</em> shank, but every value is data you must supply.</p>
</li>
<li><p><strong>Extended Cylinder</strong> — a cylinder whose <strong>start (bottom) profile is driven by
the flute</strong> and whose only parameter is the total length. Its radius follows
the cutter (flute-top) radius automatically, so it needs <strong>no shank
measurements</strong> — only a length long enough to reach the holder.</p>
<p>⚠ <strong><code>FullLength</code> is the beam's FULL length measured from <code>Z=0</code> (the cutter
tip), so it includes the flute span</strong> — it is <em>not</em> the remaining segment from
the flute top to the exposed end. It must therefore be <strong>larger than the flute
height</strong>: e.g. flute height 20 mm and 10 mm of shank above it → <code>FullLength = 30</code>, not 10. A value at or below the flute height inverts the beam solid;
thermal physics then cannot build its shank shell layers and reports a
<code>Cutter-UpperBeam--BelowFluteHeight</code> configuration error at tool change (the
web editor rejects such a value outright).</p>
</li>
</ul>
<p><strong>Convention — prefer the Extended Cylinder when the shank is not given.</strong> Most
tool sheets (especially at quoting stage) list only the cutting diameter, corner
radius, and stick-out; they do not give a shank diameter or a stepped/necked
profile. In that case use the <strong>Extended Cylinder</strong>: it extends the flute by a
length without inventing a radius the data does not support. A hand-authored
Cylindroid here would bake a <em>guessed</em> shank radius into the model — and an
over-fat guess produces false clearance / collision results, while an over-thin
one understates the body. Reserve the <strong>Cylindroid</strong> (explicit ZR) for tools
whose shank or neck profile is actually known or measured — e.g. stepped,
necked, or back-tapered shanks where a flute-radius extension would be wrong.</p>
<blockquote>
<p>Tip: because the Extended Cylinder's radius tracks the flute, set its length
comfortably past the exposed cutter height so the beam reaches into the holder
with no gap; the overlap is harmless for clearance checks.</p>
</blockquote>
<h3 id="relief-angle-setting">Relief Angle Setting</h3>
<p>The relief angle setting in HiNC refers to the primary relief angle. It is used to calculate flank wear width (Flank Wear, VB).</p>
<h3 id="cutter-body-weight">Cutter Body Weight</h3>
<p>Cutter body weight is used for thermal transfer calculations.</p>
<ul>
<li>Solid tools: Enter the weight of the solid tool as the cutter body weight.</li>
<li>Indexable tools: Enter the total insert weight as the cutter body weight, excluding the weight of the tool body.</li>
</ul>
<h3 id="hone-radius">Hone Radius</h3>
<p>The hone radius represents the sharpness of the tool and is the radius at the cutting edge tip. Typical values range from 20 to 50 um.</p>
<p>Tools used for machining easy-to-cut materials typically have a smaller hone radius (e.g., Al6061-T6, which can be assumed as 20 um); tools used for difficult-to-cut materials typically have a larger hone radius (e.g., stainless steel, which can be assumed as 50 um).</p>
<h3 id="edge-profile-and-edge-grind--bottom-edge-grind">Edge Profile and Edge Grind — Bottom Edge Grind</h3>
<p>The bottom edge grind needs to be configured when the bottom edge is horizontal or concave, and it affects segments with downward cutting.</p>
<p>Drill bits do not require bottom edge grind configuration — only the side edge grind needs to be set. This is because drill bit bottoms are not horizontal or concave. If a custom drill bit has a horizontal or concave bottom, then the bottom edge grind must be configured.</p>
<p>Typically, only bull-nose cutters require bottom edge grind configuration. Note that flat end mills usually do not perform downward cutting and should not, but if the process does so, the bottom edge grind must be configured.</p>
</article>
Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

@@ -0,0 +1,211 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Fixture | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Fixture | 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="">
<h1 id="fixture">Fixture</h1>
<p>The fixture is what clamps the workpiece onto the machine table. Setting one up is three things:
having a fixture on the project at all, giving it a geometry, and placing that geometry between the
table and the workpiece.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown. Select
the <strong>Fixture</strong> branch of the Control Tree (<code>/general-setup?tree=equipment/fixture</code>); it sits with
the other equipment items, between Coolant and Workpiece. The selected node's editor opens below the
tree in the same dock, and the canvas beside them draws the fixture with the rest of the scene.</p>
<p>The branch root selected on a demo project, at <code>/general-setup?tree=equipment/fixture</code>. The panel
under the tree is a summary rather than an editor: the <strong>Object Management</strong> (<code>⋮</code>) button, a
<strong>Geometry type</strong> badge naming the kind in the slot — here <code>TransformationGeom</code> — and the caption
saying that the geometry and the two anchor transformers are edited through the child items. Both
of those children, <strong>Geometry</strong> and <strong>Anchor</strong>, carry expand arrows of their own.</p>
<p><img src="fixture-img/fixture-branch.en.png" alt="The Fixture branch of the Control Tree selected on the General Setup page, its panel showing the Object Management button, a Geometry type badge reading TransformationGeom and a caption pointing at the child items, with Geometry and Anchor listed as its children"></p>
<h2 id="the-fixture-a-project-carries">The fixture a project carries</h2>
<p>A new project is created with a fixture already on it, its geometry slot pre-filled with a
<code>TransformationGeom</code>, so the branch is normally populated the moment a project is open. A project
may also legitimately carry no fixture: the root then has no children under it, the Object
Management button is greyed out, and the caption reads <em>No fixture available. Open or create a
project first.</em> That is a valid setup rather than a broken one — with no fixture the workpiece is
assembled onto the machine directly, anchored on its table buckle, one of the four named anchors the
scene is assembled at (<a class="xref" href="../../technique/mechanism/assembly-anchors.html">Assembly Anchors</a>); the two transforms below
then play no part.</p>
<p>The root panel's <strong>Object Management</strong> button is the fixture's file surface, available only once the
project has a fixture. <strong>Load</strong> installs a <code>.Fixture</code> or <code>.xml</code> file picked from the server in
place of the current one — re-attaching the table and workpiece buckles, rebuilding the branch and
confirming with a <em>Fixture replaced</em> notice. <strong>Save As</strong> writes the current fixture out, offered as
<code>Fixture.xml</code> in the project directory; <strong>Copy</strong> / <strong>Paste</strong> carry it as XML; <strong>XML Mode</strong> edits
that XML directly, its <strong>Apply</strong> installing the result exactly as a Load does.</p>
<h2 id="giving-it-a-geometry">Giving it a geometry</h2>
<p>Select <strong>Geometry</strong> (<code>equipment/fixture/geometry</code>). Its own panel is the kind picker alone, labelled
<strong>Geometry type</strong>, with <strong>None (unset)</strong> to clear the slot; the picked kind's editor opens as the
node beneath it, and the root panel badges whichever kind is in the slot. A fixture geometry must be
able to produce an STL, so the voxel meshed-geometry kind offered on the Workpiece branch is absent.</p>
<table>
<thead>
<tr>
<th>Kind</th>
<th>Pick it for</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Box3d</code></td>
<td>A plate, a block, a vice body — anything box-shaped.</td>
</tr>
<tr>
<td><code>Cylindroid</code></td>
<td>A solid of revolution given as Z–R pairs: a round chuck, a spacer.</td>
</tr>
<tr>
<td><code>StlFile</code></td>
<td>A mesh exported from CAD, for a fixture worth drawing accurately.</td>
</tr>
<tr>
<td><code>TransformationGeom</code></td>
<td>Another geometry with a transform in front of it — what a new project starts with.</td>
</tr>
<tr>
<td><code>GeomCombination</code></td>
<td>Several of the above assembled into one fixture.</td>
</tr>
</tbody>
</table>
<h2 id="placing-it">Placing it</h2>
<p>Two transform nodes hang from the branch's <strong>Anchor</strong> group, each a kind picker labelled
<strong>Transformer type</strong> over the picked kind's editor.</p>
<table>
<thead>
<tr>
<th>Node</th>
<th>What it sets</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Geom To Workpiece</strong> (<code>equipment/fixture/geom-to-workpiece</code>)</td>
<td>Where the workpiece attaches — the workpiece buckle — relative to the fixture geometry.</td>
</tr>
<tr>
<td><strong>Geom To Table</strong> (<code>equipment/fixture/geom-to-table</code>)</td>
<td>Pins the fixture geometry onto the machine's table buckle.</td>
</tr>
</tbody>
</table>
<p>What an anchor is, and the order to fill these in, are <a href="anchor.html">Anchor</a>. To check the result, the
<strong>Scene</strong> dropdown in the toolbar above the canvas carries <strong>Fixture Rendering Mode</strong> and the
<strong>Fixture Geometry Anchor</strong>, <strong>Workpiece Buckle</strong> and <strong>Table Buckle</strong> overlays.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="anchor.html">Anchor</a> — what the two transform nodes above are for, and the order to place them in</li>
<li><a href="workpiece.html">Workpiece</a> — the part this fixture holds, and its own geometry and material</li>
<li><a href="machine-tool.html">Machine Tool</a> — the chain carrying the table buckle the fixture is pinned to</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — the alignment that moves this fixture's Geom To Table transform when program zero is aligned onto a work offset</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</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>
@@ -90,28 +90,42 @@
<p>Pre-simulation configuration: the physical entities and components you configure before running a simulation. Once set, these form the fixed environment of the simulation.</p>
<div class="TIP">
<h5>Tip</h5>
<p>New to building a project? Start with the <a href="project-data-checklist.html">Project Data Checklist</a> — the single list of data to collect (and hand to the machine owner) before configuring any of the components below.</p>
<p>New to building a project? Start with the <a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a> — the list of data to collect from the machine owner before any of the components below can be configured. It is a workflow rather than a setup task, so it lives with the other end-to-end guides.</p>
</div>
<p>Ordered as the General Setup page builds its equipment, with the placement tasks, the tool house and the environment after it.</p>
<h2 id="equipment">Equipment</h2>
<ul>
<li><a href="machine-tool.html">Machine Tool</a> — Build or load a virtual machine tool</li>
<li><a href="anchor.html">Anchor</a> — Coordinate anchors for attaching components</li>
<li><a href="machine-tool.html">Machine Tool</a> — Build a virtual machine tool's chain, and attach one to a project</li>
<li><a href="spindle-capability.html">Spindle Capability</a> — What the spindle delivers: power, torque, thermal ceiling and gear shift</li>
<li><a href="fixture.html">Fixture</a> — What holds the workpiece on the table, its geometry, and the two transforms that place it</li>
<li><a href="workpiece.html">Workpiece</a> — The stock and the finished shape, where they sit, how finely they are meshed, and what they are made of</li>
<li><a href="controller.html">Controller</a> — The brand your NC programs are read with, and the tables that brand grew</li>
</ul>
<h2 id="controllers">Controllers</h2>
<h2 id="placing-it-all">Placing It All</h2>
<ul>
<li><a href="controller-heidenhain.html">Heidenhain Support</a> — klartext and Heidenhain DIN/ISO code support</li>
<li><a href="controller-iso.html">ISO / General NC</a> — Fanuc, Syntec, Mazak and Siemens SINUMERIK code support</li>
<li><a href="anchor.html">Anchor</a> — Place the workpiece, fixture and tool relative to the machine</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — Put the program origin where the NC code expects it, once the workpiece is placed</li>
</ul>
<h2 id="cutting-tools">Cutting Tools</h2>
<ul>
<li><a href="cutter.html">Cutter</a> — Milling cutter geometry and parameters</li>
<li><a href="apt.html">APT Tool</a> — APT-style cutter definition</li>
<li><a href="insert-cutter.html">Insert Cutter</a> — Insert-style cutter</li>
<li><a href="smart-tool-holder.html">Smart Tool Holder</a> — Smart holder with sensors</li>
<li><a href="cutter.html">Cutter</a> — Create a tool, give it a cutting geometry and a holder, and reuse a whole tool house across projects</li>
</ul>
<h2 id="environment">Environment</h2>
<ul>
<li><a href="coolant.html">Coolant</a> — Coolant settings for thermal simulation</li>
<li><a href="coolant.html">Coolant</a> — Pick how the cutting zone is cooled, and set the ambient temperature it works against</li>
</ul>
<p>Which NC vocabulary a controller brand honours is not a setup task and no longer lives here — it is
<a href="../../technique/nc-dialects/index.html">NC Dialects</a>. Neither is what a cutter's quantities mean: the
body types, the two ways a cutting envelope is expressed, the upper beam and the angles are
<a class="xref" href="../../technique/milling-physics/cutter-geometry.html">Cutter Geometry</a>, and the smart holder's sensor settings are
<a class="xref" href="../../technique/measurement/smart-tool-holder.html">Smart Tool Holder</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../../technique/index.html">Technique</a> — the models behind these settings: milling physics, NC dialects, machine capability</li>
<li><a href="../../technique/nc-dialects/index.html">NC Dialects</a> — what each controller brand's code actually does, brand by brand</li>
<li><a href="../basics/index.html">Basics</a> — the window, the project and the screens these tasks are performed in</li>
<li><a href="../run/index.html">Running a Simulation</a> — what the equipment configured here is then used for</li>
<li><a href="../utilities/index.html">Utilities</a> — the screens beside these tasks: browsing a project's files, assembling a machine chain, and the settings the legacy controller screen still owns</li>
</ul>
</article>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 KiB

@@ -1,172 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert Cutter | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Insert Cutter | 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="">
<h1 id="insert-cutter">Insert Cutter</h1>
<p>Insert cutters can be modeled in the virtual environment. See the examples below.</p>
<p><img src="insert-cutter-img/insert-cut-mark.png" alt="demo-real-insert-cutter"></p>
<p><img src="insert-cutter-img/demo-virtual-insert-cutter.png" alt="demo-virtual-insert-cutter"></p>
<table>
<thead>
<tr>
<th>Z</th>
<th>R</th>
<th>S.Ang.</th>
<th>R.Ang.</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>8</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>0.2</td>
<td>8</td>
<td>0.5</td>
<td>3</td>
</tr>
<tr>
<td>0.4</td>
<td>8</td>
<td>0</td>
<td>3</td>
</tr>
<tr>
<td>0.5</td>
<td>8</td>
<td>0</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>8</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>6</td>
<td>8</td>
<td>4</td>
<td>3</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
<td>4</td>
<td>3</td>
</tr>
</tbody>
</table>
</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

@@ -87,64 +87,184 @@
<article data-uid="">
<h1 id="building-virtual-machine-tools">Building Virtual Machine Tools</h1>
<p>Complete the following steps to build and use virtual machine tools:</p>
<ol>
<li><p>Use the mechanism builder to create the topological structure.</p>
<ol>
<li>Specific <code>Branch</code> names in the topology structure need to be set with corresponding motion axis keywords.
<ul>
<li>Linear motion axis keywords corresponding to motion modes are <code>X</code>, <code>Y</code>, <code>Z</code>.</li>
<li>Rotary motion axis keywords corresponding to motion modes are <code>A</code>, <code>B</code>, <code>C</code>.</li>
</ul>
</li>
<li>Specific <code>Anchor</code> names in the topology structure need to be set with corresponding keywords.
<ul>
<li>Keyword <code>O</code> is the ground anchor.</li>
<li>Keyword <code>base</code> is the base.</li>
<li>Keyword <code>t</code> is the tool-end anchor. Used for connecting tools.</li>
<li>Keyword <code>w</code> is the worktable-end anchor. Used for connecting fixtures or workpieces.</li>
</ul>
</li>
</ol>
<blockquote>
<p><strong>Note</strong></p>
<p>Keywords are case-sensitive.</p>
</blockquote>
</li>
<li><p>Set geometric shapes for anchors. This is optional.</p>
</li>
<li><p>Save the topology structure as a machine tool file.</p>
</li>
</ol>
<h2 id="best-practices">Best Practices</h2>
<p>The most convenient approach is to assemble the machine in CAD software, position the moving elements at the machine origin<a id="fnref:1" href="#fn:1" class="footnote-ref"><sup>1</sup></a>, then:</p>
<ul>
<li>Export individual main component STL files from the <strong>same coordinate system</strong>. Then set these STLs into anchors.</li>
<li>Measure the coordinates of tool-end anchor, worktable-end anchor, and any point on the rotary motion axis pivot relative to the output coordinate system in CAD software, then input these coordinates into the topology structure.</li>
<li>Due to relative motion, the motion axis direction settings from base to worktable-end are generally negative.</li>
</ul>
<blockquote>
<p>Too many STL meshes will reduce software opening speed and collision detection speed.</p>
</blockquote>
<h2 id="example-small-five-axis-vertical-milling-machine">Example: Small Five-axis Vertical Milling Machine</h2>
<p>Example: <a href="machine-tool-img/B1.zip">B1.zip</a></p>
<p>Target virtual milling machine:
<img src="machine-tool-img/B1_anchors.png" alt="B1-with-anchors"></p>
<p>Topology structure:
<img src="machine-tool-img/B1-topo.en.png" alt="B1-topo"></p>
<h2 id="building-horizontal-machine-tools">Building Horizontal Machine Tools</h2>
<ol>
<li>Create topology structure according to machine tool motion axis coordinates.</li>
<li>Lay down the machine: set rotation in the connection between ground anchor and machine base anchor, axis direction (0,1,1)(must be normalized), angle 180 degrees.</li>
</ol>
<div class="footnotes">
<hr>
<ol>
<li id="fn:1">
<p>Machine Origin is the position where all machine coordinates (MC, Machine Coordinate) are 0, generally the home position.<a href="#fnref:1" class="footnote-back-ref">&#8617;</a></p>
</li>
</ol>
<p>A project's machine tool is the kinematic chain between the machine table and the tool spindle: the
anchors that stand for the machine's components, and the branches that carry the motion between
them. A chain is authored once and saved as a file; attaching that file to a project is a separate
step, and one chain serves every project that runs on that machine.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown. Select
the <strong>Machine Tool</strong> branch of the Control Tree (<code>/general-setup?tree=equipment/machine-tool</code>), the
first of the equipment items. The branch is a leaf: the structure of a chain belongs to the
<a href="../utilities/mech-builder.html">Mechanism Builder</a>, so this panel carries no editors for it —
only the identity of whichever chain is attached.</p>
<p>The branch selected on a demo project, at <code>/general-setup?tree=equipment/machine-tool</code>. The panel
under the tree is the whole of it: the <strong>Object Management</strong> (<code>⋮</code>) button, a type badge reading
<code>GeneralXyzabcMachineTool</code>, and the <strong>Name:</strong> and <strong>File:</strong> lines naming the chain in force and the
file it came from. The middle column reads <em>The selected item has no expanded content.</em> — this
branch brings nothing to it — and the canvas is drawing the stock on its fixture.</p>
<p><img src="machine-tool-img/machine-tool-branch.en.png" alt="The Machine Tool branch of the Control Tree selected on the General Setup page, its panel showing the Object Management button, a GeneralXyzabcMachineTool type badge, the chain's name and its project-relative file, the middle column carrying only a caption saying the selected item has no expanded content, and the canvas drawing the workpiece on the fixture"></p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>The equipment canvas does not draw the machine until you ask it to.</strong> The <strong>Scene</strong> dropdown
above the canvas carries a <strong>Solid</strong> group whose <strong>Machine</strong> checkbox starts cleared, so a chain
that loaded perfectly still leaves that canvas showing only the fixture and the workpiece. Tick it
to bring the machine into the same scene — or open the <code>/machine-tool</code> route below, whose canvas
draws the chain on its own.</p>
</div>
<h2 id="attaching-a-chain-to-a-project">Attaching a chain to a project</h2>
<p>A chain file is not a project's machine until it is loaded onto one. The branch root's <strong>Object
Management</strong> (<code>⋮</code>) menu is where a chain arrives and leaves:</p>
<table>
<thead>
<tr>
<th>Entry</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Load</strong></td>
<td>Picks a <code>.MachineTool</code> or <code>.mt</code> file from the project or the administrator directory and installs it as the project's chain</td>
</tr>
<tr>
<td><strong>New ClMillingDevice</strong></td>
<td>Attaches a CL-driven blank device instead — the one chain type that needs no file, because it has nothing to configure</td>
</tr>
<tr>
<td><strong>Save As</strong></td>
<td>Writes the attached chain back out as a file</td>
</tr>
<tr>
<td><strong>Copy</strong> / <strong>Paste</strong></td>
<td>Carry the chain between projects as XML</td>
</tr>
<tr>
<td><strong>XML</strong></td>
<td>Shows the attached chain as XML and installs the result of an edit</td>
</tr>
</tbody>
</table>
<p>Every chain type other than the CL-driven device arrives by Load, Paste or XML. Installing one
re-attaches the fixture and workpiece buckles and rebuilds the branch, so the rest of the equipment
follows the new machine without being touched.</p>
<div class="TIP">
<h5>Tip</h5>
<p><strong>The shipped machines are one folder deeper than this picker opens.</strong> This menu's picker offers
the project folder and the administrator directory as its two roots, and the shipped resource
library is the <code>Resource</code> folder inside that administrator directory — so a shipped chain is
reached by opening <code>Resource</code>, then <code>MachineTool</code>. The <code>/machine-tool</code> route's own picker lists
that library as a root of its own and opens straight into it, which is the shorter way to the same
files; its Load installs onto the project exactly as this one does.</p>
</div>
<p><strong>A Load from a file also re-points what the project saves.</strong> A chain picked from inside the project
folder is remembered as a path relative to that folder, and one picked from the shipped resource
library relative to the resource root — which is what keeps a project save from writing over a
shared resource file. <strong>New ClMillingDevice</strong> clears that reference instead, so the fresh chain is
saved inside the project rather than over the file the previous one came from. Paste and an XML
apply leave the reference exactly as it was.</p>
<h2 id="checking-what-is-attached">Checking what is attached</h2>
<p>The <code>/machine-tool</code> route is a screen of its own for the same chain: the identity beside a canvas
that draws it. It carries no <strong>Page</strong>-menu entry and is reached by typing the URL. Its fields show
the chain rather than edit it — the name and the note are read-only there — but the folder button
beside them is a working Load, greyed out only until a project is open.</p>
<p>The route on the same demo project, at <code>/machine-tool</code>. The header names the file the chain came
from and repeats its name; the <strong>Identity</strong> card below carries the read-only name, the empty note
and the type chip; the <strong>GUI</strong> / <strong>XML</strong> toggle at the right swaps that card for the chain's XML;
and the <strong>Display</strong> panel draws the five-axis chain the file describes.</p>
<p><img src="machine-tool-img/machine-tool-route.en.png" alt="The Machine Tool route showing the loaded chain's file path and name in the header, an Identity card with a read-only name, an empty note and a GeneralXyzabcMachineTool type chip, and a Display panel drawing a five-axis machine with a rotary table"></p>
<h2 id="building-the-chain">Building the chain</h2>
<p>Structure is assembled in the <a href="../utilities/mech-builder.html">Mechanism Builder</a> and saved with
its <strong>Save As Machine Tool</strong> entry. That save checks none of this: a mechanism whose end anchors are
mis-cased or missing is written out without a word, and the mistake surfaces only later, on the
screen where the file is loaded onto a project. What that page cannot tell you is what to <em>call</em>
things: the chain reads its own topology by keyword, so the names below are not labels but the
mechanism by which the machine works at all.</p>
<ol>
<li><strong>Name the motion axes on the branches.</strong> A linear axis is a branch named <code>X</code>, <code>Y</code> or <code>Z</code>; a
rotary axis is a branch named <code>A</code>, <code>B</code> or <code>C</code>. Use each keyword at most once — a machine without
a given axis simply has no branch carrying that keyword.</li>
<li><strong>Give each axis branch a matching transformer.</strong> A branch named <code>X</code>, <code>Y</code> or <code>Z</code> must carry a
<strong>Dynamic Translation</strong>, and one named <code>A</code>, <code>B</code> or <code>C</code> a <strong>Dynamic Rotation</strong>. The keyword and
the transformer kind are read together: a branch correctly named but left on a static transformer
contributes no axis, and the machine ends up with one fewer than it looks like it has.</li>
<li><strong>Name the anchors that hold the chain together.</strong> <code>O</code> is the ground anchor, <code>base</code> the machine
base, <code>t</code> the tool-end anchor that tools connect to, and <code>w</code> the worktable-end anchor that
fixtures and workpieces connect to. The machine needs exactly one <code>t</code> and one <code>w</code>. The two are
checked one at a time and the worktable end goes first, so a chain missing both is refused
naming only <code>w</code>; <code>t</code> is named on the next attempt, once <code>w</code> is in place. A second refusal after
a rename is the next keyword, not a new fault.</li>
<li><strong>Give the anchors shapes.</strong> Optional, and driven from the builder's Geometry card.</li>
<li><strong>Save the topology as a machine tool file</strong>, then attach it to a project as above.</li>
</ol>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>Every keyword is matched exactly as written.</strong> The motion axes are upper-case <code>X</code>, <code>Y</code>, <code>Z</code>,
<code>A</code>, <code>B</code>, <code>C</code>; the ground anchor is upper-case <code>O</code>; and the base and the two end anchors are
lower-case <code>base</code>, <code>t</code> and <code>w</code>. A name differing only in letter case names nothing at all. A
mis-cased axis is silent — that axis is simply absent — while an end anchor that is missing or
mis-cased stops the file loading, with a message naming the keyword it wanted:
<em>This kinematic chain has no worktable-end anchor named &lsquo;w&rsquo;.</em> When the mechanism carries that
same letter in the other case, the message adds the rename — <em>The mechanism carries &lsquo;W&rsquo;, which
differs only in letter case; the keyword is matched exactly, so rename it to &lsquo;w&rsquo;.</em> — and when the
anchor is simply absent, or named something else entirely, the first sentence stands alone.</p>
</div>
<p>Branch direction is free: the motion, the axis keywords and the default collision pairs all read a
branch the same way round. Pointing every branch <strong>away from the ground anchor</strong> is a readability
convention — it makes the structure read outwards, ground → base → motion axes → the <code>t</code> and <code>w</code> end
anchors.</p>
<p><strong>The names also decide what can collide with what.</strong> A machine file asking for its collision pairs
to be generated is answered by walking the chain twice, from <code>O</code> to <code>t</code> and from <code>O</code> to <code>w</code>. That
walk is also where the two end anchors are checked, so such a file — the form <strong>Save As Machine
Tool</strong> writes — is refused by the Load itself. A file that lists its collision pairs explicitly
instead is read without the check and arrives intact; it is refused one step further on, when the
chain is installed onto the project and its kinematics are rebuilt, with the same message reported
against the install rather than the load.
Everything named on the way becomes a collidable component; the four structural keywords are dropped
from both walks, the tool holder, cutter shank and cutter flute are added to the tool side and the
fixture and workpiece to the table side, and every pair across the two sides is generated except
workpiece against cutter flute — that one is the cut, not a collision.</p>
<h2 id="where-the-numbers-come-from">Where the numbers come from</h2>
<p>The most convenient approach is to assemble the machine in CAD, position the moving elements at the
machine origin — the position at which every machine coordinate reads zero, generally the home
position — and then:</p>
<ul>
<li>Export the main components as individual STL files <strong>from that one coordinate system</strong>, and set
each into its anchor.</li>
<li>Measure, in the same CAD coordinate system, the tool-end anchor, the worktable-end anchor and a
point on each rotary axis' pivot, and enter those coordinates into the topology.</li>
<li>Expect the axis directions from the base to the worktable end to come out negative. That is
relative motion rather than a mistake: moving the table one way moves the tool the other way
through the chain.</li>
</ul>
<p>Keep the meshes coarse. A machine carrying too much mesh is slower to open and slower to check for
collisions, so export the components at the resolution a picture of the machine needs rather than at
the resolution CAD produced them at.</p>
<h2 id="example-a-small-five-axis-vertical-milling-machine">Example: a small five-axis vertical milling machine</h2>
<p>A worked example, complete with its STLs: <a href="machine-tool-img/B1.zip">B1.zip</a>.</p>
<p>The machine it describes:</p>
<p><img src="machine-tool-img/B1_anchors.png" alt="The B1 example machine, drawn with each of its anchors marked and named"></p>
<p>And the topology those anchors and branches form:</p>
<p><img src="machine-tool-img/B1-topo.en.png" alt="The B1 example's topology: the ground anchor, the base, the five axis branches and the two end anchors"></p>
<h2 id="laying-a-machine-on-its-side">Laying a machine on its side</h2>
<p>A horizontal machine is built exactly like a vertical one and then laid down:</p>
<ol>
<li>Create the topology from the machine's own axis coordinates.</li>
<li>On the branch between the ground anchor and the machine base, set a rotation of 180 degrees about
a normalized axis direction of (0, 1, 1).</li>
</ol>
<p>A machine tool file can also carry this same connectivity as a short bracket notation for
hand-editing the XML — the grammar is <a class="xref" href="../../technique/mechanism/chain-code.html">Machine Chain Code</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="../utilities/mech-builder.html">Mechanism Builder</a> — how to drive the editor the steps above are performed in</li>
<li><a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a> — what to collect from the machine owner before building this</li>
<li><a href="anchor.html">Anchor</a> — placing the fixture, workpiece and tool onto the chain built here</li>
<li><a class="xref" href="../../technique/mechanism/chain-code.html">Machine Chain Code</a> — the bracket notation for the structure built here, and what it cannot express</li>
<li><a href="fixture.html">Fixture</a> — what the table buckle built here then carries</li>
<li><a href="spindle-capability.html">Spindle Capability</a> — what this machine's spindle delivers, which the chain itself does not describe</li>
<li><a href="controller.html">Controller</a> — the brand whose per-axis rows this chain's axes fill</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
</article>
Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

@@ -87,70 +87,162 @@
<article data-uid="">
<h1 id="program-zero-alignment">Program Zero Alignment</h1>
<p><strong>Program zero</strong> (<code>ProgramZeroAnchor</code>) is the point an NC program treats as <code>X0 Y0 Z0</code>. It is related to the machine's work-coordinate offset (G54/G55/...): when the machine coordinate equals the work offset, the spindle sits at program zero.</p>
<p>Setting up a simulation requires relating program zero to the work offset. <strong>Which way you align depends on the scenario.</strong></p>
<h2 id="two-alignment-directions">Two Alignment Directions</h2>
<h3 id="nc-file-scenario-planning--align-g54-to-program-zero">NC-file scenario (planning) — align G54 to program zero</h3>
<p>When you drive the simulation from an NC file for <strong>planning</strong>, you usually keep the workpiece and fixture wherever they are convenient and set the work offset to match. The G54 value may not be obtained yet, and the layout does <strong>not</strong> need to reflect the real machine.</p>
<ul>
<li>Keep the workpiece/fixture placement as-is.</li>
<li>Read the machine coordinate at program zero with <a class="xref" href="../../api/Hi.Machining.MachiningEquipmentUtils.MachiningEquipmentUtil.html#Hi_Machining_MachiningEquipmentUtils_MachiningEquipmentUtil_GetMachinePositionAtProgramZero_">GetMachinePositionAtProgramZero</a> and store it into the ISO coordinate table (<code>IsoCoordinateTable.SetCoordinateOffset(&quot;G54&quot;, ...)</code>).</li>
</ul>
<h3 id="csv--real-time--online-mc-scenario-high-fidelity--align-program-zero-to-g54">CSV / real-time / online-MC scenario (high-fidelity) — align program zero to G54</h3>
<p>When you drive the simulation from a <strong>controller CSV log</strong> (see <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_PlayCsvFile_">PlayCsvFile</a>) or a real-time / online machine coordinate feed, the data is in <strong>absolute machine coordinates</strong>. To reproduce the real cut faithfully (高還原度), the workpiece + fixture must sit at their <strong>real positions</strong> so that collisions, overcut, and engagement match reality.</p>
<pre><code class="lang-csharp">// Places workpiece + fixture so ProgramZeroAnchor coincides with the
// world position the spindle reaches when the machine coordinate equals G54.
AlignWorkpieceProgramZeroToIso(&quot;G54&quot;);
</code></pre>
<p>The same action is available in the web UI on the Controller page's ISO Coordinate Table (<code>Align P0</code> per row, with a one-shot <code>Revert Align</code>).</p>
<p><code>AlignWorkpieceProgramZeroToIso</code> mutates only <code>Fixture.GeomToTableTransformer</code>. The three buckle transformers must already be placed per the rule below.</p>
<h2 id="buckle-general-rule">Buckle General Rule</h2>
<p>The workpiece/fixture assembly is built from buckle anchors (see <a href="anchor.html">Component Assembly and Anchors</a>). A typical block-on-plate setup places them at the geometry bounding-box centers:</p>
<p>Program zero is the point an NC program treats as <code>X0 Y0 Z0</code>. The machine finds it by adding a work
offset — G54, G55 and the rest — to machine zero, so a simulation only cuts where the real machine
cuts if the program zero on the model and the work offset in the controller agree. Making them agree
is this task, and it runs in one of two directions depending on why the simulation is being built.</p>
<h2 id="which-direction-to-align">Which direction to align</h2>
<table>
<thead>
<tr>
<th>Transformer</th>
<th>Position</th>
<th>You are</th>
<th>Align</th>
<th>Because</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Workpiece.WorkpieceGeomToFixtureBuckleTransformer</code></td>
<td>bottom center of the workpiece geom</td>
<td><strong>Planning a job</strong> from an NC file, before the part is set up on the machine</td>
<td>the <strong>work offset</strong> onto program zero</td>
<td>The workpiece and fixture can sit wherever is convenient; the offset has probably not been measured yet, and the model does not have to match a real table</td>
</tr>
<tr>
<td><code>Workpiece.WorkpieceGeomToProgramZeroTransformer</code></td>
<td>top center of the workpiece geom (or any chosen top tip)</td>
</tr>
<tr>
<td><code>Fixture.GeomToWorkpieceTransformer</code></td>
<td>top center of the fixture geom</td>
<td><strong>Reproducing a cut</strong> from a controller log, a machine-coordinate feed, or a job already running</td>
<td><strong>program zero</strong> onto the work offset</td>
<td>The recorded data is in absolute machine coordinates, so the part has to sit where it really sits, or collisions, overcut and engagement will not match what happened</td>
</tr>
</tbody>
</table>
<p><code>AlignWorkpieceProgramZeroToIso</code> then derives the final <code>Fixture.GeomToTableTransformer</code> from the live assembly topology (anchor-to-anchor vectors), so it works for any chain — it does not assume the buckles are at bounding-box centers.</p>
<h2 id="verifying-the-setup">Verifying the Setup</h2>
<p>A wrong setup (incorrect work offset or workpiece position) shows up as <strong>overcut</strong>, <strong>collision</strong>, or <strong>nocut</strong>. These are observable <strong>early</strong> — typically within the first ~100 NC lines or ~1 minute — so verify with a quick, cheap pass before a full run:</p>
<p>Both directions need the workpiece already placed on the fixture and the fixture on the table —
that is <a href="anchor.html">Anchor</a>, and it comes first.</p>
<h2 id="where-program-zero-sits-on-the-workpiece">Where program zero sits on the workpiece</h2>
<p><strong>Geom To Program Zero</strong> (<code>/general-setup?tree=equipment/workpiece/anchor/geom-to-program-zero</code>)
holds the offset from the workpiece geometry to program zero. Set it to whatever point the NC
program was written around: for most milling programs that is a corner or the centre of the stock's
top face. Nothing else on this page makes sense until that point is where the programmer put it.</p>
<h2 id="planning-write-the-offset-from-where-the-workpiece-is">Planning: write the offset from where the workpiece is</h2>
<p>The Controller branch's <strong>Work Coordinates</strong> leaf
(<code>/general-setup?tree=equipment/controller/program-data/work-coordinates</code>) holds the table the run
resolves G54 against, one row per coordinate id.</p>
<ol>
<li>Set a coarse <a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningResolution_">MachiningResolution</a> ≈ <strong>1/8 of the cutter diameter</strong> for fast feedback.</li>
<li>Run and watch the <strong>opening Z plunge (下刀)</strong>. This is where overcut/collision most often appears when the work offset or workpiece Z is wrong.</li>
<li>Place the workpiece and fixture wherever the scene is convenient to work in.</li>
<li>Select the Work Coordinates leaf and find the row the program uses — <code>G54</code> for most programs.</li>
<li>Press <strong>P0</strong> in that row. It writes the machine coordinate the workpiece's program-zero anchor is
currently sitting at into the row, which is exactly the number the machine's operator would key
in after touching off. <strong>M0</strong> beside it writes machine zero instead, which is how a row is
returned to no offset at all.</li>
</ol>
<p>The leaf on a demo project, at
<code>/general-setup?tree=equipment/controller/program-data/work-coordinates</code>. The grey line above the
table names where this brand keeps the offsets — on Fanuc, its own parameter table — and the rows
below it are the coordinate ids that brand holds, with only <code>G54</code> carrying a value here. The panel
is narrow, so the row actions sit off the right edge; the same three are shown in full on the Legacy
Controller screen below.</p>
<p><img src="program-zero-alignment-img/work-coordinates.en.png" alt="The Work Coordinates leaf of the Control Tree selected on the General Setup page, its panel showing a caption reading that the offsets are stored in the Fanuc parameter table and a table of G54 through G57 rows with X, Y and Z fields, G54 holding values and the rest zero"></p>
<p><strong>P0 has something to write only once the scene is assembled.</strong> It works out where the program-zero
anchor is by walking the machine chain to it, so a project with no machine tool attached, or a
workpiece that has not been placed, gives it nothing to compute and it reports that it could not get
the machine position at program zero rather than writing a wrong number.</p>
<p>The row's values can also be typed in directly when the offset is already known from the machine.
Clicking anywhere in a row marks that coordinate on the canvas, so the offset can be seen rather
than only read.</p>
<h2 id="reproducing-a-real-cut-move-the-workpiece-onto-the-offset">Reproducing a real cut: move the workpiece onto the offset</h2>
<p>Going the other way — leaving the offset alone and moving the part to meet it — is <strong>Align P0</strong>, and
it is on the Legacy Controller screen's <strong>Coordinate Table</strong> tab (<code>/controller/coordinate-table</code>),
not on the Controller branch. It moves the workpiece and fixture together, by changing where the
fixture sits on the machine table, until program zero lands on the offset the row holds. The toast
reports the translation it assigned.</p>
<p>The tab on a demo project. Each row carries <strong>P0</strong> and <strong>M0</strong> — the same two writes the branch's
leaf offers — and <strong>ALIGN P0</strong> beside them, which is the one control that moves the part instead of
writing a number. <strong>Undo Align</strong> and <strong>Redo Align</strong> in the header step back and forth through the
alignments this screen has recorded; <strong>Show on Display</strong> turns the coordinate marker in the viewer on
and off, and the checkbox at the left of each row picks which coordinate it marks.</p>
<p><img src="program-zero-alignment-img/align-p0.en.png" alt="The Legacy Controller screen's Coordinate Table tab: an ISO Coordinate Table with Undo Align, Redo Align and Show on Display in its header, and rows G54 through G59.5 each carrying X, Y and Z fields and an Actions column with P0, M0 and ALIGN P0"></p>
<p>Align P0 needs a workpiece, a fixture and a machine tool on the project; without all three it writes
nothing and says so. Driving the screen itself — the tab strip, the alignment history and what it
does and does not survive — is <a href="../utilities/legacy-controller.html">Legacy Controller</a>.</p>
<div class="WARNING">
<h5>Warning</h5>
<p><strong>Align P0 reads a different table from the one the run uses.</strong> The offsets on the Legacy
Controller screen and the offsets on the Controller branch's Work Coordinates leaf are two
separate stores: typing a value into one does not change the other, and nothing keeps them in
step. A run resolves its work offsets through the branch's table, while Align P0 takes its target
from the legacy screen's. So before aligning, check that the row you are about to press <strong>ALIGN
P0</strong> on holds the same offset as the branch's row of the same name — otherwise the part is moved
onto a number the program will never use. A project built with both tables filled in agrees only
because it was written that way.</p>
</div>
<h2 id="checking-that-it-worked">Checking that it worked</h2>
<p>A wrong alignment — a wrong offset, or a workpiece at the wrong height — shows up as <strong>overcut</strong>,
<strong>collision</strong> or <strong>nocut</strong>, and it shows up early: usually within the first hundred or so NC lines.
Check it cheaply before committing to a full run.</p>
<ol>
<li>Set a coarse <strong>Initial Resolution</strong> on the workpiece's <strong>Mesh</strong> item — around an eighth of the
cutter diameter is enough to see gross errors, and it runs quickly. That is
<a href="workpiece.html">Workpiece</a>.</li>
<li>Run, and watch the opening Z plunge. This is where a wrong offset shows first.</li>
</ol>
<div class="TIP">
<h5>Tip</h5>
<p>If the tool plunges far deeper than the programmed depth and the holder crashes into the workpiece (a visible gouge on the rendered stock), the work offset Z is almost certainly wrong — the workpiece is modeled higher (or lower) than its real position.</p>
<p>If the tool plunges far deeper than the programmed depth and the holder gouges the stock, the work
offset's Z is almost certainly wrong — the workpiece is modelled higher or lower than it really
sits.</p>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>Rare false positive: a roughing cut with a <strong>spiral entrance on tough material</strong> can legitimately exceed the modeled cutting conditions yet still be a <em>correct</em> setup. This is uncommon — in most cases early overcut/collision/nocut means the setup is wrong.</p>
</div>
<h2 id="high-fidelity-caution-work-offset-must-reflect-the-real-machine">High-Fidelity Caution: Work Offset Must Reflect the Real Machine</h2>
<p>In the CSV / online-MC scenario, the work offset (G54/G55/...) you align to must be the <strong>actual offset used on the machine</strong>, not a planned/nominal value. Operators frequently re-zero between setups (manual tool changes, re-cut stock), so a planned G54 can differ from the real one — by an amount you cannot assume in advance.</p>
<p>When driving from a controller log, <strong>derive the offset from the log's own machine coordinates</strong> rather than trusting a planned value: invariants that survive operator edits — a known cutting depth, a feature span — mapped onto the recorded machine coordinates, recover the real offset on those axes. (Positions the operator may have shifted are not recoverable this way.) A work-offset Z that is wrong places the workpiece away from its true height, so the tool over- or under-plunges; if too high, the holder crashes the stock at the opening plunge — exactly the failure the rough-resolution check above catches.</p>
<p>One false positive is worth knowing: a roughing cut with a spiral entrance into tough material can
legitimately exceed the modelled cutting conditions while the setup is perfectly correct. It is
uncommon, and early overcut, collision or nocut usually does mean the alignment is wrong.</p>
<h2 id="when-the-planned-offset-is-not-the-real-one">When the planned offset is not the real one</h2>
<p>In the reproducing direction, the offset aligned to must be <strong>the offset the machine was actually
using</strong>, not the one the job was planned with. Operators re-zero between setups — after a manual
tool change, after re-cutting stock — so a planned G54 and the real one can differ by an amount that
cannot be assumed in advance.</p>
<p>When the data comes from a controller log, derive the offset from the log's own machine coordinates
rather than trusting the plan: an invariant that survives an operator's edits — a known cutting
depth, the span of a feature — mapped onto the recorded coordinates recovers the real offset on
those axes. Axes the operator may have shifted with nothing to key on are not recoverable this way.
A wrong Z is the one that bites hardest, because it places the workpiece away from its true height
and the tool over- or under-plunges from the first block.</p>
<h2 id="a-placement-convention-that-makes-this-easier">A placement convention that makes this easier</h2>
<p>The three transforms that hold the assembly together can be put anywhere, but a block-on-plate setup
is easiest to reason about when each sits at the middle of the face it meets:</p>
<table>
<thead>
<tr>
<th>Transform</th>
<th>A good default</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fixture's <strong>Geom To Workpiece</strong></td>
<td>The top centre of the fixture geometry</td>
</tr>
<tr>
<td>Workpiece's <strong>Geom To Fixture</strong></td>
<td>The bottom centre of the workpiece geometry</td>
</tr>
<tr>
<td>Workpiece's <strong>Geom To Program Zero</strong></td>
<td>The top centre of the workpiece geometry, or whichever top point the program was written around</td>
</tr>
</tbody>
</table>
<p>Align P0 does not depend on this convention — it works out the fixture's placement from the
assembly as it stands, whatever the transforms hold — but a scene built this way is far easier to
check by eye.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="anchor.html">Component Assembly and Anchors</a> — buckle anchors (<code>WorkpieceBuckle</code>, <code>TableBuckle</code>, <code>SpindleBuckle</code>)</li>
<li><a href="anchor.html">Anchor</a> — placing the workpiece, fixture and tool relative to the machine, which comes before this</li>
<li><a class="xref" href="../../technique/mechanism/assembly-anchors.html">Assembly Anchors</a> — the named buckle anchors this alignment resolves against</li>
<li><a href="workpiece.html">Workpiece</a> — the branch carrying the Geom To Program Zero transform this task sets, and the Mesh resolution the check above uses</li>
<li><a href="fixture.html">Fixture</a> — the transform Align P0 rewrites when it moves the part onto an offset</li>
<li><a href="controller.html">Controller</a> — the branch whose work-offset table a run resolves against</li>
<li><a href="../utilities/legacy-controller.html">Legacy Controller</a> — the screen Align P0 lives on, and its alignment history</li>
<li><a href="../../technique/nc-dialects/index.html">NC Dialects</a> — how each brand's code names the work offset this alignment is expressed against</li>
<li><a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a> — the collection step this alignment closes</li>
<li><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a> — driving a simulation from an NC file or a controller log</li>
<li><a class="xref" href="../../workflows/force-training.html">Workflow: Milling Force Parameter Training</a> — milling force training, which depends on a correct setup</li>
<li><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a> — driving simulation from NC or CSV</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</li>
</ul>
</article>
@@ -1,121 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 540" font-family="'Segoe UI',Arial,sans-serif">
<!-- nameplate background -->
<rect x="2" y="2" width="716" height="536" rx="10" fill="#f7f3df" stroke="#9a8f5c" stroke-width="2"/>
<!-- header -->
<text x="30" y="46" font-size="22" font-weight="700" fill="#333" letter-spacing="2">FANUC</text>
<text x="30" y="72" font-size="15" font-weight="600" fill="#333" letter-spacing="3">AC SPINDLE MOTOR</text>
<text x="30" y="106" font-size="13" fill="#777">MODEL</text>
<text x="92" y="106" font-size="15" font-weight="700" fill="#222">αiI 6/12000</text>
<text x="30" y="130" font-size="13" fill="#777">TYPE</text>
<text x="92" y="130" font-size="14" fill="#222">A06B-1466-B123#0S21</text>
<text x="430" y="106" font-size="13" fill="#777">DATE</text>
<text x="480" y="106" font-size="14" fill="#222">2015.01</text>
<text x="430" y="130" font-size="13" fill="#777">NO.</text>
<text x="480" y="130" font-size="14" fill="#999">——</text>
<text x="30" y="158" font-size="12" fill="#777">FANUC CORPORATION · YAMANASHI, MADE IN JAPAN</text>
<line x1="20" y1="170" x2="700" y2="170" stroke="#cabf8c" stroke-width="1"/>
<!-- rating table grid -->
<g stroke="#8a7f4c" stroke-width="1">
<!-- verticals -->
<line x1="20" y1="182" x2="20" y2="444"/>
<line x1="110" y1="182" x2="110" y2="444"/>
<line x1="230" y1="182" x2="230" y2="444"/>
<line x1="360" y1="182" x2="360" y2="444"/>
<line x1="600" y1="182" x2="600" y2="444"/>
<line x1="700" y1="182" x2="700" y2="444"/>
<!-- top / header / bottom -->
<line x1="20" y1="182" x2="700" y2="182"/>
<line x1="20" y1="210" x2="700" y2="210"/>
<line x1="20" y1="444" x2="700" y2="444"/>
<!-- row separators (skip WINDING column) -->
<line x1="110" y1="236" x2="700" y2="236"/>
<line x1="110" y1="262" x2="700" y2="262"/>
<line x1="110" y1="288" x2="700" y2="288"/>
<line x1="110" y1="314" x2="700" y2="314"/>
<line x1="110" y1="340" x2="700" y2="340"/>
<line x1="110" y1="366" x2="700" y2="366"/>
<line x1="110" y1="392" x2="700" y2="392"/>
<line x1="110" y1="418" x2="700" y2="418"/>
<!-- winding group separator -->
<line x1="20" y1="340" x2="110" y2="340"/>
</g>
<!-- header labels -->
<g font-size="12" font-weight="700" fill="#444" text-anchor="middle">
<text x="65" y="200">WINDING</text>
<text x="170" y="200">RATING</text>
<text x="295" y="200">kW</text>
<text x="480" y="200">min⁻¹</text>
<text x="650" y="200">A(~) max</text>
</g>
<!-- winding group labels -->
<g font-size="14" font-weight="700" fill="#333" text-anchor="middle">
<text x="65" y="279">Y · LOW</text>
<text x="65" y="396">Δ · HIGH</text>
</g>
<!-- rating rows -->
<g font-size="13" fill="#222">
<!-- RATING column (left aligned) -->
<g text-anchor="start">
<text x="120" y="228">S1 CONT</text>
<text x="120" y="254">S2 30min</text>
<text x="120" y="280">S3 60%</text>
<text x="120" y="306">S3 25%</text>
<text x="120" y="332">S3 15%</text>
<text x="120" y="358">S1 CONT</text>
<text x="120" y="384">S2 30min</text>
<text x="120" y="410">S3 60%</text>
<text x="120" y="436">S3 25%</text>
</g>
<!-- kW column (centered) -->
<g text-anchor="middle">
<text x="295" y="228">5.5 / 2.2</text>
<text x="295" y="254">7.5 / 3.7</text>
<text x="295" y="280">7.5 / 3.7</text>
<text x="295" y="306">13 / 7.5</text>
<text x="295" y="332">15 / 13</text>
<text x="295" y="358">5.5</text>
<text x="295" y="384">7.5</text>
<text x="295" y="410">7.5</text>
<text x="295" y="436">18.5 / 11</text>
</g>
<!-- min^-1 column (centered) -->
<g text-anchor="middle">
<text x="480" y="228">1500–8000 / 12000</text>
<text x="480" y="254">1500–8000 / 12000</text>
<text x="480" y="280">1500–8000 / 12000</text>
<text x="480" y="306">1500–4000 / 8000</text>
<text x="480" y="332">1500–3000 / 4000</text>
<text x="480" y="358">4000–12000</text>
<text x="480" y="384">4000–12000</text>
<text x="480" y="410">4000–12000</text>
<text x="480" y="436">4000–7000 / 12000</text>
</g>
<!-- A column (centered) -->
<g text-anchor="middle">
<text x="650" y="228">37</text>
<text x="650" y="254">47</text>
<text x="650" y="280">47</text>
<text x="650" y="306">77</text>
<text x="650" y="332">86</text>
<text x="650" y="358">43</text>
<text x="650" y="384">43</text>
<text x="650" y="410">36</text>
<text x="650" y="436">81</text>
</g>
</g>
<!-- footer electrical specs -->
<g font-size="12" fill="#333">
<text x="20" y="470">MOTOR INPUT (~) 122 / 226 V · AMP INPUT 200 / 230 V · 4 POLES · 3 PHASES</text>
<text x="20" y="492">50 / 60 Hz · IP40 · POWER FACTOR 71 % · AMB TEMP 0–40 °C · INS. CLASS H</text>
</g>
<text x="700" y="520" font-size="11" fill="#998" text-anchor="end">範例銘牌(已移除單機序號)· example plate, unit serial removed</text>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

@@ -1,488 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Project Data Checklist | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Project Data Checklist | 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="Setup-ProjectDataChecklist">
<h1 id="project-data-checklist">Project Data Checklist</h1>
<p>A HiNC project (<code>.hincproj</code>) is a <strong>digital twin</strong> of a real machining setup: machine, spindle, workpiece, fixture, tooling, controller, and the NC program. To build one, you must first collect the data that describes the physical setup.</p>
<p>This page is the single, canonical list of that data. Hand it to the machine owner / customer as a <strong>data-collection checklist</strong> before a project is built. It mirrors the <a href="https://superhightech.com.tw/hinc/index.en.html#parameters-for-analysis"><em>Parameters for Analysis</em></a> grouping shown on the HiNC product site.</p>
<p>You do not need a strict form — write the items here up as a short free-text note and hand it over <strong>with the CAD and NC files</strong>; that is what a HiNC engineer needs to build the <code>.hincproj</code> (see the <a href="#examples">worked examples</a> below).</p>
<p>This page is the list to collect <em>before</em> a project is built. For what the engineer then does with it — build order, mission structure, and how completeness is verified — see <a href="../../workflows/project-construction.html">Project Construction</a>.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p><strong>Identifiers beat half-remembered numbers.</strong> Customers rarely have every detail. Where a value is missing, give an <strong>identifier</strong> — <em>cutter brand + product ID</em>, <em>spindle/machine make + model</em> — and the HiNC engineer sources the rest (cutter geometry from the catalog, the power–torque chart from the spindle datasheet). Capture what you can; the engineer fills the gaps.</p>
</div>
<pre><code class="lang-mermaid">graph TD
subgraph Equipment[&quot;Equipment (one-time, fixed)&quot;]
M[&quot;Machine Configuration&quot;]
S[&quot;Spindle Capability&quot;]
E[&quot;Environment&quot;]
end
subgraph Job[&quot;Job (per part)&quot;]
W[&quot;Workpiece&quot;]
F[&quot;Fixture&quot;]
T[&quot;Tooling&quot;]
C[&quot;Controller + NC Program&quot;]
end
Equipment --&gt; P[&quot;.hincproj&quot;]
Job --&gt; P
</code></pre>
<h2 id="at-a-glance">At a Glance</h2>
<p>Each item is marked:</p>
<ul>
<li><strong>Required</strong> — a project cannot be built without it.</li>
<li><strong>Optional</strong> — improves realism but the project still runs without it.</li>
<li><strong>Conditional</strong> — only needed for a specific check <em>beyond</em> the core cutting-force simulation (e.g. collision detection, geometry validation, spindle-overload analysis), noted in <em>Used for</em>.</li>
</ul>
<table>
<thead>
<tr>
<th>Category</th>
<th>Item</th>
<th>Required?</th>
<th>Used for</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td>Machine</td>
<td>Kinematic model &amp; axis configuration (3-/5-axis, motion methods)</td>
<td><strong>Required</strong></td>
<td>Toolpath, collision</td>
<td><a href="machine-tool.html">Machine Tool</a></td>
</tr>
<tr>
<td>Machine</td>
<td>Simplified component CAD/STL (table, column, spindle housing…)</td>
<td>Conditional</td>
<td>Collision detection</td>
<td><a href="machine-tool.html">Machine Tool</a></td>
</tr>
<tr>
<td>Machine</td>
<td>Travel/stroke limits</td>
<td>Conditional</td>
<td>Stroke-overrun check</td>
<td>—</td>
</tr>
<tr>
<td>Machine</td>
<td>Rapid feedrate, max spindle &amp; rotary speeds</td>
<td>Optional</td>
<td>Feedrate precision → tighter optimization &amp; physics/timing estimates</td>
<td>—</td>
</tr>
<tr>
<td>Spindle</td>
<td>Brand/model + product description (so the chart can be sourced)</td>
<td>Conditional</td>
<td>Power/torque &amp; overload analysis — a default spindle capability is applied if omitted (fine for light cuts in small/soft stock)</td>
<td>—</td>
</tr>
<tr>
<td>Spindle</td>
<td>Speed–power–torque diagram (kW &amp; Nm vs RPM, duty ratings)</td>
<td>Conditional (sourced from the brand/model above)</td>
<td>Power/torque &amp; overload analysis</td>
<td><a href="../analysis/spindle-capability.html">Spindle Capability</a></td>
</tr>
<tr>
<td>Environment</td>
<td>Coolant type (other thermal values keep their defaults)</td>
<td>Optional</td>
<td>Thermal / wear analysis — a default is applied if omitted</td>
<td><a href="coolant.html">Coolant</a></td>
</tr>
<tr>
<td>Workpiece</td>
<td>Material (named or property set)</td>
<td><strong>Required</strong></td>
<td>Force, thermal</td>
<td>—</td>
</tr>
<tr>
<td>Workpiece</td>
<td>Initial (stock) CAD + Finished CAD (STL or parametric)</td>
<td><strong>Required</strong> (stock)</td>
<td>Cut simulation; finished = geometry check</td>
<td><a href="../../workflows/geometry-validation.html">Geometry Validation</a></td>
</tr>
<tr>
<td>Workpiece</td>
<td>Program-zero position in plain words (e.g. &ldquo;G54 = top centre&rdquo;)</td>
<td><strong>Required</strong></td>
<td>Correct engagement</td>
<td><a href="program-zero-alignment.html">Program Zero Alignment</a></td>
</tr>
<tr>
<td>Fixture</td>
<td>Fixture CAD/STL</td>
<td>Optional</td>
<td>Collision detection</td>
<td>—</td>
</tr>
<tr>
<td>Tooling</td>
<td>Per tool: geometry + cutter &amp; coating material (ideally via <strong>cutter brand + product ID</strong>)</td>
<td><strong>Required</strong></td>
<td>Force, deflection, geometry</td>
<td><a href="cutter.html">Cutter</a>, <a href="apt.html">APT</a>, <a href="insert-cutter.html">Insert Cutter</a></td>
</tr>
<tr>
<td>Tooling</td>
<td>Per tool: holder brand+ID (or rough height/radius)</td>
<td>Conditional</td>
<td>Collision check; how deep the tool reaches</td>
<td>—</td>
</tr>
<tr>
<td>Controller</td>
<td>CNC brand/type (Fanuc, Heidenhain, Siemens…)</td>
<td><strong>Required</strong></td>
<td>NC interpretation</td>
<td><a href="controller-iso.html">Controllers</a></td>
</tr>
<tr>
<td>Controller</td>
<td>NC / CL program(s)</td>
<td><strong>Required</strong></td>
<td>The process to simulate</td>
<td><a href="controller-iso.html">ISO / General NC</a></td>
</tr>
<tr>
<td>Controller</td>
<td>Work offsets (G54…) and tool offset table</td>
<td>Optional</td>
<td>Estimated/relative values work for evaluation; HiNC can set an assumed offset</td>
<td><a href="program-zero-alignment.html">Program Zero Alignment</a></td>
</tr>
</tbody>
</table>
<hr>
<h2 id="1-machine-configuration">1. Machine Configuration</h2>
<p>The machine is <strong>one-time, fixed</strong> data: collected once, reused across every job on that machine.</p>
<ul>
<li><strong>Kinematic model &amp; axis configuration</strong> — number of axes and how each axis moves (the motion chain from ground → table and ground → spindle). <strong>Required.</strong> On a multi-axis machine the <strong>rotary configuration matters most</strong>: name each rotary axis and its <strong>pivot location</strong> (e.g. <em>table-C / spindle-B</em>). The pivot defines the entire kinematic chain, rotary swings are the most collision-prone motions, and the rotary bodies' geometry makes that motion intelligible — so describe it carefully.</li>
<li><strong>Simplified component CAD/STL</strong> — table, column, spindle housing, and other bodies, exported from a single coordinate system. <strong>Only needed for collision detection</strong> — though on a multi-axis machine the <strong>rotary bodies (table, cradle, tilt head)</strong> are especially worth including, as their geometry also makes the machine's motion intelligible. Keep the mesh simplified; too many triangles slow loading and collision checks.</li>
<li><strong>Travel/stroke limits</strong> — from the machine spec sheet. <strong>Conditional.</strong> Only matters when a stroke-overrun check is the goal — and the operator has usually already confirmed the program fits the machine, so it is not needed unless that is the specific thing you want to test.</li>
<li><strong>Rapid feedrate, max spindle &amp; rotary speeds</strong> — from the machine spec sheet. <strong>Optional.</strong> Real values let the simulation use a more accurate achievable feedrate, which tightens the optimization and the physics / timing estimates. Helpful but not essential — defaults still produce a valid run.</li>
</ul>
<p>See <a href="machine-tool.html">Machine Tool</a> for how the kinematic chain and anchors are built, and <a href="anchor.html">Anchor</a> for coordinate anchors.</p>
<h2 id="2-spindle-capability">2. Spindle Capability</h2>
<ul>
<li><strong>Spindle brand / model + product description</strong> — name the spindle (or the machine) make and model, with a short description or catalog link, so the chart can be <strong>sourced and verified</strong> by whoever builds the project. <strong>Conditional</strong> — needed only when spindle power/torque/overload could matter. Omit it and a <strong>default spindle capability</strong> is applied; light cuts in small or soft stock rarely stress the spindle, so the default is fine.</li>
<li><strong>Speed–power–torque diagram</strong> — the spindle's power (kW) and torque (Nm) against RPM, including duty ratings (e.g. S1 continuous / S6 / 15-minute). From the machine or spindle spec sheet. <strong>Required for power, torque, and spindle-overload analysis.</strong></li>
</ul>
<p>This is the kind of chart needed — power and torque vs spindle speed, with the continuous (S1) and short-duration (S3) ratings:</p>
<p><img src="../analysis/spindle-capability-img/fanuc-at12-12000i.jpg" alt="Spindle power and torque vs speed (FANUC aT12/12000i)"></p>
<div class="TIP">
<h5>Tip</h5>
<p><strong>Easier than transcribing: photograph the spindle motor nameplate.</strong> The same ratings are printed on the spindle <strong>motor's spec nameplate</strong>, usually attached to the machine (on the spindle or motor body). A clear photo of it is enough — the model, type, and the S1/S2/S3 rating table (kW and speeds) recover the power–torque behaviour. Example (a FANUC αiI 6/12000 plate, unit serial removed):</p>
<p><img src="project-data-checklist-img/spindle-motor-label.svg" alt="Example spindle motor spec nameplate"></p>
</div>
<p>See <a href="../analysis/spindle-capability.html">Spindle Capability</a>.</p>
<h2 id="3-environment">3. Environment</h2>
<ul>
<li><strong>Coolant type</strong> — which coolant is used. <strong>Optional</strong> — if omitted, a default coolant setting is applied. The remaining coolant/thermal values (temperature, convection, background temperature) keep their defaults too; they only affect thermal and wear results.</li>
</ul>
<p>See <a href="coolant.html">Coolant</a>.</p>
<h2 id="4-workpiece">4. Workpiece</h2>
<ul>
<li><strong>Material</strong> — a named material from the database, or its mechanical/thermal properties. <strong>Required.</strong></li>
<li><strong>Raw (stock) geometry</strong> — STL or simple parametric dimensions (e.g. block <code>120 x 80 x 40</code> or round billet <code>Ø65 x 50</code>). Used for the starting shape and size. <strong>Required.</strong> For a <strong>casting or forging</strong>, give the as-cast shape as an <strong>STL</strong> and note its <strong>casting tolerance</strong> (the stock scatters part-to-part). <strong>Finished/design CAD</strong> is <strong>optional</strong>, used to compare the simulated shape against the target (geometry validation).</li>
<li><strong>Program-zero position, in plain words</strong> — where each work offset (G54, G55…) sits on the part, e.g. <em>&ldquo;G54 = top centre of the stock; Z0 at the top face, X0/Y0 on the axis&rdquo;</em>. <strong>Required.</strong></li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p>Describe the program zero by <strong>position on the part</strong>, not the machine-coordinate offset numbers — for evaluation/planning a relative or assumed alignment is fine and HiNC aligns it for you. See <a href="program-zero-alignment.html">Program Zero Alignment</a>.</p>
</div>
<h2 id="5-fixture">5. Fixture</h2>
<ul>
<li><strong>Fixture CAD/STL</strong> — <strong>optional</strong>, only needed when the fixture participates in collision detection.</li>
</ul>
<h2 id="6-tooling">6. Tooling</h2>
<p>For <strong>each</strong> tool used by the program, collect:</p>
<ul>
<li><strong>Cutter brand + product ID</strong> — the maker and catalog number (with datasheet/link if handy). <strong>The single most useful field, when the cutter has one</strong>: from it the engineer looks up the geometry, flute count, helix, and grade, so give it even if the geometry below is incomplete. Off-brand cutters with no brand, manual, or traceable vendor are common (it depends on the shop) — then skip this and provide the geometry below directly, measured if needed.</li>
<li><strong>Cutter geometry</strong> — <strong>Required</strong> (or derivable from the brand + product ID above):
<ul>
<li>type (flat-end / ball / corner-radius / insert), <strong>diameter</strong> <code>D</code>, <strong>corner radius</strong> <code>R</code></li>
<li><strong>flute (cuttable) length</strong> — the cutting portion</li>
<li><strong>overall tool length / stick-out</strong> — how far the cutter reaches from the holder to the flute tip; this sets where the holder grips and affects deflection and reach. A plain cylindrical cutter can use a small default exposed length (~5 mm); a cutter that is <strong>not a simple cylinder</strong> — a stepped or necked shank, or a body wider than the cutting diameter — needs a longer stick-out so the wider non-cutting part clears the workpiece.</li>
<li><strong>flute count</strong>, <strong>helix angle</strong>, <strong>rake angle</strong> (relief angle if known)</li>
</ul>
</li>
<li><strong>Cutter &amp; coating material</strong> — body material and coating layers. <strong>Required.</strong></li>
<li><strong>Holder</strong> — give the <strong>brand + product ID</strong>, or at least a <strong>rough height + radius</strong> (e.g. <code>Ø40 x 60 mm</code>). Full CAD is <strong>optional</strong> and only needed for collision detection; the rough size is enough to see whether the holder would hit the workpiece and how deep the tool can reach. Where the holder grips the tool comes from the cutter's stick-out above, so the tool can be placed even without holder geometry.</li>
</ul>
<div class="TIP">
<h5>Tip</h5>
<p>The cutter <strong>brand + product ID</strong> (or a datasheet image) is usually faster and more reliable than transcribing every dimension — the engineer reads the geometry off the catalog.</p>
</div>
<p>See <a href="cutter.html">Cutter</a>, <a href="apt.html">APT Tool</a>, <a href="insert-cutter.html">Insert Cutter</a>, and <a href="smart-tool-holder.html">Smart Tool Holder</a>.</p>
<h2 id="7-controller">7. Controller</h2>
<ul>
<li><strong>CNC brand/type</strong> — determines how the NC code is interpreted. <strong>Required.</strong></li>
<li><strong>NC / CL program(s)</strong> — the actual programs that run on the machine. <strong>Required.</strong></li>
<li><strong>Work offsets (G54…) and tool offset table</strong> — <strong>not required</strong> for evaluation/planning. Relative or estimated values work; HiNC can set a workable assumed tool offset for you. Provide the real values only when a high-fidelity match is needed.</li>
<li><strong>Stroke limits and machine-specific configuration parameters</strong> — <strong>optional</strong>.</li>
</ul>
<p>See <a href="controller-iso.html">ISO / General NC</a> and <a href="controller-heidenhain.html">Heidenhain Support</a>.</p>
<hr>
<h2 id="delivery-formats">Delivery Formats</h2>
<table>
<thead>
<tr>
<th>Data</th>
<th>Preferred format</th>
</tr>
</thead>
<tbody>
<tr>
<td>Machine / fixture geometry</td>
<td><strong>STL</strong>, all exported from the <em>same</em> coordinate system (see <a href="machine-tool.html">Machine Tool</a> best practices)</td>
</tr>
<tr>
<td>Workpiece geometry</td>
<td>STL (stock + finished) or parametric dimensions</td>
</tr>
<tr>
<td>Cutter</td>
<td><strong>Brand + product ID</strong> (best), or geometry parameters / datasheet image</td>
</tr>
<tr>
<td>Holder</td>
<td>Brand + product ID, or rough height + radius</td>
</tr>
<tr>
<td>Spindle capability</td>
<td><strong>Brand + model</strong>, plus spec-sheet table or chart image (power &amp; torque vs RPM)</td>
</tr>
<tr>
<td>NC program</td>
<td>The original <code>.nc</code> / <code>.cl</code> files</td>
</tr>
</tbody>
</table>
<h2 id="examples">Examples</h2>
<p>The examples below show how to write it. Provide the item values together with the CAD and NC files; mark estimates, and give the spindle model and cutter brand + product ID where you can, so the engineer can fill any gap.</p>
<p>These files include spindle chart photos, cutter catalog pages (e.g. <code>cmtec-CEXCRSH3120005.pdf</code>), CAD (STL/STEP), and NC programs; note the filename next to the matching item.</p>
<h3 id="example-1--pocketed-plate-3-axis-steel">Example 1 — Pocketed plate, 3-axis, steel</h3>
<pre><code class="lang-markdown"># Cover plate — TMV-720A 3-axis
Pocketed S50C cover plate roughed and finished on a 3-axis vertical machining center (VMC).
Goal: verify spindle load on the deep pocket and trim cycle time.
## Machine
Model: TongTai TMV-720A, 3-axis VMC
Tool mount: (0, 0, 0) mm (where the tool is equipped; taken as the reference point)
Table mount: (-450, -340, -630) mm (fixture &amp; workpiece, relative to the tool mount)
Controller: Fanuc
Strokes: X720 Y420 Z460 mm ; rapid 20000 mm/min ; max spindle 8000 rpm
## Spindle
Brand/model: TongTai TMV-720A standard 8000 rpm spindle (BT40)
Source: TMV-720A catalog power–torque chart — attachment fanuc-at12-12000i.png (15-min rating below; with the image you need not transcribe these)
Power (kW vs rpm): 0@0, 7.5@1500, 7.5@4500, 4@8000
Torque (Nm vs rpm): 50@1500, 37@2000, 30@2600, 19@4000, 12@6000, 8@8000
## Workpiece
Raw stock: block 140 x 90 x 50 mm
Design: cover-plate.stl
Material: S50C
## Program zero
G54 = top centre of the block — Z0 at the top face, X0/Y0 at the block centre.
## Fixture
Machine vise — vise.stl, clamps below the part top (collision only).
## Coolant
Water-soluble emulsion (flood)
## Tools
T1 face mill brand NTM, product TXE1000 (D50, exact P/N missing)
D50 6 inserts flute 6 tool length 60 holder Ø60 x 50 mm stick-out 80
T2 flat end brand cmtec, product CEXCRSH3120005 (catalog: cmtec-CEXCRSH3120005.pdf)
D12 R0 4 flutes helix 30° rake 10° flute 30 tool length 90 holder Ø40 x 63 stick-out 95
T3 flat end brand cmtec (no exact P/N)
D6 R0 4 flutes helix 30° flute 20 tool length 70 holder Ø25 x 60 stick-out 75
## NC Files (folder `NC/`)
O0010.NC face + rough the pocket with T1/T2 — watch spindle load near the deep pocket
O0020.NC profile + floor finish with T3
</code></pre>
<h3 id="example-2--relief-part-5-axis-aluminum">Example 2 — Relief part, 5-axis, aluminum</h3>
<pre><code class="lang-markdown"># Airplane relief — 5-axis VMC
Airplane + logo lettering milled from a round Al6061T6 billet on a
5-axis vertical machining center (VMC). Goal: check the 5-axis toolpath for collisions/gouges, then optimize feed.
## Machine
Model: 5-axis VMC (example machine) (machine file: MachineTool/Vmc5x/Vmc5x.mt)
Config: table-C / spindle-B (C rotary on the table, B tilt on the spindle head)
Pivots: C at (0, 0, 0), B at (-70, -180, 220) mm (relative to the C pivot)
Tool mount: (-70, 70, 175) mm (where the tool is equipped)
Controller: Fanuc
Strokes: unbounded for this study ; rapid 20000 mm/min ; max spindle 8000 rpm
## Spindle
Brand/model: built-in 8000 rpm spindle, ~5.5 kW (BT30 class)
Source: machine builder spindle datasheet (power–torque chart; attachment b1-spindle-chart.png)
Power (kW vs rpm): 0@0, 5.5@1500, 5.5@4500, 3@8000
Torque (Nm vs rpm): 50@1500, 30@2000, 20@3000, 15@4000, 8@6000, 5@8000
## Workpiece
Raw stock: round billet Ø65 x 50 mm
Design: airplane.stl
Material: Al6061T6
## Program zero
G54 = top centre of the billet — Z0 at the top face, X0/Y0 on the axis. (G55+ unused.)
## Fixture
Round fixture Ø100 x 10 mm under the billet (collision only).
## Coolant
Air blast (dry)
## Tools
&lt;!-- brand given but NO product ID, so the engineer recovers the exact geometry
and grade by measurement — slower and more error-prone. A brand + product ID
is very helpful when the tool has one; off-brand tools without one must be measured. --&gt;
(all: brand cmtec, aluminum grade — product ID not given; carbide, 3 flutes,
helix 37°, rake 15°, relief 5° [helix/rake estimated];
holder Ø25 x 60 mm, 8 mm flute-to-nose clearance)
T1 flat end D6 R0 flute 20 tool length 75
T2 ball end D6 flute 20 tool length 75
T3 ball end D3 flute 20 tool length 75
T4 ball end D2 flute 8 tool length 75
## NC Files (34 programs in folder `NC/`; actual filenames below)
01-ED6L20.NC, 02-ED6L20.NC … 10-ED6L28.NC roughing with T1 (flat D6)
11-R3L25.NC … 22-R3L25.NC semi-finish with T2 (ball D6)
23-R2L25.NC … 30-R2L25.NC finishing
airplane-R1L12.NC, logo1-R1L12.NC, logo2-R1L12.NC, logo3-R1L12.NC detail airplane + logo with T4 (ball D2)
(filename = seq-toolcode+cutlength; ED6 = flat end mill D6, R3/R2/R1 = ball, digit = nose radius)
</code></pre>
<div class="NOTE">
<h5>Note</h5>
<p>Example 2 mirrors a real <code>.hincproj</code> (machine name anonymized); Example 1 is representative with estimated values. The spindle model and the cutter <strong>brand + product ID</strong> are the anchors from which the engineer recovers the geometry and the power–torque chart.</p>
</div>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a> — set up and run a simulation once the data is collected</li>
<li><a href="machine-tool.html">Machine Tool</a> — build the kinematic model from CAD</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — how HiNC aligns the program zero</li>
<li><a href="../analysis/spindle-capability.html">Spindle Capability</a> — the speed–power–torque model</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>
@@ -1,154 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Smart Tool Holder | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Smart Tool Holder | 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="">
<h1 id="smart-tool-holder">Smart Tool Holder</h1>
<p>A smart tool holder is a machine tool accessory equipped with sensors that can monitor force and torque data in real time during machining. To ensure simulation accuracy, the following parameters must be configured correctly:</p>
<h2 id="sensor-configuration">Sensor Configuration</h2>
<h3 id="moment-arm-height">Moment Arm Height</h3>
<ul>
<li>The sensor height setting has a significant impact on simulation accuracy</li>
<li>This height defines the moment arm distance for the torque measured by the sensor</li>
<li>If not set correctly, a constant scaling error will appear in the torque calculation</li>
</ul>
<h3 id="coordinate-system-alignment">Coordinate System Alignment</h3>
<ol>
<li><p><strong>Basic Principle</strong></p>
<ul>
<li>The cutting edge should be aligned with the sensor's X-axis</li>
<li>Ensure the sensor XY coordinate system is consistent with the simulation XY coordinate system</li>
<li>The impact of coordinate system misalignment is relatively smaller compared to the moment arm setting</li>
</ul>
</li>
<li><p><strong>Installation Angle Adjustment</strong></p>
<ul>
<li>If perfect alignment is not possible, measure the offset angle</li>
<li>Enter the measured angle in the &ldquo;Installation Angle&rdquo; field</li>
<li>The maximum possible deviation is 45 degrees</li>
</ul>
</li>
</ol>
<h2 id="factors-affecting-accuracy">Factors Affecting Accuracy</h2>
<h3 id="coordinate-transformation-effects">Coordinate Transformation Effects</h3>
<ul>
<li>An installation angle deviation can cause up to a √2 factor difference in values</li>
<li>This difference is inherently a result of coordinate transformation, not a measurement accuracy issue</li>
<li>Even with the same smart tool holder, different installation angles will produce different measurement data</li>
</ul>
<h3 id="best-practices">Best Practices</h3>
<ol>
<li>Prioritize accurate moment arm height configuration</li>
<li>Align the cutting edge with the sensor X-axis as closely as possible</li>
<li>If perfect alignment is not achievable, always measure and set the correct installation angle</li>
</ol>
<p>Only with these parameters correctly configured will the simulated micro-waveforms match the actual sensor measurements.</p>
</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>
Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

@@ -0,0 +1,221 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Spindle Capability | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Spindle Capability | 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="">
<h1 id="spindle-capability">Spindle Capability</h1>
<p>Describing the machine's spindle: how much power and torque it delivers at each speed, for how long,
and how hot it may get. You fill it in from the machine builder's spindle data sheet, and every spindle
number a run reports is measured against it. What the curves mean physically is
<a class="xref" href="../../technique/machine-capability/spindle-capability.html">Spindle Capability</a>; this page is where you enter them.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown. Select the
<strong>Spindle Capability</strong> branch of the Control Tree (<code>/general-setup?tree=equipment/spindle</code>) — the
equipment item straight after Machine Tool. The tree and the selected node's editor share the left
dock; this branch also fills the page's middle <strong>content column</strong> with a power and a torque chart,
which stay mounted as you walk its six nodes. Until a project is open the branch is inert: the root
reports <em>No spindle capability attached to this project.</em> and points at the <strong>Object Management</strong>
(<code>⋮</code>) menu's <strong>Load</strong>, and each child shows <em>No spindle capability attached. Load one on the Spindle
Capability item.</em> in place of its fields. The selection rides in the address bar as the <code>?tree=</code> value
the paths below quote; what those ids do and do not promise across versions is
<a href="../basics/finding-your-way.html">Finding Your Way</a>.</p>
<h2 id="what-each-child-asks-for">What each child asks for</h2>
<p>The root node carries the ⋮ menu first, then the <strong>Name</strong> and the <strong>Note</strong>; the five children carry the
values, and each edit lands on the project's equipment as you make it.</p>
<table>
<thead>
<tr>
<th>Node</th>
<th>What to enter</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Thermal / Energy</strong><br><code>.../thermal</code></td>
<td><strong>Energy Efficiency</strong>, the output / input power ratio between 0 and 1; and the <strong>Working Temperature Upper Boundary</strong> in °C, the housing temperature the spindle is rated to work up to.</td>
</tr>
<tr>
<td><strong>Gear Shift</strong><br><code>.../gear-shift</code></td>
<td>Whether the spindle has a gear-shift mechanism (L/H), and the <strong>Gear Shift Spindle Speed</strong> in rpm at which it changes range. Leaving the box clear states a single-range spindle; the speed field stays disabled.</td>
</tr>
<tr>
<td><strong>Dry-Run Coefficients</strong><br><code>.../dry-run</code></td>
<td>The <strong>Friction Power Coefficient</strong> (mW/rpm) and the <strong>Windage Power Coefficient</strong> (pW/rpm³), the spindle's dry-run idle power — the two terms and where each dominates are <a class="xref" href="../../technique/machine-capability/spindle-capability.html">Spindle Capability</a>.</td>
</tr>
<tr>
<td><strong>Power Contours</strong><br><code>.../power</code></td>
<td>One kW-against-rpm curve per duty rating.</td>
</tr>
<tr>
<td><strong>Torque Contours</strong><br><code>.../torque</code></td>
<td>The same curves, in Nm.</td>
</tr>
</tbody>
</table>
<h2 id="entering-a-contour">Entering a contour</h2>
<ol>
<li>Select <strong>Power Contours</strong> or <strong>Torque Contours</strong>. <strong>Add</strong> asks for a workable duration in minutes,
pre-filled with 60 — clear the field for the continuous curve — and starts the new curve as a copy
of the selected one.</li>
<li>Pick the curve to edit in the <strong>Contour</strong> selector, which names each by its duration and the
unlimited one <strong>Continuous</strong>; its pencil button re-opens that duration, its delete button removes
the curve, and a chip click on the chart selects one just as the selector does.</li>
<li>The table below is the curve itself: one row per spindle speed and value, an insert button that
clones a row, a double-click that removes one, and a chart that redraws on every edit.</li>
</ol>
<p>The delete button beside the pencil removes the whole selected curve. It is disabled while only one
curve is left, so an axis that has curves cannot be emptied from here.</p>
<p><strong>Power Contours</strong> selected on a demo project, at <code>/general-setup?tree=equipment/spindle/power</code>. The
tree shows the branch's five children; the middle column carries the pair of charts, which stay put
as you walk between those children; and the panel under the tree is the editor for one curve —
<strong>Power contours (2)</strong> with its <strong>Add</strong> button, the <strong>Contour</strong> selector reading <em>360 min</em>, and the
four rows of that curve. The chart legends carry one chip per curve, <em>360 min</em> and <em>Cont.</em>, and a
click on a chip moves the editor to that curve.</p>
<p><img src="spindle-capability-img/power-contours.en.png" alt="The Spindle Capability branch expanded with Power Contours selected: the power and torque charts in the middle column, each with a 360 min and a Cont. legend chip, and the contour editor below the tree showing the Contour selector and a four-row spindle-speed and power table"></p>
<h2 id="where-the-numbers-come-from">Where the numbers come from</h2>
<p>The machine's or spindle's spec sheet, as the speed–power–torque diagram with the duty ratings printed
on it; which printed rating becomes which curve is
<a class="xref" href="../../technique/machine-capability/spindle-capability.html">Spindle Capability</a>, which shows the mapping against a real datasheet
chart. The default energy efficiency of 0.4 is the conversion HiNC's power figures were validated at, in
<a class="xref" href="../../technique/machine-capability/spindle-power-evaluation.html">Spindle Power Evaluation</a>; what to ask the machine owner for is
<a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a>.</p>
<p><strong>The two dry-run coefficients are the ones a datasheet almost never prints.</strong> Their defaults —
4.82 mW/rpm of friction and 90 pW/rpm³ of windage — are estimated from published measurements of
comparable spindles rather than measured on yours, and they are a reasonable place to leave the
field unless you have run the spindle empty and measured its idle draw.</p>
<p>Leaving the branch alone is a choice rather than a blank: a project never given a capability carries a
stand-in — the <strong>TMV-720A-STD-8000RPM</strong> spindle, the same curves as one of the three shipped files, so
its name is what the root node shows: 15-minute, 60-minute and continuous curves on each axis, topping
out at 8000 rpm, with 0.4 efficiency and a 65 °C ceiling. That is fine for light cuts in small or soft
stock. Near the machine's limit it is the wrong envelope, and everything measured against it inherits
the error — the spindle torque, power and temperature ratios the run charts, and the feed the optimizer
assigns under the spindle safety factors, which are
<a class="xref" href="../../technique/machine-capability/machine-condition.html">Machine Condition and Safety Factors</a>.</p>
<h2 id="loading-and-saving">Loading and saving</h2>
<p>The root node's ⋮ menu is the branch's whole file surface. The capability is stored in the project, so
one already carrying the right spindle needs no file at all; <strong>Copy</strong>, <strong>Paste</strong> and <strong>XML Mode</strong> move
it as XML, and an XML <strong>Apply</strong> installs exactly as a Load does.</p>
<ul>
<li><strong>Load</strong> browses the server for a <code>.SpindleCapability</code> or <code>.xml</code> file — the project or
administrator directory, the latter carrying the shipped resource library where three ready-made
capabilities are installed. It replaces the capability outright; the branch and the charts reload
onto the new one.</li>
<li><strong>Save As</strong> writes the current capability out, offered as <code>SpindleCapability.xml</code> in the project
folder: how a spindle you have tuned becomes reusable in the next project.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../../technique/machine-capability/spindle-capability.html">Spindle Capability</a> — what these curves mean, and how the run's spindle ratios and temperature come out of them</li>
<li><a class="xref" href="../../workflows/project-data-checklist.html">Project Data Checklist</a> — the data to collect from the machine owner before filling this branch in</li>
<li><a href="machine-tool.html">Machine Tool</a> — the machine whose spindle this describes</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</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>
+14 -34
View File
@@ -16,10 +16,19 @@
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="project-data-checklist.html" name="" title="Project Data Checklist">Project Data Checklist</a>
<a href="machine-tool.html" name="" title="Machine Tool">Machine Tool</a>
</li>
<li>
<a href="machine-tool.html" name="" title="Machine Tool">Machine Tool</a>
<a href="spindle-capability.html" name="" title="Spindle Capability">Spindle Capability</a>
</li>
<li>
<a href="fixture.html" name="" title="Fixture">Fixture</a>
</li>
<li>
<a href="workpiece.html" name="" title="Workpiece">Workpiece</a>
</li>
<li>
<a href="controller.html" name="" title="Controller">Controller</a>
</li>
<li>
<a href="anchor.html" name="" title="Anchor">Anchor</a>
@@ -27,41 +36,12 @@
<li>
<a href="program-zero-alignment.html" name="" title="Program Zero Alignment">Program Zero Alignment</a>
</li>
<li>
<a href="cutter.html" name="" title="Cutter">Cutter</a>
</li>
<li>
<a href="coolant.html" name="" title="Coolant">Coolant</a>
</li>
<li>
<span class="expand-stub"></span>
<a>Controllers</a>
<ul class="nav level2">
<li>
<a href="controller-heidenhain.html" name="" title="Heidenhain">Heidenhain</a>
</li>
<li>
<a href="controller-iso.html" name="" title="ISO / General NC">ISO / General NC</a>
</li>
</ul>
</li>
<li>
<span class="expand-stub"></span>
<a>Cutting Tools</a>
<ul class="nav level2">
<li>
<a href="cutter.html" name="" title="Cutter">Cutter</a>
</li>
<li>
<a href="apt.html" name="" title="APT Tool">APT Tool</a>
</li>
<li>
<a href="insert-cutter.html" name="" title="Insert Cutter">Insert Cutter</a>
</li>
<li>
<a href="smart-tool-holder.html" name="" title="Smart Tool Holder">Smart Tool Holder</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Project Data Checklist","href":"project-data-checklist.html","topicHref":"project-data-checklist.html"},{"name":"Machine Tool","href":"machine-tool.html","topicHref":"machine-tool.html"},{"name":"Anchor","href":"anchor.html","topicHref":"anchor.html"},{"name":"Program Zero Alignment","href":"program-zero-alignment.html","topicHref":"program-zero-alignment.html"},{"name":"Coolant","href":"coolant.html","topicHref":"coolant.html"},{"name":"Controllers","items":[{"name":"Heidenhain","href":"controller-heidenhain.html","topicHref":"controller-heidenhain.html"},{"name":"ISO / General NC","href":"controller-iso.html","topicHref":"controller-iso.html"}]},{"name":"Cutting Tools","items":[{"name":"Cutter","href":"cutter.html","topicHref":"cutter.html"},{"name":"APT Tool","href":"apt.html","topicHref":"apt.html"},{"name":"Insert Cutter","href":"insert-cutter.html","topicHref":"insert-cutter.html"},{"name":"Smart Tool Holder","href":"smart-tool-holder.html","topicHref":"smart-tool-holder.html"}]}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Machine Tool","href":"machine-tool.html","topicHref":"machine-tool.html"},{"name":"Spindle Capability","href":"spindle-capability.html","topicHref":"spindle-capability.html"},{"name":"Fixture","href":"fixture.html","topicHref":"fixture.html"},{"name":"Workpiece","href":"workpiece.html","topicHref":"workpiece.html"},{"name":"Controller","href":"controller.html","topicHref":"controller.html"},{"name":"Anchor","href":"anchor.html","topicHref":"anchor.html"},{"name":"Program Zero Alignment","href":"program-zero-alignment.html","topicHref":"program-zero-alignment.html"},{"name":"Cutter","href":"cutter.html","topicHref":"cutter.html"},{"name":"Coolant","href":"coolant.html","topicHref":"coolant.html"}]}
Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

@@ -0,0 +1,213 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Workpiece | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Workpiece | 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="">
<h1 id="workpiece">Workpiece</h1>
<p>The workpiece is the stock the machine cuts. Setting it up means giving it the shape it starts as
and the shape it should end as, placing it in the machine, choosing how finely it is meshed, and
saying what it is made of.</p>
<h2 id="where-it-is">Where it is</h2>
<p>The General Setup page, at <code>/general-setup</code>, reached from the menu bar's <strong>Page</strong> dropdown. Select
the <strong>Workpiece</strong> branch of the Control Tree (<code>/general-setup?tree=equipment/workpiece</code>). Whichever
node you select opens its editor below the tree in the same dock, and the canvas beside them draws
the workpiece in the shared equipment scene.</p>
<p>A project carries its workpiece with it, so there is nothing to load: the branch root has no load or
save button, and every part of the workpiece is edited through one of its child items. Those children
appear once a project with a workpiece is open; until then the root shows a summary and a caption
asking for a project to be opened or created first — see <a href="../basics/projects.html">Projects</a>.
Attaching it to the machine is the anchor task below.</p>
<p>The branch with the root selected, at <code>/general-setup?tree=equipment/workpiece</code>. The root itself has
no editor — the caption in the middle column says so — while the canvas draws the stock sitting on
its fixture, with the workpiece's two anchors labelled at the corner they are placed on.</p>
<p><img src="workpiece-img/workpiece-in-scene.en.png" alt="The Workpiece branch selected, its stock drawn on the fixture in the equipment scene"></p>
<h2 id="the-two-shapes">The two shapes</h2>
<p>Selecting <strong>Raw Geometry</strong> or <strong>Target Geometry</strong> opens the same <strong>Geometry type</strong> kind picker the
fixture's geometry slot carries — see <a href="fixture.html">Fixture</a> — over a different list of kinds for
each slot.</p>
<table>
<thead>
<tr>
<th>Slot</th>
<th>What it is</th>
<th>Kinds offered</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Raw Geometry</strong><br><code>equipment/workpiece/raw-geometry</code></td>
<td>The stock as it arrives, before the first cut. This is what the run removes material from.</td>
<td><code>Box3d</code>, <code>Cylindroid</code>, <code>StlFile</code>, <code>TransformationGeom</code>, <code>GeomCombination</code>, <code>MeshedGeomFile</code></td>
</tr>
<tr>
<td><strong>Target Geometry</strong><br><code>equipment/workpiece/target-geometry</code></td>
<td>The finished part. The cut result is compared against it when a <a class="xref" href="../../workflows/geometry-validation.html">geometry difference</a> is run after the program.</td>
<td><code>Box3d</code>, <code>Cylindroid</code>, <code>StlFile</code>, <code>TransformationGeom</code></td>
</tr>
</tbody>
</table>
<p><code>MeshedGeomFile</code> is a shape already meshed into a voxel cube-tree, stored as a <code>.wct</code> file. The
target must produce a surface mesh to be compared against, so that kind is not offered there.</p>
<p><strong>A new project has a workpiece but no raw geometry.</strong> Creating one leaves the Raw Geometry slot
empty, so picking a kind there is the first thing this branch needs — until it is done there is
nothing for a run to remove material from. The Target Geometry slot is optional: it is what a
geometry comparison after the run measures against, and a run without one still cuts.</p>
<h2 id="where-it-sits">Where it sits</h2>
<p><strong>Anchor</strong> (<code>equipment/workpiece/anchor</code>) holds the two transforms that place the workpiece.
<strong>Geom To Fixture</strong> (<code>.../anchor/geom-to-fixture</code>) puts the workpiece geometry on the fixture's
workpiece buckle — one of the four named <a class="xref" href="../../technique/mechanism/assembly-anchors.html">assembly anchors</a> the
scene is built on — or, on a project carrying no fixture, straight onto the machine's table buckle.
<strong>Geom To Program Zero</strong> (<code>.../anchor/geom-to-program-zero</code>) places the program zero, the NC origin,
relative to that geometry. Setting them is <a href="anchor.html">Anchor</a>; which direction to align program
zero in — and why that depends on planning a new job versus reproducing a recorded one — is
<a href="program-zero-alignment.html">Program Zero Alignment</a>.</p>
<h2 id="mesh-and-material">Mesh and material</h2>
<p><strong>Mesh</strong> (<code>equipment/workpiece/runtime</code>) carries one field, <strong>Initial Resolution</strong> in mm, chosen
from a fixed powers-of-two ladder running from 0.0009765625 to 16. The panel's hint is that a
smaller resolution means a finer voxel grid and a slower run; what the number actually is and how to
pick it are <a class="xref" href="../../technique/simulation-performance/mesh-resolution.html">Mesh Resolution</a>. It seeds the run's machining
resolution when the project is opened.</p>
<div class="IMPORTANT">
<h5>Important</h5>
<p>Keep the stored value on that ladder. The dropdown only offers ladder values, but a project
arriving from an older generation, a script or a migration can carry something else — 0.4 mm is
the one seen most often. Such a value is not a compromise between two rungs: the run rounds it to
the next finer rung and uses that, so 0.4 mm builds the same 0.25 mm mesh at the same cost while
the project reads as though it were coarser. Set it to the width it actually builds. The number
then means what it says, here and in the Machining Resolution mission row that mirrors it.</p>
</div>
<p><strong>Material</strong> (<code>equipment/workpiece/material</code>) holds two references to pre-prepared files. Each is a
file row whose <strong>Select</strong> dropdown offers <strong>Browse Resource&hellip;</strong> and nothing else — unlike the
coolant row beside it, these two do not offer a plain <strong>Browse&hellip;</strong>, so the picker always opens in
the shipped resource library, already in that resource's own folder. Loading one fills the read-only
<strong>Name</strong> and <strong>Note</strong> below it.</p>
<p><strong>Workpiece Material</strong> selected on a demo project, at
<code>/general-setup?tree=equipment/workpiece/material/workpiece-material</code>. The file row holds the
material the project already carries, and the <strong>Name</strong> below it reads the name out of that file
while the <strong>Note</strong> is empty — both are read-only, because they belong to the file rather than to the
project.</p>
<p><img src="workpiece-img/workpiece-material.en.png" alt="The Workpiece Material item of the Control Tree selected, its panel showing a Select dropdown beside a file path reading Al6061T6.WorkpieceMaterial, a read-only Name field reading Al6061T6 and an empty read-only Note field"></p>
<ul>
<li><strong>Workpiece Material</strong> (<code>.../material/workpiece-material</code>) — a <code>.WorkpieceMaterial</code> file: the
physical properties the cutting-force physics reads.</li>
<li><strong>Cutting Parameter</strong> (<code>.../material/cutting-parameter</code>) — an <code>.mp</code> file: the milling-force
coefficients for that material. One file serves the whole run, whichever cutters it uses.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="anchor.html">Anchor</a> — the two transforms above, and the order to place the machine, fixture and workpiece in</li>
<li><a href="program-zero-alignment.html">Program Zero Alignment</a> — which way to align the program origin once the workpiece is placed</li>
<li><a href="fixture.html">Fixture</a> — what holds this workpiece on the table, and the buckle its Geom To Fixture transform lands on</li>
<li><a class="xref" href="../../technique/simulation-performance/mesh-resolution.html">Mesh Resolution</a> — how to choose the Initial Resolution, and the thin wall a coarse mesh loses entirely</li>
<li><a class="xref" href="../../workflows/force-training.html">Milling Force Parameter Training</a> — where a cutting-parameter file comes from when no shipped one fits</li>
<li><a href="index.html">Setup</a> — the rest of the pre-simulation configuration</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>