工作流程:NC 優化¶
本工作流程說明如何由物理為基礎的仿真產生優化後的 NC 檔。優化器調整進給率,將物理量(主軸功率、力矩、熱應力、切削力)保持在指定的安全範圍內,同時最大化加工效率。
flowchart TD
Prereq["前置條件<br>(已啟用物理計算的仿真、<br>切削參數)"]
Config["設定優化選項"]
Simulate["執行仿真"]
Output["產生優化 NC 檔"]
Verify["驗證優化結果"]
Prereq --> Config --> Simulate --> Output --> Verify
1. 前置條件¶
NC 優化需要 已啟用物理計算 的仿真環境與有效的 切削參數:
| 前置條件 | 說明 |
|---|---|
| 啟用物理計算 | EnablePhysics 須為 true |
| 切削參數 | 工件須已載入銑削係數(見 銑削力參數訓練) |
| 有效刀具定義 | 已配置刀具幾何、刃數與材料屬性 |
Note
優化以理想幾何模型為基礎。若工件為鑄件或有安裝誤差,請保守地放大工件幾何,以避免誤判切削區與非切削區。
2. 設定優化選項¶
進給率控制¶
| 屬性 | 說明 | 預設 |
|---|---|---|
OptEnableFeedrate |
啟用循序進給率優化 | true |
OptEnableInterpolation |
重新插補以平滑加減速 | — |
OptRapidFeed_mmdmin |
非切削區進給率 (mm/min) | — |
OptMinFeedrate_mmdmin |
切削區最小進給率 (mm/min) | — |
EnableSourceFeedrateFloor |
把每一步的進給率下限設在原始程式於該步指令進給率的某個比例 | false |
SourceFeedrateFloorRatio |
該比例,0 到 1 |
0.8 |
OptMaxFeedrate_mmdmin |
切削區最大進給率 (mm/min) | — |
OptMaxAcceleration_mmds2 |
加減速上限 (mm/s²) | — |
OptFeedrateAssignmentRatio |
重新插補的觸發門檻 | — |
這兩個原始進給率選項沒有 Opt* 捷徑;腳本在 NcOptOption 上設定它們,而且要在播放程式之前:
低於 1 時,物理約束仍能把負載尖峰的步降速到其原始進給的該比例,那正是刀具壽命收益的來源;設為 1 時優化器只會加速。見限制已驗證程式的降速幅度。
延伸距離¶
| 屬性 | 說明 |
|---|---|
OptExtendedPreDistance_mm |
切削區等效計算前置距離 (mm) |
OptExtendedPostDistance_mm |
切削區等效計算後置距離 (mm) |
安全係數(物理約束)¶
| 屬性 | 說明 |
|---|---|
OptSpindlePowerSafetyFactor |
主軸功率安全係數(0 = 忽略) |
OptSpindleTorqueSafetyFactor |
主軸力矩安全係數(0 = 忽略) |
OptThermalYieldSafetyFactor |
熱屈服安全係數(0 = 忽略) |
OptPreferedForce_N |
目標切削力 (N) |
Note
目標值 = 100% / 安全係數。例如安全係數 1.5 代表物理量目標約為極限的 67%。
約束優先順序¶
切削區內,約束依下列順序套用:
- 直接進給率約束(最小/最大進給率,刀具設定中的最小/最大每刃進給,原始進給率下限)
- 加減速約束(
OptMaxAcceleration_mmds2) - 物理約束(主軸功率、力矩、熱屈服、偏好力)
有多個上限同時適用時,採用最低進給率。
下限高過上限既不算錯誤、也不會把進給拉低:當組合出來的最小每刃進給超過組合出來的最大每刃進給——最小進給率、最小每刃進給、刀具的最小未切削切屑厚度或原始進給率下限其中之一高過上限——邊界會塌陷到最小值,該步就在那裡求解。物理約束也不會把步壓到下限以下:被下限擋住的步,負載會高於其目標要求的值;若是原始進給率下限,這一趟會回報有幾步(NcOpt-Feed--SourceFloorOverTarget)。
腳本命令範例¶
OptEnableFeedrate = true;
OptEnableInterpolation = true;
OptRapidFeed_mmdmin = 4000;
OptMinFeedrate_mmdmin = 100;
OptMaxFeedrate_mmdmin = 4000;
OptMaxAcceleration_mmds2 = 10;
OptExtendedPreDistance_mm = 3;
OptExtendedPostDistance_mm = 2;
OptSpindlePowerSafetyFactor = 1.5;
OptSpindleTorqueSafetyFactor = 1.5;
OptThermalYieldSafetyFactor = 0;
OptPreferedForce_N = double.PositiveInfinity;
嵌在 NC 碼裡的設定¶
優化設定可以寫成嵌在程式自己註解裡的腳本,讓設定從它該生效的那一行開始改變。@@ 標記讓腳本在該單節的運動之前執行,而註解符號取決於控制器本身——下面是 Fanuc 家族的括號寫法(見 NC 碼中的腳本命令):
N0110 X-3.064 Y6.378 (@@OptMaxAcceleration_mmds2=10;)
N0150 G01 X-3.068 Y40.776 (@@OptMaxAcceleration_mmds2=100; OptMaxFeedrate_mmdmin=12000;)
內嵌的優化設定改的是從那一行起的步「怎麼被優化」,不是當下怎麼被模擬:播放會把每次變更記在它發生時的那一步上,OptimizeToFiles 再依每一步建立時當下生效的設定求解。
3. 執行仿真¶
設定可在多個 NC 檔之間交錯,會套用到後續檔案:
OptRapidFeed_mmdmin = 4000;
PlayNcFile("NC/file1.nc");
OptRapidFeed_mmdmin = 8000;
PlayNcFile("NC/file2.nc");
排除特定行不予優化¶
讓某一行保持程式原本下的進給率:
Preserve() 只涵蓋它所寫的那一行,不多不少:它會在該行結束時自己把優化器放行,所以不需要配對的結束命令。
一段範圍以 BeginPreserve() 在第一行的運動之前開啟,並以 EndPreserve() 在最後一行的運動之後關閉——也就是 @@^ 標記:
N0140 G03 X-2.66 Y38.193 (@@BeginPreserve();)
N0150 G01 X-3.068 Y40.776
N0160 X-3.555 Y43.338 (@@^EndPreserve();)
EndPreserve() 一執行就把優化器放行,而這發生在什麼時候,由它那一行的標記決定。像上面這樣寫在單節之後,範圍就涵蓋三行;若改成行前標記 @@,它會在自己那一行的運動之前就放行,於是 N0160 照常被優化,只有 N0140 與 N0150 被保留。
Warning
請勿將 MachiningStep.UpdateNcOptOption 在 SessionStepBuilt 事件中與 NC 內嵌優化命令混用。由於並行運算,這可能導致未定義行為。
4. 產生優化 NC 檔¶
OptimizeToFiles 寫出優化後的 NC 程式:
[NcName] 樣板會替換為各輸入 NC 檔的檔名。
執行過程會回報什麼¶
優化會把自己的進度回報到 Session Messages 面板的 Shell 分頁,是一組固定順序的列:
| 列 | 階段 |
|---|---|
Start NC optimization. |
這一趟開始 |
Computing Optimized Feed by indivisual step.. |
逐步進給求解 |
Optimization Feedrate built. |
進給求解結束 |
Constrain feedrate By expaneded segment.. |
延伸距離約束 |
Constrain Feedrate By Acceleration.. |
加速度約束 |
Build Compensation.. |
建立補正 |
Regenerate NC commands.. |
重新產生 NC 文字 |
File optimized: <path> |
每寫完一個檔一列 |
Total N files optimized. |
這一趟結束 |
optimization cache cleared. |
釋放步快取 |
階梯上可能多出兩則警告,都出現在進給求解的收尾列之前:某一步求解拋出例外時的
N step(s) failed while computing the optimized feed …(見當某一步解不出來時),
以及原始進給率下限把步擋在力或安全目標之上時的 The source-feedrate floor holds N step(s) above a load target …
(NcOpt-Feed--SourceFloorOverTarget),附上各目標的步數。
其中兩個階段會邊做邊報數,而那是唯一能分辨「很慢」與「停住了」的工具。逐步進給求解每解完一千步
就多加一列 Computing Optimized Feed by indivisual step.. FileNo:<n>, LineNo:<m>(該步若沒有來源行,
改為 StepIndex:<i>);寫檔階段每寫一千行就多加一列 Now optimizing to: FileNo.<n>, LineNo.<m>。
兩者都帶著執行到的來源檔與行號,所以最新那一列還在往前走就是還在跑,而停在某個階段、後續階段
遲遲沒宣告就不是。要解的步或要寫的行不到一千時,該階段宣告完開頭就會一路安靜到結束,
所以短程式跨完整條階梯幾乎不出聲。
Stop 會伸進優化裡面。 傳輸列的 Stop 在每兩個階段之間、逐步進給求解內部、以及寫檔時的每個目標片段
都會被檢查,所以停下來的優化是停在下一個步或片段的邊界,而不是跑到底。階梯上會說兩次:
進給求解以 Optimization Feed Process canceled. 取代 Optimization Feedrate built. 收尾,
並在結束前多一列 optimization canceled.。
被 Stop 的優化一樣以成功列收尾(重要)
停下來的優化最後仍然是完成時那一列綠色的 Total N files optimized.。那一列不代表優化跑完了——
要看它上面那一列。 N 數的是這一趟已經開始寫的檔,所以在進給求解階段按 Stop 會得到
Total 0 files optimized.,而在寫檔階段按 Stop 則會把當時正在寫、內容不完整的那個檔一起算進去。
5. 驗證優化結果¶
優化日誌¶
步級日誌是預設就會寫的。 每一趟優化都會在每個「有步可解」的優化輸出 NC 檔旁邊放一個
.IndependentStepAdjustment.log,以該優化檔命名,記錄每一步受到哪個約束限制。
EnableIndividualStepAdjustmentLog 是關掉它的開關:
被 Stop 或失敗收場的優化會讓這個檔少一截。它緩衝區裡的尾巴只有在進給求解跑完時才會被寫出去;
中途被截斷時,緩衝區裡還沒送出的行會被丟掉,排序視窗裡還在等一個永遠不會到來的較小步索引的行也是。
批次最快一秒才送一次,所以少掉的尾巴可能涵蓋最後一秒解出來的步。只有進給求解以
Optimization Feedrate built. 收尾的那一趟,這個日誌才能當成完整紀錄來讀。
.IndependentStepAdjustment.log 的每一列開頭是來源 NC 檔與行號、步索引與刀具位置,接著列出每個生效準則各自允許的每刃進給:
| 欄位 | 準則 |
|---|---|
FrtBySourceFeedrateFloor_mm |
不是準則:以每刃進給表示的原始進給率下限;凡是它高於其他下限、因而成為各準則求解起點的步都會寫出——它出現本身不代表下限擋住了那一步 |
FrtByPreferedForce_mm |
目標切削力 |
FrtByYieldingStressRatio_mm |
屈服應力 |
FrtBySpindleTorqueRatio_mm |
主軸力矩 |
FrtBySpindlePowerRatio_mm |
主軸功率 |
FrtByThermalYieldingRatio_mm |
熱屈服 |
FrtByCustom_mm(n) |
腳本註冊的第 n 個自訂準則 |
FrtByReliefAngle_mm |
後刀面接觸——見避免後刀面接觸 |
該步的每刃進給取 FrtByPreferedForce_mm 到 FrtByCustom_mm(n) 這六個準則的最低值;後刀面那一趟接著在這個值上再跑一次,所以它那一列是最後結論,而不是眾多票數之一。某個準則等於 FrtBySourceFeedrateFloor_mm,就代表它是被下限擋住、而不是由自己的目標決定的。唯一的例外是 EnableDepthSplition 開著(預設)時的目標切削力:被力目標釘在下限上的步,FrtByPreferedForce_mm 那一列記的是該步原本的每刃進給而不是下限,而該步寫出去的仍是下限。
除了目標切削力之外,每一個準則列都在方括號裡帶著該準則的求解狀態:二分求解收斂時是 Solved,未收斂時是 Singular / OverIteration / Iterating;而只有後刀面那一列會出現 Acceptable,意思是在已經選定的進給下後刀面並未接觸,所以那一列陳述的是進給本身,而不是對它的限制。完全沒有出現的準則,代表它被關掉(安全係數為 0,或目標切削力為 Infinity)或對該刀具無法評估。
有三種列會取代上面整份清單,而不是加入它:
| 欄位 | 意義 |
|---|---|
FrtByUnTouched: inf |
該步沒有切到材料,任何物理準則都不適用 |
FeedrateByNoData_mmdmin: <進給> |
該步沒有刀具或沒有銑削係數,保留原進給 |
StepFailed: <例外> |
求解拋出例外;該步保留仿真進給並以錯誤回報——見當某一步解不出來時 |
嵌入式日誌註解¶
以 EmbeddedLogMode 控制嵌入日誌的詳細程度:
| 模式 | 說明 |
|---|---|
None |
無日誌註解 |
SimpleLog |
重新插補的行有 StepIndex;每行原始 NC 的最後插補行有 LineNo |
FullLog |
所有行都有 StepIndex 與 LineNo |
這個模式只有舊的優化路徑會讀(重要)
只要 EnableSoftNcRunner 開著、而 session 握有已播放的 NC——也就是預設情況——優化器一律寫出
SimpleLog 的形狀,不管模式設成什麼:每個重新插補出來的片段帶自己的 StepIndex,
每一行原始 NC 的最後一個片段再加上該行的 LineNo,而沒有被切開的行不帶任何註解。
註解是以控制器的註解文法寫出來的,優化後的檔案因此對讀它的控制器仍然合法。Fanuc 家族是括號:
Heidenhain 則是 ; 註解,因為 TNC 會把括號當成程式碼讀:
在 Heidenhain 專案上,優化器要插入的進給字也會照 TNC 要求的元素順序擺放——在座標字之後、
在旋轉方向 DR+ / DR- 之後、也在半徑補正 RL / RR / R0 之後。原本是 L X+10 Y+20 RL
的 block,回來會是 L X+10 Y+20 RL F500。
追蹤個別步的物理量限制¶
要分離出每步受哪個物理量限制,停用平滑:
OptMaxAcceleration_mmds2 = double.PositiveInfinity;
OptFeedrateAssignmentRatio = 0;
OptExtendedPreDistance_mm = 0;
OptExtendedPostDistance_mm = 0;
這個區塊真正改變的是那四項平滑設定。步級日誌本來就是開的,而 EmbeddedLogMode 進不到預設會跑的
那條管線——見上面。
優化後仿真差異¶
優化後的進給率產生不同的插補點,會造成:
- 不同的仿真網格誤差
- 表面形態變化(在表面粗糙度層級;轉角處更明顯)
優化後的仿真物理量可能略高於目標值,原因即為上述差異。
Tip
若轉角處出現異常低的優化進給率,請參閱 轉角進給率。
刀具斷裂的解決方案¶
若仿真顯示屈服應力比、主軸力矩比或主軸功率比超過 100%,可考慮:
- 修改刀具路徑以降低切削寬度/深度
- 使用 HiNC 優化調整進給率,使這些比值降至 100% 以下
熱崩刃情況,降低主軸轉速以利散熱。
完整腳本範例¶
EnablePhysics = true;
LoadCuttingParaByFile("Material.mp");
OptEnableFeedrate = true;
OptEnableInterpolation = true;
OptRapidFeed_mmdmin = 4000;
OptMinFeedrate_mmdmin = 100;
OptMaxFeedrate_mmdmin = 4000;
OptMaxAcceleration_mmds2 = 10;
OptExtendedPreDistance_mm = 3;
OptExtendedPostDistance_mm = 2;
OptSpindlePowerSafetyFactor = 1.5;
OptSpindleTorqueSafetyFactor = 1.5;
OptThermalYieldSafetyFactor = 0;
OptPreferedForce_N = double.PositiveInfinity;
PlayNcFile("NC/file1.nc");
OptimizeToFiles("Cache/Opt-[NcName]");
WriteStepFiles("Output/[NcName].step.csv");
延伸閱讀¶
- NC 優化原理 — 理論與目標
- 轉角進給率
- 銑削力參數訓練 — 前置條件:訓練切削參數
- 基礎仿真 — 基礎仿真設置
- SessionShell — SessionShell 命令速查