🧩 第九章 建模:填补现实世界和软件之间的沟壑
📄 一句话概括

全自动的核心是无人值守,所以只能用状态机描述——实测洗衣机 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. 检查每条可能卡住的状态有没有超时出口。

常见误区

  1. 以为全自动就没有人的事。总有一个启动点,只是只有一个。
  2. 省掉超时兜底。卡住就永远卡住,水会一直流。
自测三问(点开对答案) 1. 为什么全自动只能用状态机? —— 无人值守没有下一步指令,只能靠事件驱动;状态机正是状态加事件迁移。 2. 实测比例如何? —— 7 条迁移里 1 条需要人按(按启动),6 条自动触发。 3. 兜底路径为什么不能少? —— 少了超时回到安全状态,设备可能永远停在进水或排水状态。

相关笔记