当前位置: 首页 > 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.hskmm.com/?act=detail&tid=29929

相关文章:

  • 2025 年磨粉机厂家最新推荐榜单:全面覆盖新型磨粉机、超细磨粉机、立式双动力磨粉机及节能磨粉机,为各行业采购者精准筛选优质品牌
  • Qwen2.5技术报告
  • 手把手教你在 Windows 安装 Docker Desktop
  • AI重构项目管理:2025年工具生态的三大颠覆性趋势
  • 跨数据与任务的可扩展图像分割技术
  • 2025年10月变位机厂家最新推荐排行榜,焊接变位机,机器人变位机,重型变位机,轻型变位机公司推荐!
  • 2025年中国开发者代码管理平台选型全景报告:从本土化适配到全球化协作
  • ZKsync Baby Alpha里程碑达成:zkEVM技术架构全面解析
  • 【技术干货】Vaadin Flow vs Hilla:你该选择哪个Java Web框架?
  • 使用CVX工具箱求解凸优化问题示例
  • 2025年10月家纺摄影公司最新推荐榜单,专业拍摄与创意设计一站式服务首选!
  • 彩笔运维勇闯机器学习--KNN算法
  • FastReport文本框根据高度缩小字体
  • 国产代码托管平台Gitee崛起:企业级Git自建解决方案深度解析
  • 易基因:植物作为表观遗传学研究理想模型 如何把握研究思路与应用探索|项目解析
  • 供应商协同管理系统:打破协作壁垒提升供应链效能
  • 2025年10月锅炉厂家最新权威推荐榜:高效节能与安全稳定品质之选!
  • Gitee如何重塑中国开发者的效率革命?
  • 2025 年最新推荐雕塑源头厂家排行榜:聚焦成本、定制与全国布局,助力客户精准选合作方铸铜/铸铝/仿古/校园/广场/人物雕塑厂家推荐
  • 高效办公必备:自动同步文件的工具如何选
  • 关于通过样式设置的章标题等可能出现不能完全居中的问题的解决办法
  • 2025年10月掘进机厂家最新推荐排行榜,隧道掘进机,煤矿掘进机,城市轨道掘进机公司推荐!
  • Aave 协议的最新版本
  • 2025 年国内空调机组厂家最新推荐,含冷凝热回收等多类型空调机组企业优选指南! 泳池热泵/屋顶式/海水源养殖热泵/精密机房/岗位送风空调机组厂家推荐
  • 2025 年攻丝机定制厂家最新推荐排行榜:聚焦非标异形件加工需求,精选优质品牌助力企业高效生产
  • Uniswap 入门:小白也能懂的去中心化交易所指南
  • Codeforces Round 1058 (Div. 2) A - D
  • ACE-Step音乐生成大模型:开启AI音乐创作新纪元
  • c++操纵器std::ws
  • 2025 年计数包装机厂家最新推荐榜:聚焦高精度高效能品牌,助力企业智能化生产升级全自动/种子/五金/注塑件/纽扣计数包装机厂家推荐