同步状态的广播事件

定向活动广播
你可以直接将事件从一个状态广播到另一个状态,以同步同一图表中的并行(AND)状态。以下规则适用:
在事件广播期间,接收状态必须处于活动状态。
一个图表中的操作无法将事件广播到另一个图表的状态。
与无定向广播相比,使用定向本地事件广播有以下好处:
防止模拟过程中出现不必要的递归。
提高生成代码的效率。

使用send定向本地事件广播

带send的定向本地事件广播的格式为:
send(event_name,state_name)

其中event_name被广播到state_name和层次结构中该状态的任何子代。发送的事件必须对发送状态和接收状态都可见(state_name)。
state_name参数可以包含状态的完整层次结构路径。例如,如果状态A包含状态A1,则通过以下广播向状态A1发送事件e:
send(e, A.A1)

以下定向本地事件广播的示例使用send(event_name,state_name)语法。
在这里插入图片描述

在这个例子中,事件E_one属于chart,对A和B都可见。
这时候把E_one放在整个chart下面。
在这里插入图片描述

使用限定事件名称定向本地事件广播

使用合格事件名称的定向本地事件广播的格式为:
send(state_name.event_name)

其中event_name被广播到state_name和层次结构中该状态的任何子代。您发送的事件必须对发送状态和接收状态都可见(state_name)。
state_name参数还可以包含接收状态的完整层次结构路径。不要在state的完整路径名中使用图表名称。
以下示例显示了在定向本地事件广播中使用限定事件名称。

在这里插入图片描述
在这个例子中,事件E_one属于状态B,并且仅对该状态可见。记住用这种方式的时候E_one必须放在状态B下面,而不是chart下面。
在这里插入图片描述生成代码如下

void demo_1_step(void)
{
  /* Chart: '<Root>/Chart' incorporates:
   *  Inport: '<Root>/In2'
   */
  /* Gateway: Chart */
  /* During: Chart */
  if (demo_1_DW.is_active_c3_demo_1 == 0U) {
    /* Entry: Chart */
    demo_1_DW.is_active_c3_demo_1 = 1U;

    /* Entry Internal: Chart */
    demo_1_DW.is_active_A = 1U;

    /* Entry Internal 'A': '<S1>:16' */
    /* Transition: '<S1>:2' */
    demo_1_DW.is_A = demo_1_IN_a1;

    /* Outport: '<Root>/Out1' incorporates:
     *  Inport: '<Root>/In1'
     */
    /* Entry 'a1': '<S1>:1' */
    demo_1_Y.Out1 = demo_1_U.In1 + 100.0;
    demo_1_DW.is_active_B = 1U;

    /* Entry Internal 'B': '<S1>:13' */
    /* Transition: '<S1>:17' */
    demo_1_DW.is_B = demo_1_IN_b1;
  } else {
    if (demo_1_DW.is_active_A != 0U) {
      /* During 'A': '<S1>:16' */
      switch (demo_1_DW.is_A) {
       case demo_1_IN_a1:
        /* During 'a1': '<S1>:1' */
        if (demo_1_U.In2 == 1.0) {
          /* Transition: '<S1>:20' */
          if (demo_1_DW.is_active_B != 0U) {
            /* During 'B': '<S1>:13' */
            switch (demo_1_DW.is_B) {
             case demo_1_IN_b1:
              /* During 'b1': '<S1>:9' */
              /* Transition: '<S1>:18' */
              demo_1_DW.is_B = demo_1_IN_b2;

              /* Outport: '<Root>/Out1' */
              /* Entry 'b2': '<S1>:12' */
              demo_1_Y.Out1 = 456.0;
              break;

             case demo_1_IN_b2:
              /* During 'b2': '<S1>:12' */
              break;

             default:
              /* Unreachable state, for coverage only */
              demo_1_DW.is_B = demo_1_IN_NO_ACTIVE_CHILD;
              break;
            }
          }

          demo_1_DW.is_A = demo_1_IN_a2;

          /* Outport: '<Root>/Out1' */
          /* Entry 'a2': '<S1>:11' */
          demo_1_Y.Out1 = 123.0;
        }
        break;

       case demo_1_IN_a2:
        /* During 'a2': '<S1>:11' */
        break;

       default:
        /* Unreachable state, for coverage only */
        demo_1_DW.is_A = demo_1_IN_NO_ACTIVE_CHILD;
        break;
      }
    }

    if (demo_1_DW.is_active_B != 0U) {
      /* During 'B': '<S1>:13' */
      switch (demo_1_DW.is_B) {
       case demo_1_IN_b1:
        /* During 'b1': '<S1>:9' */
        break;

       case demo_1_IN_b2:
        /* During 'b2': '<S1>:12' */
        break;

       default:
        /* Unreachable state, for coverage only */
        demo_1_DW.is_B = demo_1_IN_NO_ACTIVE_CHILD;
        break;
      }
    }
  }

  /* End of Chart: '<Root>/Chart' */
}

检测无定向本地事件广播的诊断

如果在图表中的状态操作或条件操作中有无向的本地事件广播,则在模拟过程中默认会出现警告。无定向本地事件广播的state actions示例包括:
entry:send(E1),其中E1是图表中的本地事件
exit:E2,其中E2是图表中的本地事件
您可以在Model Configuration Parameters对话框的Diagnostics > Stateflow窗格中控制无向本地事件广播的诊断操作级别。将无方向事件广播诊断设置为无、警告或错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值