工业状态控制

news/2025/10/13 11:09:49/文章来源:https://www.cnblogs.com/chen1880/p/19138015

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.mzph.cn/news/935980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年磨粉机厂家最新推荐榜单:全面覆盖新型磨粉机、超细磨粉机、立式双动力磨粉机及节能磨粉机,为各行业采购者精准筛选优质品牌

当前磨粉机市场品牌繁杂,产品性能、质量差异显著,矿山、建材、化工等行业采购者在挑选设备时,常面临不知如何辨别优劣的难题。部分产品宣传与实际不符,易导致采购失误,不仅增加成本,还可能影响生产进度。为解决这…

Qwen2.5技术报告

全文摘要Qwen2.5系列模型经过预训练和后处理两个阶段的改进,在高质量预训练数据集的基础上,通过多阶段强化学习等技术进行后处理,提高了人类偏好、长文本生成、结构数据分析和指令遵循等方面的能力。该系列模型提供…

手把手教你在 Windows 安装 Docker Desktop

本文是一份零基础友好、步骤化的实操教程,旨在帮助初学者和高级开发者快速掌握在 Windows 系统中基于 WSL 2(适用于 Linux 的 Windows 子系统,版本 2)安装 Docker Desktop 的方法,并学会使用 VS Code 在远程容器中…

强化学习的数学原理-04章 策略评估与策略优化 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

HDU1204糖果大战 题解

HDU1204糖果大战 题解HDU1204 的题解。这篇题解写的很不错,但是一些小细节我还是太看不懂了,所以补充一下。 【首先得注意到是胜者从败者中拿走一颗糖。】 首先 simple 地设 \(f_i\) 表示当 S 有 \(i\) 颗糖的时候获…

吴恩达深度学习笔记----系列文章

吴恩达深度学习笔记----系列文章随笔分类 - 吴恩达深度学习笔记吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(五)吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(四)吴恩达深…

AI重构项目管理:2025年工具生态的三大颠覆性趋势

AI重构项目管理:2025年工具生态的三大颠覆性趋势 当微软Project 2025预览版首次演示AI自动调整2000人天项目计划时,全球CTO们意识到项目管理工具的进化已进入新纪元。据Gartner最新产业图谱显示,AI驱动的智能项目管…

跨数据与任务的可扩展图像分割技术

本文介绍了一种新型混合查询变换器架构,通过融合可学习查询和条件查询来提升图像分割模型的跨任务迁移能力。该方法利用合成数据解决标注数据稀缺问题,在多个数据集上的实验表明,同时扩展训练数据量和任务多样性可显…

实用指南:大语言模型LLM解决AI幻觉方法的深度分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年10月变位机厂家最新推荐排行榜,焊接变位机,机器人变位机,重型变位机,轻型变位机公司推荐!

2025年10月变位机厂家最新推荐排行榜,焊接变位机,机器人变位机,重型变位机,轻型变位机公司推荐!随着工业自动化和智能制造的快速发展,变位机在各个行业中的应用越来越广泛。无论是焊接、装配还是检测,变位机都能…

2025年中国开发者代码管理平台选型全景报告:从本土化适配到全球化协作

2025年中国开发者代码管理平台选型全景报告:从本土化适配到全球化协作 随着数字化转型进程加速,代码管理平台已成为软件开发生态的核心基础设施。在中国特殊的网络环境和开发者生态下,如何选择适配不同发展阶段的技…

ZKsync Baby Alpha里程碑达成:zkEVM技术架构全面解析

本文详细介绍了ZKsync 2.0(现名zkSync Era)达成Baby Alpha里程碑的技术进展,包括zkEVM架构升级、动态费用机制、项目注册系统、证明生成与验证等核心技术特性,以及未来路线图中的Layer3概念验证和去中心化计划。Ba…

【技术干货】Vaadin Flow vs Hilla:你该选择哪个Java Web框架?

在现代Web开发中,前后端分离已成为主流趋势,但对于许多以 Java 为核心技术栈的企业来说,如何高效地构建现代化Web应用依然是一个挑战。今天我们为大家介绍的,是由 Vaadin 平台 提供的两种开源全栈Web框架 —— Vaa…

使用CVX工具箱求解凸优化问题示例

1. 线性规划(LP)示例 问题描述: 最小化目标函数 \(c^Tx\),满足约束 \(Ax≤b\)和 \(x≥0\)。 MATLAB代码: c = [-1; -2]; % 目标函数系数 A = [1, 1; 2, 1; -1, 1]; % 约束矩阵 b = [4; 5; 2]; …

深入解析:【MySQL✨】MySQL 入门之旅 第十一篇:常见错误排查与解决方案

深入解析:【MySQL✨】MySQL 入门之旅 第十一篇:常见错误排查与解决方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…

图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理

图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理https://blog.csdn.net/luolaihua2018/article/details/132647066

2025年10月家纺摄影公司最新推荐榜单,专业拍摄与创意设计一站式服务首选!

2025年10月家纺摄影公司最新推荐榜单,专业拍摄与创意设计一站式服务首选!随着家纺行业的快速发展,高质量的家纺摄影需求日益增长。优秀的家纺摄影不仅能够提升品牌形象,还能有效促进产品销售。为了帮助筛选家纺摄影…

彩笔运维勇闯机器学习--KNN算法

前言 彩笔运维勇闯机器学习:KNN算法,它也是分类中的一种 开始探索 scikit-learn import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preproc…

FastReport文本框根据高度缩小字体

我尝试使用报表自带的设置,AutoShrink = FontSize​​ 并设置 AutoShrinkMinSize=10避免字体过小。 但这种方法只会在文本行超出文本框宽度时才会触发字体缩小,无法满足在不触及宽度时,多次换行导致高度不够的情况下…

JAVA工具包

1、JSON数据结构处理 FastJSON、Gson、Jackson工具包 2、在线API接口文档生成 (1)knife4j在线文档 (2)Swagger生成API文档 3、参数校验 (1)Hibernate Validator (2)javax.validation 注解式参数校验 (3)Apac…