Heidenhain 控制器支援¶
Heidenhain 程式只由一組控制器預設組 (preset) 執行,這組預設組兩種方言都讀——TNC klartext(TNC 640 / TNC 530 對話式)與 Heidenhain DIN/ISO。沒有另外的選項要選:把專案的控制器選為 Heidenhain,程式是用哪種方言寫的,就以哪種方言讀取。
涵蓋範圍以與通用 NC 碼支援相同的三種狀態表述——照辦、認得但不作用、拒絕。認得但不作用是刻意設計的狀態:該語法結構會被消化掉,並以它自己的訊息 id 回報,因此絕不會被悄悄誤讀成別的東西。PLANE AXIAL B+45 永遠不會被誤認為旋轉軸指令。
程式格式¶
分隔符號可有可無¶
klartext 通常在字母指令之間以空白分隔,控制器顯示的也是這種寫法。有些後處理器輸出的是同一支程式、卻完全不帶分隔符號。兩種形式都能解析,進給字與數值分開寫的形式也能。
等價,且全部可解析:
L X-26.3 Y+43.1 Z+100.3 A-90.0 C+13.123 FQ3與LX-26.3Y+43.1Z+100.3A-90.0C+13.123FQ3L X+0 Y+0 R0 FMAX與LX+0Y+0R0FMAXFMAX M03 M08與FMAXM03M08F20000與F 20000
多行區塊¶
以波浪號 (~) 續行、跨多行書寫的一個敘述——CYCL DEF 本體或一長串 PLANE 敘述的常見樣子——會在解析前先接回成一個區塊 (block),因此會被當成它原本就是的那一個敘述來讀。
結構區塊(*)¶
第一個字是 * 的區塊是結構區塊——後處理器為控制器的結構視窗寫出的項目,例如 * - OPERATION: ROUGH - TOOL: T0。整行都是註解,並以註解記錄;裡面沒有任何東西會被讀成字,所以例子裡的 T0 是文字,不是刀具呼叫。出現在區塊其他位置的 *,例如 Q1 = Q2 * 3,是算術。
運動¶
| 語法結構 | 支援情形 |
|---|---|
L |
直線運動,帶其軸字,絕對或 I 前綴的增量皆可。見增量軸字。 |
LN |
曲面法向量區塊——一段直線,帶終點加上最多兩個單位化向量,元素順序固定為 X,Y,Z → NX,NY,NZ → TX,TY,TZ。終點字可帶 I 前綴;向量字沒有增量形式。見向量區塊。 |
FMAX |
快速移動。 |
CC / C |
圓弧運動——CC 設定極點,C 給出終點。DR- 為順時針、DR+ 為逆時針,圓心一律來自模態的 CC 而非 C 區塊本身,而終點回到起點的圓弧就是整圓。兩種開頭都接受 I 前綴的字——CC 上的增量極點、C 上的增量終點。見圓弧中心。 |
RL / RR / R0 |
半徑補正 左/右/取消。 |
M91 |
該區塊單次有效的機械座標移動。 |
M126 / M127 |
旋轉軸最短路徑移動 開/關。兩者都沒下時,預設就是最短路徑。I 前綴的旋轉軸字無論如何都豁免——見增量軸字。 |
M140 MB+n / M140 MB MAX |
沿刀軸退刀——退 n mm,或退到 Z 正向行程極限。沒有設定行程極限時,MB MAX 回報 M140--NoStrokeLimit 並被略過。該敘述自己的 F 驅動這次退刀,但不會進入模態進給率。 |
STOP |
程式停止,與 M00 / M01 並列。 |
CYCL DEF 32 TOLERANCE |
路徑平滑公差。 |
BLK FORM |
記錄為毛胚宣告。它不會取代專案裡設定的工件。 |
增量軸字(I 前綴)¶
軸字可以帶 I 前綴——IX+20、IY-15、旋轉軸 IC+90——此時它是相對值而非座標。有五種敘述開頭會讀這個前綴:L、C、CC、LN 與 CYCL CALL POS。在前四種上它是距上一個程式位置的距離;CYCL CALL POS 寫法相同,但量的是距前一個 CYCL CALL POS 座標的距離,說明見循環與呼叫。L、C 與 LN 接受完整的軸集合,含旋轉軸字母;CC 與 CYCL CALL POS 只接受 X / Y / Z,因為兩者都不定位旋轉軸。
這個前綴是逐字的,不是一種模式——klartext 沒有對應模態 G90 / G91 的東西,一個區塊裡只有標了 I 的字才會被讀成距離。因此絕對字與增量字可以在同一個區塊裡自由混用。
可解析:
L IX+20 IY-15——兩軸都是相對值L X+60 IY-10——X 到 60,Y 走 −10LIX+20IY-15——黏在一起,和不帶分隔符號的絕對形式一樣能解析L IX5——正負號可省略L IZ+Q2與L IY-Q2——前綴後面的數值文法是共用的那一套,所以Q參數或括號運算式都能像其他數值一樣進到這裡
旋轉軸的 I 字是鏈式尺寸 (chain dimension)——帶正負號的行程——它保留累加出來的值,而不會被折進 ±180° 的最短路徑範圍:從 75° 走 IC+270 停在 345°,不是 −15°。這項豁免是逐字、逐區塊的。它不會把該區塊其餘部分的最短路徑關掉:同一個區塊上的絕對旋轉軸字仍走短的那一邊,M127 也仍是那個模態開關。
這個控制器上還有一種 I 寫法,根本不是這個機制:CYCL DEF 7 原點平移的字平移的是作用中的原點,而不是定位某一軸,說明見原點。
圓弧中心(CC)¶
C 區塊從不自己給圓心。每個平面內分量都從模態的 CC 段解出:先看 CC 區塊自己的軸字,再看前一個 CC 的同一軸,最後才是圓弧自己的起點。不帶任何座標的 CC 是一次就供應全部三個座標的唯一寫法——它取上一個程式位置(在 CC 區塊處讀取,而不是在圓弧處),並取代模態圓心而非繼承它。手冊自己的那種寫法就是靠這點成立的:CC 在圓心上、移到圓弧起點、再下 C 區塊。
增量圓心不是那種寫法。CC IX+0 IY+11 給出了一個圓心——距上一個程式刀具位置的距離,絕不是距前一個圓心——而到圓弧取用它時它已經是絕對值了。座標讀不出來的 CC 也不是那種寫法:它留下殘餘文字並回報 UnparsedText--Remaining,且因為它沒給出圓心,每一軸都落入模態鏈——有前一個 CC 時取其同一軸,否則才如下取圓弧自己的起點。無論哪種情況,讀不出來的那個 CC 區塊所在的位置都不會被讀成圓心。
落在圓弧自己起點上的圓心讓該區塊沒有半徑、因此沒有圓弧幾何:它回報 Arc-CircleCenter--OnStartPoint 並降級成一段到終點的直線移動。只要有一個平面內座標就能避開這種情形——模態鏈仍把另一個座標留給起點的圓弧保有真實幾何,會正常播放,只有優化器的切分 (splition) 會拒絕它,說明見優化輸出。
向量區塊(LN)¶
CAM 產出的五軸程式以向量而非旋轉軸字表示姿態。LN 區塊帶著終點,加上曲面法向量 NX/NY/NZ——3D 刀具補正的方向——以及可選的刀具向量 TX/TY/TZ。HiNC 把主導的那個向量解算成機台的旋轉軸,再把結果餵進旋轉軸字程式所用的同一套 RTCP 機制,因此不存在第二條需要另外推敲的運動路徑。
由哪個向量主導,遵循控制器自己的規則:
| 情況 | 刀軸 |
|---|---|
有 T,且 M128 或 FUNCTION TCPM 作用中 |
T 向量——刀具維持所設定的方位。 |
沒有 T,RTCP 作用中 |
曲面法向量 N——刀具保持垂直於輪廓。 |
| RTCP 未作用 | T 向量被忽略,正如控制器忽略它一樣。回報為 Orientation-Vector--IgnoredNoTcpm,姿態維持不動。 |
同一個區塊把 RTCP 開起來就算 RTCP 作用中,所以一個既啟動 RTCP 又帶向量的區塊不會被略過。
在信任結果之前,有兩個限制值得知道:
- 向量是在未傾斜的程式座標框架下讀取的。作用中的
PLANE傾斜底下的LN區塊會回報Orientation-Vector--TiltedFrameAssumed,而不是被重新映射。 - 沿曲面法向量的補正(
DR2/ 3D-ToolComp)認得但不作用——SurfaceNormal--CompNotSimulated,每次運行回報一次。
非單位長度的向量會被單位化並回報(Orientation-Vector--NotNormalized);零向量回報為 Orientation-Vector--ZeroVector。
刀具¶
TOOL CALL 自己就完成換刀——klartext 沒有另外的 M06 觸發。接受刀具編號或帶引號的刀具名稱。
可解析:
TOOL CALL 1 Z S5000TOOL CALL "1" Z S5000TOOL CALL "B40R" Z S3000 DL+0.5
- 主軸轉速
S以模態記錄。 DL是長度差量——有效刀具高度是刀具表高度加上DL。DR會被讀取並記錄,但不套用:半徑補正照用刀具表的半徑,且該區塊回報ToolChange--DeltaUnsupported。- 不是字面值的
DL/DR——例如尚未求值的變數——會被忽略並回報ToolChange--DeltaNotLiteral。 Z以外的刀軸回報ToolChange--AxisUnsupported。- 抓不到刀具編號的
TOOL CALL——例如尚未求值的變數——回報ToolChange--MissingToolId。 TOOL CALL 0是零刀,和控制器上一樣:不管刀具表放什麼,它的長度補正都是 0;刀具庫沒有 0 號刀時,主軸上原本的刀留著不動。在M128之下,這樣的程式是把主軸的量測基準點沿著刀路走,而不是刀尖——後處理輸出若還帶著 CAM 系統沒設定的 0 號刀,得先呼叫真正的刀,才切得到程式寫的位置。
TOOL DEF 也會讀。刀具表作用中時它是預選刀——TOOL DEF 5 讓刀庫先備好 5 號刀等下一個 TOOL CALL,什麼都不換——舊式在程式內定義刀具的寫法 TOOL DEF 5 L+10 R+5 則同時寫出刀長與半徑。這個區塊會被記錄(ToolPreselect),不換刀;L 與 R 只記錄、不套用,因為刀具庫就是刀具表。有些後處理器在每個 TOOL CALL 後面寫一行空的 TOOL DEF,它什麼都沒指名,直接消化、不留紀錄。
主軸是由 M3 / M4 啟動的,不是由刀具呼叫的 S,兩者可以分在不同區塊:TOOL CALL 22 Z S5305 之後單獨一行 M3 是控制器自己的寫法,不回報任何東西。兩者之間的區塊帶著轉速、沒有方向,所以那些區塊不算切削物理。只有在主軸有轉速卻從未下達方向的情況下做出的進給移動,才會從那個移動起假設為順時針,並在那裡回報 SpindleDirection--AssumedCw——見通用 NC 碼支援的說明。
原點¶
CYCL DEF 247 設定原點預設點 (preset),CYCL DEF 7 則是疊在其上的加法式平移,這正是 TNC 的語意。兩者在座標鏈中作為各自獨立的項目組合起來,而不是彼此取代。
可解析:
7.0 那一行的循環名稱可有可無:有些後處理器在軸字行前面只寫一行空的 CYCL DEF 7.0,平移一樣照讀,X 也在。
CYCL DEF 7 的軸字本身也可以帶 I 前綴——CYCL DEF 7.2 IY+5 在上一次有效的平移之上,再把原點沿 Y 多平移 5。與 L / C / CC / LN 的字不同,這個完全不是距刀具位置的距離:它留在循環自己的紀錄裡,永遠不會變成逐字的增量定位,因此也永遠碰不到優化器的增量防護。只有 X / Y / Z 會被套用;那裡的非零旋轉軸字,IC+90 與 C+90 一樣,會被消化掉並回報為 Datum-Shift--Rotary。
Q 參數與 FN¶
凡是需要數值的地方都讀 Q、QR、QL 與 QS 參數,所以 FQ1 進得了進給率、L X+Q2 進得了程式位置、TOOL CALL SQ3 進得了主軸轉速。Q0–Q99 自由參數與 QR0–QR499 永久參數以專案資料保存,隨專案一起儲存。
| 語法結構 | 支援情形 |
|---|---|
FN 0–FN 5 |
指定值與算術運算,包括 FN 4 的 DIV 關鍵字與 FN 5 的前置 SQRT。 |
FN 9–FN 12 |
條件跳躍——會執行,並對每個標籤設有迭代上限,讓損壞或惡意的程式無法無限打轉。 |
其他 FN 操作碼(FN 14、FN 16、FN 18 SYSREAD、…) |
認得但不作用。該敘述會被認領並回報,因此其目標參數保持空白,而不是被填入捏造的值。 |
可解析:
Q1 = 5000FN0: Q1 = 5000FN1: Q1 = -Q2 + -5FN2: Q1 = +10 - +5FN3: Q2 = +3 * +3
傾斜平面與 RTCP¶
| 語法結構 | 支援情形 |
|---|---|
PLANE SPATIAL |
完整組合,包括 SEQ+ / SEQ-、COORD ROT / TABLE ROT,以及 STAY / MOVE / TURN 三種定位行為。 |
PLANE RESET |
取消傾斜。 |
PLANE VECTOR |
結構上有擷取,但不仿真。 |
PLANE EULER / POINTS / RELATIV / AXIAL / PROJECTED |
認得但不作用——會被消化掉並回報為 HeidenhainPlane--Unsupported,並保留先前的傾斜。 |
FUNCTION TCPM |
照辦,讀作預設的 REFPNT TIP-TIP。以中心為參考的參考點(REFPNT CNT-CNT / TIP-CENTER)是認得但不作用:座標仍當成刀尖對刀尖來讀,所以以 CNT 為參考的 CAM 輸出在仿真時會沿刀軸偏掉一個球半徑。回報為 Orientation-RefPoint--CntNotSimulated。 |
M128 / M129 |
刀具中心點控制 開/關——真正的 RTCP,即 ISO G43.4 與 Siemens TRAORI 在 Heidenhain 上的對應物。 |
可解析:
PLANE SPATIAL SPA-60.3 SPB+0 SPC-19.88 STAY SEQ- TABLE ROTPLANE RESET STAY
循環與呼叫¶
CYCL DEF 2xx本體會連同其Q參數一起讀入區塊。循環 200、232、251、252 與 253 對應到共用的鑽孔機制並予以仿真;對應依循環自己的Q值而定,所以Q202啄鑽增量導向啄鑽,Q211孔底停留導向孔底停留的鑽孔。- 不屬於上述的
CYCL DEF本體認得但不作用——回報為HeidenhainCycl--Unsupported。 CYCL CALL與CYCL CALL POS觸發循環一次;M99觸發一次,M89則啟動模態觸發。CYCL CALL POS的位置字可帶I前綴,其參考基準是控制器自己的那一個:由前一個CYCL CALL POS最後程式指定的座標,而不是目前的刀具位置。該軸先前沒有任何呼叫時,增量沒有參考基準,控制器會拒絕該區塊(其錯誤碼1A0-0108);仿真則回報HeidenhainCyclCall--IncrementalNoReference,並改以上一個程式位置為基準解算。若刀具在兩次呼叫之間移動過,兩個候選基準就不一樣——採用控制器所述的那一個,並把差異回報為HeidenhainCyclCall--IncrementalAfterMove。CALL LBL n把標籤本體一路到LBL 0為止內嵌展開;CALL LBL n REP m把該段重複m次。CALL PGM依檔名解析被呼叫的程式。- 鏡射 (Mirror image) 兩種寫法都支援——klartext 的
CYCL DEF 8形式與 DIN/ISO 的G28形式。
DIN/ISO 方言¶
同一組預設組,沒有任何東西要切換。
%紙帶標頭與N區塊編號。T加M06換刀。- 圓弧中心
I/J/K是絕對的極點座標,不是距起點的增量偏移。這是 Heidenhain 的讀法,且極點會以模態方式延續。 - ISO 標籤家族——
G98 L<n>定義,以及位於區塊開頭的L<n>,<m>呼叫,其逗號數對應到重複次數。 G247 Q339標記與CYCL DEF 247相同的原點預設點。- 帶軸字的
G54讀作原點平移宣告。 G70/G71單位。
Warning
Heidenhain 上的 G28 是鏡射 (MIRROR IMAGE),不是原點復歸。 Heidenhain 預設組刻意不含 Fanuc 對 G28 的讀法。Heidenhain DIN/ISO 檔案請選 Heidenhain 控制器——若當成 Fanuc 來讀,每一句鏡射敘述都會變成回原點的移動。
優化輸出¶
優化後的程式是逐區塊修補回原始文字,而不是重新輸出,因此它會以原本書寫的方言回來;有兩條規則確保結果仍是 TNC 接受的程式。
優化器寫進一個原本不帶進給的區塊的進給字,會落在座標字之後、也在 DR+ / DR- 與 RL / RR / R0 之後,因此控制器期望的元素順序——座標、旋轉方向、半徑補正、F、M——在修補後的區塊上仍然成立:L X+10 Y+20 RL 回來會是 L X+10 Y+20 RL F500。已經帶 F 的區塊,那個字留在原位,只改它的數字——除非進給是 FMAX、FAUTO 或 Q 參數,修補模式拒絕改寫這些:區塊會原封不動留下,並回報 Writeback-Patch--KeywordValue 或 Writeback-Patch--VariableValue。
優化器嵌入的來源註解以 klartext 的註解文法寫出——; 註解,絕不是括號註解,因為 TNC 會把括號當成程式碼讀:
重新插補本身不會因為是 klartext 就被拒絕。當模態的 CC 鏈供應了兩個平面內圓心座標、且 C 區塊自己的字都是絕對值時,C … DR± 圓弧會像其他圓弧一樣被切開:不重建任何圓心字,每個片段帶著該區塊自己的字、配上各自的終點與進給,圍繞它們共用、原樣不動的那一行 CC。增量的 CC 不會讓它所餵的圓弧失去資格——逐字標記只落在 CC 區塊本身、從不往後延續,圓心到達圓弧時已經解算完成。
有兩種形狀會改以整行為單位優化。各自回報自己的 id,每次運行一次。
- 模態鏈留下一個平面內座標未給定的圓弧——從沒有任何
CC給過它,所以由圓弧自己的起點供應,而每個片段都會從自己的起點重新推導那個圓心:NcOpt--SplitionStartPointCenterUnsupported。 - 本身帶增量字的那一段——klartext 的
I前綴字,例如合法且完整仿真的C IX+20 IY+0 DR-,或 DIN/ISO 方言裡的G91區塊。片段改寫輸出的是絕對座標,所以每個片段都會從自己的起點再套用一次那段距離:NcOpt--SplitionIncrementalUnsupported。這項檢查只看該段自己的區塊——模態CC鏈的狀態既不會觸發它,也不會讓某一段豁免。
拒絕¶
FK 自由輪廓程式、SL 循環、PATTERN DEF 與 TCH PROBE。這些字會留下來沒被消化掉,帶有它們的區塊會回報 Parsing--Unconsumed 並點名那些字。
不在上述 Heidenhain 詞彙之內的機台專屬 M 碼是在機台上宣告,而非內建——見通用 NC 碼支援的 M 碼說明。