当前位置: 首页 > news >正文

工业状态控制

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

 

http://www.jsqmd.com/news/12661/

相关文章:

  • 2025 年磨粉机厂家最新推荐榜单:全面覆盖新型磨粉机、超细磨粉机、立式双动力磨粉机及节能磨粉机,为各行业采购者精准筛选优质品牌
  • Qwen2.5技术报告
  • 手把手教你在 Windows 安装 Docker Desktop
  • 强化学习的数学原理-04章 策略评估与策略优化 - 指南
  • HDU1204糖果大战 题解
  • 吴恩达深度学习笔记----系列文章
  • AI重构项目管理:2025年工具生态的三大颠覆性趋势
  • 跨数据与任务的可扩展图像分割技术
  • 实用指南:大语言模型LLM解决AI幻觉方法的深度分析
  • 2025年10月变位机厂家最新推荐排行榜,焊接变位机,机器人变位机,重型变位机,轻型变位机公司推荐!
  • 2025年中国开发者代码管理平台选型全景报告:从本土化适配到全球化协作
  • ZKsync Baby Alpha里程碑达成:zkEVM技术架构全面解析
  • 【技术干货】Vaadin Flow vs Hilla:你该选择哪个Java Web框架?
  • 使用CVX工具箱求解凸优化问题示例
  • 深入解析:【MySQL✨】MySQL 入门之旅 第十一篇:常见错误排查与解决方案
  • 图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理
  • 2025年10月家纺摄影公司最新推荐榜单,专业拍摄与创意设计一站式服务首选!
  • 彩笔运维勇闯机器学习--KNN算法
  • 2025 年计数包装机厂家最新推荐榜:聚焦高精度高效能品牌,助力企业智能化生产升级全自动/种子/五金/注塑件/纽扣计数包装机厂家推荐
  • JAVA工具包
  • 2025 年蝶阀厂家最新推荐:全金属 / 高压 / 美标 / 双偏心 / 三偏心等各类蝶阀优质厂家榜单及选择指南
  • 基于MATLAB的一维大地电磁反演程序实现
  • DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(一)
  • Java并发机制的底层实现原理:从CPU到JVM的全面解析
  • 2025年10月储罐源头厂家最新权威榜单:技术实力与市场口碑深度解析
  • 学习unigui【38】重新认识UUNIGUI--为什么这样快? 站在“架构与性能”层面重新审视
  • 2025 年国内发电机厂家最新推荐排行榜:汽油 / 柴油 / 10KW-200KW 多功率机型精选,全方位解读品牌实力助力精准选购
  • wqs二分学习笔记
  • Android系统中使用initrc脚本在开机时禁用selinux
  • 2025年10月氧化镁厂家最新推荐排行榜,轻烧氧化镁,重烧氧化镁,高纯氧化镁,活性氧化镁公司推荐!