Grafcet 是 IEC 60848 標準的順序控制建模方法,用於描述自動化系統中的狀態轉換邏輯。適用於 PLC 程式設計、嵌入式控制流程規劃。
drawmiat 接受兩種輸入:
{Steps, Gates, Edges},每個元素角色明確分離。渲染器的正式輸入格式,validator 也以這份結構做合規檢查與輸出。[{StepNumber, LinkOutputType, LinkOutputNumber, Condition, ...}]。validator 會自動 canonicalize 成嚴格格式後再送進渲染管線。新作品建議直接用 canonical 格式輸出,可確保 transition、gate、port、edge 與條件關係都被明確表達;legacy 格式仍可用於既有資料,但部分語意(如 gate port 對應、edge id、bypass topology)會在 canonicalize 階段被推導。
{
"Steps": [ ... ], // 步驟 (穩定狀態) 列表
"Gates": [ ... ], // 條件 transition / 分匯合閘列表
"Edges": [ ... ] // 步驟 ↔ gate 之間的有向連線
}
| 欄位 | 類型 | 說明 |
|---|---|---|
StepNumber | 整數 | 步驟唯一 ID |
StepType | 字串 | initial | normal | sub_grafcet |
StepAction | 字串 | 步驟啟動時執行的動作描述 |
ModuleRef | 字串(選填) | 對應的 IDEF0 活動 ID(如 A1),用於跨圖追蹤 |
SubGrafcet | 陣列(選填) | 巢狀子圖(macro step) |
| 欄位 | 類型 | 說明 |
|---|---|---|
GateNumber | 整數 | Gate 序號(用於 stable id) |
GateId | 字串 | 如 G1,作為 Edge endpoint 的命名根 |
GateType | 字串 | divergence_or / divergence_and / convergence_or / convergence_and |
Owner | 物件 | {Kind: "source"|"target", StepNumber: N} — diverge 由 source step 持有,converge 由 target step 持有 |
Inputs | 陣列 | 每個 input port 一筆 {Port: "I1", From: "S1O1"},From 是 step 或上游 gate 的 output endpoint |
Outputs | 陣列 | 每個 output port 一筆 {Port: "O1", To: "S2I1", Condition: "..."},Condition 是該分支的布林觸發條件 |
| 欄位 | 類型 | 說明 |
|---|---|---|
EdgeId | 字串 | 由 endpoint pair 組成,如 S1O1G1I1、G1O2S3I1 |
From | 字串 | 來源 endpoint:step output(S{n}O{k})或 gate output(G{n}O{k}) |
To | 字串 | 目的 endpoint:step input(S{n}I{k})或 gate input(G{n}I{k}) |
Condition | 字串(選填) | 當 edge 直接承載條件時(無 gate 介入的 step→step transition) |
| 類型 | 語義 | 用途 |
|---|---|---|
track | 單一順序段(僅 legacy) | 直線流程,無 gate |
divergence_or | 條件分支(多擇一) | If-Else 邏輯 |
convergence_or | 條件匯合 | 分支合流 |
divergence_and | 並行分叉 | 同時啟動多個流程 |
convergence_and | 同步匯合 | 等待所有並行流程完成 |
{
"Steps": [
{"StepNumber": 0, "StepType": "initial", "StepAction": "待機", "ModuleRef": "A1"},
{"StepNumber": 1, "StepType": "normal", "StepAction": "啟動馬達", "ModuleRef": "A1"},
{"StepNumber": 2, "StepType": "normal", "StepAction": "監測異常", "ModuleRef": "A1"},
{"StepNumber": 3, "StepType": "normal", "StepAction": "停止馬達", "ModuleRef": "A1"}
],
"Gates": [
{
"GateNumber": 1, "GateId": "G1", "GateType": "divergence_or",
"Owner": {"Kind": "source", "StepNumber": 1},
"Inputs": [{"Port": "I1", "From": "S1O1"}],
"Outputs": [
{"Port": "O1", "To": "S2I1", "Condition": "timer_done"},
{"Port": "O2", "To": "S3I1", "Condition": "fault_detected"}
]
}
],
"Edges": [
{"EdgeId": "S0O1S1I1", "From": "S0O1", "To": "S1I1", "Condition": "start_button"},
{"EdgeId": "S1O1G1I1", "From": "S1O1", "To": "G1I1"},
{"EdgeId": "G1O1S2I1", "From": "G1O1", "To": "S2I1", "Condition": "timer_done"},
{"EdgeId": "G1O2S3I1", "From": "G1O2", "To": "S3I1", "Condition": "fault_detected"},
{"EdgeId": "S2O1S0I1", "From": "S2O1", "To": "S0I1", "Condition": "reset"},
{"EdgeId": "S3O1S0I1", "From": "S3O1", "To": "S0I1", "Condition": "ack"}
]
}
每個元素是一個 Step 物件,內含本身與所有後繼 transition 的描述。validator 會以以下規則 canonicalize:
LinkOutputType 不是 track 時 → 產生一個對應的 divergence_* Gate,Owner.Kind="source",owner 為當前 step。LinkInputType 非空 → 產生 convergence_* Gate,Owner.Kind="target"。EdgeId),condition 從 Condition 陣列對應到 gate output。[
{"StepNumber": 0, "StepType": "initial", "StepAction": "待機",
"LinkOutputType": "track", "LinkInputNumber": [2,3], "LinkOutputNumber": [1], "Condition": ["start_button"]},
{"StepNumber": 1, "StepType": "normal", "StepAction": "啟動馬達",
"LinkOutputType": "divergence_or", "LinkInputNumber": [0], "LinkOutputNumber": [2,3], "Condition": ["timer_done","fault_detected"]},
{"StepNumber": 2, "StepType": "normal", "StepAction": "監測異常",
"LinkOutputType": "track", "LinkInputNumber": [1], "LinkOutputNumber": [0], "Condition": ["reset"]},
{"StepNumber": 3, "StepType": "normal", "StepAction": "停止馬達",
"LinkOutputType": "track", "LinkInputNumber": [1], "LinkOutputNumber": [0], "Condition": ["ack"]}
]
S{n}O{k} — 第 n 號 step 的第 k 個 output port(k 從 1 起算)S{n}I{k} — 第 n 號 step 的第 k 個 input portG{n}O{k} — gate G{n} 的第 k 個 output portG{n}I{k} — gate G{n} 的第 k 個 input portEdgeId = From + To 直接串接,例如 S1O1G1I1、G1O2S3I1每個步驟的 ModuleRef 對應到 IDEF0 層級中存在的活動 ID,確保功能分解(IDEF0)與行為建模(Grafcet)之間的雙向可追蹤性。
ModuleRef: "A1" → 這個步驟屬於 IDEF0 中 A1 活動的控制邏輯ModuleRef: "A11" 來對應子活動Condition_or(應用 _and)ModuleRef 或對應到不存在的 IDEF0 模組Grafcet SVG 之外,drawmiat 同時匯出 可編輯 PPTX(每個 step / gate / route / label 都是 PowerPoint 原生 shape,可在 PPT 內直接調整)。Condition 標籤的放置由兩段管線負責:
webapp/pptx_l6/):在 EMU 座標系算 snap target、natural / flipped 候選位置、wrap 寬度,並把每個 stub label 標上 shape Name MiatL6Stub|<stub_x>|<stub_y>|...|<snap_x>|<snap_y>|<side>。miat_function.ppam):在使用者 PowerPoint 內負責 runtime tier escalation —— Tier 1 snap、Tier 1.5 flipped single-line、Tier 2 雙側 wrap、Tier 3 remote + S-curve leader、Tier 4 clamp。長文字(> 30 char)自動強制 wrap。miat_installer.cmd,雙擊執行分頁上的「一鍵 Refit + 統一字級」會把當前 deck 所有 Miat 標籤重新跑一次排版(refit text → normalize font → layout stub labels)。也可在「更多動作」下拉中個別觸發各步驟。
miat_function 勾起來。這是 Office 對「檔案有更新」的安全機制,勾一次即可