跳轉到

出了問題時 (When Something Goes Wrong)

一次沒有照預期進行的執行,通常早已在某個地方說明了原因。本頁講的就是那是哪個地方——位於 /execution 的執行頁面上的四份清單、控制樹路徑 execution/program 上的「程式」分支,以及服務自己的日誌。

從對的清單開始

畫布下方的工作階段訊息面板,把工作階段的訊息分成四份清單,而挑對要讀的那一份,就是診斷的大半。分頁只有在它的清單裡有東西之後才帶著計數,所以名稱旁沒有數字的分頁,是一份還沒有任何東西到達的清單。

  • 工作階段 (Shell) — 工作階段對它自己的交代:什麼開始了、什麼完成了、它建立了什麼,以及一趟播放結束時它得出的判定。轉換或優化也在這裡回報自己,從開頭那一列到收尾的計數——優化是一個階段一個階段、一個檔案一個檔案地回報;轉換則只有那兩列,收尾那一列在一個句子裡帶著計數與寫出的每個檔案的名稱,只有它寫不出的檔案才另外獨佔一列。這些列不帶錨點,因為程式裡沒有東西可以讓它們錨定。一次看起來什麼都沒做的執行,就是從這份清單來診斷的——有兩個盲點。產生了步、但沒有一步碰到工件的播放,會在這裡回報為 Play-Touch--None,訊息也會指出常見的原因——增量的開頭之後沒有 G90、把程式放到別處的工作偏移或程式原點、毛胚不在程式預期的位置,以及刀具幾何。完全沒有產生步的播放——最常見的原因是從來沒有裝上刀具——不會被回報,而且仍然以已完成結束:時序圖保持空白,而NC 診斷往往也沒留下任何痕跡:不論主軸上有沒有刀,G43 H1 都照樣從補正表取值補正。只在部分應該切到的地方碰到毛胚的播放也不會被回報——多件工作中的一件以錯的偏移播放,或者精加工程式擦過一塊早已精加工完的毛胚——因為任何地方只要有一步碰到,就足以讓這則警告沉默。
  • NC 診斷 — NC 管線在播放時說的每一句話,而那不只是抱怨。它以讀到的行數替每個檔案收尾——行數那一列在檔案最後一行被消化之後才寫出,所以它排在該檔案引發的每一則診斷之後,而播放還在讀的檔案還沒有這一列——而關於某一個語句的列,帶著指名該語句的錨點。程式沒有照它的文字去做時,要讀的就是這份清單。
  • 工步診斷 — 錨定在一個加工步上,而不是文字中的某個位置。大部分關於運動,但不全是:內嵌在 NC 裡的腳本編譯失敗時也回報在這裡,歸在到達它的那一步之下。
  • NC 操作 — 回寫在把程式轉換成 NC 檔或優化它時,在程式裡發現的東西:一個它不肯改寫其中字詞的單節、一筆在串流中對不上任何片段的編輯、一個優化器不肯重新內插、改為整段優化的單節、一段寫出的片段不再共用同一個半徑的分割圓弧。它只放發現,別無其他,所以沒什麼好抱怨的轉換或優化會讓這份清單保持空白;執行對它自己的交代在工作階段上。

關於一個 G 字詞的訊息與關於一個移動的訊息是不同的問題,它們從來不會落在同一份清單。找錯清單,讀起來就像一片沉默。

沒有產生任何步的執行,仍然可能顯示一件切過的零件。在一個配置成可以接續的任務裡,程式下方每一筆「首次讀取,否則寫入」的記錄,在還沒有產生任何步時都會讀取它的檔案——於是先前一次成功的執行所留下的階段末檔案會被載入回來,畫布與任何幾何比對都會把那個先前的結果顯示得像是這次執行做出來的一樣。信任一個結果之前,先確認這次執行到底有沒有產生步:時序圖上帶著它們,而在程式分支上,這次執行應該執行過的每個檔案都有被標記的行。能接續的任務就是這種情況出自的配置。

讀一列

執行頁面,左右兩欄都已關掉,所以畫面上沒有控制樹窗格,也沒有執行標頭:上方是 3D 渲染畫布,畫著灰色夾具上的一塊白色方塊,一把金色的盤形銑刀位於它的頂面,綠色的刀具路徑在它上方升起;其下是「工作階段訊息」面板,選取的是「NC 診斷」分頁。分頁列上「工作階段」帶著 11 的標記、「NC 診斷」帶著 7,「工步診斷」與「NC 操作」完全沒有標記。在由「嚴重性」、「類別」、「篩選文字…」方框、「重置」與「匯出」組成、右端帶著 7 / 7 計數的篩選工具列下方,列出七列:六列「系統」列,讀作 Sys-Init--FileLines,各帶一個檔案與它的行數——circle.ptp 列了兩次,Inline finishing pass 在最後——以及清單中第六列的一列警告,它的錨點欄讀作 Sn 2105,類別為「不支援」,id 為 Parsing--Unconsumed,文字為「未消化的 Parsing 項目:G02」

/execution 上的四份清單,選取的是「NC 診斷」。四個分頁中有兩個沒有標記,空的清單看起來就是這樣。Sn 2105 的警告排在 Inline finishing pass 的行數列之上,因為那一列是替它的檔案收尾,而不是替它開頭。

一列由左到右帶著:它所關於的位置、類別、訊息自己的 id,以及它的文字。位置就是錨點。在兩份 NC 清單上,它是 Sn 加一個數字,指名一個語句。在工步診斷上,它以 S 與該步的編號開頭,而當那一步是從某個語句到達的時,同一個錨點帶著兩個標記——S12 · Sn 340 先指名步,再指名它背後的語句;只有背後沒有語句的步,才只讀作 S 加它的編號。並不是每一列都有錨點——針對管線、而不是針對某個特定語句的抱怨沒有東西可以錨定,工作階段上的任何東西也都沒有。

id 值得一讀。它在各種語言與各個版本之間保持不變,所以向別人詢問某則訊息時要引用的就是它,某則訊息一再重複時要拿來篩選的也是它。篩選文字…方框、嚴重性與類別清單,以及匯出,連同面板的其餘部分都在訊息與日誌裡說明。

NC 清單上的一列不是一次發生(重要)

在兩份 NC 清單上,一列並不等於一次發生。 NC 診斷在一個任務命令的播放範圍內摺疊——一筆程式檔案或一筆NC 程式碼項目,子程式也包括在內,所以播放兩次的檔案就是兩個範圍——NC 操作則在一次轉換或優化的執行範圍內摺疊;工作階段與工步診斷不做這種摺疊——那裡的每一則回報都各自成一列,除非它與緊接在前的那一列完全相同,這時它會併入那一列,掛在下文所說的倍數標記之下。在適用的地方,管線對每一則不同的訊息——相同的 id、相同的措辭——只保留一筆,其後的每一次重複都丟掉而不列出。程式結束時,發生過不只一次的每則訊息會得到一列摘要:第一次發生時的文字,後面接著 [本次執行重複 N 次,首次在 Sn=…],以次數取代 N,Sn= 之後是第一次看到它的語句(沒有語句可錨定的訊息,則改以 [本次執行重複 N 次] 結尾)。所以一則在同一個檔案的四十個不同語句上引發的診斷,會為那個檔案留下兩列:第一次發生,以及那列摘要——而同一則診斷在下一個檔案、或在同一個檔案的第二次播放中再度引發時,會重新開始,有它自己的第一次發生與摘要。上面的截圖顯示了這個範圍的邊界:circle.ptp 播放了兩次,它的行數列也列了兩次,而不是摺疊在一起。

有兩個後果值得記住。次數只在那句摘要裡——標示連續相同訊息的倍數標記是另一套機制,不會出現在這些列上。而且摘要列的錨點是最後一次發生,它的文字指名的卻是第一次,所以它錨點欄裡的 Sn 是那一串重複的結尾,而文字裡的 Sn= 是開頭。兩者都不是連結:點一下某一列,有詳細資訊時會打開它的詳細資訊,此外什麼都不做,所以錨點是用來讀出的位置,而不是可以前往的地方。兩列之間的一切都沒有錨點:要找出那些位置,就修正第一個,再播放一次。

接著是執行自己的紀錄

程式分支保存著執行對每一行做了什麼——它走過的每一趟,以及每一趟留下的標記。一行預期要切削、卻沒有被標記的,就是在那一趟中沒有被執行。見程式分支。

這兩份紀錄回答的是不同的問題,值得一起讀:NC 診斷說的是管線在播放時對一個語句的看法,程式分支說的是那個語句產出了什麼。

接著是服務日誌

「說明」選單上的日誌檢視器,會打開服務為當天正在寫的日誌,並附有下載,方便把它傳給別人。它保存著四份清單不承載的東西——引擎在啟動時對它自己的交代、每一次執行各一行、列出它為 NC、工步與工作階段 (shell) 各自計數的錯誤與警告,以及引擎沒有透過訊息回報的失敗背後的例外,那是服務只寫進日誌、別處都沒有的——而且它比工作階段活得久:傳輸列上的重置——執行標頭裡的退出 (eject) 按鈕,而不是分頁篩選工具列上的重置,後者只清除該分頁的篩選條件,不動任何清單——會清空工作階段、NC 診斷與工步診斷,日誌則保有它原本有的內容。至於四份清單本身,日誌只保留警告與錯誤,每一則都帶著它的訊息 id、它的錨點以及它所帶的例外,而且同一個訊息 id 在一次執行中不超過二十則——執行的收尾那一行會計數其餘的。較輕微的列,以及超過那個上限的重複,只在清單裡。引擎透過訊息回報的例外也跟著它那一列,那一列帶著一個展開箭號;打開它會顯示完整的例外,並附有它自己的複製,所以一段編譯不過的腳本、或一筆讀不出來的步紀錄,先從清單就能得到解答。傳輸列的重置唯一不動的清單是NC 操作——清空它的是下一次轉換或優化——所以執行被重置掉之後,上一次轉換的發現仍在那個分頁上,而它的警告與錯誤也在日誌裡。檢視器本身在訊息與日誌裡說明。

優化執行中時

優化在工作階段上一個階段一個階段地回報自己。它以開始 NC 優化。開頭,以共優化 N 個檔案。與優化快取已清除。結束,而在兩者之間,每個階段開始時都會宣告自己:正在逐步計算優化進給…,在逐步進給求解完成時以優化進給率已建立。收尾,接著是正在以擴展段約束進給率…、正在以加速度約束進給率…、正在建立補償…與正在重新產生 NC 命令…,每個輸出檔案完成時各有一列檔案優化完成:指名它。

其中兩個階段會邊做邊報數,而它們是分辨很慢的優化與停住的優化的唯一方法。逐步進給求解期間,每一千步就多加一列正在逐步計算優化進給…,帶著它已經到達的來源檔與行號;寫出優化後的文字期間,每一千行就多加一列正在優化至:,帶著同樣的兩個數字。它們每一個都是工作階段上的一列,受工作階段所做的那一種摺疊約束:步列上的檔案與行號是那一步所來自的語句的,所以一個展開成超過一千步的語句——在精細解析度下的一段長圓弧——會把同樣的兩個數字放在連續兩列上,而那兩列會併在倍數標記之下。而且因為逐步進給是平行求解的,連續幾列步列上的數字不一定嚴格遞增。不論如何都成立的是:最新的那一列就是執行已經到達的地方——數字持續在變,就是執行還在工作;一份在某個階段停止增長、而下一個階段又還沒宣告的清單,就是執行沒有在工作。

要看的儀表是報數的列,不是階段的列。要求解的步不到一千、或要寫出的行不到一千的階段,宣告它的開始之後就一聲不吭,直到結束——所以一支短程式幾乎是無聲地走完整條階梯,而那份沉默本身並不代表什麼。

「停止」會讓優化以和完成時相同的兩列收尾。「停止」會在步與步之間、輸出檔案與輸出檔案之間觸及優化器,而不是只在最後,而它留在工作階段上的,是優化已取消。,緊接著以成功的綠色顯示的共優化 N 個檔案。,然後是執行的最後一列優化快取已清除。——即使是共優化 0 個檔案。也以成功送達。在逐步進給求解期間落下的「停止」,會在這幾列之前再多放一列:優化進給流程已取消。站在原本會是優化進給率已建立。的位置。計數算的是執行已經打開的檔案,所以「停止」落在中途的那個檔案也和其餘的一起算進去,並以不完整的長度留在磁碟上。完整的,是那些在取消之前就出現了自己那一列檔案優化完成:的檔案。

三件看起來像故障、其實不是的事

翻譯過的介面裡出現英文訊息,是保險的答案,不是錯誤。引擎訊息送達時帶著一個 id 與它的英文文字,介面依 id 翻譯。對於帶有數值的訊息——檔名、計數、行號——只有當介面裡該 id 的樣板與引擎送來的那一個相符時,介面才會換上自己的翻譯;以不同訊息集建置的引擎,或介面沒有對應條目的訊息,會保留原本的英文,而不是顯示一段可能說著別的事的文字。不帶數值的訊息則只憑 id 替換,不比對措辭,所以一個改寫了這種訊息的措辭、卻保留 id 的引擎,在翻譯過的介面裡顯示的,是它先前那個措辭的翻譯。兩種情況下,引擎送來的英文才是準確的文字,而把介面切換成英文,就會讓每則訊息完全照它送達的樣子顯示。

因為正在播放而被拒絕的動作,是一道防護,不是故障。切換 NC 執行器與切換控制器品牌,在程式播放中都會被拒絕,而不是把它底下的剖析器抽換掉。拒絕是一則快顯通知,開頭是它所拒絕的動作名稱,以及服務回應的狀態:切換品牌時是切換控制器品牌: HTTP 409: Cannot switch the controller brand while an NC program is playing; pause and let the current program finish first.,透過控制器分支的物件管理選單、以載入或貼上安裝執行器時,則是安裝 NC 執行器: HTTP 409: Cannot switch the NC runner while an NC program is playing; pause and let the current program finish first.。其中的 pause 並不是解除這道防護的那一部分:對這道防護來說,暫停中的執行仍然是播放中的執行,所以在程式播完、或被「停止」結束之前,切換會一再被拒絕。拒絕直接在動作本身上送達——四份清單都不會多出任何一列,所以事後沒有東西可找。

空的工步診斷清單,並不證明什麼都沒出錯。碰撞偵測除非任務打開它,否則是關著的;而依賴物理的警告——包括換刀時提出的刀具幾何檢查——在物理關閉時根本不會提出。在這些都關掉的執行上,一份安靜的清單只說明了沒有在監看任何東西。

如果是設定問題、而不是執行問題

有些失敗是設置在遲來地回應。夾持柱比刀刃還短的刀具,建不出它的熱物理殼層。「夾持柱」編輯器在編輯刀具時就會標出這一點,而裝上那把刀的執行會在換刀時於工步診斷再回報一次——前提是物理是開著的,那正是讓這項檢查執行的條件。見刀具幾何。

延伸閱讀