跳轉到

步變數 (Step Variables)

你自己的「每一步的值」:一條對步的公式,隨專案儲存,每次播放都讀得到。

步變數是專案用公式定義的、每一步都有的值——對步寫的 C#,例如一個已存的力除以一個已存的比值。專案保存它的步變數,每次播放都讀得到:視覺指標時序圖可以畫出其中一個,並用它替刀具路徑與切削面著色;步屬性也能在內建步屬性旁邊列出它。步上不存任何東西;每次讀到一步時才算出變數的值。以變數的鍵寫在某一步上的值——由任務腳本、CSV 程式,或映射一個帶著同名欄位的 CSV 檔(例如本產品寫出的步檔案)寫上去——在那一步上會取代公式被讀到。這樣寫上去的值存在執行的步驟快取 (step cache) 裡——存放這次執行其他每步結果的那個資料庫檔案——而不是記憶體裡:帶著寫入欄位的長程式(一個 CSV 映射、一個 CSV 程式、腳本的累計值)不會按步耗用記憶體,而且只要執行的各步還在,這些值就還在。步變數是執行頁面控制樹的第三個根節點步變數,位在任務與程式之下,控制樹路徑 execution/step-variables。

位置

根節點的面板列出兩組。

  • 專案——這個專案定義的變數,每個一列:名稱在上,下面是鍵、單位與格式,旁邊的徽章說明引擎怎麼看待它。已編譯表示已註冊,每一步都會讀。另外三種不會註冊,並說明原因:編譯不過;內建屬性的鍵——和內建步屬性或 HiNC 的內建著色樹同名的鍵(MachiningState、MachiningStateGeometry;工程面向著色),或位在機械座標保留的 MC. 之下;專案裡重複的鍵——同一個鍵只有第一個變數算數。每個變數也都是根節點底下的一個節點,點它那一列就會選取該節點。
  • 播放中註冊——這個工作階段以其他方式加入的鍵:任務腳本的 RegisterStepVariable、CSV 程式或 CSV 映射帶到步上的欄位、訓練的那兩個。它們以唯讀方式列出,並標明來源,工作階段結束就不見。著色樹不是步變數,所以不論是任務腳本以 RegisterStepColorTree 註冊的,還是專案檔裡的,它的鍵都不在這兩組裡。

這個分支裡的修改,改的是記憶體裡的專案。存檔時才寫進專案檔:檔案 › 儲存,面板在清單下方也這樣提醒。

執行頁面的左側停靠欄:執行標頭帶著六個傳輸按鈕與綠色的「已完成」徽章;底下的「任務」與「程式」根節點收合著,「程式」列帶著它的「跟隨」切換鈕、重新整理按鈕與重新計算按鈕,「步變數」根節點展開,有四個子節點——Energy_kJ、YieldingForce、CutterSkin_C 與 ToothLoad_N;下方面板標題為「步變數」,顯示帶著計數 4 與「新增步變數」按鈕的「專案」組、說明變數定義在專案裡並隨專案儲存的提示,以及四列——Energy(Energy_kJ · kJ · G4)、Yielding Force(YieldingForce · N · F1)與 Cutter Skin Temperature(CutterSkin_C · °C · F1)各帶著「已編譯」徽章,Tooth Load(ToothLoad_N · N · F1)帶著紅色的「編譯不過」徽章——接著是「修改只在記憶體裡,儲存專案才會寫進檔案:檔案 › 儲存。」;一條分隔線下是帶著計數 1 與唯讀提示的「播放中註冊」組,裡面有一列 Accumulate Energy(AccumulateEnergy_kJ · kJ · G4),帶著「工作階段(腳本或 CSV)」徽章

播放之後的 /execution?tree=execution/step-variables。AccumulateEnergy_kJ 是任務腳本註冊的,腳本在每一步寫入一個累計值(見最後一節)。

新增一個

新增步變數會先要一個鍵。鍵在輸入時就會檢查:不能空白、不能含逗號或引號——步檔案的 CSV 表頭帶不了——也不能含斜線、不能只是一個 . 或 ..——變數的網址指不到——也不能是專案裡某個變數已經有的鍵。內建屬性的鍵(內建著色樹的鍵也算在內)在新增時會被拒絕,專案裡某棵著色樹的鍵(步著色),或另一個瀏覽器分頁剛加入的鍵也一樣。新的變數在寫好公式之前,每一步都讀不到值,接著會開啟它的編輯器。

寫公式

編輯器裡有鍵、名稱(顯示在清單與圖表裡;空白就顯示鍵)、單位、格式——.NET 的數值格式,G4 是四位有效數字、F2 是小數兩位,常用的幾種在欄位下方點一下就能選——以及公式(C#)。

公式是一個 C# 運算式,或一個用大括號包起、回傳值的區塊,讀的是傳進來的那一步 step。它回傳一個數字:int 或 float 會自動轉換,null 表示那一步沒有值,bool 則編譯不過。輸入時,自動完成會列出步的成員——打 step. 再加幾個字母。停止輸入半秒後,公式就會被檢查:錯誤列在編輯器下方,附行號與欄號,並在出錯的位置畫上底線。檢查不執行任何東西,也不改動任何東西。

套用把變數放進記憶體裡的專案:公式會被編譯,專案的步變數會重新註冊,所以圖表與著色立刻讀到新的定義,不必重新播放。編譯不過的公式不會套用,錯誤會在同樣兩個地方再出現。套用的請求還在路上時打的字,會留在編輯器裡、尚未套用。

公式編譯不過的變數——例如另一個版本存的專案檔,用到了這個版本沒有的成員——會列成編譯不過,讀不到值。它的編輯器一開始就標出錯誤:

同一個停靠欄,選取的是 ToothLoad_N:面板標題為「步變數 / ToothLoad_N」,帶著紅色的「編譯不過」徽章、「刪除」按鈕與「套用」按鈕;欄位讀作 鍵 ToothLoad_N、名稱 Tooth Load、單位 N、格式 F1,格式下方是「G4:四位有效數字;F2:小數兩位」的提示,以及 G4、F0、F1、F2、F3、F4 幾個快選,F1 反白;「公式(C#)」編輯器裡有一行 step.MaxAbsForce_N / step.FluteCount,FluteCount 下方畫著紅色波浪線;編輯器下方是「一個運算式,或一個用大括號包起、回傳值的區塊;讀的是傳進來的那一步(step)。」的提示,接著是紅字:第 1 行,第 27 欄 · CS1061: 'MachiningStep' does not contain a definition for 'FluteCount' and no accessible extension method 'FluteCount' accepting a first argument of type 'MachiningStep' could be found (are you missing a using directive or an assembly reference?);最下方是「在選取步上試算」標題、它的「試算」按鈕與提示

/execution?tree=execution/step-variables/ToothLoad_N。步沒有 FluteCount 這個成員,所以這個變數沒有註冊,在公式修好並套用之前讀不到值。

改了鍵再套用,就是替變數改名。專案記在舊鍵底下的東西會搬到新鍵:視覺指標時序圖的檢視鍵、它的色彩範圍與 Y 軸設定,以及專案的著色樹裡用到這個鍵的每個條件項與顯示數值(步著色);步顯示偏好設定對話框若列著舊鍵,會在它旁邊列出新鍵。專案裡還有別的變數用著舊鍵,或舊鍵是內建屬性的鍵時,舊鍵底下的東西留在原處。刪除在確認後移除變數。刪除之後,專案在這個鍵下若已沒有別的變數,而專案的某棵著色樹有條件項或顯示數值用到這個鍵,會有一則通知列出那些樹的鍵:除非有內建屬性或播放中註冊的步屬性用這個鍵,那些條件項與顯示數值就讀成無值,並標上找不到屬性(步著色)。

有修改尚未套用時切換到別的節點,會先詢問:取消留在原處,捨棄丟掉修改,套用並切換先套用再繼續。不經詢問的切換——程式列上的跟隨把選取移到執行所在的檔案——會保留修改,回到這個變數時修改都還在。如果這段時間這個變數在別處被改過——同一個專案的另一個瀏覽器分頁——編輯器會說明,此時套用會用你的版本蓋過那次修改。

在一步上試算

試算用編輯器裡現在的公式(套用與否都可以),在選取的步上算一次——要先在圖表、程式檢視器或 3D 畫布上選一步,因為播放不會選取任何步。它顯示用變數的格式與單位寫出的值、原始值、公式在那一步丟出的例外,以及掃過所有步一遍要多久:公式會在選取步起最多 100 步上計時(選取步靠近結尾時,是最後 100 步),每步時間的中位數乘上步數,大約就是重畫一次圖表或重新著色一次的代價。改選別的步之後,結果會標成已經過時。

同一個停靠欄,選取的是 YieldingForce:面板標題為「步變數 / YieldingForce」,帶著綠色的「已編譯」徽章、「刪除」與「套用」;欄位讀作 鍵 YieldingForce、名稱 Yielding Force、單位 N、格式 F1,「公式(C#)」編輯器裡是 step.MaxAbsForce_N / step.YieldingStressRatio;在「在選取步上試算」與它的「試算」按鈕下方,結果讀作「第 500 步」旁邊的 3922.7 N,接著是「原始值: 3922.7265603491596」,再來是「掃過 1090 步一遍約 < 0.01 秒」

在 circle.ptp 播放的 1,090 步裡的第 500 步上試算。

公式在某一步丟出例外時,那一步就讀不到值;工作階段訊息會為每個變數回報一次它第一次丟出的例外。

Note

每一段被編譯過的公式文字——不論是套用還是試算——都會把程式碼載入伺服器,直到伺服器重新啟動前都留著;輸入時的檢查則什麼都不載入。一個試了很多不同公式的長工作階段,會為每一段都用掉一些記憶體。

在圖表與著色裡

套用之後的變數,立刻就會出現在視覺指標時序圖的屬性選擇器裡。在那裡挑它,它就是圖表的那條線,也是刀具路徑與切削面的顏色。新鍵的色彩範圍是 0 到 1,所以高於範圍的值顯示為紅色、低於範圍的顯示為藍色:在著色裡設定範圍(觀看執行)。要在步屬性裡列出它,就在步顯示偏好設定對話框的 Custom 底下加入它(檢視一個步)。

若要改成把各步分成類別——每個類別在 3D 畫布上有自己的顏色、在圖表上有自己的一道——就定義一棵著色樹:步著色。

三個例子

名稱 單位 公式 它是什麼
Yielding Force N step.MaxAbsForce_N / step.StressRatio 假如應力隨力等比例增加,會讓刀具本體到達應力線的切削力
Cutter Skin Temperature °C step.GetCutterDermisTemperature_C(0.001) 刀具表面下 0.001 mm 處的溫度——帶參數的方法也可以用
Energy kJ step.SpindleMeterPower_W * step.StepDuration.TotalSeconds / 1000 主軸電表在這一步計到的能量

公式的代價,以及該寫在腳本裡的

只讀步上已存的值——力、溫度、時間——的公式,每步約一微秒或更少:上面三個例子量到 0.4 到 1.1 µs,掃過一個 100,000 步的執行一遍,最多約十分之一秒。讀每轉陣列的公式,例如側面粗糙度的剖面,在很長的執行上掃一遍可能要一分鐘上下;先試算、看過時間,再用它著色。

把之前每一步都加起來的值——到目前為止用掉的能量——會在每一步都重讀所有更早的步。改寫在任務的腳本裡,在每一步建好時寫到那一步上(步 (Step)):

RegisterStepVariable("AccumulateEnergy_kJ", "Accumulate Energy", "kJ", "G4");
SessionStepBuilt += (preStep, curStep) =>
{
    double energy_kJ = curStep.SpindleMeterPower_W * curStep.StepDuration.TotalSeconds / 1000;
    double before_kJ = preStep?["AccumulateEnergy_kJ"] is double d ? d : 0;
    curStep["AccumulateEnergy_kJ"] = before_kJ + (double.IsNaN(energy_kJ) ? 0 : energy_kJ);
};

它會列在播放中註冊底下,公式則用 step["AccumulateEnergy_kJ"] as double? 讀它。在上面那次執行裡,它最後是 13.02 kJ——和內建的 AccumulatedSpindleMeterEnergy_kWh 以 kWh 記的是同一個總和。

這個處理器的寫入不多花任何代價:值會和那一步自己的結果一起送進步驟快取,而 preStep["AccumulateEnergy_kJ"] 讀的是剛建好的前一步,不是檔案。播放之後才寫上去的值,則是各自單獨進步驟快取:一次一個寫入、一筆交易 (transaction)。所以,事後要填很多步的腳本,應該用步 (Step)〈索引器存取〉一節說明的整批寫入,而不是一個 step["key"] = ... 的迴圈:它把最多 4,096 個寫入放進同一筆交易,圖表與著色也只在每批之後跟上一次,而不是每個寫入都跟一次。

延伸閱讀

  • 步 (Step) — 從任務腳本註冊步變數、寫值到步上、步檔案
  • 觀看執行 — 視覺指標時序圖與它的色彩指引
  • 檢視一個步 — 步屬性與步顯示偏好設定對話框
  • 程式分支 — 這個根節點上面的那一個
  • 步著色 — 這個根節點下面的那一個:你自己的步分類,每一類是著色樹的一片葉,有它的顏色與它的一道
  • 步變數分支(英文,未鏡像) — 這個分支是怎麼組成的