stateflow
stateflow状态转移和动作过程中,可以使用两种类型的时序逻辑:基于事件和绝对时间。基于事件的时序逻辑可跟踪重复发生的事件,绝对时间时序逻辑则基于 Stateflow 图的仿真时间定义时间段。要对这些重复事件或仿真时间进行操作,可以使用称为时序逻辑操作符的内置函数。
tateflow可实现时序逻辑,通过时间控制stateflow图的执行,包括基于事件的时序逻辑和绝对时间的时序逻辑。
操作符 | 语法 | 说明 |
after | after(n, E) E 是 after 操作符的基础事件;n 可以是: · 正整数 · 计算结果为正整数值的表达式 | 如果基础事件 E 自关联状态激活后至少已发生 n 次,则返回 true。否则,操作符返回 false。 在不包含输入事件的 Stateflow 图中,如果图自关联状态激活后已唤醒 n 次或更多次,after(n, tick) 或 after(n, wakeup) 会返回 true。 每次关联状态重新激活时,请将 E 的计数器重置为 0。 |
before | before(n, E) E 是 before 操作符的基础事件;n 可以是: · 正整数。 · 计算结果为正整数值的表达式。 | 如果基础事件 E 自关联状态激活后发生次数少于 n 次,则返回 true。否则,操作符返回 false。 在不包含输入事件的 Stateflow 图中,如果 Stateflow 图自关联状态激活后唤醒次数少于 n 次,则 before(n, tick) 或 before(n, wakeup) 会返回 true。 每次关联状态重新激活时,请将 E 的计数器重置为 0。 |
at | at(n, E) E 是 at 操作符的基础事件;n 可以是: · 正整数。 · 计算结果为正整数值的表达式。 | 仅当基础事件 E 自关联状态激活后发生第 n 次时,才返回 true。否则,操作符返回 false。 在不包含输入事件的 Stateflow 图中,如果 Stateflow 图自关联状态激活后已唤醒第 n 次,at(n, tick) 或 at(n, wakeup) 将返回 true。 每次关联状态重新激活时,请将 E 的计数器重置为 0。 |
every | every(n, E) E 是 every 操作符的基础事件;n 可以是: · 正整数。 · 计算结果为正整数值的表达式。 | 当基础事件 E 自关联状态激活后每发生 n次时,返回 true。否则,操作符返回 false。 在不包含输入事件的 Stateflow 图中,当图自关联状态激活后唤醒 n 的整数倍次数时,every(n, tick) 或 every(n, wakeup) 会返回 true。 每次关联状态重新激活时,请将 E 的计数器重置为 0。因此,此操作符只适用于状态操作,而不适用于转移。 |
temporalCount | temporalCount(E) E 是 temporalCount 操作符的基础事件。 | 自关联状态激活后,基础事件 E 每发生一次,值递增 1,并返回正整数。否则,操作符返回 0 值。 每次关联状态重新激活时,请将 E 的计数器重置为 0。 |
以下示例说明了基于事件的时序逻辑在状态动作和转移中的使用。
操作符 | 用法 | 示例 | 说明 |
after | 状态动作 (on after) | on after(5, CLK): status('on'); | 每次 CLK 循环期间会出现一条状态消息,从状态激活后开始 5 个时钟周期。 |
after | 转移 | ROTATE[after(10, CLK)] | 仅在广播 ROTATE 事件但不早于状态激活后的 10 个 CLK 循环时,才会发生转出关联状态的转移。 |
before | 状态动作 (on before) | on before(MAX, CLK): temp++; | temp 变量在每次 CLK 循环时递增一次,直到状态达到 MAX 限制。 |
before | 转移 | ROTATE[before(10, CLK)] | 只在广播 ROTATE 事件但不晚于状态激活后的 10 个 CLK 循环时,才会发生转出关联状态的转移。 |
at | 状态动作 (on at) | on at(10, CLK): status('on'); | 状态消息会在状态激活后的正好 10 个 CLK 循环时出现。 |
at | 转移 | ROTATE[at(10, CLK)] | 仅在广播 ROTATE 事件且正好在状态激活后的 10 个 CLK 循环时,才会发生转出关联状态的转移。 |
every | 状态动作 (on every) | on every(5, CLK): status('on'); | 状态激活后,每 5 个 CLK 循环会出现一条状态消息。 |
temporalCount | 状态动作 (during) | du: y = mm[temporalCount(tick)]; | 此动作会对状态激活后的时钟时间进行计数并返回整数值。然后,该动作会为变量 y 赋予 mm 数组的值,该数组的索引是 temporalCount 操作符返回的值。 |
stateflow中每个状态有两种形式:OR和AND,设置方式为:点击需要设置状态模式的状态,右键选择该状态内部的子状态的运行方式。如果为OR,则需要选择内部子状态执行的顺序,如果为AND则表示状态激活时,内部的子状态将同时被激活,处于并行模式。并行状态一般与stateflow的广播相关,具体可以参考广播的内容。