工作流程:銑削力參數訓練¶
本工作流程涵蓋從感測器資料訓練銑削力係數的完整流程,包含資料映射、係數訓練、品質評估與訓練參數的套用。
銑削係數是計算銑削力的關鍵參數。訓練即是從實驗感測器資料(動力計或智慧刀把)對映至仿真路徑後,推導出這些係數。
flowchart TD
Prereq["前置條件<br>(感測器資料、專案設置)"]
Resolution["設定解析度並啟用物理計算"]
Mapping["設定資料映射"]
Simulate["以 NC 檔執行仿真"]
Export["匯出仿真資料<br>(WriteShotFiles, WriteStepFiles)"]
Map["映射感測器資料到仿真"]
Train["訓練銑削參數"]
Evaluate["評估訓練品質"]
Apply["載入訓練參數"]
Prereq --> Resolution --> Mapping --> Simulate --> Export
Simulate --> Map --> Train --> Evaluate --> Apply
1. 前置條件¶
Tip
專案背後完整的資料蒐集清單,見 專案資料盤點清單。
訓練前需要:
| 項目 | 說明 |
|---|---|
| HiNC 專案 | 已配置工具機、工件、夾具、刀具庫 |
| NC 檔 | 實際切削實驗使用的 NC 程式 |
| 感測器資料 CSV | 含時間戳的力/力矩資料(來自動力計或智慧刀把) |
| 控制器資料 CSV (選用) | 含 FileNo、LineNo、ActualTime 的工具機控制器紀錄,用於兩層映射 |
訓練前務必先對齊程式原點(重要)
訓練前,工件 + 夾具必須相對於工件偏移正確擺放,否則仿真出的嚙合(以及訓練出的係數)就是錯的。見 程式原點對齊 —— 特別是高還原度注意事項:所用的 G54 必須反映真實機台偏移,以及用粗解析度檢查在開頭下刀處抓出錯誤設置。
感測器資料檔格式¶
CSV 必須含一行標頭,包含 ActualTime 與至少一條力/力矩通道:
| 來源 | 標頭 |
|---|---|
| 動力計 | Fx (或 Workpiece.Fx)、Fy、Fz |
| 智慧刀把 | Mx (或 Holder.Mx)、My、Mz |
| 加速規 (選用) | Ax、Ay、Az |
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
...
Tip
保留完整的訓練專案存檔。HiNC 訓練演算法更新後,可從同一份專案重新訓練。
2. 設定解析度與啟用物理計算¶
解析度¶
訓練時須使用較正常運行更細的解析度以提高精度:
Tip
訓練解析度應 ≤ 生產解析度的 0.5 倍,以提升精度。
啟用物理計算¶
EnablePhysics 必須啟用以進行力的計算:
銑削力周期分割數¶
於訓練前設定每轉的角度分割數。值越大,相位對齊越準確:
Note
必須在執行 TrainMillingPara 之前設定。較大的值產生較準確的 AngleOffset 與較佳的銑削係數。
3. 設定資料映射¶
依資料型態選擇下列映射策略之一。
3.1 局部映射(以錨點為基準)¶
將感測器資料映射至特定 NC 路徑段:
步驟 A — 指定輸入資料:
ClearTimeMappingData();
AddTimeDataByFile("lineA", "Mapping/sensor1.csv", "18:25:51.7100", "18:26:12.9910");
AddTimeDataByFile("lineB", "Mapping/sensor1.csv", "18:26:30.5750", "18:27:12.2880");
步驟 B — 指定 NC 路徑(嵌入 NC 註解中):
X13. F20 ;@LineSelection("lineA", FirstTouch, ShiftTime_s(2), LineEnd, ShiftDistance_mm(-1));
X25. F10 ;@LineSelection("lineB", FirstTouch, null, LastTouch, null);
錨點選項:LineBegin、LineEnd、FirstTouch、LastTouch。
偏移選項:null、ShiftTime_s(<秒>)、ShiftDistance_mm(<毫米>)。
3.2 兩層串聯映射(控制器 + 感測器)¶
當同時擁有控制器資料與感測器資料時:
PlayNcFile("NC/machining.nc");
MapSingleByCsvFile("Data/controller.csv"); // 映射 FileNo/LineNo → ActualTime
MapSeriesByCsvFile("Data/sensor.csv"); // 映射 ActualTime → 感測器系列
為何使用兩層映射?
透過系統解譯器執行 NC 比直接 CSV 回放產生更準確的仿真路徑。控制器資料以 FileNo/LineNo 為仿真步與實際時間之間的橋樑;感測器資料則以 ActualTime 為實際時間與力/力矩讀值之間的橋樑。
4. 執行仿真¶
Warning
訓練期間禁止:
- 調整工件、刀具或控制器解析度設定
- 使用 NC 播放器的重置鍵(請改用關閉專案)
- 儲存專案(系統訓練設定可能覆寫刀具解析度設定)
5. 匯出仿真資料¶
匯出步資料與波形資料以供分析:
shot 檔包含時間解析的力欄位:Tool.Fx/Fy/Fz、Workpiece.Fx/Fy/Fz、Spindle.Mx/My/Mz。
座標系說明請見 銑削物理座標系。
6. 訓練銑削參數¶
TrainMillingPara(新訓練)¶
TrainMillingPara 訓練全新係數,與既有工件參數無關。
ReTrainMillingPara(校正)¶
ReTrainMillingPara 對既有係數做校正(10% 原權重 + 90% 新樣本權重)。
樣本旗標需求¶
| 命令 | 最低資料類型 | 每刃進給需求 |
|---|---|---|
TrainMillingPara |
Fx\|Fy\|Fz(動力計)或 Fz\|Mx\|My\|Mz(智慧刀把) |
至少一個樣本須有不同每刃進給 |
ReTrainMillingPara |
無限制 | 無限制 |
Warning
僅使用 Mx|My|Mz 而無 Fz 會損失一個自由度(力矩 = r × F 中的 r 方向丟失),使係數訓練不可靠。使用力矩資料時務必包含 Fz。
訓練條件¶
- 樣本應有 至少兩個主軸轉的穩定且重複波形
- 不穩定狀況下,犁切係數易被高估
- 樣本穩定時,任何 NC 路徑形狀(槽銑、側銑,或任何刀具形狀)皆可
7. 評估訓練品質¶
訓練後系統會回報三個品質指標。
相關係數 (R)¶
代表整體結果的單一值。範圍 0–1;新刀具預期 0.95–0.999。
訓練誤差比 (TrainingErrRatio)¶
訓練後自動註冊的步級變數。值越小表示步級品質越佳:
角度偏移 (AngleOffset)¶
代表量測與仿真資料間刀具旋轉相位差的步級變數:
Tip
若同一訓練批次中各段 AngleOffset 差異甚大,可能代表主軸經歷轉速變化、資料缺漏,或系統無法準確分析樣本。
8. 載入訓練參數¶
訓練後將新係數載入工件:
Warning
若訓練輸出檔路徑與刀具既有切削參數檔相同,訓練後請 重新載入專案,新參數才會生效。
XML 配置(GUI 流程)¶
使用 GUI 訓練流程時,於 .hincproj 檔配置:
<MillingParaGridTrainingDestinationFile>MillingPara/trainedPara.mp</MillingParaGridTrainingDestinationFile>
<MillingParaTraining>
<IsMzEnabled>false</IsMzEnabled>
<ForceOutlierRatio>2</ForceOutlierRatio>
<LeadParaTemplate>
<RakeFaceCuttingParaMap>
<FluteFormNum>1</FluteFormNum>
<NAngleDivisionNum>0</NAngleDivisionNum>
<EcAngleDivisionNum>0</EcAngleDivisionNum>
</RakeFaceCuttingParaMap>
</LeadParaTemplate>
<ResultParaTemplate>
<RakeFaceCuttingParaMap>
<FluteFormNum>1</FluteFormNum>
<NAngleDivisionNum>0</NAngleDivisionNum>
<EcAngleDivisionNum>0</EcAngleDivisionNum>
</RakeFaceCuttingParaMap>
</ResultParaTemplate>
</MillingParaTraining>
若映射資料含智慧刀把的軸向主軸力矩,將 IsMzEnabled 設為 true。
完整腳本範例¶
MachiningResolution_mm = 0.0625;
EnablePhysics = true;
MillingForceCycleDivisionNum = 360;
ClearTimeMappingData();
AddTimeDataByFile("lineA", "Mapping/sensor1.csv", "18:25:51.7100", "18:26:12.9910");
AddTimeDataByFile("lineB", "Mapping/sensor1.csv", "18:26:30.5750", "18:27:12.2880");
PlayNcFile("NC/file1.nc");
TrainMillingPara(Fx|Fy|Fz, "MillingPara/trained.mp");
LoadCuttingParaByFile("MillingPara/trained.mp");
WriteStepFiles("Output/[NcName].step.csv");
WriteShotFiles("Output/[NcName].shot.csv", 1);