跳轉到

工作流程:由參照網格建立工件

客戶送來的零件,常常是從 CAM 驗證工具匯出的單一網格,而不是一個標明為毛胚的模型加上一個標明為設計的模型。這樣的網格位於 CAM 工具的座標系,而不是程式的座標系;它可能是某道工序之前的毛胚、之後的毛胚,或是設計曲面——而它的檔名很少說明是哪一個。本頁把它變成工件:判斷這個網格是什麼、在其中找出程式原點,再用它建出目標與毛胚,手動或透過 HTTP API 皆可。

它是專案建構建置順序中的第 3 步。

flowchart LR
    What["1 · 網格是什麼?<br>距離測試"]
    Zero["2 · 程式原點<br>在網格座標系中"]
    Build["3 · 目標 + 毛胚<br>同一個座標系"]
    Parts["4 · 多件零件?"]
    Api["5 · API 呼叫"]

    What --> Zero --> Build --> Parts --> Api
    Zero -->|細調| What

1. 判斷網格是什麼

判讀錯了,得到的是一次毫無錯誤地跑完的執行。把精加工程式放在它本來就要留下的那個曲面上播放,它只會擦過那個曲面:各步回報有接觸、力出來接近零,也不會發出任何訊息,因為未接觸警告只有在整趟播放連一步都沒碰到工件時才會發出。

建任何東西之前,先拿程式測試這個網格。對半徑為 R 的球刀,把程式的每一個刀尖點沿刀軸往上移 R,得到球心,再量出每個球心到網格的距離:

距離集中在 這個網格是
R,遍及整個零件 這支程式所留下的那個曲面——拿它當目標,不要當毛胚
R − a,a 大致固定 帶著留給這支程式切除之預留量 a 的毛胚——球沉入其中 a;a 一旦超過 R,球心就落進網格內部,深 a − R
分散,許多球心落在網格內部 來自另一道工序的曲面,或是程式原點擺錯了位置

平底刀在底面上做同一個測試更簡單:每一道底面走刀的刀尖 Z,等於它所留下的那個底面的高度。

2. 在網格的座標系裡找出程式原點

CAM 工具以它自己的座標系匯出,往往是機械座標,所以網格的原點很少就是程式的原點。找出把程式搬到網格上的那個平移:

  • X 與 Y——把程式的覆蓋範圍(其切削移動在 X–Y 上所及的範圍,或一個有辨識度的輪廓,例如一個凹槽)套準到網格的俯視高度圖上。
  • Z——把程式各個不同的底面深度對上網格的各個平坦面。一支底面位於 Z −0.5、−2.5 與 −4.5 的程式,必須落在三個恰好各相距 2 mm 的平坦面上;兩組數字之間的差值,就是程式原點的高度。

用 §1 的距離測試把三者都細調:正確的平移,是讓距離最均勻的那一個,而取樣幾萬個刀位點就綽綽有餘。不要假定慣例——程式原點位於毛胚頂面——對這個網格也成立:由擬合來決定。把平移量、它留下的距離離散程度,以及它是怎麼找到的,寫進專案的 README。

同一個擬合,也就是精加工程式的 Z 基準檢查——精加工程式沒有可以拿來和峰值切削深度比對的層深。

3. 由同一個網格建出目標與毛胚

毛胚幾何與目標幾何掛在同一個工件幾何座標系上,所以在兩者裡都給這個網格加上同一個變換,並讓這個變換把程式原點移到幾何原點上:

  • 目標幾何——以 StlFile 持有這個網格,並在它上面加一個 Static Translation,平移量為程式原點在網格中之座標的負值:在 StlFile 項目上用變換選取器,或透過 HTTP 用一個持有該 StlFile 的 TransformationGeom(§5)。
  • 毛胚幾何——同一個變換;網格是成品曲面時,把預留量加到平移的 Z 上。§1 若顯示這個網格是毛胚,它就放在這裡、不加預留量,而目標則來自設計模型。
  • 通往程式原點錨點的連接——工件那條由它的幾何錨點通往它的程式原點錨點的連接:恆等變換,因為那個變換已經把程式原點放在幾何原點上了。
  • 通往夾具安裝點的連接——由幾何錨點通往夾具安裝點:照常是毛胚的底面中心;網格的包圍盒加上那個變換的平移,就得出它。

垂直抬升不是法向偏移。它在底面上留下完整的預留量 a,在與水平面夾 θ 角的斜面上留下 a · cos θ(45° 時約 0.7 a),在垂直壁上則什麼也不留。對於以平坦或緩坡曲面為主的精加工,這是說得過去的替代;若是側壁精加工,就要取得真正的工序前毛胚。預留量不明時,挑一個該精加工策略的典型值——球刀精加工約 0.1~0.2 mm——把它記成一項假設,並讓它保持為建置裡的單一參數,以便修改後重建。修改了它——或毛胚網格化所用的初始解析度——之後,在下一次執行之前刪掉毛胚在第 0 階段的記錄,否則執行會從舊的那一份開始:見第 0 階段的快取會悄悄過時。

4. 幾件零件、一個程式原點

一個網格常常帶著由同一支程式並排加工的幾件相同零件——同一支子程式,在 G54 下呼叫一次、在 G55 下呼叫一次,依此類推。把它們建模成同一份工件幾何,並依上述方式把程式原點放在第一個偏移所對應的那件零件上:工件只有一個程式原點錨點,P0 不論按在哪一列,寫出的都是那個錨點的位置,而之後的每一列都是第一列加上各件零件的程式原點之間的間距。三軸機台上沿 X 相距 120 mm 的兩件零件,得出 G55 = G54 + (120, 0, 0)。

§1 的距離測試也要逐件零件各做一次。網格顯示各件零件的高度略有不同、而記錄的偏移卻說它們等高時,要決定信哪一個,並把這個選擇寫下來;幾件零件、幾個偏移列出了兩種選項。某件零件比第一件低、而且低得超過預留量時,保留記錄下來的等高偏移是代價高的選擇:它的整趟走刀都會在它的毛胚上方播放,什麼也切不到。只要另一件零件仍有切到,播放在錯誤位置的零件本身不會發出任何訊息,所以執行後要逐件檢查——在每次呼叫的步範圍上看 IsTouched,做法如透過 HTTP API 進行重播驗收 §6。

5. 透過 HTTP API

每個欄位都走同一串呼叫。鍵由呼叫端自己選——下面用的是 raw;實務上會加一個該服務的其他呼叫端都不會用到的前綴——內層的鍵則由服務從它推導出來:

  1. POST /api/Workpiece/CreateRawGeometry?geometryKey=raw&geometryType=TransformationGeom (目標欄位則用 CreateIdealGeometry)——在該欄位裡裝入一個空的變換幾何。
  2. POST /api/TransformationGeom/CreateGeom?transformationGeomKey=raw&geometryType=StlFile——回應內層的鍵 raw-Geom。
  3. POST /api/StlFile/UpdateSource,帶著 {"StlFileKey": "raw-Geom", "RootName": "ProjectDirectory", "RelFile": "Geom/part.stl"}——以相對於專案的形式儲存路徑,並載入網格。
  4. POST /api/TransformationGeom/CreateTransformer?transformationGeomKey=raw&transformerType=StaticTranslation 回應 raw-Transformer; POST /api/StaticTranslation/UpdateTrans?staticTranslationKey=raw-Transformer&x=…&y=…&z=… 設定平移量。
  5. GET /api/StlFile/GetInfo?stlFileKey=raw-Geom——必須回應 loaded: true,以及檔案實際所含的三角形數。
  6. 重新裝入該欄位,讓執行看得到在它內部所做的編輯:先 POST /api/Workpiece/UpdateRawGeometry?geometryKey=raw,再 POST /api/Workpiece/ClearRawGeomCache(目標欄位則是 UpdateIdealGeometry 與 ClearIdealGeomCache)。

第 5 步不是可有可無的。載入失敗的網格,在第 3 步照樣回應 HTTP 200 與 success: true;唯一的跡象是回應本體裡的一個 warning 欄位,而參照照樣會被存下,所以失敗會在較晚、離起因很遠的地方才浮現。同一個 GetInfo 回應也帶著網格在它自己座標系中的包圍盒,加上第 4 步的平移,就得出通往夾具安裝點那條連接的平移量。

第 6 步同樣不是可有可無的。第 2 到第 4 步是透過鍵去編輯欄位內部的物件,而這樣的編輯不會把任何東西標為已變更:要等到全新的工作階段——載入或重置之後的第一次播放——或該欄位被再次裝入時,它才會到達執行據以建立的那份設置副本。在一個從先前執行延續下來、仍然開著的工作階段裡播放,會一聲不響地播放舊的毛胚。重新裝入不花任何代價,所以每次巢狀編輯之後都要做。原因,以及連接上的變換器同樣適用的這條規則,見透過 HTTP 驅動網頁服務(英文,未鏡像)。

工件的兩條連接不是欄位:每一條都是工件拓樸裡的一條連接,要透過拓樸的圖找到它,並以 guid 指定。以通往夾具安裝點的連接為例:

  1. 以一個鍵建立變換器:POST /api/StaticTranslation/NewWithValue?key=fm-xf&x=…&y=…&z=…。
  2. GET /api/mech/equipment-topology/graph。在 anchors 裡,取 owner: "workpiece"、且 roles 含有 FixtureMount 的那一個;在 branches 裡,取 owner: "workpiece"、isAttachment: false,且 arrowAnchorGuid 等於該錨點之 guid 的那一條。找不到時,表示這個角色尚未繫結,或那條連接不存在——繼續之前,先在工件的角色面板裡繫結它,或加上那條連接。
  3. POST /api/mech/equipment-topology/workpiece/branch/{guid}/update-transformer?transformerKey=fm-xf 把它裝上;回應是它重新索引後所用的鍵,之後任何巢狀編輯完,把那個鍵 POST 到同一個路由,就是重新裝入。

通往程式原點錨點的連接是同樣這三個呼叫,改用 roles 含有 ProgramZeroAnchor 的那個錨點。PUT /api/Workpiece/init-resolution 以單純的數字接收初始解析度。

延伸閱讀

  • 專案建構 — 建置順序,本頁是其中一步
  • 程式原點對齊 — 兩種對齊方向,以及幾件零件各用一個偏移
  • 工件 — 應用程式裡的毛胚與目標兩個欄位,以及初始解析度
  • 幾何驗證 — 拿切削結果與這裡建出的目標比對
  • 透過 HTTP 驅動網頁服務(英文,未鏡像) — 鍵、推導出的鍵、重新裝入欄位,以及指定設備拓樸裡的一條連接