📄 一句话概括
全自动的核心是无人值守,所以只能用状态机描述——实测洗衣机 7 条迁移里只有 1 条需要人按,其余 6 条全靠事件自己触发。
📝 本节和前面几节的关系
9.12 讲了验证为什么重,这一节讲用什么描述才能验证得清——状态机图。
一、为什么全自动只能用状态机
没人守着,就没有【下一步做什么】的指令,只能靠事件驱动。 状态机图正好是【状态+事件→下一个状态】,天生适合无人值守。 业务系统的流程图是给人看的,状态机是给设备用的。
二、实测:7 条迁移只有 1 条要人按
待机 →(按启动)→ 进水,这是唯一需要人的一条。 其余 6 条全靠事件:水位到位、时间到、排空、超时。包括两条超时的兜底路径。 1 比 6 这个比例,就是【全自动】的量化定义。
三、兜底路径不能少
两条【超时 → 待机】:进水超时、排水超时。 这是无人值守设备必须有的安全出口——卡住了要能自己回到安全状态。 少了兜底,设备可能永远停在【进水】状态,水一直流。
四、跟 8.13 的区别
8.13 用订单举例,关注状态是否连通、有没有孤岛。 这里用设备举例,关注的是有没有人在场、事件从哪来。 同一个图,两种关注点:前者看正确性,后者看自动化程度。
五、动手 Demo:使用状态机图表示全自动工作的情形
列洗衣机的状态迁移表。 数一数有几条需要人参与、几条是自动触发。
trans = [("待机", "按启动", "进水"), ("进水", "水位到位", "洗涤"),
("洗涤", "时间到", "排水"), ("排水", "排空", "脱水"),
("脱水", "时间到", "待机"), ("进水", "超时", "待机"),
("排水", "超时", "待机")]
human = [t for t in trans if t[1] == "按启动"]
print(len(trans), len(human), len(trans) - len(human)) # 7 1 6
实跑输出:
--------------------------------------------------------------------
使用状态机图表示全自动工作的情形
--------------------------------------------------------------------
全自动设备的核心是**无人值守**,所以只能用状态机描述。实测洗衣机:
当前状态 事件 下一个状态
-------------------------------------
待机 按启动 进水
进水 水位到位 洗涤
洗涤 时间到 排水
排水 排空 脱水
脱水 时间到 待机
进水 超时 待机
排水 超时 待机
状态 5 个
迁移 7 条
需要人参与的事件 1 个(按启动)
自动事件 6 个
**7 条迁移里只有 1 个需要人按**——这就是【全自动】的含义。
**其余 6 条全靠事件自己触发**,包括两条超时的兜底路径。
**注意兜底那两条**:超时回待机,**这是无人值守设备必须有的安全出口。**
实测:7 条迁移里只有 1 条需要人按(按启动),其余 6 条自动触发。 那 1 比 6 就是全自动的量化定义,也是与人操作的唯一接触点。 两条超时兜底不能少——少了设备可能永远停在进水状态。
30 秒实验
- 给你的一个自动化流程画状态机图,数一数几条要人按。
- 检查每条可能卡住的状态有没有超时出口。
常见误区
- 以为全自动就没有人的事。总有一个启动点,只是只有一个。
- 省掉超时兜底。卡住就永远卡住,水会一直流。
自测三问(点开对答案)
1. 为什么全自动只能用状态机? —— 无人值守没有下一步指令,只能靠事件驱动;状态机正是状态加事件迁移。 2. 实测比例如何? —— 7 条迁移里 1 条需要人按(按启动),6 条自动触发。 3. 兜底路径为什么不能少? —— 少了超时回到安全状态,设备可能永远停在进水或排水状态。- ☐ 9.14 嵌入式软件一直执行单调的工作
相关笔记
- 使用状态机图表示状态的变化 — 同一张图的另一种用法
- 嵌入式软件中设备的研究开发很重要 — 为什么要画得这么细
- 嵌入式软件一直执行单调的工作 — 图变成代码的样子
- 🧩 面向对象是怎样工作的 · 索引