2026-01-08 21:07:15 +08:00

423 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>資料映射 | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="資料映射 | 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="Cmd-Mapping">
<h1 id="資料映射">資料映射</h1>
<p>資料映射指,將外部資料對應於仿真路徑,使得仿真步(<a class="xref" href="../../output/simulation-step-output.html">仿真步輸出資訊Simulation Step Output</a>)可以索引外部資料。</p>
<p>外部資料包含智慧刀把、動力計,可依時間線性映射至指定刀具路徑及加工區域。</p>
<p>映射資料可用於檢視加工狀態、訓練銑削係數、校正銑削係數。</p>
<h2 id="資料映射的形式">資料映射的形式</h2>
<p>依據資料大小、應用情境不同,資料映射有多種形式。
以資料量區分,<strong>仿真步</strong>對應<strong>外部資料</strong>可以一對一與一對多。</p>
<h2 id="一對一映射">一對一映射</h2>
<p>一對一映射指每個仿真步對應一個外部資料點,資料量與仿真步數量相同或相近。</p>
<p>一對一的資料映射方式:</p>
<ul>
<li><a class="xref" href="../PlayCsvFile/play-csv-file.html">執行CSV檔</a>適用控制器資料每個步階對應一個CSV資料行</li>
<li><a href="#mapsinglebycsvfile">MapSingleByCsvFile</a>使用時間插值將CSV資料映射到加工步階</li>
</ul>
<h3 id="playcsvfile">PlayCsvFile</h3>
<p><a class="xref" href="../PlayCsvFile/play-csv-file.html">執行CSV檔</a> 可以與一對多的資料映射協同使用,詳見 <a class="xref" href="../PlayCsvFile/play-csv-file.html">執行CSV檔</a></p>
<h3 id="mapsinglebycsvfile">MapSingleByCsvFile</h3>
<p><a class="xref" href="../../../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSingleByCsvFile_">MapSingleByCsvFile</a><small>(API)</small> 讀取CSV檔案並使用時間插值將資料映射到加工步階。每個仿真步對應一個外部資料點透過時間插值計算</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>指令格式</strong></p>
<pre><code class="lang-csharp">MapSingleByCsvFile(&lt;CSV檔案路徑&gt;);
</code></pre>
</div>
<div class="TIP">
<h5>Tip</h5>
<p><strong>指令範例</strong></p>
<pre><code class="lang-csharp">// 讀取CSV檔案並映射到步階
PlayNcFile(&quot;NC/file1.nc&quot;);
MapSingleByCsvFile(&quot;Data/sensor.csv&quot;);
</code></pre>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>此方法使用時間插值方式將CSV資料映射到加工步階適用於需要將外部感測器資料對應到仿真步階的場景。每個仿真步會對應一個透過時間插值計算的外部資料點。</p>
</div>
<h2 id="一對多映射">一對多映射</h2>
<p>一對多映射指每個仿真步對應多個外部資料點,外部資料量遠大於仿真步數量(通常數十倍以上)。</p>
<p>一對多的形式適用智慧刀把、加速規、測力計等高採樣率資料。</p>
<p>一對多的資料映射可以直接<a href="#%E5%B0%8D%E6%87%89%E7%9C%9F%E5%AF%A6%E5%8A%A0%E5%B7%A5%E6%99%82%E9%96%93%E5%85%A8%E5%B1%80%E6%98%A0%E5%B0%84">對應真實加工時間全局映射</a>,也可以對<a href="#%E6%8C%87%E5%AE%9A%E6%95%B8%E6%8E%A7%E8%B7%AF%E5%BE%91%E5%8F%8A%E6%99%82%E9%96%93%E5%B1%80%E9%83%A8%E6%98%A0%E5%B0%84">指定數控路徑及時間局部映射</a></p>
<h3 id="對應真實加工時間全局映射">對應真實加工時間全局映射</h3>
<p>可使用<a class="xref" href="../PlayCsvFile/play-csv-file.html">執行CSV檔</a><a href="#mapsinglebycsvfile">MapSingleByCsvFile</a>作為前置以獲取真實加工時間csv檔案中須包含<code>ActualTime</code>欄位(<a class="xref" href="../../../../api/Hi.MachiningSteps.MachiningStep.html#Hi_MachiningSteps_MachiningStep_ActualTime">ActualTime</a><small>(API)</small>)。然後使用<a class="xref" href="../../../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSeriesByCsvFile_">MapSeriesByCsvFile</a><small>(API)</small>映射外部資料。</p>
<p>此方法為一對多映射,每個仿真步會對應多個外部資料點。</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>指令格式</strong></p>
<pre><code>MapSeriesByCsvFile(&lt;檔案名&gt;);
</code></pre>
</div>
<h3 id="指定數控路徑及時間局部映射">指定數控路徑及時間局部映射</h3>
<p>資料映射需設定指定輸入資料、指定NC路徑。</p>
<p>此方法為一對多映射,每個仿真步會對應多個外部資料點。</p>
<figure class="alert text-bg-light">
<img src="Mapping%20Overview%20Example.png" alt="Mapping Overview Example">
<figcaption>資料映射圖例</figcaption>
</figure>
<h4 id="指定輸入資料">指定輸入資料</h4>
<div class="NOTE">
<h5>Note</h5>
<p><strong>指令格式</strong></p>
<pre><code>AddTimeDataByFile(&lt;映射名&gt;, &lt;輸入檔案路徑&gt;, &lt;映射起點時間&gt;, &lt;映射終點時間&gt;);
</code></pre>
</div>
<p>&lt;映射名&gt;為自訂之標記名稱,對應於指定<strong>NC路徑</strong>中的映射名。</p>
<p>時間資料格式為<code>&lt;&gt;:&lt;&gt;:&lt;&gt;.&lt;小數點後秒&gt;</code>;其餘資料格式為實數。</p>
<p>注意映射資料不會因撥放器重置而被清空。可以使用<code>ClearTimeMappingData</code>指令清空。</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>指令格式</strong></p>
<pre><code>ClearTimeMappingData();
</code></pre>
</div>
<div class="TIP">
<h5>Tip</h5>
<p><strong>指令範例</strong></p>
<pre><code>ClearTimeMappingData();
AddTimeDataByFile( &quot;lineA&quot;, &quot;Mapping/sensor1.csv&quot;, &quot;18:25:51.7100&quot;, &quot;18:26:12.9910&quot;);
AddTimeDataByFile( &quot;lineB&quot;, &quot;Mapping/sensor1.csv&quot;, &quot;18:26:30.5750&quot;, &quot;18:27:12.2880&quot;);
PlayNcFile(&quot;NC/file1.nc&quot;)
</code></pre>
</div>
<h4 id="指定nc路徑">指定NC路徑</h4>
<div class="NOTE">
<h5>Note</h5>
<p><strong>指令格式</strong></p>
<pre><code>//範圍(多行)資料映射
BeginSelection(&lt;映射名&gt;, &lt;起點映射錨點旗標&gt;, &lt;起點偏置物件&gt;);
EndSelection(&lt;映射名&gt;, &lt;終點映射錨點旗標&gt;, &lt;終點偏置物件&gt;);
//單行資料映射
LineSelection(&lt;映射名&gt;, &lt;起點映射錨點旗標&gt;, &lt;起點偏置物件&gt;, &lt;終點映射錨點旗標&gt;, &lt;終點偏置物件&gt;);
</code></pre>
</div>
<p>&lt;映射名&gt;為自訂之標記名稱,對應於指定<strong>輸入資料</strong>中的映射名。</p>
<ul>
<li>可以使用<code>BeginSelection</code><code>EndSelection</code>作範圍(多行)資料映射:
<ul>
<li><code>BeginSelection</code>設置映射起點。</li>
<li><code>EndSelection</code>設置映射終點。</li>
</ul>
</li>
<li>或是使用<code>LineSelection</code>作單行資料映射。</li>
</ul>
<p>&lt;映射錨點旗標&gt;可以使用:</p>
<ul>
<li><code>LineBegin</code>
以該行運動起點為映射錨點。</li>
<li><code>LineEnd</code>
以該行運動終點為映射錨點。</li>
<li><code>FirstTouch</code>
以該行第一次接觸工件的位置為映射錨點。</li>
<li><code>LastTouch</code>
以該行最後接觸工件的位置為映射錨點。</li>
</ul>
<blockquote>
<p><img src="markRegionOnTouch.png" alt="markRegionOnTouch.png"></p>
</blockquote>
<p>&lt;偏置物件&gt;是相對於錨點的偏移,可以使用:</p>
<ul>
<li><code>null</code>
無偏移。</li>
<li><code>ShiftTime_s</code>
單位秒。正值為往後時間;負值為往前時間。</li>
<li><code>ShiftDistance_mm</code>
單位mm。正值為往後位移負值為往前位移。</li>
</ul>
<p>指定NC路徑命令需在NC碼註解中執行前置<code>;@</code>符號。</p>
<div class="TIP">
<h5>Tip</h5>
<p><strong>NC檔案範例</strong></p>
<pre><code>...
G00 G90 X-6. Y10.
G17 G01 Z-1. F600.
S50 M03
X13. F20 ;@LineSelection(&quot;lineA&quot;, FirstTouch, ShiftTime_s(2), LineEnd, ShiftDistance_mm(-1));
X25. F10 ;@LineSelection(&quot;lineB&quot;, FirstTouch, null, LastTouch, null);
...
</code></pre>
</div>
<div class="TIP">
<h5>Tip</h5>
<p><strong>NC檔案範例2</strong></p>
<p>如果控制器不支援<code>;</code>符號作為註解如FANUC控制器則需將其引入註解範圍內。</p>
<pre><code>...
G00 G90 X-6. Y10.
G17 G01 Z-1. F600.
S50 M03
X13. F20 (;@LineSelection(&quot;lineA&quot;, FirstTouch, ShiftTime_s(2), LineEnd, ShiftDistance_mm(-1));)
X25. F10 (;@LineSelection(&quot;lineB&quot;, FirstTouch, null, LastTouch, null);)
...
</code></pre>
</div>
<h3 id="選區結束映射設定">選區結束映射設定</h3>
<p><a class="xref" href="../../../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_EnableMapOnSelectionEnd">EnableMapOnSelectionEnd</a><small>(API)</small> 設定是否在選擇結束時連帶執行映射。</p>
<div class="NOTE">
<h5>Note</h5>
<p><strong>指令格式</strong></p>
<pre><code class="lang-csharp">EnableMapOnSelectionEnd = true; // 或 false
</code></pre>
</div>
<div class="TIP">
<h5>Tip</h5>
<p><strong>指令範例</strong></p>
<pre><code class="lang-csharp">// 啟用選區結束映射
EnableMapOnSelectionEnd = true;
BeginSelection(&quot;region1&quot;);
// ... NC 代碼 ...
EndSelection(&quot;region1&quot;); // 連帶執行映射
// 停用選區結束映射
EnableMapOnSelectionEnd = false;
BeginSelection(&quot;region2&quot;);
// ... NC 代碼 ...
EndSelection(&quot;region2&quot;); // 不連帶執行映射
Map(&quot;region2&quot;); // 手動執行映射
</code></pre>
</div>
<div class="NOTE">
<h5>Note</h5>
<p>預設值為 <code>true</code>。當設為 <code>true</code> 時,<code>EndSelection</code> 會連帶執行對應的 <code>Map</code> 操作。</p>
</div>
<h3 id="範例專案">範例專案</h3>
<ul>
<li><a class="xref" href="../../examples/milling-training-dynamometer/index.html">範例專案:動力計訓練銑削係數</a></li>
</ul>
<h2 id="感測器資料檔案格式">感測器資料檔案格式</h2>
<p>輸入檔案格式為csv須包含時間資訊其餘資訊可選擇包含或不包含。</p>
<p>csv檔案需有標題列欄位標題需用特定指示詞標示。
部分欄位指示詞為方便性是多擇一。</p>
<ul>
<li>時間:
<ul>
<li><code>ActualTime</code></li>
</ul>
</li>
<li>動力計:
<ul>
<li>X方向力
<ul>
<li><code>Fx</code></li>
<li><code>Workpiece.Fx</code></li>
</ul>
</li>
<li>Y方向力
<ul>
<li><code>Fy</code></li>
<li><code>Workpiece.Fy</code></li>
</ul>
</li>
<li>Z方向力
<ul>
<li><code>Fz</code></li>
<li><code>Workpiece.Fz</code></li>
</ul>
</li>
</ul>
</li>
<li>智慧刀把:
<ul>
<li>X方向力矩
<ul>
<li><code>Mx</code></li>
<li><code>Holder.Mx</code></li>
</ul>
</li>
<li>Y方向力矩
<ul>
<li><code>My</code></li>
<li><code>Holder.My</code></li>
</ul>
</li>
<li>Z方向力矩
<ul>
<li><code>Mz</code></li>
<li><code>Holder.Mz</code></li>
</ul>
</li>
</ul>
</li>
<li>加速規(可選)
<ul>
<li><code>Ax</code></li>
<li><code>Ay</code></li>
<li><code>Az</code></li>
</ul>
</li>
</ul>
<p>欄位可以包含其他外部資訊,如下例之<code>CH1</code><code>CH2</code></p>
<div class="TIP">
<h5>Tip</h5>
<p><strong>檔案範例</strong></p>
<pre><code>ActualTime,CH1,CH2,Mx,My,Mz
18:23:54.703,-0.00398,-0.00034,-0.02923,0.10733,0.00409
18:23:54.704,-0.00194,0.00285,0.04155,-0.04457,0.00448
...
</code></pre>
</div>
<h2 id="串接控制器資料及感測器資料至數控路徑">串接控制器資料及感測器資料至數控路徑</h2>
<p>因為機台加減速,模擬加工時間與實際加工時間會累積誤差,時間拉長了對不上。所以在資料映射時透過錨點做線性投影。</p>
<ul>
<li>模擬步資料及控制器資料皆含檔案號行號,故可依此設定兩者相應錨點</li>
<li>控制器資料及感測器資料皆含實際時間,故可依此設定兩者相應錨點</li>
</ul>
<p>串接後可使模擬步索引感測器資料。</p>
<p><img src="img/Series-Mapping.jpg" alt="串接映射示意圖"></p>
<p>如示意圖:</p>
<ul>
<li>L = <code>FileNo</code>, <code>LineNo</code> 錨點</li>
<li>t = <code>ActualTime</code> 錨點</li>
</ul>
<div class="NOTE">
<h5>Note</h5>
<p><strong>為何使用兩層映射?</strong></p>
<p>雖然可以直接使用 <a class="xref" href="../PlayCsvFile/play-csv-file.html">執行CSV檔</a> 執行模擬,但控制器的採樣頻率有限,直接播放會導致模擬路徑失真。</p>
<p>透過系統解譯器解譯數控路徑(<a class="xref" href="../PlayNcFile/index.html">執行NC檔</a>),再將控制器資料與感測器資料映射至模擬步,可獲得較精確的模擬路徑。</p>
</div>
<h3 id="操作流程">操作流程</h3>
<p>依序使用兩指令串聯控制器資料及感測器資料至虛擬環境:</p>
<ol>
<li><p><strong>先使用 <a href="#mapsinglebycsvfile">MapSingleByCsvFile</a> 將控制器資料映射至模擬數控路徑</strong></p>
<ul>
<li>控制器資料至少包含 <code>FileNo</code><code>LineNo</code><code>ActualTime</code></li>
<li>該指令會依 <code>FileNo</code><code>LineNo</code><code>ActualTime</code> 及其他控制器資料插補至模擬步中</li>
</ul>
</li>
<li><p><strong>而後使用 <a class="xref" href="../../../../api/Hi.MachiningProcs.RuntimeApi.html#Hi_MachiningProcs_RuntimeApi_MapSeriesByCsvFile_">MapSeriesByCsvFile</a><small>(API)</small> 將感測器資料映射至模擬數控路徑</strong></p>
<ul>
<li>感測器資料至少包含 <code>ActualTime</code></li>
<li>該指令會依 <code>ActualTime</code> 將其他感測器資料插補至模擬步中</li>
</ul>
</li>
</ol>
<div class="TIP">
<h5>Tip</h5>
<p><strong>指令範例</strong></p>
<pre><code class="lang-csharp">// 1. 使用系統解譯器解譯數控路徑(獲得精確的模擬路徑)
PlayNcFile(&quot;NC/machining.nc&quot;);
// 2. 映射控制器資料含FileNo, LineNo, ActualTime
MapSingleByCsvFile(&quot;Data/controller.csv&quot;);
// 3. 映射感測器資料含ActualTime及感測器數據
MapSeriesByCsvFile(&quot;Data/sensor.csv&quot;);
</code></pre>
</div>
<h3 id="範例專案-1">範例專案</h3>
<ul>
<li><a class="xref" href="../../examples/mapping-demo/index.html">範例專案:串聯控制器資料及感測器資料至模擬數控路徑並更新銑削係數</a></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>