跳轉到

腳本命令

什麼是腳本命令?

腳本命令 即 HiNC 腳本引擎執行的 C# 敘述。腳本直接引用 SessionShell (API) 的成員與方法 — SessionShell 即全域作用域,無需明確物件參考。

// 以下都是直接以 SessionShell 成員作為全域使用
EnablePhysics = true;
MachiningResolution_mm = 0.125;
PlayNcFile("NC/file1.nc");
Message("Done");

腳本語法基礎

腳本使用 原生 C# 語法:

功能 語法
敘述結尾 ;
行尾註解 // comment
字串插值 $"Value is {variable}"
正無限大 double.PositiveInfinity
負無限大 double.NegativeInfinity
位元 OR(旗標) Fx|Fy|Fz

所有標準 C# 語言特性(變數、迴圈、條件、LINQ 等)皆可使用。


執行模型

工作階段生命週期

  1. 腳本依 Task 頁順序執行
  2. 由 PacePlayer (API) 控制播放 — PlayNcFile (API) 之類的腳本命令會阻塞至 NC 程式完成
  3. 播放器控制命令(Pace (API)、Pause (API)、Reset (API))與 PacePlayer (API) 互動
  4. ResetRuntime (API) 清除運行時狀態——已記錄的步、網格化的工件與訊息。掛在工作階段事件上的處理器不受它影響,要等工作階段結束、也就是播放器「重置」時才會移除

事件驅動執行

SessionStepBuilt (API) 等事件於仿真期間觸發,可作步級邏輯:

SessionStepBuilt += (preStep, curStep) => {
    if (curStep != null)
        Message($"Step: ToolId={curStep.ToolId}");
};
PlayNcFile("NC/file1.nc");

這樣加上的處理器屬於工作階段:ResetRuntime (API) 不會移除它,它要等工作階段結束、也就是播放器「重置」時才會移除。


NC 碼中的腳本命令

腳本命令可嵌入 NC 程式自己的註解,讓設定在程式中真正該生效的位置改變。這需要兩層語法配合:控制器的註解語法先把註解從單節取出,而註解符號取決於控制器本身:

控制器 用什麼開啟註解
Fanuc、Mazak、Syntec 只有括號 ( )
Siemens ; 到行尾
Heidenhain //、; 或 ( )

腳本語法接著用兩個標記把腳本從註解文字取出:@@ 是在該單節運動之前執行的腳本,@@^ 是在之後執行的(下文稱行前/行後標記,指的就是該單節之前/之後)。兩個標記是該語法的設定、不是固定字元:它們來自專案所指名的控制器定義,而自帶解析器設定的專案則沿用自己那一份。在以 ; 開啟註解的 Siemens 上:

T01 M06 ;@@MachiningResolution_mm=0.03125;
S1270 M03
G43 Z10. H01

在 Fanuc 家族的控制器上,同一段腳本寫在括號內:

T01 M06 (@@MachiningResolution_mm=0.03125;)
S1270 M03
G43 Z10. H01

單節所帶的腳本會不會照字面執行,由三條規則決定:

  • 每個標記各只寫一次,而且腳本寫在最後。 標記會把自己到該則註解結尾的所有文字吃進腳本,所以寫在腳本後面、但仍在同一則註解內的東西會被當成腳本的一部分——同一則註解裡的第二個 @@ 會被第一段腳本整段吞掉。
  • 同一則註解要放兩段時,@@ 要寫在 @@^ 之前。 行後腳本會先被取出,所以先寫 @@^ 的註解,它的 @@ 會被行後腳本整段吞掉。
  • 一行只寫一則括號註解。 括號註解從該行第一個 ( 讀到最後一個 ),所以第二則註解會被當成第一則的一部分。

內嵌腳本與腳本命令編譯時用同一組參考與命名空間引用 (using),而且和腳本命令一樣,本身不需要任何授權功能。腳本編譯不過會在它所屬的步回報 Script-Compile--Error,執行期丟例外則是 Script-Run--Exception,兩者都不會中斷播放。

Note

3.2.7 到 3.2.31 的套件只在有 NcComposition 授權功能時才執行內嵌腳本。沒有這個授權功能時,只會對第一個內嵌腳本回報一次 Script--NotLicensed,其後不論同一次播放或之後的播放全部靜默跳過。程式裡的內嵌腳本若在換到這幾版之後不再生效,換到更新的套件就會恢復執行,程式本身不必修改。

Warning

;@ 是前一代執行器 (runner) 的標記,;# 是它的行後標記。在今天播放 NC 的執行器上,這兩個只是普通註解文字:命令不會執行,也沒有任何訊息說。在 Fanuc 家族上裸寫時,; 根本不開啟註解,那段文字連註解都不是——建置會發出 UnparsedText--Remaining 警告。


檔案路徑樣板

輸出檔的命令支援 [NcName] 標記,會替換為各 NC 檔名稱:

PlayNcFile("NC/file1.nc");
PlayNcFile("NC/file2.nc");
WriteShotFiles("Output/[NcName].shot.csv", 1);
// 產生:Output/file1.nc.shot.csv、Output/file2.nc.shot.csv

所有檔案路徑除非指定為絕對路徑,否則皆以 專案目錄 為基準。


重要警告

下列操作可能損壞仿真狀態或產生錯誤結果:

  • 仿真期間請勿儲存專案。 系統內部配置(如訓練專屬的解析度覆寫)可能覆寫你的設定。
  • 訓練銑削係數期間請勿重置播放器。 請改以關閉專案取代按下重置按鈕,以避免意外錯誤。
  • 訓練期間請勿修改解析度、刀具或控制器設定。 在訓練中途改變這些設定會使結果無效。
  • 請勿將 SessionStepBuilt (API) 事件中的 UpdateNcOptOption 與 NC 內嵌優化命令併用。 並行計算可能造成未定義行為。
  • 請勿把 NaN 寫進逐步的 NcOptOption。 求解該步時會拒絕 NaN 的每刃進給邊界:該步保留仿真進給率,並以一則指名選項值的錯誤回報,其餘各步照常優化。見當某一步解不出來時。

全域變數

Global (API) 提供跨腳本共享資料的鍵值字典:

Global["material"] = "Steel";
var material = Global["material"];

完整 API 參考

完整命令、屬性與事件清單請參閱:

延伸閱讀