# ============================================================================
# NcCycleSense 機台設定檔 · 範本
#
# 複製這個檔案、改成你的機台，然後：
#
#     nccs estimate 你的程式.nc --machine machines/你的機台.toml
#
# ----------------------------------------------------------------------------
# 每個值後面的「參數 xxxx」是 Fanuc 30i/31i/32i-B 的參數編號
# （來源：B-64490EN/03 參數手冊，見 reference/notes/fanuc-加減速參數對照.md）。
#
# 如果你能從機台的參數畫面或參數備份檔讀到這些值，就能把校正等級從
# T0（族預設 —— 每個值都是假設）提升到 T1（參數檔 —— 值來自你這一台機器）。
#
# **0i 系列的參數編號不完全相同**，請對照你機台的參數手冊。
# ----------------------------------------------------------------------------
# 打錯的鍵會**報錯**，不會被忽略 —— 那是刻意的：
# 把 arc_min_feedrate 打成 arc_min_feed 若被靜默忽略，你會以為自己設定了
# 圓弧進給下限，而工時錯了也不會知道。
# ============================================================================

schema = 1
id = "my-machine"                 # 內部識別碼，英數與連字號
name = "廠商 型號"                 # 顯示在報告上的名稱

# 校正等級。誠實填 —— 報告會把它印出來，而它決定了誤差的預期範圍。
#   T0 = 直接用控制器族的預設值（沒讀過這台機器的任何參數）
#   T1 = 從參數檔／參數畫面讀到了下面的加減速數值
#   T2 = 跑過探測程式實測
#   T3 = 用歷史實測資料回歸修正過
calibration = "T0"

# ----------------------------------------------------------------------------
# 軸
#
# 順序就是報告與內部陣列的順序。三軸機填 X/Y/Z 三個；
# 五軸再加旋轉軸（kind = "rotary"）。
# ----------------------------------------------------------------------------
[[axes]]
name = "X"
kind = "linear"                   # linear（mm）或 rotary（度）
travel_min = -350.0               # 行程下限，機械座標（參數 1320/1321）
travel_max = 350.0
rapid_velocity = 48000            # mm/min  ← 參數 1420（快速移動速度）
cut_velocity_max = 20000          # mm/min  ← 參數 1430（最大切削進給）
rapid_accel = 4000                # mm/s²   ← 參數 1671（快速移動的最大允許加速度）
cut_accel = 2000                  # mm/s²   ← 參數 1660（插補前加減速的最大允許加速度）
# jerk = 加速度 ÷ 加速度變化時間。參數 1772 是加速度變化時間（毫秒）：
#   1772 = 20ms、cut_accel = 2000 → jerk = 2000 / 0.020 = 100000
# 1772 = 0 代表梯形加減速（沒有 jerk 限制），這時 jerk 填 0，
# 並把下面的 cascade 設成 1。
jerk = 100000                     # mm/s³   ← 由參數 1772 導出

[[axes]]
name = "Y"
kind = "linear"
travel_min = -250.0
travel_max = 250.0
rapid_velocity = 48000
cut_velocity_max = 20000
rapid_accel = 4000
cut_accel = 2000
jerk = 100000

[[axes]]
name = "Z"
kind = "linear"
travel_min = -300.0
travel_max = 0.0
rapid_velocity = 36000
cut_velocity_max = 15000
rapid_accel = 3000
cut_accel = 1500
jerk = 75000

# ----------------------------------------------------------------------------
# 運動模型（平滑／精度模式）
#
# **索引 0 是連續切削（G64／AICC），索引 1 是精確停止（G61）** ——
# 順序固定，因為方言表用索引對應 G 碼。
#
# 同一支程式在這兩個模式下可以差 20~30%，而真實程式會中途切換。
# ----------------------------------------------------------------------------
[[motion_models]]
name = "continuous"               # 僅供人閱讀
# 濾波施加位置。現代機台開 AI 輪廓控制時是插補前（before_interpolation）；
# 傳統模式是插補後（after_interpolation，轉角會有路徑誤差）。
# FIR 級聯數：1 = 梯形（參數 1772 = 0）、2 = S 曲線／鐘形、3 = snap 限制
cascade = 2
lookahead_blocks = 200            # 前視段數（AI 輪廓控制的前視能力）
corner_axis_velocity_delta = 600  # mm/min  ← 參數 1783（轉角允許的逐軸進給差）
arc_accel_clamp = 2000            # mm/s²   ← 參數 1735（圓弧插補的最大允許加速度）
arc_min_feedrate = 300            # mm/min  ← 參數 1732（圓弧夾制的進給下限）
# 每個程式段的最小處理時間。**精修高段密度程式時這是真正的瓶頸**，
# 可達總時間的 100%。手冊查不到，要用探測程式量（T2）。
block_processing_time = 0.0008    # 秒
in_position_check = false         # 連續切削不做到位檢查
in_position_time = 0.0

[[motion_models]]
name = "exact_stop"               # G61
cascade = 1
lookahead_blocks = 1
corner_axis_velocity_delta = 0    # 每段結束都要停 → 轉角速度為 0
arc_accel_clamp = 2000
arc_min_feedrate = 300
block_processing_time = 0.0008
in_position_check = true
in_position_time = 0.010          # 到位等待（參數 1826 的到位寬度決定它的量級）

# ----------------------------------------------------------------------------
# 非切削時間（可省略，省略時用預設值）
#
# **這是最容易拿到的準確度**：佔總時間 15~35%，而 CAM 幾乎完全不算。
# 這幾個值不需要查手冊 —— 拿秒錶量就好，而且量一次可以用很久。
# ----------------------------------------------------------------------------
[non_cutting]
tool_change = 4.0                 # 秒，切屑到切屑（chip-to-chip）
spindle_accel_rpm_per_s = 3000    # rpm/秒，0 → 8000rpm 要 2.7 秒
spindle_orient = 0.8              # 秒，M19 主軸定位
coolant = 0.3                     # 秒
program_overhead = 2.0            # 秒，程式起始／結束的回原點

# ----------------------------------------------------------------------------
# 固定循環的廠商相關數值（可省略）
#
# 這些是控制器參數，程式裡看不到。用到啄鑽或攻牙的程式，報告會告訴你
# 「這幾個值目前是假設」。
# ----------------------------------------------------------------------------
[canned]
peck_clearance = 1.0              # mm ← 參數 5115（G83 每次啄完退到 R 平面後，
                                  #      快速下降到「上次深度 + 此間隙」，
                                  #      這段間隙是**進給**走的）
high_speed_retract = 1.0          # mm ← 參數 5114（G73 每次只退這麼多）
tap_return_feed_factor = 1.0      # 攻牙回程進給倍率（1.0 = 與進刀同進給）

# ============================================================================
# 運動鏈（五軸才需要；三軸整段省略）
#
# 沒有這一段時，`G43.4`（刀尖點控制）會被回報為不支援 ——
# **不會靜默把 X/Y/Z 當成直線軸座標**。那個靜默處理的後果是：
# 旋轉軸不為零時，位置與時間都是錯的，而兩者都不會報錯。
#
# 有旋轉軸而沒有運動鏈是**合法的中間狀態**：那台機器可以做定位五軸（3+2），
# 旋轉軸的速度與加速度照樣進進給規劃，只是刀尖補正算不出來。
#
# ----------------------------------------------------------------------------
# 怎麼寫
#
# 每個 [[joint]] 是一個關節，**由機台基座往外**排列。兩條鏈：
#
#   基座 ──刀具鏈（chain = "tool"）──> 主軸鼻端
#     └──工件鏈（chain = "work"）──> 工件座標原點
#
# **直線軸屬於哪一條鏈是有差的**：X 移動工作台與 X 移動主軸，
# 在旋轉軸轉過之後會得到不同的相對位置。
#
# 三種常見構型只是關節分配的結果，不是要宣告的東西：
#
#   | 構型 | A/B | C |
#   |---|---|---|
#   | table-table（搖籃式） | work | work |
#   | head-table | tool | work |
#   | head-head（雙擺頭） | tool | tool |
#
# 我們**刻意不認得構型名稱**：Fanuc 參數 19682 有一組構型代碼
# （手冊範例值 12、21），但那張對映表還沒確認（PR-0046）——
# 讀對值卻對映錯，比讀不到更危險，因為它看起來像資料。
#
# ----------------------------------------------------------------------------
# 向量為什麼拆成三個鍵
#
# 設定檔用的是自己寫的 TOML 子集（DR-66：一份解析器，三個外殼共用），
# 不支援陣列值，所以 `dir = [1, 0, 0]` 寫不出來。
# 拆成 dir_x/dir_y/dir_z 囉唆，但每個分量因此有自己的錯誤位置。
# ============================================================================

# [kinematics]
# spindle_dir_x = 0.0               # 主軸方向（在主軸鼻端的座標系裡）
# spindle_dir_y = 0.0               # 立式主軸朝下 = (0, 0, -1)
# spindle_dir_z = -1.0

# --- 直線軸 ---
# [[joint]]
# chain = "tool"                    # tool（基座→主軸）或 work（基座→工件）
# kind = "linear"
# axis = "X"                        # 對應 [[axes]] 的 name，**用名字不用索引**
# dir_x = 1.0
# dir_y = 0.0
# dir_z = 0.0

# --- 旋轉軸 ---
#
# pivot_* 是**旋轉軸心在機械座標裡的位置** ← 參數 19700~19714（PR-0046）。
#
# ⚠ **這三個數字填錯不會報錯。** 它只會讓 RTCP 的刀尖位置安靜地偏掉 ——
#    位置檢查看不出來，工時也不會爆掉，只是不對。
#    要用在報價上，請從機台的參數畫面抄真值。
#    省略時預設為原點，那等於「軸心通過機械原點」，多數機台不是那樣。
#
# 用 `nccs machine <你的檔案>` 可以印出整條鏈並做一次自我檢查
# （往返殘差、兩個旋轉軸的姿態自由度有沒有重疊）。
#
# [[joint]]
# chain = "work"
# kind = "rotary"
# axis = "A"
# dir_x = 1.0                       # 軸的方向（右手定則）
# dir_y = 0.0
# dir_z = 0.0
# pivot_x = 0.0                     # ← 參數 19700~19714
# pivot_y = 0.0
# pivot_z = -180.0

# --- 固定偏置（機台幾何的常數部分，選用）---
# [[joint]]
# chain = "tool"
# kind = "offset"                   # 沒有軸，也沒有軸心
# dir_x = 0.0
# dir_y = 0.0
# dir_z = 250.0
