惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
月光博客
月光博客
爱范儿
爱范儿
罗磊的独立博客
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
F
Full Disclosure
博客园 - 司徒正美
小众软件
小众软件
D
Docker
大猫的无限游戏
大猫的无限游戏
O
OpenAI News
T
Threatpost
Engineering at Meta
Engineering at Meta
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Y
Y Combinator Blog
H
Help Net Security
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
博客园 - 聂微东
A
Arctic Wolf
T
Threat Research - Cisco Blogs
U
Unit 42
NISL@THU
NISL@THU
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 【当耐特】
T
Troy Hunt's Blog
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
AWS News Blog
AWS News Blog
The Last Watchdog
The Last Watchdog
Last Week in AI
Last Week in AI
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
腾讯CDC
V
V2EX
A
About on SuperTechFans
Know Your Adversary
Know Your Adversary
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - CHHC

公钥解析 eSIM SGP32 自建符合GSMA规范的eIM平台(支持SGP32及SGP22卡接入) eSIM SGP32 eIM GSMA转码器(支持net及java) eSIM SGP32 证书 eSIM SGP32 生成eUICC所需的配置数据 eSIM SGP32 EuiccPackage包eimSignature和euiccSignEPR生成及校验 eSIM SGP32/SGP22 EUICC.SDK - IPAd RTSPShape-包含服务端及客户端 树莓派安装与配置 NetCore树莓派桌面应用程序 C#解析TLV数据(der -> asn1) golang 项目依赖备份 SGP32笔记 SoftSIM - swSIM eSIM SGP.22 LPA程序开发 - 协议解析 eSIM SGP.22 LPA程序开发 - 实现功能 PGP文件加解密 vscode配置c/c++环境 网关开发笔记 电池笔记 SQLiteRedis - 静动态数据联合使用 RTP推流测试 SQLite批量操作优化方案 golang优化 vSIM / SoftSIM笔记 移远AT指令笔记
工业状态控制
CHHC · 2025-10-13 · via 博客园 - CHHC
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()
        };
    }
}