首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 4.0 流程圖實作邏輯控制電路:依賴關係與互斥約束的可視化建模

     編輯:關於.NET

Windows Workflow Foundation (WF) 不僅是業務流程引擎,其流程圖模型天然適合表達複雜的邏輯依賴與約束規則。本文以「設備啟停邏輯控制」為例,展示如何用 WF 4.0 流程圖建模具備依賴順序、互斥條件、安全約束的控制演算法,並對比 C# 硬編碼、狀態機、規則引擎等多種實現方式。

應用場景:工業設備互鎖邏輯

五台設備(A, M, N, X, Y)具備以下物理約束:

  1. 啟動 Y 必須先啟動 X;關閉 X 必須先關閉 Y
  2. 啟動 N 必須先啟動 M;關閉 M 必須先關閉 N
  3. M、N 依賴 A 供電:啟動 M/N 前必須啟動 A
  4. 關閉 A 前,M、N 必須皆已關閉
  5. N 耗電大:N 運行時必須關閉無關設備(安全互斥)

設備依賴關係拓撲圖

啟動 N 設備規則邏輯表

WF 4.0 流程圖建模設計

採用 Flowchart 活動作為根節點,以 FlowDecision 表達條件判斷,FlowStep 串接執行步驟,Parallel 處理可並行操作。

核心流程邏輯

  1. 啟動指令輸入:接收目標設備與動作(Start/Stop)
  2. 前置條件檢查:
    • 依賴檢查:目標設備的前置依賴是否滿足(如 Start N → 檢查 M、A 是否 Running)
    • 互斥檢查:目標動作是否違反互斥規則(如 N Running 時嘗試 Start 其他非必要設備)
    • 狀態衝突檢查:重複啟動/關閉已處於目標狀態的設備
  3. 執行動作序列:按拓撲順序執行啟動/關閉指令
  4. 狀態持久化:更新設備狀態至資料庫/記憶體
  5. 結果回報:成功/失敗及違規規則說明

Flowchart 總覽設計圖

FlowDecision 細節判斷邏輯

關鍵活動設計

自訂活動:CheckDependencyActivity

public sealed class CheckDependencyActivity : CodeActivity<bool> {
    [RequiredArgument] public InArgument<string> TargetDevice { get; set; }
    [RequiredArgument] public InArgument<DeviceAction> Action { get; set; }
    [RequiredArgument] public InArgument<DeviceContext> Context { get; set; }

    protected override bool Execute(CodeActivityContext context) {
        var device = TargetDevice.Get(context);
        var action = Action.Get(context);
        var ctx = Context.Get(context);
        
        // 依賴規則表(可外部化配置)
        var rules = new Dictionary<string, string[]> {
            ["Y"] = new[] { "X" }, ["N"] = new[] { "M" }, ["M"] = new[] { "A" }, ["N"] = new[] { "A" }
        };
        
        if (action == DeviceAction.Start && rules.ContainsKey(device)) {
            foreach (var dep in rules[device]) {
                if (ctx.GetDeviceState(dep) != DeviceState.Running) {
                    ctx.AddViolation($"啟動 {device} 需先啟動 {dep}");
                    return false;
                }
            }
        }
        // 關閉依賴反向檢查...
        return true;
    }
}

自訂活動:ExecuteDeviceActionActivity

public sealed class ExecuteDeviceActionActivity : CodeActivity {
    [RequiredArgument] public InArgument<string> DeviceId { get; set; }
    [RequiredArgument] public InArgument<DeviceAction> Action { get; set; }
    [RequiredArgument] public InArgument<DeviceContext> Context { get; set; }

    protected override void Execute(CodeActivityContext context) {
        var id = DeviceId.Get(context);
        var action = Action.Get(context);
        var ctx = Context.Get(context);
        
        // 呼叫實際硬體控制 API 或模擬器
        ctx.ExecuteHardwareCommand(id, action);
        ctx.UpdateDeviceState(id, action == DeviceAction.Start ? DeviceState.Running : DeviceState.Stopped);
    }
}

執行效果驗證

啟動 N 設備成功流程

違反互斥規則被攔截

關閉 A 被 M/N 運行阻擋

多種實現方式對比分析

維度C# 硬編碼WF 狀態機 (3.x)規則引擎WF 4.0 流程圖
可視化程度無高(狀態轉移圖)低(規則集)最高(流程圖直觀)
規則外部化困難中等極佳良好(活動參數化)
動態修改流程重新編譯困難支援支援(XAML 熱載入)
長時間執行/持久化自行實現內建需整合內建
並行/同步控制手動鎖有限無Parallel/FlowDecision 原生
學習曲線低中高中
適用場景固定簡單邏輯狀態驅動業務複雜業務規則複雜依賴/約束邏輯

WF 4.0 流程圖優勢總結

  1. 領域專家可讀:流程圖即文檔,業務與技術雙方共同語言
  2. 編譯期型別安全:活動屬性強型別,減少運行時錯誤
  3. 原生持久化/追蹤:長時間流程、審計軌跡零代碼實現
  4. 並行控制原語:Parallel、Pick、FlowDecision 直觀表達並發與選擇
  5. 版本管理友好:XAML 純文字,Git diff 可見流程變更

源碼下載

完整範例包含流程圖定義、自訂活動、WPF 測試主機:

本文配套源碼下載連結

將複雜邏輯約束轉化為可視化流程圖,是 WF 4.0 區別於傳統編程的核心價值。對於工控互鎖、業務規則引擎、智能決策流程等場景,流程圖模型提供了「所見即所得」的建模體驗與強大的運行時保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved