THWS 鑰匙圈:沒有模型、沒有毛胚、沒有夾具的 Siemens 840D sl 程式¶
德國一所大學把它在一台 Siemens 840D sl 控制器的五軸機 Spinner U5-620 上跑過的程式,公開在一份關於機台換線的開放資料集裡。三支程式中最短的一支,加工一個鑰匙圈:用 90° 倒角刀在一塊金屬板上描出 THWS 標誌和「thws」字樣,再在一端鑽一個掛環用的孔。對這個零件,資料集給了 NC 程式、刀具表、一張照片,以及每次加工的機台逐秒紀錄,但沒有 CAD 模型、毛胚、夾具或刀把。
一個 AI 代理拿到這支程式,透過 HiNC 的 Web API 建出一個仿真,讓它照程式的指令切出鑰匙圈;反覆重播,直到每一則訊息都有交代;再讓第二個代理盲建一次;最後用它找出週期的時間花在哪裡:28.7 秒的仿真時間中有 13 秒(45 %)是刀具在輪廓之間以切削進給上下移動 16 mm,把安全高度改成 2 mm,每件可省 10.5 秒,切出來的東西完全一樣。本頁的一切都是仿真,沒有在真實機台上切過。

案例¶
| 拿到的 | 缺少的 |
|---|---|
Keychain_Schluesselanhaenger.mpf,644 行 Siemens 840D sl 程式:兩道用 90° 倒角刀(ENTFRAESER_D8_N_90GRAD)的雕刻工序,一道用 Ø3.3 鑽頭(BOHRER_D3.3_VHM)的鑽孔工序 |
零件模型,因此沒有幾何差異可以比對 |
| 一份刀具表,列出每把刀的製造商與訂購碼;刀具廠的資料頁是公開的 | 毛胚尺寸與擺放位置、材料、夾具、刀把、伸出量、刀長 |
| 機台的型號與控制器、資料描述論文中成品鑰匙圈的照片,以及機台的逐秒紀錄(資料描述論文算出這個零件每次生產平均 83 筆,含中斷) | 工件座標偏移、機台的座標與行程、原機台自有 M 碼的作用 |

這支程式用的是 Siemens 使用者天天會碰到的語法:DEF REAL 變數、機械座標移動 SUPA、取消擺角的 CYCLE800()、高速設定 CYCLE832、鑽孔用的 MCALL CYCLE81、以名稱叫刀(T="…")並搭配刃號 D1,以及旋轉軸的 B、C 字——它們只會移到 0。
代理建了什麼¶
每個值都標明出處:讀取(來源寫明的)、推得(從來源推算的)、自選(來源沒說、由代理決定的)或量測(從 HiNC 讀回,並註明版本)。
| 項目 | 值 | 依據 |
|---|---|---|
| 機台 | 以腳本從簡單方塊與圓柱寫成的通用五軸機:主軸頭側 X、Y、Z;繞 Y 傾斜的搖籃(B)上載著 Ø360 旋轉台(C);行程 X ±400 mm、Y ±300 mm、Z -250 至 650 mm、B ±110°、C 不限 | 自選。 程式會下 B 和 C,所以機台必須有這兩軸,而 HiNC 資源庫裡沒有可公開使用的五軸機。行程與台面大小是配合本系列另一個五軸案例選的,那個案例需要超過 ±60° 的 B 與至少 Ø300 的台面。 |
| 夾具 | 一台通用虎鉗:板子放在兩根平行塊上、位於虎鉗正中,板底在虎鉗底座上方 90 mm,鉗口跨著 25 mm 的板寬夾住、比板面低 2 mm | 自選。 鑽頭會穿透板子,所以孔的下方要留空;倒角刀絕不能碰到鉗口。 |
| 毛胚 | 25 × 64 × 5 mm 的方塊 | 推得,其中一項為自選。鑽孔循環的深度 DP = -6.1835 可以讀成 5 + 0.6835 + 0.5:5 mm 板厚、Ø3.3 名目 135° 鑽尖的高度(1.65 / tan 67.5°),以及 0.5 mm 的穿透量。雕刻與孔都以 X ≈ -12.5 為中心;把 X0、Y0 當成板緣(CAM 的工件原點通常這樣取),板寬就是 25 mm(照片以雕刻長度 48.6 mm 定比例,約 25.7)。照片給出的長度是 64–66 mm;自選:64。 |
| 目標模型 | 無 | 讀取。 來源沒有模型,所以沒有幾何差異可查;驗收只看切削本身。 |
| 程式原點 | 上表面的 +X/+Y 角;在這台機台上 G54 = (12.5, 32, -5) | 推得(鑽孔循環的參考面是 Z0;雕刻與孔都在 X、Y 的負側);G54 的值由 HiNC 3.2.39 從模型量測。 |
| 控制器 | Siemens;刀號 1、2 對應到程式的刀名;$TC_DP 補正列;宣告原機台的 M27、M29、M50、M51、M65;起始與換刀高度 Z610 |
讀取:廠牌與程式用到的碼。自選:刀號。推得:每一項怎麼設(見難題)。 |
| 材料 | 鋁;取資源庫中的 6061-T6 | 推得是鋁:照片是一塊亮面金屬板,而鑽頭的 S23632 在 Ø3.3 上是 245 m/min——正是刀具廠給短屑鋁的值。自選:以 6061-T6 代替。 |
| 倒角刀 | 錐形輪廓 Ø8、與水平面夾 45°、刃長 4 mm、尖頭、4 刃、全長 63 mm;螺旋角 0°、前角 0°、讓角 10°;伸出量 27 mm,裝在熱縮刀把上(鼻端 Ø24,量規長 80 mm) | 讀取自刀具廠資料頁:直徑、輪廓角、刃長、全長、刃數、27 mm 的伸出量。推得:尖頭(4 mm 刃長等於 45° 下的 D/2)。自選:刀把、螺旋角(資料頁只寫「特殊螺旋角」),以及前角與讓角。 |
| 鑽頭 | 錐形輪廓 Ø3.3、135° 鑽尖、20 mm 刃溝、2 刃、Ø6 × 36 mm 刀柄、全長 62 mm;螺旋角 30°、前角 0°、讓角 10°;伸出量 26 mm,裝在 Ø6 刀把上 | 讀取自資料頁,包括 26 mm 的伸出量。自選:刀把、螺旋角,以及前角與讓角。 |
| 刀長 | 107 與 106 mm(刀把量規長 80 加伸出量) | 推得。 |
| 雕刻深度 | 倒角刀補正列上 -0.3 mm 的長度磨耗 | 自選;見〈雕刻只擦過板面〉。 |
| 主軸 | 通用 24,000 rpm 電主軸,連續 7.5 kW | 自選。 程式最高轉速 23,632 rpm;來源沒提主軸。 |
| 任務 | 原樣播放程式;開啟碰撞偵測;第一次用 1 mm,驗收用 0.0625 mm | 自選。 刻線只有 0.6 mm 寬。 |
兩把刀在 HiNC 裡的設定;程式以名稱叫刀,刀號是代理自己定的:
| T1 | T2 | |
|---|---|---|
| 程式裡的名稱 | ENTFRAESER_D8_N_90GRAD |
BOHRER_D3.3_VHM |
| 實際刀具(刀具表與資料頁) | Garant 208110 8,整體碳化鎢 90° 倒角刀,全長 63 mm | Garant 122380 3,3,整體碳化鎢鑽頭,全長 62 mm |
| 輪廓 | 錐形,Ø8,與水平面夾 45°,刃長 4 mm | 錐形,Ø3.3,與水平面夾 22.5°(135° 鑽尖),刃溝 20 mm |
| 刃數、螺旋角、徑向前角、徑向讓角 | 4、0°、0°、10° | 2、30°、0°、10° |
| 刀柄(從刀尖起算) | Ø8,從 4 到 63 mm | Ø3.3 到 23 mm,在 26 mm 處擴到 Ø6,Ø6 到 62 mm |
| 刀把:熱縮刀把,鼻端以上各高度的半徑 | 鼻端 R12,到 55 mm 處漸增為 R16.5,接著 R22 到 63 mm,再以 R31.75 到 80 mm 的量規線 | 鼻端 R10.5,到 55 mm 處漸增為 R15,其餘同 T1 |
| 伸出量;刀長 | 27 mm;107 mm | 26 mm;106 mm |
| 刃部材料 | 碳化鎢,鈷含量 10 %,晶粒 600 nm,取自 HiNC 的資源庫 | 同左 |
代理怎麼管理這件工作¶
- 先定通過標準,再開始跑。 在碰伺服器之前,代理逐行讀過程式,寫下一次正確的執行必須呈現什麼:哪些行會切到、切在哪裡、鑽頭鑽多深、程式原點落在哪裡、哪些字會發出訊息。每一次執行都拿這些來核對,第一次乾淨執行的數字則成為之後所有執行的基準——而不是看它「跑完了」。
- 一切經 Web API,每次寫入都讀回。 代理用 HiNC 網頁本身用的同一組路由建案,每寫一個值就讀回來,存檔、重新載入後再讀一次。
- 先粗後細。 先用 1 mm 在幾秒內檢查設定,之後才跑 0.0625 mm。
- 研究交給別人,決定自己做。 兩個輔助代理平行閱讀 HiNC 的原始碼與文件——一個查機台檔格式,一個查 API 呼叫以及模擬器怎麼處理程式裡的每個 Siemens 字——代理本身則同時推算毛胚。
- 共用的伺服器。 一個 HiNC 實例一次只開一個專案,而同一台伺服器上還有好幾個代理在建本系列的其他案例。代理先宣告自己用哪個實例,每次 reset 前確認沒有執行中的 run,用重新載入丟掉記憶體中的實驗,刪除暫存檔,做完後關閉專案。它把自己寫的五軸機台分享給需要的代理,對方也找出了這台機台的第一個缺陷(第二個難題)。
- 盲建。 自己的建案通過後,代理只把書面指示與輸入檔交給第二個代理。那個代理從零建出專案,得到相同的步數、切深、時間與訊息;它的專案只在隨機產生的識別碼與自由文字註記的措辭上不同。
- 對抗式審查。 另外三個代理被要求找出所有錯處:兩個審來源筆記與指示,一個審本頁。它們的發現都列在下面的難題裡,包括代理自己犯的三個錯。
- 人在哪裡介入。 實例需要代理沒有的登入帳號;代理沒有去讀伺服器的設定,而是問擁有者,由擁有者提供。擁有者的常設規則決定了建法:不用任何客戶或授權不明的東西(所以代理自己寫機台)、每把刀都裝在工廠實際會用的刀把上(所以用熱縮刀把與型錄伸出量)、每個案例的專案放在自己的資料夾。擁有者核准結束這項已完成的工作。之後擁有者把本系列的目的從訓練教材改成這種代理工作紀錄,代理便加做了時間分析與安全高度實驗,展示仿真如何幫上忙,而不只是重播。
難題¶
以下數字除非另註版本,都是在 HiNC 3.2.41、0.0625 mm 下量得。
程式預設的機台,資源庫裡沒有¶
- 情況。 程式會移動 B 和 C(
G0 B0.0 C0.0、SUPA … B=_B_HOME C=_C_HOME);HiNC 資源庫裡唯一的通用機台只有三軸。 - 錯過的風險。 在三軸機上,每個 B、C 字都不會被消化(
Parsing--Unconsumed),重播永遠不會乾淨。 - 怎麼發現。 在建任何東西之前先讀程式。
- 解法。 用腳本寫一台通用機台:主軸頭側 X、Y、Z;繞 Y 傾斜的搖籃(B)載著旋轉台(C);兩個旋轉軸在鏈上都取負向,使 B+、C+ 成為刀具相對工件的 ISO 正向。
- 證據。 HiNC 自行把 B、C 綁成旋轉軸,沒有任何一次重播發出
Parsing--Unconsumed。
搖籃太窄¶
- 情況。 鑰匙圈只用到 B0 C0,但借用這台機台做真正五軸零件(一個傾斜 10°、偏離 C 軸 50 mm 的圓錐台)的代理,在 HiNC 3.2.39 上得到 3,436 則
Collided(B,Z)。 - 錯過的風險。 一台在三軸工作上看起來沒問題的機台,對它原本也要支援的工作卻是錯的。
- 怎麼發現。 那個代理用機台的運動學算出碰撞的範圍:與引擎回報的是同一段(第 96 至 3713 行,對上引擎的第 96 至 3714 句;引擎把「移往下一點」算在下一句),所以是真的干涉。主軸鼻端(半徑 80 mm)到達 |y| = 206 mm,而搖籃側板從 |y| = 200 開始。
- 解法。 側板外移到 |y| 260–320 mm,軸承塔移到 330–450 mm。
- 證據。 那個夥伴案例在加寬後的機台上重播了兩個零件的每一個點,沒有任何碰撞。
有些機台零件永遠不會被檢查碰撞¶
- 情況。 HiNC 產生碰撞對時,沿著機台鏈從地面走到刀具、再走到工作台,並把兩條路上的地面
O與底座base照名稱剔除;掛在base上的零件因此不會列入碰撞對。 - 錯過的風險。 耳軸軸承座——搖籃傾斜時主軸頭最可能撞上的東西——會被畫出來,卻從不被檢查。
- 怎麼發現。 寫鏈之前先讀機台文件。
- 解法。 軸承座掛在鏈上工作台側、自己的元素下。
- 證據。 夥伴案例的碰撞,報在搖籃上,那是鏈上同一側的零件。
存檔改寫了機台檔¶
- 情況。 第一次存檔後,專案載入的機台檔變了樣:HiNC 把角色綁定寫成元素、加上位元組順序記號,並重新排版實體。
- 錯過的風險。 被當成機台來源保存的檔案,會在每次有專案用它存檔時悄悄改變。
- 怎麼發現。 存檔後,那個檔案顯示為已修改。
- 解法。 代理自己做的設定檔留在自己的資料夾、保持原樣;建案時上傳副本到專案、載入的是副本,所以存檔只改寫專案的副本。
- 證據。 每次存檔後,設定資料夾裡的機台檔都沒變,被改寫的只有專案的副本。
讀者拿到的檔案裡沒有機台¶
- 情況。 這個案例的備份包原本只收來源本身的檔案與筆記;機台與虎鉗是代理的作品。
- 錯過的風險。 沒有人能從這個包重建這個案例。
- 怎麼發現。 交給盲建之前,先檢查這個包會包含什麼。
- 解法。 代理自己做的設定檔放在自己的資料夾,並隨案例一起打包。
- 證據。 盲建只用這個包,並且成功。
建案指南的工作台擺放會移動零件¶
- 情況。 本系列的建案指南用一個平移來擺放它那台三軸機的工作台;這台機台已經在同一條連接上帶著工作台的擺放。
- 錯過的風險。 照指南字面做,會蓋掉工作台 100 mm 的下降,整個設定都跟著移位。
- 怎麼發現。 對照機台的鏈讀這一步。
- 解法。 這個案例的指示跳過這一步。
- 證據。 G54 算出來是 (12.5, 32, -5),正是虎鉗幾何放板子角落的位置。
程式的起始點是另一台機台的座標¶
- 情況。 程式用
SUPA G0 Z=_Z_HOME和X=_X_HOME Y=_Y_HOME回起始點,值是 610、-365、224——Spinner 的機械座標。一次執行從機械原點開始,而換刀會把 Z 送到機台的換刀位置,預設是 0。 - 錯過的風險。 在機械原點時,主軸鼻端只在板面上方 5 mm;在 Z0 換刀,新刀會直直往下穿過板子。
- 怎麼發現。 第一次執行前,比對程式的起始點與機台自己的原點。
- 解法。 把起始與換刀高度設為 Z610,也就是程式自己的起始點。
- 證據。 兩列都讀回 610;沒有任何重播發出碰撞或行程錯誤。
設定行程的捷徑只涵蓋 X、Y、Z¶
- 情況。 本系列的三軸案例用一個呼叫同時設 X、Y、Z 的行程;這台機台還需要 B,而逐軸設定的路由接受帶正負號的下限。
- 錯過的風險。 照本系列給三軸機的標準值在這裡用那個捷徑,X、Y、Z 的上限會是 0,程式的起始點 Z610 就超出行程。
- 怎麼發現。 一位審查者讀了這兩個路由在控制器中的原始碼。
- 解法。 逐軸設定 X、Y、Z 與 B 的行程,下限帶負號;無限旋轉的 C 不設。
- 證據。 各行程讀回與送出的相同,沒有任何重播發出
StrokeLimit--*。
程式以名稱叫刀¶
- 情況。
T="ENTFRAESER_D8_N_90GRAD"與T="BOHRER_D3.3_VHM";HiNC 的刀具庫以號碼為鍵。 - 錯過的風險。 沒有對照時,模擬器發出
ToolChange--NameUnresolved、不換刀、什麼都沒切——卻仍回報執行已完成。 - 怎麼發現。 一個輔助代理在剖析器的測試裡找到這種情況。
- 解法。 一張名稱對刀號的表(1 與 2)。驗收從不依賴「已完成」。
- 證據。 兩把刀都有切到:雕刻從第 292 步到第 4,252 步,鑽孔從第 5,161 步到第 5,201 步。
Siemens 補正表是另一張表¶
- 情況。 Siemens 執行依刀號與刃號從自己的
$TC_DP表讀刀長,而不是從 HiNC 由刀具庫填入的通用表;兩張表套用磨耗的正負號也相反。 - 錯過的風險。 空的列會帶著警告退回;用通用表的正負號填磨耗,會讓刀具往錯的方向移動。
- 怎麼發現。 讀 Siemens 補正的文件與剖析器。
- 解法。 寫入 (1, 1) 與 (2, 1) 兩列,刀長 107 與 106 mm,並讀回。
- 證據。 剩下唯一的補正警告是刀號 0 的那一則(見〈第一次叫刀之前的刀具補正〉)。
雕刻只擦過板面¶
- 情況。 倒角刀的程式點停在上表面(Z 0 至 Z -0.009);尖頭 90° 刀在那裡只碰到表面。
- 錯過的風險。 一次碰到零件、卻沒刻出標誌的執行——而且沒有模型可比對,不會有別的東西告訴你。
- 怎麼發現。 代理問:在真實機台上,雕刻深度從哪裡來?不是程式,那就來自設定:刀具資料或工件座標偏移,而資料集沒有記錄。
- 解法。 在倒角刀的
$TC_DP列上給 -0.3 mm 的長度磨耗,就像操作員輸入雕刻深度那樣。這個深度是假設,並如此標明。 - 證據。 有磨耗時,雕刻段的切深峰值是 0.3025 mm,逐步切屑體積加總為 9.55 mm³;磨耗為 0 時,峰值是 0.0025 mm、體積為 0,而鑽孔不受影響。
鑽尖不是資料頁上的那個¶
- 情況。 板厚的推算依據是名目 135° 鑽尖,高 0.6835 mm;鑽頭資料頁寫的刃角到尖端距離是 0.73 mm。
- 錯過的風險。 把名目值說成實際鑽頭的值是錯的,由它推出的板厚也可能有偏差。
- 怎麼發現。 一位審查者拿來源筆記和資料頁比對。
- 解法。 筆記現在寫明,程式作者顯然用的是名目錐:只有這個值能讓 6.1835 成為整數的 5 + 0.5;模型也用同一個錐。
- 證據。 5 + 0.6835 + 0.5 = 6.1835 剛好成立;用 0.73 則湊不出整數板厚。
原機台的五個 M 碼¶
- 情況。 開頭有
M50,結尾有M27、M29、M51、M65。程式的註解說出其中三個:「Spuelung Spaenefoerderer Absaugung」——沖洗、排屑機、抽風。 - 錯過的風險。 每個沒宣告的碼都會發出
Parsing--Unconsumed;把它們從程式刪掉,則會掩蓋程式真正做的事。 - 怎麼發現。 一個輔助代理稽核了程式裡的每一個字。
- 解法。 每一個都宣告為不會移動任何東西的機台功能,並附上註記。程式原樣播放。
- 證據。 在
N80、N6400與N6410有五則DeclaredMCode--UnmodeledEffects,沒有Parsing--Unconsumed。
第一次叫刀之前的刀具補正¶
- 情況。 第
N190行SUPA G0 X=_X_HOME Y=_Y_HOME B=_B_HOME C=_C_HOME D1,在程式叫任何刀之前就選了刃號 D1。 - 錯過的風險。 一則可能被誤認為設定錯誤的警告——或被人用改程式的方式「修掉」。
- 怎麼發現。 它是最後剩下的那一則警告:(T0, D1) 的
SiemensToolOffset--TcdpRowMissing。 - 解法。 保留原樣並加以說明:程式以
T0/M6結束,所以真實主軸在下一次開始時大概也是空的;而這一行是機械座標移動,不切任何東西。 - 證據。 每一次執行都只有這一則警告,盲建的也一樣。
在 HiNC 中,SUPA 不套刀長¶
- 情況。 HiNC 把
SUPA當成G53:該行把主軸量規線定位在機械座標上,不套框架,也不套刀長。 - 錯過的風險。 期待
SUPA期間刀長仍有效的程式,會落在別的位置。840D sl 是否保留刀長,代理沒有查證。 - 怎麼發現。 一個輔助代理稽核剖析器。
- 解法。 檢查程式:每一個移動 Z 的
SUPA行都同時以D0取消補正(N180、N250、N6100、N6240、N6360),所以兩種讀法得到同樣的移動。NC 方言文件的 Siemens 段寫有這個行為。 - 證據。 程式裡五個
SUPA的 Z 移動都帶D0,重播在這些地方都沒有發出行程或碰撞訊息。
MCALL 退回前一行的高度¶
- 情況。
MCALL CYCLE81(10.,0.,3.,-6.1835)指定了退刀面(RTP)10;HiNC 則退回鑽孔位置前一行的 Z。 - 錯過的風險。 前一行的 Z 與 RTP 不同的程式,會退到另一個高度。
- 怎麼發現。 剖析器稽核。
- 解法。 這裡前一行(
N6300)停在 Z10,與 RTP 相同,結果一樣。 - 證據。 程式裡退刀面與前一行的 Z 都是 10。
T0 / M6 讓最後一把刀留在主軸上¶
- 情況。 在真實機台上,程式結尾的
T0與M6會把鑽頭收回;在 HiNC 中,換成刀號 0 什麼都不做。 - 錯過的風險。 之後的任何移動,都會拖著一把真機已經不在手上的刀。
- 怎麼發現。 剖析器稽核。
- 解法。 這裡它是
M30之前的最後一行,所以沒有影響;NC 方言文件寫有這個行為。 - 證據。 它之後沒有任何移動。
指南的伸出量規則與全長固定的刀¶
- 情況。 本系列的建案指南把伸出量定為刃長與最深切削兩者中較長者加 5 mm,再進位到 5 mm 的倍數:倒角刀 10 mm、鑽頭 25 mm。
- 錯過的風險。 一把 63 mm 的倒角刀只露出 10 mm,就得把 53 mm 的刀柄塞進刀把。
- 怎麼發現。 拿規則算出的數字對照刀具自己的全長。
- 解法。 採用型錄的伸出量:27 mm(留 36 mm 刀柄夾持)與 26 mm(鑽頭 36 mm 刀柄全部夾入),並在旁邊寫明理由。代理也在建案指南裡加上:刀具本身的長度迫使伸出量較長時,寫明數值與理由。
- 證據。 由刀長與程式算出:最深處時,刀把鼻端在毛胚上方 26.7 mm(倒角刀)與 19.8 mm(鑽頭)。
本系列建案指南對兩把刀做的刀把檢查:
| 檢查 | T1 倒角刀 | T2 鑽頭 |
|---|---|---|
| 刀把鼻端半徑對刀具半徑 | 12 > 4 mm | 10.5 > 1.65 mm |
| 伸出量對刃長 | 27 ≥ 4 mm | 26 ≥ 20 mm |
| 最深處;當時刀把鼻端的位置 | Z -0.31(程式 Z -0.009,磨耗 0.3 mm);Z +26.7 | Z -6.18;Z +19.8 |
| 指南的伸出量規則;實際採用 | max(4, 0.31) + 5 → 10 mm;27 mm | max(20, 6.18) + 5 → 25 mm;26 mm |
| 刀長 | 107 = 80 + 27 mm | 106 = 80 + 26 mm |
驗收重播中的 Collision--Detected |
無 | 無 |
reset 之前讀到的程式原點是錯的¶
- 情況。 由模型算 G54 的路由,在剛擺好夾具和零件之後,回了一個錯的值。
- 錯過的風險。 整支程式跑在錯的位置。
- 怎麼發現。 夥伴案例在 reset 前讀到 (-62.7, 65.2, -134.9),reset 後才讀到預期的 (50, 0, -55.742)。
- 解法。 先 reset 再計算:reset 是一個邊界,執行中的設定副本要到這時才會吃進工作階段內所做的修改。
- 證據。 這次建案與盲建的 G54 都是 (12.5, 32, -5),雕刻也落在板子上。
共用的主軸檔在第一次存檔時改變¶
- 情況。 本系列使用的主軸描述檔,在第一次存檔時被 HiNC 改寫成較新的格式(2,495 bytes 變成 3,111)。
- 錯過的風險。 拿專案的副本和原檔比對的檢查,會無故失敗。
- 怎麼發現。 盲建在存檔後比對了檔案大小。
- 解法。 上傳當下就比對,而不是存檔之後。
- 證據。 每一次上傳的長度都與本機檔案相符;重新載入沒有回報任何訊息。
只出現一次的訊息¶
- 情況。 碰撞準備的那一對訊息(
Collision-Prepare--Start與--Done)只在碰撞偵測由關轉開時出現:新建專案的第一次重播,或載入一個存檔時偵測關著的專案之後的第一次重播。本案的專案存檔時偵測是開的,所以載入或重新載入之後都不會出現。 - 錯過的風險。 逐一核對每則訊息 id 的驗收,會把同一種執行一次判為乾淨、一次判為不乾淨。
- 怎麼發現。 盲建在粗跑時看到它,細跑時沒有。
- 解法。 預期訊息清單把這對訊息列為可能出現、不算異常。
- 證據。 此後每一次執行的訊息都對得上這份清單。
步數比經驗法則多¶
- 情況。 重播有 5,930 步;「切削時間 × 主軸轉速」預測約 3,800。
- 錯過的風險。 以這條法則估的記憶體會偏低。
- 怎麼發現。 盲建的報告。
- 解法。 主軸轉著時,切削之間的移動也會被仿真成步;代理把建案指南改成以主軸轉動的全部時間估算。
- 證據。 盲建重現了 5,930 步。
一張看得到刀把的圖¶
- 情況。 選取某一步,並不會把畫出來的刀具移過去,而重播頁面預設也不畫刀具。
- 錯過的風險。 一張沒有刀把的圖——本系列不接受。
- 怎麼發現。 最早的幾張圖只拍到虎鉗與板子,刀具停在程式的起始點。
- 解法。 打開刀具的繪製,並在切削途中暫停重播:雕刻時暫停一次,鑽孔則一行一行地推進去。
- 證據。 本頁的兩張 HiNC 畫面。
讀取移除體積¶
- 情況。 逐步切屑體積在整次執行上的加總,約是刻槽幾何體積的三分之一、孔的一半;它到底算的是什麼,沒有查清。
- 錯過的風險。 把它當成移除體積引用,會是錯的。
- 怎麼發現。 拿加總值與刻槽和孔的幾何體積比較。
- 解法。 只用它比較同一支程式的不同執行,從不當作絕對值。
- 證據。 原程式與安全高度變體的加總值,到小數第三位都相同。
代理自己的錯¶
- 情況。 審查在代理的文字裡找到三個錯:標註句列了描述資料集那篇論文的四位作者,而資料集與檔案的署名分別是其中三位與兩位;指示用錯的理由解釋「先 reset」;以及第一次讀照片時,把孔之後的板長讀成 6 mm,照片實際顯示 7 到 7.5 mm。
- 錯過的風險。 授權條件沒有做到;讀者去追一個不存在的原因;長度寫得比照片能支持的更精確。
- 怎麼發現。 審查者拿標註句和資料集自己的紀錄比對、拿解釋和原始碼比對,並重新量了照片。
- 解法。 三個都已更正;審查也讓每個推得的值(板子尺寸、材料、深度)都掛上明確的標示。
- 證據。 下方的標註句與資料集的紀錄相符;長度寫成 64–66 mm,並註明取 64。
結果與效益¶
在 HiNC 3.2.41、0.0625 mm 下量得。仿真週期把換刀算成 0 秒,也沒有加減速。
| 結果 | 數值 |
|---|---|
| 步數;執行的程式行數 | 5,930;644 行全部 |
| 雕刻切深峰值 | 0.30 mm(0.3 mm 磨耗加上程式 0.009 mm 的起伏) |
| 鑽孔每步切深峰值 | 0.88 mm(0.68 mm 鑽尖加上一轉的進給 0.14 mm,在 0.0625 mm 解析度之內) |
| 仿真週期 | 28.70 s |
| 刀具降伏應力比,雕刻 | 0.6 % |
| 主軸功率比,雕刻 | 0.2 % |
| 主軸扭矩比,雕刻 | 0.08 % |
| 最大切削力分量,雕刻 | 19 N(Z);18 N(Y) |
| 切削的累計主軸能量 | 174 J(主軸少轉 10 秒時仍是同一個值,所以只計切削) |
| 最深處刀把鼻端在毛胚上方的高度(計算值) | 26.7 mm(倒角刀)、19.8 mm(鑽頭) |
| 鑽孔的負載(模型算出,不應引用:鑽頭被當成錐形銑刀仿真,見〈誠實的限制〉) | 軸向力 1.6 N,X、Y 為 0(真實 Ø3.3 鑽頭在鋁上約上百 N);熱降伏比 0.60 |
| 訊息 | Sys-Init--FileLines 1、DeclaredMCode--UnmodeledEffects 5、Msg--Display 3(程式的 MSG)、SiemensToolOffset--TcdpRowMissing 1(已說明);沒有 Collision--Detected,沒有 StrokeLimit--* |
用來檢查設定的粗跑與驗收跑:
| 1 mm,HiNC 3.2.39 | 0.0625 mm,HiNC 3.2.41 | |
|---|---|---|
| 步數 | 5,930 | 5,930 |
| 執行的程式行數 | 644 | 644 |
| 是否切到毛胚,整次執行與雕刻段(第 0–5,000 步) | 是 | 是 |
| 雕刻段切深峰值,第 0–5,000 步 | 0.29 mm | 0.3025 mm |
| 鑽孔段每步切深峰值,第 5,000–5,930 步 | 1.61 mm | 0.884 mm |
| 仿真週期 | 28.70 s | 28.70 s |
| 在 32 執行緒的伺服器上重播一次 | 約 6 s | 約 6 s |
一次重播的每一則訊息,以及發出它的程式行:
| 訊息 | 嚴重性 | 數量 | 位置,以及為什麼在預期之內 |
|---|---|---|---|
Sys-Init--FileLines |
訊息 | 1 | 程式檔有 644 行 |
DeclaredMCode--UnmodeledEffects |
訊息 | 5 | M50(N80)、M27(N6400)、M29、M51 與 M65(N6410):原機台自己的功能,已宣告為不移動任何東西 |
Msg--Display |
訊息 | 3 | 程式的 MSG("MILL_FINISH")(N230)與 MSG("DRILL_METHOD")(N6220),以及第二個 MILL_FINISH 合併成的一則(N2740,「repeated 2x」) |
SiemensToolOffset--TcdpRowMissing |
警告 | 1 | N190:在第一次叫刀之前、主軸還是空的(T0)時就選了 D1;見〈第一次叫刀之前的刀具補正〉 |
Parsing--Unconsumed、ToolChange--NameUnresolved、StrokeLimit--*、Collision--Detected |
-- | 0 | 沒有 |

給加工工程師。 仿真告訴你時間花在哪裡。28.7 秒的仿真時間中,21.7 秒是 F2069 的進給,而這 749 mm 的進給路徑裡有 448 mm 是刀具在輪廓之間以切削進給上下 16 mm——13 秒。代理把程式複製一份,把 14 個退刀從 Z16 改成 Z2、兩道雕刻工序開頭以快移到達的進刀點(N330、N2810)保留 Z16,重播後得到 18.18 秒,切屑體積加總、切深峰值、切削能量與訊息都相同。只要真實的夾持低於板面,就像這台虎鉗一樣,每件可省 10.5 秒,而且在花任何機台時間之前就驗證過了。機台紀錄顯示真實每次約 83 秒(含換刀與中斷),所以在機台上的節省比較接近 13 %,而不是仿真的 37 %。機械負載離任何極限都很遠,所以這個零件的時間是由路徑決定,而不是由切削決定。還有,雕刻深度不在程式裡:它應該寫在設定單上。
安全高度實驗的數字,在 HiNC 3.2.41 上,進給路徑取自程式:
| 原樣的程式 | 14 個退刀改成 Z2 | |
|---|---|---|
| 仿真週期 | 28.70 s | 18.18 s:少 10.5 s,-37 % |
| F2069 的進給路徑 | 749 mm,21.7 s | 385 mm,11.2 s |
| 其中在輪廓之間上下的部分 | 448 mm:14 次下刀與 14 次退刀,各 16 mm | 84 mm:兩個進刀點之後的下刀仍是 16 mm,其餘 2 mm |
| 切深峰值,雕刻/鑽孔 | 0.3025/0.8842 mm | 相同 |
| 逐步切屑體積加總,雕刻/鑽孔——只作比較用(見〈讀取移除體積〉) | 9.550/23.356 mm³ | 到小數第三位都相同 |
| 切削的累計主軸能量 | 174 J(4.842 × 10⁻⁵ kWh) | 相同 |
| 訊息 | 如上所列;沒有碰撞 | 相同 |
給老師或學生。 這一支短短的程式,涵蓋了 Siemens 840D sl 程式和 ISO G 碼大部分的不同之處:變數、機械座標移動、擺角與平滑及鑽孔的循環、以名稱叫刀與 $TC_DP 表,以及機台特有的 M 碼。這個案例也示範了在沒有模型時,能從程式讀出多少東西——從鑽孔深度讀出板厚、從對稱讀出板寬——以及讀取到哪裡為止、之後就必須標明是假設。
給評估這種做法值不值得的人。 在 32 執行緒的伺服器上,每次重播兩種解析度都約 6 秒;代理總共跑了約二十次,包括實驗與拍圖。一次執行約需 30 MB 的步結果,加上服務本身約 1 GB 的基底(依文件的規則估算,未實測)。除了建案的代理,還有七個輔助代理參與:三個做研究、一個盲建、三個審查。人只需要出手兩次:提供登入帳號,以及核准結束這項工作。審查找到的錯誤都在發佈前修正了。
誠實的限制¶
- 板子的尺寸、材料與雕刻深度,是代理對程式與照片的解讀,不是來源的資料。5.5 mm 的板子不留穿透量、或 4.5 mm 的板子穿透 1 mm,也都符合鑽孔深度。
- 機台不是 Spinner U5-620。它的座標不同,只用到 B0 C0,而真實的夾持方式未知。
- 鑽孔的物理量不是鑽削模型:鑽頭被當成錐形銑刀仿真,軸向力(不到 2 N)遠低於真實鑽頭。它的幾何——切在哪裡、切多深——是對的;它的負載不應引用。
- 仿真週期沒有加減速,換刀算成 0 秒。安全高度的節省只在仿真中驗證;切屑、冷卻液與真實機台的加減速都不在其中。
- 刀把離板子的間隙是代理自己的檢查:最深處時刀把鼻端在板面上方多高,由刀具幾何與程式算出(見〈指南的伸出量規則與全長固定的刀〉);驗收重播的碰撞檢查不是它的證據。
- 840D sl 在
SUPA期間是否保留刀長,沒有查證;這支程式兩種情況結果都一樣。
讀者可以帶到自己案例的¶
- 沒有模型時,程式本身仍帶著尺寸:固定循環的參考面與深度、對稱的特徵、孔的位置。
- 用尖頭刀、路徑停在 Z0 的程式,深度來自設定。在相信一次乾淨的執行之前,先查清楚它從哪裡來。
- 面對 Siemens 程式:對應刀名、填
$TC_DP、宣告機台自己的 M 碼、從程式的SUPA移動取起始與換刀高度,並檢查每個SUPA的 Z 移動是否帶D0。 - 在 reset 之後取程式原點。
- 看時間分解。沒切到東西的進給移動,是最便宜能省下的秒數,而仿真能證明切削沒有改變——但要拿節省和真實週期比,而不是和仿真週期比。
- 依證據驗收——步數、切到什麼、切深、時間、每一則訊息的 id——絕不依「已完成」。
來源與授權¶
- 程式與刀具表:B. Engelmann, A.-M. Schmitt (THWS),https://github.com/ElMoe/Production-Data-Set-for-Five-Axis-CNC-Milling-with-Multiple-Changeovers,為 B. Engelmann, A.-M. Schmitt, M. Martinez, "Production Data Set for Five-Axis CNC Milling with Multiple Changeovers", https://doi.org/10.5281/zenodo.15735480 的外部資料。
- 描述於 M. Martinez, A.-M. Schmitt, A. Schiffler, B. Engelmann, Scientific Data 12, 1067 (2025), https://doi.org/10.1038/s41597-025-05294-0。
- 授權:Creative Commons Attribution 4.0 International,https://creativecommons.org/licenses/by/4.0/,依現狀提供,不附任何保證。
- 修改之處:程式與刀具表原樣使用。安全高度實驗重播的是一份把 14 個退刀的 Z16 改成 Z2 的程式副本;這份副本不對外發佈。毛胚、機台、虎鉗、刀把與補正由代理推得或自選。兩張看得到刀把的圖是那個仿真的渲染畫面;示意圖與圖表由程式與代理的設定檔繪出;三個產品的照片是資料描述論文的圖 2(© The Author(s) 2025),依 CC BY 4.0 原樣重製。
- 讀者請到原網站取得檔案;本頁不提供下載。連結失效時可搜尋:「Production Data Set for Five-Axis CNC Milling with Multiple Changeovers」、「Keychain_Schluesselanhaenger.mpf」。公司網站保留一份原始檔的副本,只作為原始連結失效時的備份。
從 GitHub repository 取得的檔案,可以用來源筆記給的 SHA-256,核對它是否就是本頁仿真所用的那一個:
| 檔案 | commit b800366 時在 repository 中的路徑 | SHA-256 |
|---|---|---|
Keychain_Schluesselanhaenger.mpf |
NC_code/Keychain_Schluesselanhaenger/Keychain_Schluesselanhaenger.mpf |
df1831facaed2c20fb3ab6735d8894bfe01fdf7ffc8412ceefb453f6fda5cb8f |
Tool_information.csv |
Tool_information/Tool_information.csv |
139243c00f0841ac6b10981eaf7c5afbcb3fe6b5d0d981bda4bfd09f43fa63af |
另見¶
- 實作案例——本系列的其他案例
- 專案建構——這些步驟所依循的建案流程
- 透過 HTTP API 進行重播驗收——一次執行據以驗收的證據
- Siemens 刀具補正(英文,未鏡像)——
$TC_DP表 - 刀具幾何——刀把輪廓、伸出量與刀長