能接續的任務 (A Mission That Resumes)¶
寫成一個腳本的任務跑得起來,卻什麼也沒告訴你。同一次執行寫成命令,讀起來就是一個個數值,可以一列一列地開關,而且——在程式前後各放一筆「記錄網格幾何」項目之後——會從上一次執行做到的地方重新開始,而不是從毛胚開始。
本頁就是同時拿到這三樣的配置。把它當成專案一開始的形狀,而不是之後再加上的優化——尤其那兩筆記錄是配置的一部分,沒有它們的任務,每一次都從毛胚重播。擺放位置本身並不受限制:每個命令都可以放在任何地方,操作方式見建立任務。
形狀¶
| # | 命令 | 類別 | 為什麼放在這裡 |
|---|---|---|---|
| 1 | 物理模擬 | 設定 | 這次執行的各個開關,放在它們所管的一切之上 |
| 2 | 加工解析度 | 設定 | 必須在第一支程式之前——見下文 |
| 3 | 碰撞偵測 | 設定 | |
| 4 | 腳本 | 程式 | 只放沒有命令涵蓋的東西 |
| 5 | 記錄網格幾何 | 輸出 | Cache/<stage>-init.wct——毛胚,只網格化一次。只要毛胚是不算微不足道的 STL 就保留這一列;毛胚是程序式實體、或本身已是記錄下來的網格時就拿掉(哪些情形、為什麼) |
| 6 | 程式檔案 | 程式 | 這個階段的程式——一個控制檔案,完整一支 |
| 7 | 記錄網格幾何 | 輸出 | Cache/<stage>-done.wct——這個階段的結果,也是下一個階段的毛胚 |
| 8 | 執行後作業 | 輸出 | 這次執行要寫出的東西 |
每個項目都有自己的核取方塊,所以任何一項都可以關掉,不必刪除,設定也不會遺失。
一個階段,就是用一個清單命令包起來的第 5–7 列。清單是「新增命令」裡「流程」類別中唯一的命令;給它這個階段的名稱,它那一列就讀作 清單 [Roughing],而那筆記錄、程式檔案與收尾的記錄,就是它下一層的各列。設定類的各列不歸入群組,留在第一個階段之上;執行後作業也一樣,留在最後一個階段之下。清單列有自己的核取方塊,取消勾選會讓裡面每一列都反灰,整個群組跳過——下面重新執行那一節開開關關的,就是這個核取方塊。群組怎麼建立、命名與移動,見群組成一張清單。
為什麼用命令,而不是一個腳本¶
腳本設定的是同樣的數值,它的好處也就僅止於此。不利於它的有:
- 一列就寫明它的值。
加工解析度 [0.125 mm]、物理模擬 [開]、程式檔案 [NC/facing.ptp]——不必打開任何東西,任務就讀得懂。 - 核取方塊取代註解掉。 註解掉的一行在樹裡看不見,還會以沒有人讀的文字留在儲存的專案裡。取消勾選的核取方塊會讓該列反灰,樹下方那個命令的編輯器也會標明這一點。
- 欄位有型別。 解析度是一個帶單位的數字欄位,而不是一行得通過編譯的程式碼。
- 順序就是執行。 把一項設定移到某支程式之上或之下,是在控制樹的任務分支裡拖曳它那一列,而不是一次編輯。
腳本裡只留下沒有命令涵蓋的東西,並依它實際的內容為它下標題。
兩個解析度:毛胚的與切削的¶
第 0 階段的記錄寫下的,是依工件幾何建出來的毛胚,而這次建構是以工件的初始解析度進行的——它在設備頁面上工件的網格項目裡,見工件。加工解析度命令影響不到它,不論放在記錄之上還是之下。加工解析度管的是它下方的程式切出什麼,所以它必須放在第一個程式檔案之上。第一次執行之前,把初始解析度設成毛胚該被網格化的寬度,並讓加工解析度那一列保持在第一支程式之上;其他設定類命令也放在那裡,在它們所管的一切之上。
「首次讀取,否則寫入」做什麼¶
記錄網格幾何有四種操作,讓任務能夠接續的是第四種:
| 操作 | 作用 |
|---|---|
| 無操作 | 什麼也不做;這個項目只是佔位 |
| 讀取 | 一律把檔案載入工作階段 |
| 寫入 | 一律把工作階段的幾何寫進檔案 |
| 首次讀取,否則寫入 | 檔案存在,而且自工作階段上次重置以來還沒有產生任何加工步時讀取檔案;否則寫入 |
這個條件是工作階段的屬性,不是項目的屬性——沒有逐項目的計數器——而沒有先重置就開始的執行,會承接上一次執行的步。這樣的執行裡,每一筆「首次讀取,否則寫入」項目都會寫入,第 0 階段的記錄也不例外,於是快取的毛胚被上一次執行加工出來的零件取代,之後每一次執行都從已經切過的毛胚開始。每次執行之前都要重置——見開始與逐步執行。這個條件看的也是步,而不是切削:只做刀具定位的一趟仍會產生步,所以一支沒有移除任何材料的程式,仍算是已經播放過,下一筆記錄會寫入而不是讀取。只有完全沒有產生步的程式——沒有選刀、沒有運動,或檔案找不到——才會讓執行停留在它開頭的狀態。
所以在上面的配置裡:
- 第一次執行。 兩個檔案都不存在。第 5 項寫下網格化的毛胚;程式播放;第 7 項寫下結果。
- 每一次重置之後的執行。 第 5 項找到它的檔案,而且還沒有任何東西播放過,所以它讀取——毛胚不會重新網格化。程式播放了,所以到第 7 項時已經有東西播放過,它就寫入新的結果。
- 重新執行某一個階段。 在每個你不要的階段的清單列上取消勾選。第一筆仍勾選著的記錄項目會成為第一個執行的東西,所以它讀取自己的快取,執行就從那裡接下去。
取消勾選一個階段,會連同它裡面的一切一起取消,包括它的記錄。一個階段就是一列清單加上它底下的各個項目;取消那一列的核取方塊,裡面每個項目都跟著反灰,整個群組都被跳過——所以在一條串接裡,若某個階段接續所用的快取是前一個階段的階段末記錄,取消前一個階段,恰恰拿掉了原本會載入那份快取的項目。執行於是從毛胚開始,悄無聲息,也沒有錯誤。要嘛讓較早的階段維持勾選,只取消其中的程式檔案列;要嘛取消它們,但保留你要從它的階段末記錄接續的那一個階段,並把該階段自己的程式取消勾選。規則就只是:你要接續的那筆記錄必須到得了——它上方的每個核取方塊都維持勾選。
最後這一點就是這個配置的用意。回到一件長工作的中段,代價只是讀一次檔案。
第 0 階段的快取會悄悄過時¶
這是這個配置的代價,值得單獨說明。
程式上方那筆記錄快取的是網格化後的毛胚。從第二次執行起,執行就從這份快取開始——所以在快取清掉之前,變更工件幾何或它的初始解析度都不會有任何效果。沒有任何警告:執行只是從先前的毛胚開始。兩者之一改過之後,先把第 0 階段的記錄重設(或刪掉它的檔案),再從結果解讀任何東西。變更加工解析度則確實會生效——它管的是切削,而不是快取的毛胚。最常掉進這個陷阱的方式,是先做一次粗的對齊檢查、接著做一次精細的執行,這也是程式原點對齊在檢查的最後要做這個重設的原因。
只有在毛胚真的要花時間網格化時,才給階段一筆第 0 階段的記錄,否則不要。判斷的依據是工件的初始幾何實際上是什麼:
| 毛胚幾何 | 第 0 階段的記錄 | 原因 |
|---|---|---|
| 任何不算微不足道的 STL——CAD 匯出檔、掃描的胚料,任何超過幾千個三角形的東西 | 要 | 網格化它是固定的單執行緒成本,每一次播放都要付,而且不會因為程式變短而縮小 |
| 方塊、柱狀體或其他程序式實體 | 不要 | 核心一下子就建好了;記錄花的會比省下的多 |
| 由較早的階段記錄下來的網格 | 不要——見下文 | 它本身就已經是快取 |
第一列是值得細說的情形,因為這份成本看起來不像是幾何造成的。毛胚 STL 是在第一支程式播放時才網格化成立方樹,所以這段時間落在執行之中,讀起來就像是 NC 很慢。其實不是:它是個常數。一個實測的例子是一個 8.9 MB 的毛胚 STL,它的網格建構在每一次播放中都佔 168 s,把程式換成一支 4.8 KB 的程式也不變——在一次 193 s 的執行裡,有 168 s 花在毛胚上。把那份網格記錄一次,第二次以及之後的每一次播放,就變成一次只要百分之幾秒的檔案讀取。
這份成本隨三角形數急劇攀升,所以三角化越細,第 0 階段的記錄就越划算:一個三角形數達 1.17 百萬的毛胚,在 0.125 mm 下過了 268 s 仍未完成網格化。
當一個階段的毛胚本身就是記錄下來的網格——就像串接的兩道工序中的第二道——第 0 階段的記錄完全省不了時間,還會把這條串接凍結:上游的階段愛重跑幾次都行,這一個階段卻一直讀它第一次取得的那份副本。在那種情況下,前一個階段自己的階段末檔案就已經是快取,這個階段的程式上方不需要記錄。
記錄做不到的一件事,是讓核心無法網格化的毛胚變得可以網格化。記錄寫下的是建構產出的東西;建構本身失敗時,就沒有東西可寫,任務每一次執行都會在同一個地方失敗。
接續之後,切得更細¶
記錄凍結的工件,是以它執行當時生效的寬度網格化的樣子。把記錄讀回來,並不會把其餘的執行釘在那個寬度上:在記錄之下、下一支程式之上放一個更細的加工解析度,那支程式的移除就以更細的寬度建構。在一個以 0.5 mm 記錄的粗加工階段上實測——讀回來,再以 0.0625 mm 切削——切削確實以 0.0625 mm 進行,花了 779 s,而同一支程式在 0.5 mm 下只花 27 s,代價是網格本身五倍的記憶體。請求是有約束力的;記錄不是上限,而且在階梯的這一端,它也不是免費的。
讀回來做不到的,是補上從來沒有存下的細節。從記錄承接下來的表面,保持它們被記錄時的寬度;只有後面那支程式切到的部分會網格化得更細。這通常正好是對的——粗加工的表面馬上就要被切掉,精細的網格本來就是為精加工表面準備的。
所以每個階段都以該階段需要的寬度記錄——只有一個例外:精加工那一趟所讀取的階段。精加工刀具沒碰到的一切都保持那筆記錄的寬度,這也包括精加工據以量測的那個表面。因此,那一筆記錄的寬度要依精加工來選,而不是依它剛好所屬的粗加工階段。
較早的階段沒有這種限制。為了保險而以精加工的寬度做粗加工,什麼也得不到,還讓整段粗加工的執行都付精加工的價錢。
這和上面第 0 階段的陷阱是兩回事,那個陷阱講的是程式上方那筆記錄快取的是毛胚:在那裡,凍結的網格就是執行的起點,所以在檔案清掉之前,毛胚的初始解析度真的就卡住了。
每個階段一筆記錄¶
有好幾個階段的任務——每個階段一個清單,各自帶著它的程式檔案——在每個階段之後各放一筆記錄,另外在值得的地方加上第 0 階段的記錄。每個檔案都以它結束的那個階段命名,而不是以寫出它的程式命名,這樣一個階段讀取的檔案,就是以它前一個階段命名的那一個。
不要為了得到更細的階段,把一個控制檔案拆成好幾個程式檔案項目。程式的模態狀態——單位、平面、工件偏移、絕對或增量——是在它的開頭建立、再一路帶下去的;把它切成兩半,就是把後半交給一個從沒看過開頭的執行器。階段的邊界就是檔案的邊界。
什麼留在腳本裡¶
屬於那裡的有兩樣,此外就很少了:
- 沒有專屬命令、作用於整個處理程序的設定。
MillingCycleDivisionNum是一貫的例子:它作用於整個處理程序,撐得過執行時期的重置與專案切換,而一支把它調高的訓練腳本,會洩漏到之後載入的每一個專案。把它釘在任務裡是一道防護,而不是一項設定。 - 真正一次性的工作階段工作——見其他命令的「腳本」一節。
凡是有命令的,就放在命令裡。重複某個命令預設值的腳本行比什麼都沒有還糟:它明明是殘留,讀起來卻像是一個決定。
快取是副產品¶
Cache/ 存放的是可以重建的產物,這也是記錄命令預設放在那裡的原因。網格化的工件很大——在精細的解析度下,數百 MB 很平常——而且它完全由毛胚幾何、解析度與它上方的程式推導出來。不要把它納入版本控制,想讓執行從毛胚重建時就刪掉它:記錄命令自己的重設會清掉它所指向的檔案。