跳轉到

工作流程:NC 優化

本工作流程說明如何由物理為基礎的仿真產生優化後的 NC 檔。優化器調整進給率,將物理量(主軸功率、力矩、熱應力、切削力)保持在指定的安全範圍內,同時最大化加工效率。

flowchart TD
    Prereq["前置條件<br>(已啟用物理計算的仿真、<br>切削參數)"]
    Config["設定優化選項"]
    Simulate["執行仿真"]
    Output["產生優化 NC 檔"]
    Verify["驗證優化結果"]

    Prereq --> Config --> Simulate --> Output --> Verify

1. 前置條件

NC 優化需要 已啟用物理計算 的仿真環境與有效的 切削參數:

EnablePhysics = true;
LoadCuttingParaByFile("Material.mp");
前置條件 說明
啟用物理計算 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 上設定它們,而且要在播放程式之前:

NcOptOption.EnableSourceFeedrateFloor = true;
NcOptOption.SourceFeedrateFloorRatio = 0.8;

低於 1 時,物理約束仍能把負載尖峰的步降速到其原始進給的該比例,那正是刀具壽命收益的來源;設為 1 時優化器只會加速。見限制已驗證程式的降速幅度。

延伸距離

屬性 說明
OptExtendedPreDistance_mm 切削區等效計算前置距離 (mm)
OptExtendedPostDistance_mm 切削區等效計算後置距離 (mm)

安全係數(物理約束)

屬性 說明
OptSpindlePowerSafetyFactor 主軸功率安全係數(0 = 忽略)
OptSpindleTorqueSafetyFactor 主軸力矩安全係數(0 = 忽略)
OptThermalYieldSafetyFactor 熱屈服安全係數(0 = 忽略)
OptPreferedForce_N 目標切削力 (N)

Note

目標值 = 100% / 安全係數。例如安全係數 1.5 代表物理量目標約為極限的 67%。

約束優先順序

切削區內,約束依下列順序套用:

  1. 直接進給率約束(最小/最大進給率,刀具設定中的最小/最大每刃進給,原始進給率下限)
  2. 加減速約束(OptMaxAcceleration_mmds2)
  3. 物理約束(主軸功率、力矩、熱屈服、偏好力)

有多個上限同時適用時,採用最低進給率。

下限高過上限既不算錯誤、也不會把進給拉低:當組合出來的最小每刃進給超過組合出來的最大每刃進給——最小進給率、最小每刃進給、刀具的最小未切削切屑厚度或原始進給率下限其中之一高過上限——邊界會塌陷到最小值,該步就在那裡求解。物理約束也不會把步壓到下限以下:被下限擋住的步,負載會高於其目標要求的值;若是原始進給率下限,這一趟會回報有幾步(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");

排除特定行不予優化

讓某一行保持程式原本下的進給率:

N0140 G03 X-2.66 Y38.193 I-103.796 J7.172 (@@Preserve();)

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 程式:

OptimizeToFiles("Cache/Opt-[NcName]");

[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 是關掉它的開關:

EnableIndividualStepAdjustmentLog = false;

被 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 家族是括號:

G01 X10.0 Y20.0 F500 (src(LineNo: 140, StepIndex: 256))

Heidenhain 則是 ; 註解,因為 TNC 會把括號當成程式碼讀:

120 L X+35 Y-11.7 R0 F500 ;src(LineNo: 140, StepIndex: 256)

在 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%,可考慮:

  1. 修改刀具路徑以降低切削寬度/深度
  2. 使用 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");

延伸閱讀