【问题标题】:state machine for a cd writercd 刻录机的状态机
【发布时间】:2014-06-16 02:51:12
【问题描述】:

作为一个新手,我正在尝试使用 Visio 为 cd 编写器开发一个状态机。下面是设备操作/交易并附上,是我到目前为止所做的图表,不确定它是否准确表示。

Device operation 
  • 加载按钮 - 使抽屉打开并在打开时关闭(加载一个空的 cdr)

  • 刻录按钮 - 开始在 cdr 上刻录文档,刻录过程中绿灯亮
    完成后熄灭。一旦 cdr 被烧毁,writer 就会停止。

  • 验证按钮 - 验证之前记录在 cdr 上的文档,绿灯亮起 进程并在完成后熄灭,然后设备停止

  • 取消按钮 - 在记录或验证期间随时停止进程

  • 取消按钮 - 如果 cd 写入器为空或不忙于验证或录制,则无效 通电时 - CD 写入器将确保抽屉关闭

  • 刻录按钮 - 当 cd 刻录机为空以及在录制或验证过程中时无效。

  • 只有在刻录机不忙于刻录时才能开始验证。

【问题讨论】:

    标签: uml state-machine statechart


    【解决方案1】:
    • 您不需要描述从“空”到“空”的转换,因为不需要在状态机图中绘制没有任何操作或状态转换的转换。 (State Transition tables 通常用于检查此类情况下是否存在任何丢失的转换。)
    • “已加载”和“空闲”可以同时表示为同一状态
    • 为了表示“绿灯”,我将“打开绿灯”写为“录制”中的进入操作,“关闭绿灯”作为退出

    这是我画的图。托盘的状态(无论是打开还是关闭)应该在实际模型中考虑,但它不在我下面的示例图中。

    【讨论】:

      【解决方案2】:

      从视觉上看,您的图表看起来像一个状态机,并且状态具有好听的名称 - 这是一个好的开始。 :)

      我看到的第一个问题是转换规范。这绝对是不正确的。 UML 中的状态转换按以下格式指定:

      事件 [守卫] /action

      地点:

      • 事件(或触发器)是开始转换的外部“内部”“信号”。它可以是用户激活的按钮、经过的计时器、检测到的错误等。甚至可以省略。
      • guard 是一个逻辑条件,应该满足才能开始转换。它通常是一个返回布尔值 tru 或 false 的表达式。也可以省略。
      • action 是一种副作用,即在触发转换时执行的操作。 Ic 也可以省略。

      回到你的图表,我想说...

      1. 转换上的大多数标签不应带有“/”,因为它表示一个动作。多为手动触发,如“加载”(按下按钮打开抽屉)、“取消”、“按钮”等。
      2. 考虑一些内部触发的事件,例如“刻录完成”或“CD 加载”
      3. 您可以在可能的情况下添加一些保护条件
      4. 我会删除所有没有效果的触发器(比如取消没有 CD)。它使图表更简单,不会丢失信息
      5. 在您的情况下,状态 LOADED 和 IDLE 有点奇怪,很弱。目前尚不清楚是什么让它们不同(参见下面的示例)

      这是一个我觉得更准确的图表(有关其他 cmets,请参阅注释):

      【讨论】:

      • 非常感谢您的回复和图表。但是,在空闲状态进入空(关闭)状态的图中,我认为它应该进入空(打开)状态。我的原因是,当设备处于空闲状态(加载)并且需要进入时到空(未加载)状态,抽屉需要打开,将其变为空(打开)状态。我对任何异议持开放态度。谢谢
      • 你是对的,对不起!它绝对应该从 IDLE --> OPEN 开始,并且没有指定防护(因为它总是会在这里加载)。在此之后,下一个“加载”触发器将导致它进入 CLOSED 或 IDLE,具体取决于守卫。
      • 请查看修改后的状态机图。
      • 一些细节: - 关机不应该是结束状态,因为它的意思是对象被销毁。每次断电时设备肯定不会被破坏。我不会首先将其建模为状态,它是一种假设并且不必直接与基本操作有关 - 将退出操作与后续状态的进入操作对齐(如果您在 CLOSE/exit 上有“打开抽屉” ,您不需要对 OPEN/entry 执行相同的操作) - 与转换操作和后续状态的条目相同 - 它们不应重复
      【解决方案3】:

      您需要指定显式事件作为转换的触发器。

      在当前状态机中,每个转换(离开初始顶点的转换除外)都有效果,但没有触发器。更准确地说,它们由默认的完成事件触发,因此是自动的。

      此外,由于所有转换都对同一事件做出反应,因此您的状态机是不确定的。例如,在状态 loaded 中,到 Recording、empty 和 Loaded 的转换都对完成事件做出反应。当完成事件被调度时,这些转换被称为是冲突的,并且其中一个被非确定性地选择。我敢肯定这不是你想要的。

      阅读 UML 规范,并为您的转换定义触发器。

      【讨论】:

        猜你喜欢
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 2010-10-26
        • 1970-01-01
        相关资源
        最近更新 更多