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()};} }