定向活动广播
你可以直接将事件从一个状态广播到另一个状态,以同步同一图表中的并行(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窗格中控制无向本地事件广播的诊断操作级别。将无方向事件广播诊断设置为无、警告或错误。