跳轉到

記憶體規劃

記憶體不夠的仿真不會變慢然後跑完;它會停下來,而且停得很晚。一次實測中,把記憶體限制在剛好低於運行所需的量,結果在程式跑到 75% 到 96% 之間中止——幾乎所有時間都已經花掉了。請在建立專案之前估算記憶體,用的是任何設定都還沒做之前就已經在手上的兩樣東西——NC 程式與工件——然後對照將要執行它的那台機器來選擇解析度。

記憶體花在哪裡

一次運行持有三樣東西:

部分 是什麼 由誰決定 隨網格寬度改變?
底座 執行環境、工具機與刀具模型、專案本身 專案 否——約 1 GB,另加下文所說匯入的工件檔案
每步結果 每一步保留下來的位置、物理結果與顯示資料;回放、圖表與點選步都讀取它們 步數,由 NC 程式決定 否
工件網格 沿著工件表面的那些立方體 工件的表面與網格寬度 是

前兩項是專案的最低記憶體成本:沒有任何解析度設定能把它們拿掉。第三項是解析度所選擇的,而兩邊哪一邊較大,決定了解析度的分量。NC 程式決定前者的大小,工件決定後者:

  • 表面大而複雜、程式又短的工件由網格主導,解析度就是決定性的設定。 輪形件是常見的例子:表面很多,而程式比起同樣大小、從方塊雕出來的零件少。一個 586 mm 的自由曲面殼件配一支 4.8 KB 的程式播放,尖峰 3.6 GB,幾乎全是網格;光是毛胚的網格,就從 0.25 mm 的 3.2 GB 變成 0.0625 mm 的 17.6 GB:一兩階就決定了這次運行放不放得進。
  • 長程式配小工件由每步結果主導,解析度幾乎動不了尖峰。 在一個 Ø65 × 50 mm 的毛胚上,270 萬步的尖峰是 14.3 GB,其中 1 mm 的網格不到 0.1 GB。

所以選擇之前兩邊都要估。要問的是「付完最低成本之後,機器還剩多少可以給網格」——而在表面大而複雜的工件上,這幾乎就是整個問題。

NC 程式:步數

以每步約 5 KB 來規劃。一步保留約 2.9 KB 的結果;其餘是執行環境在這些結果周圍所佔的工作空間。在由每步結果主導的整次運行上,連同一切在內的尖峰落在每步 4.1–5.3 KB,較低的數字出現在最大的那次運行(1,570 萬步)。

步數跟著主軸走,不是跟著檔案走。預設情況下,主軸轉動時每轉一圈取一步(加工運動解析度),主軸停止時每移動一毫米取一步。所以最好的估法是加工時間乘以主軸轉速:一支以 8,000 rpm 切削兩小時的程式大約是一百萬步,約 5 GB。如果 CAM 系統或後處理把加工時間寫進了程式,就用那個數字。

只看檔案大小得到的數字比較粗,但一眼就能取得。在實測過的程式上,一 MB 的程式是 8 萬到 100 萬步——大約 0.4 到 5 GB 的每步結果。一支程式落在這個範圍的哪裡,取決於它的移動有多長:由許多短單節組成的精加工程式,每個單節只讓主軸轉幾圈;由長行程組成的粗加工程式,則轉很多圈。

程式 大小 步數 每位元組步數
渦輪件,三支程式 46.3 MB 396 萬 0.08
示範飛機,全部 34 支程式 14.45 MB 270 萬 0.18
示範飛機,第二支程式 0.57 MB 221,000 0.39
大型工件,一支程式 33.2 MB 1,570 萬 0.45
示範飛機,第一支程式 0.41 MB 199,000 0.49
輪形殼件,粗加工 0.6 MB 300,000 0.5
同一殼件,一小段粗加工節錄 4.8 KB 4,800 1.0

工件:網格

網格是沿著工件的表面建立的,不是填滿整個體積,所以它的記憶體跟著表面積走,而寬度每減半一次,就可能讓它乘上四倍或更多。有兩種表面要算:毛胚本身的表面,以工件的初始解析度 (Initial Resolution) 建立;以及程式切出的每一個表面,以加工解析度 (Machining Resolution) 建立。

毛胚本身的表面要花多少,取決於初始幾何有多複雜。一個立方體在其內部表面是平面的地方就停止細分,所以簡單的毛胚——方塊或圓柱——在任何寬度下都幾乎不花記憶體:它屬於最低成本,把機器的空間留給程式切出的表面,這正是寬度能夠放細的原因。複雜的毛胚——匯入的自由曲面實體,例如輪形件或殼件——在第一刀之前就已經在花記憶體,細寬度下會佔掉這次運行的大部分記憶體;這時初始解析度與加工解析度同樣是記憶體的決定。

匯入的工件在任何網格建立之前,本身作為檔案也要花記憶體。一個 STL 在記憶體中約佔其二進位檔案大小的兩倍,而工件的 STL 檔——毛胚與設計件——會被持有兩份,一份供編輯、一份供運行,所以請以磁碟上檔案大小的約四倍來抓預算。對幾 MB 的檔案可以忽略,對幾百 MB 的檔案則不行:一個 550 MB 的毛胚 STL,只要專案開著就佔約 2 GB。

實測:

毛胚 寬度 網格記憶體
圓柱 Ø65 × 50 mm,一支粗加工程式 2 / 1 / 0.5 / 0.25 / 0.125 mm 0.03 / 0.05 / 0.08 / 0.19 / 0.82 GB
同一圓柱,粗加工與精加工程式 0.0625 mm 6.4 GB
自由曲面殼件 586 × 586 × 92 mm,匯入毛胚,尚未切削 0.25 / 0.125 / 0.0625 mm 3.2 / 7.1 / 17.6 GB
毛胚 600 × 450 × 240 mm,整支程式跑完之後 0.125 mm 約 9 GB

從表中可以讀出兩件事。寬度比零件本身的細節還粗時,增量一直很小,之後就增長得很快:圓柱的網格從 0.25 到 0.125 mm 翻了四倍。而毛胚的大小會把整條曲線往上推:殼件在一些寬度上就需要好幾 GB,而小圓柱在同樣的寬度下仍不到 200 MB。

對於與上述都不相像的毛胚,量一個點,再從它推算。毛胚是在運行第一次需要它時才網格化,不是在專案開啟時,所以請在粗的一階上播放程式的前幾個單節,讀取尖峰記憶體(見本頁最後),扣掉底座,再把剩下的量每減半一次寬度就乘以四——寬度細過零件的特徵之後還要更多。

實測運行

整次運行、行程的尖峰記憶體,供找出可比較的案例:

毛胚 寬度 程式 步數 尖峰 主要來自
圓柱 Ø65 × 50 mm 1 mm 0.41 MB 199,000 2.4 GB 底座與每步結果
同上 1 mm 14.45 MB 270 萬 14.3 GB 每步結果
同上 0.0625 mm 0.98 MB 421,000 9.3 GB 網格
渦輪件 1 mm 46.3 MB 396 萬 18.2 GB 每步結果
自由曲面殼件 586 × 586 × 92 mm 0.25 mm 4.8 KB 4,800 3.6 GB 網格
毛胚 600 × 450 × 240 mm 0.125 mm 33.2 MB 1,570 萬 64.9 GB 每步結果

實務上用的寬度

實際使用的加工解析度從 2 mm 到 0.03125 mm——七階,寬度相差 64 倍——由情境決定用哪一階:

情境 由什麼主導記憶體 加工解析度
非常大的工件、大量程式,快速總覽 兩邊都大,而且每步結果降不下來 2 mm
表面大而複雜、程式少——例如輪形件 網格 機器空間所允許的那一階;它決定這次運行放不放得進
簡單毛胚——方塊或圓柱——配中等的程式 每步結果;毛胚本身幾乎不花 可以放細,因為只有切出的表面會增長
殼件上的精細切削 網格,在精細切削的地方 到 0.03125 mm,用來估計切削的行為;要比它碰到的最薄的壁更細

兩端正好說明了規則。非常大的工件配大量程式時,每步結果已經佔掉機器的大半,任何寬度都降不下來,所以用最粗的一階讓網格不擋路、總覽跑得快。殼件上的精細切削要問的是薄壁怎麼反應,比壁還粗的寬度根本答不出來,所以寬度要細到切削所需的程度——再由下面的估算判斷機器撐不撐得住,或是否只讓那一段切削用這個寬度播放。

對照機器

把各部分加起來:

peak ≈ 1 GB + 4 × workpiece STL size + steps × 5 KB + mesh

也就是:尖峰 ≈ 1 GB + 4 × 工件 STL 檔大小 + 步數 × 5 KB + 網格。再拿這個總和去比機器能給這次運行的記憶體:它的實體記憶體,扣掉作業系統與其他程式佔用的,再扣掉同一台機器上同時在跑的其他仿真。

這個比較的兩邊都沒有多少餘裕。估算值是在記憶體充裕的機器上的尖峰,那時執行環境會拿比嚴格所需更多的工作空間;實測上,一次運行在比無限制尖峰少約 15% 的記憶體下仍然跑完,再少就失敗。所以放不進去的估算值就是放不進去,而硬跑的那次運行會以記憶體不足中止,而且發生在接近尾聲、不是在開頭。

接著依下列順序選擇:

  1. 寬度動不了的那部分。 如果底座加上每步結果本身就已經放不進去,任何寬度都救不了這次運行,因為這些記憶體不在網格上。改為減少步數:ScaledFeedPerCycle(2) 每兩轉取一步,讓每步結果減半,代價是力的取樣變稀疏;或是一個階段一個階段地跑程式,每個階段之後放一筆「記錄網格幾何」項目,讓每次運行只持有它所播放那些階段的步(能接續的任務);或是換一台記憶體更大的機器來跑。
  2. 再選寬度——在表面大而複雜的工件上,這就是決定本身。 付完最低成本之後剩下的,就是網格的空間,而每粗一階,網格就降到原本的四分之一到二分之一。兩個寬度都要算:初始解析度管毛胚本身的表面,加工解析度管程式切出的每一個表面。取階梯上能完成這件工作的最粗一階——這就是這件工作能花的最少記憶體——並確認它的網格放得進那個空間。設定檢查、碰撞檢查或初步看一下切削力,用 1 mm 或更粗即可;比寬度還薄的壁、肋或底面,需要比它的厚度更細的寬度(網格解析度)。空間所允許的最細一階是上限,不是目標。
  3. 只在需要的地方用細寬度。 用粗寬度做粗加工、記錄結果,只讓精加工程式切得細。在示範飛機上實測,這比兩支程式都以 0.0625 mm 播放少用了 46% 的記憶體、53% 的時間(接續之後,切得更細)。

在把機器交給整支程式之前,先在選定的寬度上用一段裁短的節錄驗證估算值:播放它、讀取行程的尖峰記憶體(在 Windows 上,是工作管理員詳細資料分頁的尖峰工作集欄位),再與同一段節錄的估算值比較。每步結果隨步數等比例增加;網格則隨整支程式切出的表面多寡而增長,所以節錄得到的數字對網格那一項而言只是下限。

延伸閱讀