

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