跳轉到

工作流程: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)
OptMaxFeedrate_mmdmin 切削區最大進給率 (mm/min)
OptMaxAcceleration_mmds2 加減速上限 (mm/s²)
OptFeedrateAssignmentRatio 重新插補的觸發門檻

延伸距離

屬性 說明
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. 物理約束(主軸功率、力矩、熱屈服、偏好力)

同優先順位的約束衝突時,採用最低進給率。

腳本命令範例

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;

XML 配置(NC 碼內嵌)

優化設定可嵌入 NC 註解中:

N0110 X-3.064 Y6.378 (;@OptMaxAcceleration_mmds2=10;)
N0150 G01 X-3.068 Y40.776 (;@OptMaxAcceleration_mmds2=100; OptMaxFeedrate_mmdmin=12000;)

3. 執行仿真

設定可在多個 NC 檔之間交錯,會套用到後續檔案:

OptRapidFeed_mmdmin = 4000;
PlayNcFile("NC/file1.nc");

OptRapidFeed_mmdmin = 8000;
PlayNcFile("NC/file2.nc");

排除特定行不予優化

保留特定 NC 行不變:

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

排除一段範圍:

N0140 G03 X-2.66 Y38.193 (;@BeginPreserve();)
N0150 G01 X-3.068 Y40.776
N0160 X-3.555 Y43.338 (;@EndPreserve();)

Warning

請勿將 MachiningStep.UpdateNcOptOptionSessionStepBuilt 事件中與 NC 內嵌優化命令混用。由於並行運算,這可能導致未定義行為。


4. 產生優化 NC 檔

OptimizeToFiles 寫出優化後的 NC 程式:

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

[NcName] 樣板會替換為各輸入 NC 檔的檔名。


5. 驗證優化結果

優化日誌

啟用步級日誌以查看每步受到哪個約束限制:

EnableIndividualStepAdjustmentLog = true;

.IndependentStepAdjustment.log 檔記錄每步的計算資料,包括:

  • FrtByPreferedForce_mm — 由目標力導出的每刃進給
  • FrtByYieldingStressRatio_mm — 由屈服應力導出的每刃進給
  • FrtBySpindleTorqueRatio_mm — 由主軸力矩導出的每刃進給
  • FrtBySpindlePowerRatio_mm — 由主軸功率導出的每刃進給
  • FrtByThermalYieldingRatio_mm — 由熱屈服導出的每刃進給

嵌入式日誌註解

EmbeddedLogMode 控制嵌入日誌的詳細程度:

模式 說明
None 無日誌註解
SimpleLog 重新插補的行有 StepIndex;每行原始 NC 的最後插補行有 LineNo
FullLog 所有行都有 StepIndexLineNo

範例輸出:G01 X10.0 Y20.0 F500 (src(LineNo: 140, StepIndex: 256))

追蹤個別步的物理量限制

要分離出每步受哪個物理量限制,停用平滑:

OptMaxAcceleration_mmds2 = double.PositiveInfinity;
OptFeedrateAssignmentRatio = 0;
OptExtendedPreDistance_mm = 0;
OptExtendedPostDistance_mm = 0;
EnableIndividualStepAdjustmentLog = true;
EmbeddedLogMode = NcOptimizationEmbeddedLogMode.FullLog;

優化後仿真差異

優化後的進給率產生不同的插補點,會造成:

  • 不同的仿真網格誤差
  • 表面形態變化(在表面粗糙度層級;轉角處更明顯)

優化後的仿真物理量可能略高於目標值,原因即為上述差異。

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");

延伸閱讀