当前位置: 首页 > 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.zskr.cn/news/20000.html

相关文章:

  • 2025 年磨粉机厂家最新推荐榜单:全面覆盖新型磨粉机、超细磨粉机、立式双动力磨粉机及节能磨粉机,为各行业采购者精准筛选优质品牌
  • 手把手教你在 Windows 安装 Docker Desktop
  • 强化学习的数学原理-04章 策略评估与策略优化 - 指南
  • HDU1204糖果大战 题解
  • 吴恩达深度学习笔记----系列文章
  • 2025年中国开发者代码管理平台选型全景报告:从本土化适配到全球化协作
  • 使用CVX工具箱求解凸优化问题示例
  • FastReport文本框根据高度缩小字体
  • 基于MATLAB的一维大地电磁反演程序实现
  • Java并发机制的底层实现原理:从CPU到JVM的全面解析
  • 学习unigui【38】重新认识UUNIGUI--为什么这样快? 站在“架构与性能”层面重新审视
  • 2025 年国内发电机厂家最新推荐排行榜:汽油 / 柴油 / 10KW-200KW 多功率机型精选,全方位解读品牌实力助力精准选购
  • IDA9.0中文版与相关插件安装详细教程
  • 2025 北京宽带安装公司最新推荐榜:专业口碑双优服务商汇总,企业家庭装机必看指南北京企业/北京无线/北京商务/北京商业/北京店铺宽带安装公司推荐
  • 2025年10月苹果仓源头厂家最新推荐榜单:专业仓储与高效配送的优质选择!
  • 2025年10月整平机厂家最新推荐排行榜,精密整平机,自动整平机,金属板材整平机公司推荐!
  • linux与window文件互传方式
  • 2025 年最新留学机构权威最新推荐排行榜,深度解析顶尖机构服务特色与核心优势助力留学规划英国/澳洲/香港/美国/加拿大留学机构推荐
  • 2025年10月瑕疵检测设备厂家最新推荐排行榜,表面/薄膜/铝箔/陶瓷膜瑕疵在线检测,外观瑕疵检测机/仪公司推荐!
  • 基于MATLAB的ADS-B接收机卫星与接收天线初始化实现
  • SpringBoot中这10个神仙功能,惊艳到我了!
  • 学习科学的笔记
  • 25.10.13 C语言 运算符
  • matlabe东向偏移、北向偏移、垂直偏移转经纬度
  • 基于SC译码算法的极化码解码实现与优化
  • ElasticSearch基础入门和基本概念 - 详解
  • 2025 年安防系统厂商最新推荐榜:弱电 / 智能 / 周界 / 监控等全品类服务商深度测评及选择指南
  • 献丑贴:Task.Run中foreach优化
  • 完整教程:应用部署(后端)
  • 2025.10.13——1橙