工业状态控制

image

 

namespace 工业状态机
{
    public partial class MainForm : Form
    {
        private StateMachine stateMachine; 

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            stateMachine = new StateMachine();
            stateMachine.OnLogMessage += OnLogMessage;
            stateMachine.OnStateChanged += OnStateChanged;

            UpdateUI();
        }

        private void OnLogMessage(string message)
        {
            rtbMsg.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + message + "\n");
        }

        private void OnStateChanged(设备状态 oldState, 设备状态 newState)
        {
            UpdateUI(); 
        }

        private void UpdateUI()
        {
            // 更新状态指示器 
            foreach (Control control in groupBoxStateIndicators.Controls) { if (control is Label label) label.BackColor = Color.LightGray; }
            var currentIndicator = groupBoxStateIndicators.Controls.OfType<Label>().FirstOrDefault(l => l.Tag?.ToString() == stateMachine.CurrentState.ToString());
            if (currentIndicator != null) currentIndicator.BackColor = Color.White;

            // 更新可用状态
            var allowedEvents = stateMachine.GetAllowedEvents();
            btnInitialize.Enabled = allowedEvents.Contains(设备事件.初始化);
            btnStart.Enabled = allowedEvents.Contains(设备事件.启动);
            btnPause.Enabled = allowedEvents.Contains(设备事件.暂停);
            btnResume.Enabled = allowedEvents.Contains(设备事件.恢复);
            btnStop.Enabled = allowedEvents.Contains(设备事件.停止);
            btnReset.Enabled = allowedEvents.Contains(设备事件.重置);
            btnMaintenance.Enabled = allowedEvents.Contains(设备事件.维护);
            btnError.Enabled = allowedEvents.Contains(设备事件.错误);
            BtnComplete.Enabled = allowedEvents.Contains(设备事件.完成);
        }

        private void BtnInitialize_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.初始化);
        private void BtnStart_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.启动);
        private void BtnPause_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.暂停);
        private void BtnResume_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.恢复);
        private void BtnStop_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.停止);
        private void BtnReset_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.重置);
        private void BtnMaintenance_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.维护);
        private void BtnError_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.错误);
        private void BtnComplete_Click(object sender, EventArgs e) => stateMachine.TriggerEvent(设备事件.完成);

        private void BtnClear_Click(object sender, EventArgs e)
        {
            rtbMsg.Clear();
        }
    }
}
public enum 设备状态
{
    空闲,
    初始化,
    准备就绪,
    运行中,
    暂停,
    停止中,
    错误,
    维护
}

public enum 设备事件
{
    初始化,
    启动,
    暂停,
    恢复,
    停止,
    重置,
    错误,
    维护,
    完成
}

/// <summary>
/// 状态机核心类
/// </summary>
public class StateMachine
{
    设备状态 currentState = 设备状态.空闲;
    Dictionary<(设备状态, 设备事件), 设备状态> stateTransitions;

    public 设备状态 CurrentState
    {
        get => currentState;
        private set
        {
            var oldState = currentState;
            currentState = value;
            OnStateChanged?.Invoke(oldState, currentState);
        }
    }

    public event Action<设备状态, 设备状态> OnStateChanged;
    public event Action<string> OnLogMessage;

    public StateMachine()
    {
        InitializeStateTransitions();
    }

    /// <summary>
    /// 初始化状态转换表
    /// </summary>
    private void InitializeStateTransitions()
    {
        stateTransitions = new Dictionary<(设备状态, 设备事件), 设备状态>
        { 
            // 设备空闲时,只能进行初始化或维护
            { (设备状态.空闲, 设备事件.初始化), 设备状态.初始化 },
            { (设备状态.空闲, 设备事件.维护), 设备状态.维护 },

            { (设备状态.初始化, 设备事件.完成), 设备状态.准备就绪 },
            { (设备状态.初始化, 设备事件.错误), 设备状态.错误 },

            { (设备状态.准备就绪, 设备事件.启动), 设备状态.运行中 },
            { (设备状态.准备就绪, 设备事件.维护), 设备状态.维护 },
            { (设备状态.准备就绪, 设备事件.错误), 设备状态.错误 },

            { (设备状态.运行中, 设备事件.暂停), 设备状态.暂停 },
            { (设备状态.运行中, 设备事件.停止), 设备状态.停止中 },
            { (设备状态.运行中, 设备事件.错误), 设备状态.错误 },

            { (设备状态.暂停, 设备事件.恢复), 设备状态.运行中 },
            { (设备状态.暂停, 设备事件.停止), 设备状态.停止中 },
            { (设备状态.暂停, 设备事件.错误), 设备状态.错误 },

            { (设备状态.停止中, 设备事件.完成), 设备状态.空闲 },
            { (设备状态.停止中, 设备事件.错误), 设备状态.错误 },

            { (设备状态.错误, 设备事件.重置), 设备状态.空闲 },
            { (设备状态.错误, 设备事件.维护), 设备状态.维护 },

            { (设备状态.维护, 设备事件.完成), 设备状态.空闲 }
        };
    }

    /// <summary>
    /// 触发状态转换事件
    /// </summary>
    public bool TriggerEvent(设备事件 stateEvent)
    {
        if (stateTransitions.TryGetValue((CurrentState, stateEvent), out 设备状态 newState))
        {
            var message = $"状态转换: {GetStateDisplayName(CurrentState)} → {GetStateDisplayName(newState)} (事件: {GetEventDisplayName(stateEvent)})";
            OnLogMessage?.Invoke(message);
            CurrentState = newState;
            return true;
        }
        else
        {
            var message = $"无效的状态转换: 在状态 {GetStateDisplayName(CurrentState)} 下无法处理事件 {GetEventDisplayName(stateEvent)}";
            OnLogMessage?.Invoke(message);
            return false;
        }
    }

    /// <summary>
    /// 获取当前状态允许的事件
    /// </summary>
    public List<设备事件> GetAllowedEvents()
    {
        var allowedEvents = new List<设备事件>();
        foreach (var transition in stateTransitions.Keys)
        {
            if (transition.Item1 == CurrentState)
            {
                allowedEvents.Add(transition.Item2);
            }
        }
        return allowedEvents;
    }

    /// <summary>
    /// 获取状态显示名称
    /// </summary>
    static string GetStateDisplayName(设备状态 state)
    {
        return state switch
        {
            设备状态.空闲 => "空闲",
            设备状态.初始化 => "初始化中",
            设备状态.准备就绪 => "准备就绪",
            设备状态.运行中 => "运行中",
            设备状态.暂停 => "已暂停",
            设备状态.停止中 => "停止中",
            设备状态.错误 => "错误",
            设备状态.维护 => "维护中",
            _ => state.ToString()
        };
    }

    /// <summary>
    /// 获取事件显示名称
    /// </summary>
    static string GetEventDisplayName(设备事件 stateEvent)
    {
        return stateEvent switch
        {
            设备事件.初始化 => "初始化",
            设备事件.启动 => "启动",
            设备事件.暂停 => "暂停",
            设备事件.恢复 => "恢复",
            设备事件.停止 => "停止",
            设备事件.重置 => "重置",
            设备事件.错误 => "错误",
            设备事件.维护 => "维护",
            设备事件.完成 => "完成",
            _ => stateEvent.ToString()
        };
    }
}
 

 

posted @ 2025-10-13 11:06  CHHC  阅读(8)  评论(0)    收藏  举报