deploy webservice static-file routing for docsite folder URLs, per-instance step-cache db, and constant-height panel title bars.

This commit is contained in:
2026-08-27 14:51:37 +08:00
parent 1fc510af5e
commit 2a98ae7556
1468 changed files with 182837 additions and 18888 deletions
@@ -87,133 +87,244 @@
<article data-uid="Controllers/HeidenhainSupport">
<h1 id="heidenhain-controller-support">Heidenhain Controller Support</h1>
<p>This chapter explains HiNC support for NC codes of Heidenhain TNC640 and TNC530 controllers.</p>
<p>Heidenhain controllers support general ISO syntax. The general ISO syntax supported by HiNC is documented in other files.</p>
<p>If not mentioned in the documentation, it generally means it's not supported. R radius compensation command is not supported.</p>
<h2 id="format-support">Format Support</h2>
<p>Except for L code and FQ code, there must be spaces between letter instructions, otherwise, they cannot be parsed.</p>
<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>Can be parsed:</p>
<p>Equivalent, all parsed:</p>
<ul>
<li><code>FMAX M03</code></li>
<li><code>LX-26.3 Y+43.1 Z+100.3 A-90.0 C+13.123 FQ3</code></li>
<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>Cannot be parsed:
<code>FMAXM03</code></p>
</blockquote>
<p>Support for <code>L</code> move command.</p>
<blockquote>
<p>Can be parsed:</p>
<p>Parsed:</p>
<ul>
<li><code>LX+0Y+0FMAX</code></li>
<li><code>L X+0 Y+0 FMAX</code></li>
</ul>
</blockquote>
<h2 id="macro-support">Macro Support</h2>
<h3 id="q-variable-assignment">Q Variable Assignment</h3>
<p>Support for Q variable assignment.</p>
<blockquote>
<p>Can be parsed:</p>
<ul>
<li><code>Q1 = 5000</code></li>
<li><code>Q2 = 123</code></li>
<li><code>Q3 = 1000</code></li>
<li><code>LX-26.3 Y+43.1 Z+100.3 A-90.0 C+13.123 FQ3</code></li>
</ul>
</blockquote>
<h3 id="q-variable-operations">Q Variable Operations</h3>
<p>Support for the following macro operations:</p>
<ul>
<li><code>FN0</code> specify a value.</li>
<li><code>FN1</code> calculate and specify the sum of two values.</li>
<li><code>FN2</code> calculate and specify the difference of two values.</li>
<li><code>FN3</code> calculate and specify the product of two values.</li>
</ul>
<blockquote>
<p>Can be parsed:</p>
<ul>
<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="tool-call">TOOL CALL</h2>
<p>Support for <code>TOOL CALL</code>, but the tool name must be a number.</p>
<blockquote>
<p>Can be parsed:</p>
<ul>
<li><code>TOOL CALL &quot;1&quot; Z S5000</code></li>
<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>Cannot be parsed:
<code>TOOL CALL &quot;ET1&quot; S5000</code></p>
</blockquote>
<h2 id="cycl-def-7">CYCL DEF 7</h2>
<p>Support for <code>CYCL DEF 7</code> workpiece origin offset command.</p>
<blockquote>
<p>Can be parsed:</p>
<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="cycl-def-247">CYCL DEF 247</h2>
<p>Support for <code>CYCL DEF 247</code> workpiece origin setting. Supports <code>Q339</code> coordinate index.</p>
<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>Can be parsed: <code>CYCL DEF 247 Q339=+1</code></p>
</blockquote>
<h2 id="plane-series-instructions">PLANE Series Instructions</h2>
<h3 id="motion-behavior-instructions">Motion Behavior Instructions</h3>
<p>Support for one of three motion behavior instructions: { <code>STAY</code> , <code>TURN</code> , <code>MOVE</code> } .</p>
<h3 id="seq">SEQ</h3>
<p>Support for { <code>SEQ+</code> , <code>SEQ-</code> } active spindle rotation direction instructions.</p>
<h3 id="table-rot">TABLE ROT</h3>
<p>Support for <code>TABLE ROT</code> worktable rotation instructions.</p>
<h3 id="plane-spatial">PLANE SPATIAL</h3>
<blockquote>
<p>Can be parsed: <code>PLANE SPATIAL SPA-60.3 SPB+0 SPC-19.88 STAY SEQ- TABLE ROT</code></p>
</blockquote>
<h3 id="plane-reset">PLANE RESET</h3>
<blockquote>
<p>Can be parsed: <code>PLANE RESET STAY</code></p>
</blockquote>
<h2 id="heidenhain-specific-m-codes">Heidenhain Specific M Codes</h2>
<p>Support for the following Heidenhain specific M codes. General ISO M codes are documented elsewhere.</p>
<h3 id="m91">M91</h3>
<p>Support for <code>M91</code> single-line effective mechanical coordinate displacement.</p>
<blockquote>
<p>Can be parsed: <code>L Z-1 F5000 M91</code></p>
</blockquote>
<h3 id="m107">M107</h3>
<p><strong>Skip</strong> <code>M107</code> display error message command.</p>
<h3 id="m108">M108</h3>
<p><strong>Skip</strong> <code>M108</code> reset <code>M107</code> command.</p>
<h3 id="m126">M126</h3>
<p>Support for <code>M126</code> move on the rotary axis with a shorter path.</p>
<h3 id="m127">M127</h3>
<p>Support for <code>M127</code> reset <code>M126</code> command.</p>
<h4 id="controller-parameter-field-300401">Controller Parameter Field 300401</h4>
<p>Support for controller parameter field <code>300401</code>, if this parameter is true, regardless of whether <code>M127</code> is issued, it will move on the rotary axis with a shorter path.</p>
<p>Parameter field <code>300401</code> default value is true.</p>
<h3 id="m128">M128</h3>
<p>Support for <code>M128</code> enable Tool Center Point Management (TCPM).</p>
<h3 id="m129">M129</h3>
<p>Support for <code>M129</code> disable Tool Center Point Management (TCPM).</p>
<h3 id="m140">M140</h3>
<p>Support for <code>M140 MB</code> <code>M140 MB MAX</code> retract tool command.</p>
<blockquote>
<p>Can be parsed:</p>
<p>Parsed:</p>
<ul>
<li><code>M140 MB MAX</code></li>
<li><code>M140 MB+50 F6000</code></li>
<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>
@@ -87,17 +87,380 @@
<article data-uid="">
<h1 id="general-nc-code-support">General NC Code Support</h1>
<p>This list only represents partial functionality that can be applied to these commands. It may not execute complete functionality.</p>
<h2 id="iso-standard-nc-codes">ISO Standard NC Codes</h2>
<p>G00, G01, G02, G03, G04, G17, G18, G19, G21, G28, G40,
G43, G44, G49, G52, G53, G54~G59.9, G68, G69, G71,
G80, G81, G82, G83, G85, G86,
G90, G91, G94, G98, G99</p>
<p>M03, M04, M05, M06, M08, M09, M13, M14, M30</p>
<h2 id="fanuc--syntec-specific-nc-codes">Fanuc &amp; Syntec Specific NC Codes</h2>
<p>G43.4, G53.1, G68.2</p>
<h2 id="siemens-specific-nc-codes">Siemens Specific NC Codes</h2>
<p>G500, SUPA, TRAFOOF, TRAORI</p>
<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>
@@ -88,6 +88,32 @@
<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>
<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>
<table>
<thead>
<tr>
<th>Shipped file</th>
<th>Pick it when</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>StandardForcedAir</strong></td>
<td>The machine only blows air at the cutter — no liquid coolant.</td>
</tr>
<tr>
<td><strong>StandardWaterSolubleCoolant</strong></td>
<td>Water-based emulsion coolant, the common flood coolant. (A fresh project already carries these values.)</td>
</tr>
<tr>
<td><strong>StandardOilBasedCoolant</strong></td>
<td>Neat-oil cutting fluid: better lubrication, noticeably less heat removal than water-based.</td>
</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>
<table>
@@ -102,7 +128,7 @@
<tr>
<td><code>M08</code></td>
<td><code>Flood</code></td>
<td><code>CoolantConvectionCoefficient_Wdm2K</code> (baseline you set)</td>
<td><code>CoolantConvectionCoefficient_Wdm2K</code> (baseline of the chosen type)</td>
</tr>
<tr>
<td><code>M07</code></td>
@@ -117,7 +143,46 @@
</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>
@@ -135,7 +200,7 @@
<tr>
<td><code>CoolantConvectionCoefficient_Wdm2K</code></td>
<td>1 000</td>
<td>Flood baseline. Water-based emulsion ≈ 1 000–3 000, oil ≈ 100–500.</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>
@@ -147,6 +212,11 @@
<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>—</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>
</tbody>
</table>
<h2 id="why-the-mist-ratio-defaults-to-05">Why the mist ratio defaults to 0.5</h2>
@@ -155,15 +225,23 @@
<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>
<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>
</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;1000&lt;/CoolantConvectionCoefficient_Wdm2K&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>Omit the last two elements to accept the defaults.</p>
<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>
@@ -118,6 +118,43 @@ Cutting tools, EDM (electrical discharge machining) dies.</li>
<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>
@@ -88,6 +88,10 @@
<h1 id="setup">Setup</h1>
<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>
</div>
<h2 id="equipment">Equipment</h2>
<ul>
<li><a href="machine-tool.html">Machine Tool</a> — Build or load a virtual machine tool</li>
@@ -95,8 +99,8 @@
</ul>
<h2 id="controllers">Controllers</h2>
<ul>
<li><a href="controller-heidenhain.html">Heidenhain Support</a> — Heidenhain controller setup</li>
<li><a href="controller-iso.html">ISO / General NC</a> — Fanuc, Siemens, Mitsubishi, and ISO NC code support</li>
<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>
</ul>
<h2 id="cutting-tools">Cutting Tools</h2>
<ul>
@@ -0,0 +1,180 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Program Zero Alignment | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Program Zero Alignment | 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="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>
<table>
<thead>
<tr>
<th>Transformer</th>
<th>Position</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Workpiece.WorkpieceGeomToFixtureBuckleTransformer</code></td>
<td>bottom center of the workpiece geom</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>
</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>
<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>
</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>
</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>
<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 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>
</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,121 @@
<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>

After

Width:  |  Height:  |  Size: 5.1 KiB

@@ -0,0 +1,488 @@
<!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>
@@ -15,12 +15,18 @@
<li>
<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>
</li>
<li>
<a href="machine-tool.html" name="" title="Machine Tool">Machine Tool</a>
</li>
<li>
<a href="anchor.html" name="" title="Anchor">Anchor</a>
</li>
<li>
<a href="program-zero-alignment.html" name="" title="Program Zero Alignment">Program Zero Alignment</a>
</li>
<li>
<a href="coolant.html" name="" title="Coolant">Coolant</a>
</li>
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Machine Tool","href":"machine-tool.html","topicHref":"machine-tool.html"},{"name":"Anchor","href":"anchor.html","topicHref":"anchor.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":"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"}]}]}