fix SoftNcRunner GM code normalization.

This commit is contained in:
2026-05-06 13:21:19 +08:00
parent 0fe9497552
commit 2f57932000
1238 changed files with 69405 additions and 22511 deletions
@@ -0,0 +1,261 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Release Note | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Release Note | 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="release-note">Release Note</h1>
<h2 id="hinc-packages-version-31167">HiNc Packages Version 3.1.167</h2>
<ul>
<li>Introduce <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> as a pluggable NC parser/runner replacing the legacy <code>HardNcRunner</code>; opt in via <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_EnableSoftNcRunner">EnableSoftNcRunner</a>. <strong>see <a href="softnc-rewrite-report.html">HardNc → SoftNc Rewrite — Progress Report</a> for the in-flight rewrite scope and remaining work</strong></li>
<li>Extend coolant model to <a class="xref" href="../api/Hi.Numerical.CoolantMode.html">CoolantMode</a> Flood/Mist/Off and refactor <a class="xref" href="../api/Hi.Physics.CoolantHeatCondition.html">CoolantHeatCondition</a> / <code>MillingTemperatureUtil</code> for multi-mode coolant</li>
<li>Bind session events to <a class="xref" href="../api/Hi.MachiningProcs.MachiningSession.html">MachiningSession</a> lifetime: <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_SessionStepBuilt">SessionStepBuilt</a>, <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_SessionStepSelected">SessionStepSelected</a>, <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_SessionSyntaxPieceRan">SessionSyntaxPieceRan</a>, <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_SessionSourcedActEntry">SessionSourcedActEntry</a> (legacy aliases kept as <code>[Obsolete]</code>); add <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_RegisterWriteSyntaxPieces_">RegisterWriteSyntaxPieces</a> / <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_RegisterWriteSyntaxPiecesWithActs_">RegisterWriteSyntaxPiecesWithActs</a> for syntax-piece debug tracing</li>
<li>Add <a class="xref" href="../api/Hi.Common.XmlUtils.ProjectApiVersion.html">ProjectApiVersion</a> carrier through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization for project-XML version negotiation; resolve <a class="xref" href="../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> through a lazy <code>Func</code> getter in <a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a></li>
</ul>
<h2 id="hinc-packages-version-31162">HiNc Packages Version 3.1.162</h2>
<ul>
<li>Refactor message management into three independent categories: <strong>Diagnostic</strong> (<code>IProgress&lt;object&gt;</code>), <strong>UI Notification</strong> (<code>MessageBoardUtil</code>), <strong>App Log</strong> (<code>ILogger</code>); remove <code>MessageUtil</code> class entirely and remove <code>ExceptionUtil.ShowException</code> / <code>ExceptionUtil.OnShown</code> (see <a href="../fundamentals/common/message-management.html">Message Management</a>)</li>
<li>Thread <code>IProgress&lt;object&gt;</code> through <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a> deserialization chain and <a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> loading; remove <code>GenMode</code> enum entirely (see <a href="../fundamentals/common/xml-io.html">XML IO</a>)</li>
<li>Add <a class="xref" href="../api/Hi.Common.Messages.ActionProgress-1.html">ActionProgress&lt;T&gt;</a>.<a class="xref" href="../api/Hi.Common.Messages.ActionProgress-1.html#Hi_Common_Messages_ActionProgress_1_FromLogger_">FromLogger</a> to bridge <code>IProgress&lt;object&gt;</code> APIs to <code>ILogger</code></li>
<li>Rename <code>ShowIfCatched</code><a class="xref" href="../api/Hi.Common.Messages.ExceptionUtil.html#Hi_Common_Messages_ExceptionUtil_CatchExceptions_">CatchExceptions</a> with explicit <code>Action&lt;Exception&gt;</code> handler; remove <code>RoutineBlocker0</code></li>
<li>Extract <a class="xref" href="../api/Hi.NcMech.Workpieces.WorkpieceService.html">WorkpieceService</a> from <a class="xref" href="../api/Hi.NcMech.Workpieces.Workpiece.html">Workpiece</a> for runtime geometry operations</li>
<li>Update ISO coordinate rendering for 3+2 axis machines: coordinate position now uses <a class="xref" href="../api/Hi.Numerical.IsoCoordinateEntryDisplayee.html">IsoCoordinateEntryDisplayee</a> with full machining chain anchor instead of table-buckle-only anchor</li>
<li>Rename <code>SessionMessageHost</code><code>SessionProgress</code> on both <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html#Hi_MachiningProcs_LocalProjectService_SessionProgress">SessionProgress</a> and <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_SessionProgress">SessionProgress</a> (<code>RuntimeApi.SessionMessageHost</code> is kept as <code>[Obsolete]</code>)</li>
<li>Remove obsolete <code>HiLog</code> logging utility and <code>DynamicMachiningProjectDisplayee0</code></li>
</ul>
<h2 id="hinc-packages-version-31160">HiNc Packages Version 3.1.160</h2>
<ul>
<li>Fix NC optimization R-format arc interpolation with negative R values (follow-up to v158 R-format arc fix)</li>
<li>Fix cubetree construction defect when a triangle edge passes through a wire corner</li>
<li>Mech Builder: geometry (STL) file picker for anchored transformation now offers <strong>Project</strong> directory in addition to <strong>Resource</strong> directory.</li>
<li>Rename XML IO utilities: <code>XmlSourceAndFile&lt;T&gt;</code><a class="xref" href="../api/Hi.Common.XmlUtils.FileRefSource-1.html">FileRefSource&lt;T&gt;</a>, <code>CombineAsSubDirectory</code><a class="xref" href="../api/Hi.Common.PathUtils.PathUtil.html#Hi_Common_PathUtils_PathUtil_GetResourceDirectory_">GetResourceDirectory</a>, <code>MakeXmlSourceWithRebaseFile</code><a class="xref" href="../api/Hi.Common.XmlUtils.XmlUtil.html#Hi_Common_XmlUtils_XmlUtil_MakeXmlSourceToFileRef_">MakeXmlSourceToFileRef</a></li>
</ul>
<h2 id="hinc-packages-version-31158">HiNc Packages Version 3.1.158</h2>
<ul>
<li>Fix G53.1 tool height compensation behavior: replace <code>NcEnv.SetToolHeightCompensationOnFeatureNormal</code> configuration with automatic detection via NC flag state</li>
<li>Make <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html#Hi_Numerical_HardNcEnv_EnableIntegerShrinkOnPositionCommand">EnableIntegerShrinkOnPositionCommand</a> configurable via project settings (previously hard-coded by CNC brand, now defaults to <code>false</code> with XML IO support)</li>
<li>Fix NC optimization splitting R-format arcs (G02/G03 with R parameter) by converting to IJK format, since R sign meaning does not apply correctly to individual fragments</li>
<li>Fix step.csv reading crash on null or malformed values</li>
<li>Fix XML IO sub-base directory not applied in some project file operations</li>
<li>Improve CSV actual time parsing to support <code>DateTime</code> format in addition to <code>TimeSpan</code> (see <a class="xref" href="../workflows/basic-simulation.html">Workflow: Basic Machining Simulation</a>)</li>
<li>Fix CSV title parsing to trim surrounding quotes</li>
</ul>
<h2 id="hinc-packages-version-31156">HiNc Packages Version 3.1.156</h2>
<ul>
<li>Fix G68 coordinate rotation transformation for non-origin rotation centers</li>
<li>Fix NC optimization arc/circle offset when splitting arc fragments across multiple lines</li>
<li>Fix optimization rotation code jumping at ±180° cycle boundary by applying cyclic angle comparison</li>
<li>Fix RTCP on unmatched tool offset</li>
<li>Fix blocking issue when time-mapping file not found</li>
<li>Fix <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_FlagsText">FlagsText</a> always null after NC parser refactoring</li>
</ul>
<h2 id="hinc-packages-version-31150">HiNc Packages Version 3.1.150</h2>
<ul>
<li>Add cubetree geometry defect scanning (<a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_ScanRuntimeGeomInfDefect_">ScanRuntimeGeomInfDefect</a>) and clearing (<a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_ClearDefectDisplayee_">ClearDefectDisplayee</a>) for detecting and visualizing geometry anomalies in workpieces (see <a class="xref" href="../workflows/geometry-validation.html">Workflow: Geometry Validation</a>)</li>
<li>Upgrade internal fraction representation to float128 precision for improved cubetree geometry accuracy and numerical stability</li>
<li>Refactor messaging system from <code>IMessageHost</code> to standard <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress&lt;T&gt;</a> pattern; <a class="xref" href="../api/Hi.MachiningProcs.SessionProgress.html">SessionProgress</a> (formerly <code>SessionMessageHost</code>) now implements <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iprogress-1">IProgress&lt;T&gt;</a>, and all messaging methods renamed from <code>Add*</code> to <code>Report*</code> (e.g., <code>AddProgress</code><a class="xref" href="../api/Hi.Common.Messages.MultiTagMessageUtil.html#Hi_Common_Messages_MultiTagMessageUtil_ReportProgress_">ReportProgress</a>)</li>
<li>Fix cubetree initialization crash</li>
<li>Improve postprocess precision by applying sincos parameterization instead of direct angle-based formulation for rotary axis numerical solving in <a class="xref" href="../api/Hi.Numerical.Xyzabc.XyzabcSolver.html">XyzabcSolver</a></li>
<li>Add asynchronous anchor solid preparation on project load for improved startup performance</li>
</ul>
<h2 id="hinc-packages-version-31144">HiNc Packages Version 3.1.144</h2>
<ul>
<li>Enhance Siemens Sinumerik support:
<ul>
<li>Siemens CYCLE800 coordinate transform and reset</li>
<li>Siemens MCALL CYCLE81() drilling cycle parsing</li>
<li>Siemens TRAORI/TRAFOOF/SUPA flag parsing</li>
</ul>
</li>
<li>Fix Siemens TRAFOOF plain rotation coordinate transform issue</li>
<li>Fix Siemens coordinate transform for successive file running</li>
<li>Fix relief face collision floating-point precision issue</li>
<li>Replace MongoDB with SQLite for local step data storage (significant package size reduction)</li>
<li>Add machining and motion resolution dynamic adjustment functions</li>
</ul>
<h2 id="hinc-packages-version-31106">HiNc Packages Version 3.1.106</h2>
<ul>
<li>Rename mapping API for clearer naming:
<ul>
<li><code>ReadCsvByTimeInterpolation</code><a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSingleByCsvFile_">MapSingleByCsvFile</a> (one-to-one mapping)</li>
<li><code>MapByActualTime</code><a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSeriesByCsvFile_">MapSeriesByCsvFile</a> (one-to-many mapping)</li>
</ul>
</li>
<li>Rename CSV column prefix <code>Spindle</code> to <code>Holder</code> for sensor data mapping</li>
<li>Unify CSV column tags to <a class="xref" href="../api/Hi.Mapping.MappingUtil.html">MappingUtil</a> for consistent data mapping</li>
<li>Fix <a class="xref" href="../api/Hi.CutterLocations.ClStrips.ClStrip.html#Hi_CutterLocations_ClStrips_ClStrip_ChartRange">ChartRange</a> manipulation to be time-based instead of step-based for more accurate time chart display</li>
<li>Tune thread priority for machining parallel processing to improve UI responsiveness during simulation</li>
<li>Various code cleanup and improvements</li>
</ul>
<h2 id="hinc-packages-version-31102">HiNc Packages Version 3.1.102</h2>
<ul>
<li>Separate resource files (Resource, wwwroot, Doc) to HiNc-Resource nuget package for smaller package size</li>
<li>Add <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_ScaledFeedPerCycle_">ScaledFeedPerCycle</a> function for scaled feed-per-cycle machining motion resolution</li>
<li>Upgrade target framework to .NET 10.0</li>
<li>Various code cleanup and improvements</li>
</ul>
<h2 id="hinc-packages-version-31100">HiNc Packages Version 3.1.100</h2>
<ul>
<li>Refactor project architecture: split runtime functions from <a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> to <a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> for better separation of concerns</li>
<li>Improve <a class="xref" href="../api/Hi.MillingForces.Training.MillingTraining.html">MillingTraining</a> module with separate lead and result parameter templates for more accurate cutting parameter training</li>
<li>Separate C++ library for code protection</li>
<li>Add UTF-8 file path support for runtime geometry IO operations</li>
<li>Improve <a class="xref" href="../api/Hi.Numerical.FilePlayers.CsvRunner.html">CsvRunner</a> with enhanced time mapping pattern</li>
<li>Various architecture improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3191">HiNc Packages Version 3.1.91</h2>
<ul>
<li>Add <a class="xref" href="../api/Hi.NcOpt.NcOptimizationEmbeddedLogMode.html">NcOptimizationEmbeddedLogMode</a> to control embedded log detail level (None/SimpleLog/FullLog) (see <a href="../workflows/nc-optimization.html#embedded-log-comments">Embedded Log Comments</a>).</li>
<li>Fix bug of <a class="xref" href="../api/Hi.NcOpt.NcOptProc.html">NcOptProc</a> duplicated feedrate assignment</li>
</ul>
<h2 id="hinc-packages-version-3190">HiNc Packages Version 3.1.90</h2>
<ul>
<li>Rename optimization log API <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_EnableIndividualStepAdjustmentLog_">EnableIndividualStepAdjustmentLog</a></li>
<li>Fix crash from workpiece displaying with specific mechanical topology setting</li>
<li>Improve <code>.flatproc.log</code> output to maintain step order during parallel computation</li>
<li>Various stability improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3186">HiNc Packages Version 3.1.86</h2>
<ul>
<li>Re-build <a class="xref" href="../api/Hi.NcOpt.NcOptProc.html">NcOptProc</a> with stricter optimization logics</li>
<li>Add optimization logging features (see <a href="../workflows/nc-optimization.html#optimization-logs">Optimization Logs</a>):
<ul>
<li><code>.flatproc.log</code> file output for optimization process analysis</li>
<li>Embedded log comments in optimized NC file marking source lines with <code>(src)</code> suffix</li>
</ul>
</li>
<li>Fix cutting depth and width accuracy by bounding-box method with workpiece surface</li>
<li>Fix collision check error during concurrent changing collidable object</li>
<li>Various stability improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3184">HiNc Packages Version 3.1.84</h2>
<ul>
<li>Optimize memory usage by shrinking map-size of clStripPos</li>
<li>Fix design pattern of cutting parameter training module (<a class="xref" href="../api/Hi.MillingForces.Training.MillingTraining.html">MillingTraining</a>)</li>
<li>Add <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_LoadCuttingParaByFile_">LoadCuttingParaByFile</a> function to load cutting parameters from file</li>
<li>Improve <a class="xref" href="../api/Hi.Numerical.FilePlayers.CsvRunner.html">CsvRunner</a> actual time parsing: automatically calculate step duration from actual time when duration is not provided</li>
<li>Enhance message handling in <a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html">RuntimeApi</a> by unifying <a class="xref" href="../api/Hi.MachiningProcs.SessionProgress.html">SessionProgress</a> usage</li>
<li>Improve optimization performance with better task scheduling</li>
<li>Various performance improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3175">HiNc Packages Version 3.1.75</h2>
<ul>
<li>Add actual time tracking functionality (<a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTime_">ActualTime</a>)</li>
<li>Various stability improvements and bug fixes</li>
</ul>
<h2 id="hinc-packages-version-3174">HiNc Packages Version 3.1.74</h2>
<ul>
<li>Rename class <code>MillingCutterOptLimit</code> to <a class="xref" href="../api/Hi.NcOpt.MillingCutterOptOption.html">MillingCutterOptOption</a></li>
<li>Add physics simulation function for relief face collision detection (<a class="xref" href="../api/Hi.MillingForces.MillingPhysicsBrief.html#Hi_MillingForces_MillingPhysicsBrief_ReliefFaceCollidingSpeed_mmds">ReliefFaceCollidingSpeed_mmds</a>, <a class="xref" href="../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_IsReliefFaceCollided">IsReliefFaceCollided</a>) and optimization (<a class="xref" href="../api/Hi.NcOpt.MillingCutterOptOption.html#Hi_NcOpt_MillingCutterOptOption_EnableLimitByReliefAngle">EnableLimitByReliefAngle</a>)</li>
<li>Add <code>UpdateNcOptOption</code> function to step processing</li>
<li>Fix step ordering bug from concurrent processing</li>
<li>Fix ClStrip shrinking to zero issue</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,542 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HardNc 到 SoftNc 改寫進度報告 | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="HardNc 到 SoftNc 改寫進度報告 | 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="SoftNc-Rewrite-Report">
<h1 id="hardnc--softnc-改寫進度報告">HardNc → SoftNc 改寫進度報告</h1>
<blockquote>
<p><strong>說明:</strong> 此頁為從最新 release note 連入的暫時性進度頁面。
內容描述進行中的改寫,未來可能重整、改置或移除,因此並未列入主導覽選單。</p>
</blockquote>
<p>HiAPIs 的 NC 解譯器正從早期單體式 <code>HardNcXxx</code> 全面改寫為可重組(reconfigurable)的
<code>SoftNcXxx</code> pipeline。本頁說明改寫動機、架構轉變、目前完成度,以及剩餘工作。</p>
<p><strong>Last Updated:</strong> 2026-04-26</p>
<hr>
<h2 id="1-executive-summary">1. Executive Summary</h2>
<table>
<thead>
<tr>
<th>指標</th>
<th>內容</th>
</tr>
</thead>
<tbody>
<tr>
<td>客戶需求</td>
<td>NC 解譯器需「Reconfigurable(可重組)」 — 不同廠牌、不同機械架構、不同 G/M code 集合,必須可由設定檔切換而不需重編譯。</td>
</tr>
<tr>
<td>改寫策略</td>
<td>將 3,000+ 行的 <a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 單體類別解構為 <a class="xref" href="../api/Hi.NcParsers.Segmenters.ISegmenter.html">ISegmenter</a> + <a class="xref" href="../api/Hi.NcParsers.Initializers.INcInitializer.html">INcInitializer</a> + 多層 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> + <a class="xref" href="../api/Hi.NcParsers.Semantics.INcSemantic.html">INcSemantic</a> + <a class="xref" href="../api/Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a> 五段 pipeline,全部以介面為主、可由 XML 序列化。</td>
</tr>
<tr>
<td>完成度估算</td>
<td><strong>ISO 共通部分接近完成</strong> — 主流 G/M code、modal 行為、ISO 座標系、刀具補償、CL/MC 兩段路徑、Cycle、G43.4 RTCP、G68/G68.2 傾斜、單位/暫停/冷卻、診斷系統皆已上線。其他廠牌(Siemens / Syntec / Mazak / Heidenhain)特定語法尚未深入盤點,不敢稱為接近完成。</td>
</tr>
<tr>
<td>仍未動工</td>
<td>(1) 程式呼叫 / 巨集 / 子程式(<code>CALL</code>, <code>M98</code>, <code>LBL CALL</code> (2) 數學/邏輯函式(<code>#var = expr</code>, <code>IF/GOTO/WHILE</code>, Q-parameter 算式) (3) <a class="xref" href="../api/Hi.NcOpt.NcOptProc.html">NcOptProc</a> 模組(仍綁定舊 <a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> / <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a>,尚未深入規劃)。</td>
</tr>
<tr>
<td>風險評估</td>
<td>程式呼叫 / 數學邏輯:低 — 可在現有 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.IExpandingNcSyntax.html">IExpandingNcSyntax</a> / <a class="xref" href="../api/Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> / <a class="xref" href="../api/Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a> 介面下,以「新增實作」而非「改架構」的方式落地。NcOpt:不算低風險,仍有未知的設計工作待釐清。</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>Hard → Soft 不是改寫一個類別,而是把「規則寫在程式裡」搬成「規則寫在資料裡」。</strong></p>
</blockquote>
<hr>
<h2 id="2-設計哲學三大支柱">2. 設計哲學:三大支柱</h2>
<p><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> 的彈性奠基於三個彼此正交的設計原則。任何一條缺失,整個 pipeline 都會退化回 <a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 那種「想改任何東西都要動到中央類別」的狀態。</p>
<h3 id="21-xml-configurable--結構即資料">2.1 XML-configurable — 結構即資料</h3>
<p><code>SoftNcRunner</code> 本身只是一個容器,內部 5 個 List 全部由 XML 載入:</p>
<pre><code class="lang-xml">&lt;SoftNcRunner&gt;
&lt;NcDependencyList&gt;...&lt;/NcDependencyList&gt; &lt;!-- 1. 依賴設定 --&gt;
&lt;Segmenter&gt;...&lt;/Segmenter&gt; &lt;!-- 2. 段落切分器 --&gt;
&lt;NcInitializationList&gt;...&lt;/NcInitializationList&gt; &lt;!-- 3. 初始化 --&gt;
&lt;NcSyntaxList&gt;...&lt;/NcSyntaxList&gt; &lt;!-- 4. 語法層 --&gt;
&lt;NcSemanticList&gt;...&lt;/NcSemanticList&gt; &lt;!-- 5. 語義層 --&gt;
&lt;/SoftNcRunner&gt;
</code></pre>
<p>每個 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> / <a class="xref" href="../api/Hi.NcParsers.Semantics.INcSemantic.html">INcSemantic</a> / <a class="xref" href="../api/Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a> 都實作 <a class="xref" href="../api/Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a>,透過 <a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a>.<code>Regs.Add(XName, ...)</code> 自動註冊。<strong>新增一個 G code 不需改 SoftNcRunner,只需新增一個 syntax class 並在 XML 加一行。</strong></p>
<h3 id="22-dataflow-transparent--json-為共通通貨">2.2 DataFlow-transparent — JSON 為共通通貨</h3>
<p>每個 <a class="xref" href="../api/Hi.NcParsers.Sentence.html">Sentence</a> 通過 pipeline 時帶著一個 <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a>,每一層 syntax 都是「讀某些鍵 → 寫某些鍵 → 移除已消費的鍵」。整段 dataflow 對外可序列化為 JSON,方便:</p>
<ul>
<li><strong>除錯</strong> — 可在任何一層之間印出 JSON snapshot 看狀態。</li>
<li><strong>測試</strong> — unit test 可直接斷言 JSON 結構,不需 mock 整個 NcEnv。</li>
<li><strong>跨語言整合</strong> — 未來若要做 Web API / Python bindingJSON 即現成傳輸格式。</li>
</ul>
<p>JSON 鍵名採「Section + Term」雙層結構:section key 用語義名稱(<code>Unit</code><code>Feedrate</code><code>Motion</code> ...)跨廠牌一致;NC 代碼實際關鍵字(<code>G21</code> / <code>G94</code> / <code>G01</code>、Heidenhain <code>BLK FORM</code> / <code>LBL</code> / <code>PGM</code> 等)放在子物件的 <code>Term</code> 欄位以保留與原始 NC 的對應。</p>
<h4 id="範例--一行-nc-block-的-json-結構">範例 — 一行 NC block 的 JSON 結構</h4>
<p>原始 NCFanuc 風格):</p>
<pre><code class="lang-text">N162 X-14.696 Y-6.42 Z45.638
</code></pre>
<p>該 block 通過 pipeline 後的 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>.<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.text.json.nodes.jsonobject">JsonObject</a> 內容(截自實機輸出,矩陣數值省略):</p>
<pre><code class="lang-json">{
&quot;IndexNote&quot;: {&quot;Symbol&quot;:&quot;N&quot;,&quot;Number&quot;:162},
&quot;Positioning&quot;: {&quot;Term&quot;:&quot;G90&quot;,&quot;Mode&quot;:&quot;Absolute&quot;},
&quot;Unit&quot;: {&quot;Term&quot;:&quot;G21&quot;,&quot;System&quot;:&quot;Metric&quot;},
&quot;PlaneSelect&quot;: {&quot;Term&quot;:&quot;G17&quot;,&quot;Plane&quot;:&quot;XY&quot;},
&quot;Feedrate&quot;: {&quot;FeedrateValue&quot;:400,&quot;Term&quot;:&quot;G94&quot;,&quot;Unit&quot;:&quot;mm/min&quot;},
&quot;SpindleSpeed&quot;: {&quot;SpindleSpeed_rpm&quot;:20000,&quot;Direction&quot;:&quot;CW&quot;},
&quot;Coolant&quot;: {&quot;IsOn&quot;:true,&quot;Mode&quot;:&quot;Flood&quot;},
&quot;ToolChange&quot;: {&quot;ToolId&quot;:4,&quot;IsChange&quot;:false},
&quot;TiltTransform&quot;: {&quot;Term&quot;:&quot;G68.2&quot;},
&quot;EndPointProgramToMcTransform&quot;: [
{&quot;Source&quot;:&quot;TiltTransform&quot;, &quot;Mat4d&quot;:[ /* 16 doubles */ ]},
{&quot;Source&quot;:&quot;ToolHeightCompensation&quot;, &quot;Mat4d&quot;:[ /* 16 doubles */ ]},
{&quot;Source&quot;:&quot;CoordinateOffset&quot;, &quot;Mat4d&quot;:[ /* 16 doubles */ ]},
{&quot;Source&quot;:&quot;PivotTransform&quot;, &quot;Mat4d&quot;:[ /* 16 doubles */ ]}
],
&quot;ToolHeightCompensation&quot;: {&quot;Offset_mm&quot;:16,&quot;Term&quot;:&quot;G43&quot;,&quot;OffsetId&quot;:4},
&quot;CoordinateOffset&quot;: {&quot;CoordinateId&quot;:&quot;G54&quot;,&quot;Offset_X&quot;:72.4,&quot;Offset_Y&quot;:-72.4,&quot;Offset_Z&quot;:-116.44},
&quot;ProgramXyz&quot;: {&quot;X&quot;:-14.696,&quot;Y&quot;:-6.42,&quot;Z&quot;:45.638},
&quot;MachineCoordinate&quot;: {&quot;X&quot;:140.5947...,&quot;Y&quot;:-78.8200...,&quot;Z&quot;:-124.4559...},
&quot;MotionState&quot;: {&quot;Term&quot;:&quot;G01&quot;},
&quot;MotionEvent&quot;: {&quot;Form&quot;:&quot;McLinear&quot;,&quot;IsRapid&quot;:false},
&quot;RadiusCompensation&quot;: {&quot;Term&quot;:&quot;G40&quot;,&quot;OffsetId&quot;:0,&quot;Radius_mm&quot;:0}
}
</code></pre>
<p>幾點觀察:</p>
<ul>
<li>每一個區塊(<code>Positioning</code>, <code>Feedrate</code>, <code>Coolant</code>, <code>ToolChange</code>, ...)都是某一個 syntax 的輸出 — 例如 <code>Feedrate</code> 來自 <a class="xref" href="../api/Hi.NcParsers.LogicSyntaxs.FeedrateSyntax.html">FeedrateSyntax</a><code>MachineCoordinate</code> 來自 <a class="xref" href="../api/Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a></li>
<li><code>ProgramXyz</code><code>MachineCoordinate</code> 並陳:原始 NC 寫的是程式座標,pipeline 終點同時保留兩者,方便 UI / 報表選用。</li>
<li><code>EndPointProgramToMcTransform</code> 把 Program → MC 的成因鏈攤平為四段(Tilt、ToolHeight、CoordinateOffset、Pivot),每段附上來源變換矩陣 — 若 MC 結果不如預期,看這個陣列就知道是哪一段補正在作怪,不需重跑除錯器。</li>
<li>modal 狀態(<code>Unit</code> / <code>Positioning</code> / <code>PlaneSelect</code> / 等)即使這一行沒有顯式寫出,也會被前一節的 modal lookback 帶到此處,確保每個 block 的 JSON 都是自足的。</li>
</ul>
<h3 id="23-interface-based--消費者導向依賴">2.3 Interface-based — 消費者導向依賴</h3>
<p>舊系統的 <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> 是一個 God Object — 上百個欄位塞在一起,修改任何一個都可能波及無關的 syntax。新系統反過來:每個 syntax 自己宣告需要什麼介面,由 <code>NcDependencyList.OfType&lt;T&gt;()</code> 拉取:</p>
<pre><code class="lang-csharp">// 範例:G28 ReferenceReturnSyntax 需要 home 座標
var homeConfig = ncDependencyList.OfType&lt;IHomeMcConfig&gt;().FirstOrDefault();
</code></pre>
<p>依賴設定本身也是物件,只要實作對應介面即可注入。新增廠牌只需新增一個 <code>XxxParameterTable : </code> <a class="xref" href="../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html">ControllerParameterTableBase</a></p>
<hr>
<h2 id="3-架構對照圖">3. 架構對照圖</h2>
<h3 id="31-舊架構hardnc">3.1 舊架構(HardNc</h3>
<pre><code class="lang-mermaid">graph TD
A[NC raw lines] --&gt; B[HardNcRunner]
B --&gt; C[new HardNcLine ctor]
C --&gt; D[HardNcEnv God Object&lt;br/&gt;~80 fields, 4 brands hard-coded]
C --&gt; E[NcProc.GetActs]
D -.coupled.-&gt; C
D -.coupled.-&gt; E
E --&gt; F[IAct stream]
style D fill:#fdd,stroke:#c33,color:#000
style C fill:#fdd,stroke:#c33,color:#000
</code></pre>
<p><strong>痛點:</strong></p>
<ul>
<li><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 建構子 = 解析 + modal 累計 + MC 計算 + 補償,全部混在 3,000 行內。</li>
<li><a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> 包含所有廠牌設定,CncBrand 切換時用 if/switch 在內部分流。</li>
<li>新增廠牌 / 自訂語法 = 修改 <a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a><a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a><a class="xref" href="../api/Hi.Numerical.NcProc.html">NcProc</a> 三處。</li>
<li><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 同時是資料載體、解析狀態機、輸出來源 — 無法在管線中插入第三方步驟。</li>
</ul>
<h3 id="32-新架構softnc">3.2 新架構(SoftNc</h3>
<pre><code class="lang-mermaid">graph TD
A[NC raw lines] --&gt; SEG[ISegmenter]
SEG --&gt; SENT[Sentence stream]
SENT --&gt; INIT[INcInitializer&lt;br/&gt;HomeMc / Static]
INIT --&gt; P[ParsingSyntaxs&lt;br/&gt;Layer 1]
P --&gt; L1[LogicSyntaxs Layer 2&lt;br/&gt;ProgramXyz / McXyz / Motion]
L1 --&gt; L2[LogicSyntaxs Layer 3&lt;br/&gt;McAbcCyclic / Cleanup]
L2 --&gt; POST[PostSyntaxs&lt;br/&gt;Cache / Snapshot]
POST --&gt; SEM[INcSemantic&lt;br/&gt;→ IAct]
SEM --&gt; OUT[SourcedActEntry]
DEP[INcDependency List&lt;br/&gt;BrandTable / IsoCoord / ToolOffset / ...]
DEP -. injected .-&gt; P
DEP -. injected .-&gt; L1
DEP -. injected .-&gt; L2
DEP -. injected .-&gt; SEM
style P fill:#dfd,stroke:#393,color:#000
style L1 fill:#dfd,stroke:#393,color:#000
style L2 fill:#dfd,stroke:#393,color:#000
style POST fill:#dfd,stroke:#393,color:#000
style SEM fill:#dfd,stroke:#393,color:#000
</code></pre>
<p>每一層的「步驟個數、順序、實作類別」都由 XML 決定。新增 G code = 新增一個 syntax 並在 XML 中插入;汰除舊 G code = 從 XML 拿掉那一行。</p>
<hr>
<h2 id="4-元件對照表">4. 元件對照表</h2>
<table>
<thead>
<tr>
<th>角色</th>
<th>HardNc</th>
<th>SoftNc</th>
<th>進度</th>
</tr>
</thead>
<tbody>
<tr>
<td>主 Runner</td>
<td><a class="xref" href="../api/Hi.Numerical.FilePlayers.HardNcRunner.html">HardNcRunner</a>(約 165 行)</td>
<td><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a>(約 870 行,純編排)</td>
<td>已完成</td>
</tr>
<tr>
<td>設定容器</td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a>(約 571 行 God Object</td>
<td><code>List&lt;</code><a class="xref" href="../api/Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a><code>&gt;</code> 多介面</td>
<td>已完成</td>
</tr>
<tr>
<td>NC 行物件</td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a>(約 3,118 行)</td>
<td><a class="xref" href="../api/Hi.NcParsers.Sentence.html">Sentence</a> + <a class="xref" href="../api/Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>(<code>JsonObject</code>)</td>
<td>已完成</td>
</tr>
<tr>
<td>段落切分</td>
<td>寫死於 <code>HardNcRunner.BuildNcLinesByRawNcLines</code></td>
<td><a class="xref" href="../api/Hi.NcParsers.Segmenters.ISegmenter.html">ISegmenter</a>3 種實作)</td>
<td>已完成</td>
</tr>
<tr>
<td>初始化</td>
<td><code>RefNcLineOnInit</code> 隱式</td>
<td><a class="xref" href="../api/Hi.NcParsers.Initializers.INcInitializer.html">INcInitializer</a> 顯式(2 種實作)</td>
<td>已完成</td>
</tr>
<tr>
<td>文字解析</td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 建構子內 regex</td>
<td><code>ParsingSyntaxs/</code>(約 15 種,寫入 <code>Parsing</code></td>
<td>已完成</td>
</tr>
<tr>
<td>Modal / 跨行邏輯</td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a><code>last:</code> 參考</td>
<td><code>LogicSyntaxs/</code>(約 36 種,跨節點 lookback</td>
<td>已完成</td>
</tr>
<tr>
<td>廠牌專屬語法</td>
<td><code>if (CncBrand == ...)</code> 內聯</td>
<td><code>XxxSyntaxUtil.DefaultSyntaxList</code> 五份</td>
<td>ISO 共通已完成;廠牌特定進行中</td>
</tr>
<tr>
<td>Cycle 處理</td>
<td><code>HardNcLine.cs</code> 內函式群</td>
<td><a class="xref" href="../api/Hi.NcParsers.LogicSyntaxs.BoringCycleSyntax.html">BoringCycleSyntax</a> / <a class="xref" href="../api/Hi.NcParsers.LogicSyntaxs.DrillingCycleSyntax.html">DrillingCycleSyntax</a> / <a class="xref" href="../api/Hi.NcParsers.LogicSyntaxs.CannedCycleResolveSyntax.html">CannedCycleResolveSyntax</a></td>
<td>已完成</td>
</tr>
<tr>
<td>座標系 / 偏移</td>
<td><code>HardNcEnv.IsoCoordinateTable</code> 等欄位</td>
<td><a class="xref" href="../api/Hi.NcParsers.Dependencys.Generic.IsoCoordinateTable.html">IsoCoordinateTable</a> / <code>HeidenhainDatumTable</code> / <a class="xref" href="../api/Hi.NcParsers.Dependencys.Generic.ToolOffsetTable.html">ToolOffsetTable</a> 介面</td>
<td>已完成</td>
</tr>
<tr>
<td>廠牌參數表</td>
<td><code>HardNcEnv.ConfigurationTable</code> 字典</td>
<td><a class="xref" href="../api/Hi.NcParsers.Dependencys.Fanuc.FanucParameterTable.html">FanucParameterTable</a> / <a class="xref" href="../api/Hi.NcParsers.Dependencys.Syntec.SyntecParameterTable.html">SyntecParameterTable</a> / <a class="xref" href="../api/Hi.NcParsers.Dependencys.Siemens.SiemensMachineDataTable.html">SiemensMachineDataTable</a> / <a class="xref" href="../api/Hi.NcParsers.Dependencys.Heidenhain.HeidenhainParameterTable.html">HeidenhainParameterTable</a>(繼承 <a class="xref" href="../api/Hi.NcParsers.Dependencys.ControllerParameterTableBase.html">ControllerParameterTableBase</a></td>
<td>已完成</td>
</tr>
<tr>
<td>行程界限</td>
<td><code>HardNcEnv.CheckStrokeLimit</code></td>
<td><a class="xref" href="../api/Hi.NcParsers.Dependencys.IStrokeLimitConfig.html">IStrokeLimitConfig</a> + <a class="xref" href="../api/Hi.NcParsers.Semantics.StrokeLimitCheckSemantic.html">StrokeLimitCheckSemantic</a></td>
<td>已完成</td>
</tr>
<tr>
<td>動作輸出</td>
<td><a class="xref" href="../api/Hi.Numerical.NcProc.html">NcProc</a>.<code>GetActs</code></td>
<td><a class="xref" href="../api/Hi.NcParsers.Semantics.INcSemantic.html">INcSemantic</a>.<code>Resolve</code>12 種)</td>
<td>已完成</td>
</tr>
<tr>
<td>診斷</td>
<td><code>sessionProgress.ReportError</code> 字串</td>
<td><a class="xref" href="../api/Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a> 結構化(severity / category / ID / sentence</td>
<td>已完成</td>
</tr>
<tr>
<td>Cs Script</td>
<td><code>HardNcUtil.GetSimCsScript</code> 字串切割</td>
<td><a class="xref" href="../api/Hi.NcParsers.ParsingSyntaxs.CsScriptSyntax.html">CsScriptSyntax</a> + <a class="xref" href="../api/Hi.NcParsers.Semantics.CsScriptBeginSemantic.html">CsScriptBeginSemantic</a> / <a class="xref" href="../api/Hi.NcParsers.Semantics.CsScriptEndSemantic.html">CsScriptEndSemantic</a></td>
<td>已完成</td>
</tr>
<tr>
<td>子程式 / <code>CALL</code></td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 內部分支處理</td>
<td><a class="xref" href="../api/Hi.NcParsers.Syntaxs.IExpandingNcSyntax.html">IExpandingNcSyntax</a> 介面已備好,待建構</td>
<td>待建構</td>
</tr>
<tr>
<td>數學 / 邏輯函式</td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a><code>IsoNC_Proc</code> P/Invoke</td>
<td>待建構</td>
<td>待建構</td>
</tr>
<tr>
<td>NcOpt 模組</td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> / <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a></td>
<td>待建構</td>
<td>待建構</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="5-進度狀態">5. 進度狀態</h2>
<h3 id="51-已完成--主路徑全綠">5.1 已完成 — 主路徑全綠</h3>
<p>ISO 共通部分皆已就緒:三層 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> 架構、<a class="xref" href="../api/Hi.NcParsers.Semantics.INcSemantic.html">INcSemantic</a> 動作輸出、<a class="xref" href="../api/Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a>
注入、廠牌參數表、ISO Logic Syntax、Motion + Compound Motion + Spindle 語義、
Canned Cycle G73G89、Group-09 Cycle modal 狀態管理、G41/G42 Radius Compensation、
G68/G68.2/G69 傾斜、G43.4 RTCP、G53/G53.1、Mc ABC 旋轉軸最短路徑、ProgramXyz 追蹤、
ISO Coordinate Table 字串 key 遷移、Block Skip 多層管控、Unit / ProgramStop /
Coolant Mist、G28 / Comment / CncBrand / 版本 / CsScript、Cache Syntaxmodal
lookback O(N·Pace))、結構化 <a class="xref" href="../api/Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a> 診斷、<a class="xref" href="../api/Hi.MachiningProcs.LocalProjectService.html">LocalProjectService</a> / <a class="xref" href="../api/Hi.MachiningProcs.MachiningProject.html">MachiningProject</a> 整合,以及
<a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html">RuntimeApi</a> Session Events。</p>
<h3 id="52-仍未動工">5.2 仍未動工</h3>
<h4 id="521-各廠牌特定語法尚未深入盤點">5.2.1 各廠牌特定語法尚未深入盤點</h4>
<p>ISO 共通部分接近完成;但每個廠牌都有大量自有語法尚未動工,下表僅是樣本:</p>
<table>
<thead>
<tr>
<th>廠牌</th>
<th>待動工樣本</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fanuc</td>
<td>Custom Macro B 細節、<code>G10</code> Programmable Data Setting、<code>G50</code> 主軸限制、<code>G31</code> Skip、Polar 完整支援</td>
</tr>
<tr>
<td>Siemens</td>
<td><code>TRAORI</code> / <code>TRAFOOF</code><code>CYCLE800</code> 傾斜、<code>MSG</code> / <code>STOPRE</code>、Frame 體系(<code>TRANS</code> / <code>ROT</code> / <code>SCALE</code> / <code>MIRROR</code>)、GUD/PUD 變數、<code>SETAL</code> 警報</td>
</tr>
<tr>
<td>Syntec</td>
<td>自訂 G 巨集、Pr 系列參數對應、雙頭 / 雙刀塔語法</td>
</tr>
<tr>
<td>Mazak</td>
<td>Mazatrol 對話式區段、MAZATROL ↔ EIA/ISO 切換、Mazak 特有 G/M 號碼差異</td>
</tr>
<tr>
<td>Heidenhain</td>
<td><code>FK</code> Free Contour、<code>SL</code> Cycle、<code>PATTERN DEF</code><code>TCH PROBE</code> 量測循環、<code>TOOL DEF</code> / <code>TOOL CALL</code> 進階欄位、<code>PLANE</code> 完整 7 種模式</td>
</tr>
</tbody>
</table>
<p>架構上不需改 pipeline;新增廠牌語法 = 新增 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a> 實作 + 註冊 + 加入該廠牌
<code>XxxSyntaxUtil.DefaultSyntaxList</code>。但實作數量大,需依客戶優先序逐項展開。</p>
<h4 id="522-程式呼叫--subprogram--macro-call">5.2.2 程式呼叫 — subprogram / macro call</h4>
<table>
<thead>
<tr>
<th>對象</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>ISO <code>M98 P_ L_</code> / <code>M99</code></td>
<td>Fanuc / Syntec / Mazak 子程式呼叫與返回</td>
</tr>
<tr>
<td>Heidenhain <code>LBL &lt;n&gt;</code> / <code>CALL LBL &lt;n&gt; REPn</code></td>
<td>標籤定義與重複呼叫</td>
</tr>
<tr>
<td>Heidenhain <code>PGM CALL &quot;&lt;file&gt;&quot;</code></td>
<td>外部檔案呼叫</td>
</tr>
<tr>
<td>Siemens <code>&lt;name&gt;</code> 子程式</td>
<td>自訂子程式名稱呼叫</td>
</tr>
</tbody>
</table>
<p><a class="xref" href="../api/Hi.NcParsers.Syntaxs.IExpandingNcSyntax.html">IExpandingNcSyntax</a>.<code>Expand()</code> 介面正是為此設計 — 允許一個 <a class="xref" href="../api/Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a> 在管線中被展開為多個。已有 <a class="xref" href="../api/Hi.NcParsers.ParsingSyntaxs.Heidenhain.HeidenhainCallSyntax.html">HeidenhainCallSyntax</a><a class="xref" href="../api/Hi.NcParsers.ParsingSyntaxs.Heidenhain.HeidenhainLblSyntax.html">HeidenhainLblSyntax</a> 在 ParsingSyntax 層解析出 <code>Parsing.CALL</code> / <code>Parsing.LBL</code> 結構但尚未連到 expander。</p>
<h4 id="523-數學--邏輯函式macro--control-flow">5.2.3 數學 / 邏輯函式(macro / control flow</h4>
<table>
<thead>
<tr>
<th>對象</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fanuc Custom Macro B</td>
<td><code>#100=...</code><code>IF [...] GOTO n</code><code>WHILE [...] DO n / END n</code></td>
</tr>
<tr>
<td>Heidenhain Q-Parameter</td>
<td><code>Q1 = Q2 + Q3</code><code>FN0</code> ~ <code>FN26</code><code>IF Q1 EQU 0 GOTO LBL</code></td>
</tr>
<tr>
<td>Siemens R-parameter / GUD</td>
<td><code>R1 = R2 * SIN(R3)</code><code>IF / GOTOB / GOTOF</code></td>
</tr>
</tbody>
</table>
<p><a class="xref" href="../api/Hi.NcParsers.ParsingSyntaxs.Heidenhain.HeidenhainFnAssignmentSyntax.html">HeidenhainFnAssignmentSyntax</a><a class="xref" href="../api/Hi.NcParsers.ParsingSyntaxs.NamedVarAssignmentSyntax.html">NamedVarAssignmentSyntax</a> 已能將指派寫入 JSON;但 expression evaluator、條件跳轉、迴圈展開尚未實作。</p>
<h4 id="524-ncopt-模組重寫">5.2.4 NcOpt 模組重寫</h4>
<p>目前 <code>Hi.NcOpt</code><a class="xref" href="../api/Hi.NcOpt.NcOptProc.html">NcOptProc</a><a class="xref" href="../api/Hi.NcOpt.NcOptOption.html">NcOptOption</a>)仍綁定舊系統:透過 <a class="xref" href="../api/Hi.Numerical.HardNcLine.html">HardNcLine</a> 鏈結串列做最佳化(feedrate、深度切分、加速度限制等)。此模組尚未深入規劃,仍可能有未知工作量需釐清。</p>
<hr>
<h2 id="6-客戶可重組性reconfigurable展示">6. 客戶可重組性(Reconfigurable)展示</h2>
<p>新系統下,下列三類客製化全部 <strong>不需重編譯</strong></p>
<h3 id="61-切換廠牌內建-5-組-preset">6.1 切換廠牌(內建 5 組 preset)</h3>
<pre><code class="lang-csharp">var runner = SoftNcRunner.HeidenhainNcRunner;
runner.ConfigureByMachiningChain(machine.Chain);
</code></pre>
<p>亦可由 XML 載入由專案反序列化挑選。詳見 <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a></p>
<h3 id="62-客製某廠牌特定語法不影響其他廠牌">6.2 客製某廠牌特定語法(不影響其他廠牌)</h3>
<p>例如某客戶 Fanuc 機台用了非標準 <code>M168</code> 進行夾具控制:</p>
<ol>
<li>新增一個 <code>MyClampMSyntax : </code> <a class="xref" href="../api/Hi.NcParsers.Syntaxs.ISituNcSyntax.html">ISituNcSyntax</a> 類別。</li>
<li>在客戶專案的 <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a> XML 中插入一行 <code>&lt;MyClampMSyntax/&gt;</code></li>
<li>不需改動 HiAPIs 任何原始檔。</li>
</ol>
<h3 id="63-跨廠牌共用機構配置">6.3 跨廠牌共用機構配置</h3>
<p><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_ConfigureByMachiningChain_">ConfigureByMachiningChain</a> 把機台軸序、旋轉軸 / 線性軸區分、<a class="xref" href="../api/Hi.NcParsers.Dependencys.Generic.NcKinematicsDependency.html">NcKinematicsDependency</a> 的注入交由 <code>IMachiningChain</code> 驅動 — 5 軸機、4 軸機、雙轉台都共用同一條程式路徑。</p>
<hr>
<h2 id="7-過渡相容性">7. 過渡相容性</h2>
<p>為了不破壞既有客戶專案:</p>
<table>
<thead>
<tr>
<th>機制</th>
<th>位置</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html#Hi_NcParsers_SoftNcRunner_FromLegacyNcEnvXml_">FromLegacyNcEnvXml</a></td>
<td><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a><code>Legacy HardNcEnv XML support</code> 區段</td>
<td>讀舊 <a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> XML 自動建構 <a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a></td>
</tr>
<tr>
<td><a class="xref" href="../api/Hi.Common.XmlUtils.XFactory.html">XFactory</a>.<code>Regs.Add(&quot;NcEnv&quot;, ...)</code></td>
<td><a class="xref" href="../api/Hi.Numerical.HardNcEnv.html">HardNcEnv</a> 靜態建構子</td>
<td>舊 XML key <code>NcEnv</code> 也能載入</td>
</tr>
<tr>
<td><code>ApplyLegacyVersionPatches</code></td>
<td><a class="xref" href="../api/Hi.NcParsers.SoftNcRunner.html">SoftNcRunner</a></td>
<td><a class="xref" href="../api/Hi.Common.XmlUtils.ProjectApiVersion.html">ProjectApiVersion</a> 補上後續版本新增的 syntax/semantic3.1.163 起 4 道補丁)</td>
</tr>
<tr>
<td><a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_EnableSoftNcRunner">EnableSoftNcRunner</a></td>
<td><a class="xref" href="../api/Hi.MachiningProcs.RuntimeApi.html">RuntimeApi</a></td>
<td>客戶可在 script 中切換新舊 runner 比對結果</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>
@@ -0,0 +1,22 @@
<div id="sidetoggle">
<div>
<div class="sidefilter">
<form class="toc-filter">
<span class="glyphicon glyphicon-filter filter-icon"></span>
<span class="glyphicon glyphicon-remove clear-icon" id="toc_filter_clear"></span>
<input type="text" id="toc_filter_input" placeholder="Filter by title" onkeypress="if(event.keyCode==13) {return false;}">
</form>
</div>
<div class="sidetoc">
<div class="toc" id="toc">
<ul class="nav level1">
<li>
<a href="index.html" name="" title="Release Note">Release Note</a>
</li>
</ul>
</div>
</div>
</div>
</div>
@@ -0,0 +1,2 @@
{"items":[{"name":"Release Note","href":"index.html","topicHref":"index.html"}]}