预订演示
前页 后页

事件宏:EVENT_PARAMETER

EVENT_PARAMETER 是一个函数宏,用于访问信号实例的属性,在状态的行为中,转移

的守护和效果。该宏将根据仿真语言扩展为可执行代码。

访问默认宏定义

功能区|开发 |源代码 |选项 |编辑代码模板|语言 | Stm事件参数

用途格式

%EVENT_PARAMETER(信号类型,信号属性名称)%

例如: A信号'MySignal'有两个属性,'foo: int '和'bar: int ';这些用例是有效的:

  • 转移
    的效果:%EVENT_PARAMETER(MySignal, foo)%
  • 状态的行为:%EVENT_PARAMETER(MySignal, bar)%
  • 转移
    的守卫:%EVENT_PARAMETER(MySignal, bar)% > 10
  • 状态的行为:%EVENT_PARAMETER(MySignal, bar)%++
  • 跟踪值到仿真窗口:%TRACE(EVENT_PARAMETER(MySignal, 富))%

宏扩展示例

对于带有属性“value”的信号“MySignal”,转移

的宏扩展示例转移

带信号触发:%EVENT_PARAMETER(MySignal, value)%

C

((MySignal*)信号)->值

C++

static_cast<MySignal*>(signal)->value

C#

((MySignal)信号).value

Java

((EventProxy.MySignal)信号).value

JavaScript

信号值

示例

这个例子演示了如何在转移

中使用 EVENT_MACRO转移

的效果、守卫和状态的行为。

在运行模拟时,

( 1 ) 触发 REQUEST 并为属性值指定数字1 。

由于守卫的条件为false ,因此活动状态将保持为 State1。

(2) 触发 REQUEST 并为属性值指定数字 11。

由于守卫的条件为真,活动状态将从State1变为State2;

转移

的效果被执行。在这里,我们将信号属性的运行时值跟踪到模拟窗口。

State2 的行为被执行。在这里,我们增加了信号属性的运行时间值并将其跟踪到模拟窗口。

[32608107] [Part1:TransactionServer]转移

影响:影响

[32608118] [Part1:TransactionServer] 入口行为:StateMachine_State1

[32608124] [Part1:TransactionServer]行为:StateMachine_State1

[32608877] [第 1 部分:TransactionServer] 完成:TransactionServer_StateMachine_State1

[触发器] 等待简单

[32613165] 命令:广播 REQUEST.RequestSignal( 1 )

[32613214] [Part1:TransactionServer]事件排队:REQUEST.RequestSignal(值: 1 )

[32613242] [Part1:TransactionServer]事件调度:REQUEST.RequestSignal(值: 1 )

[触发器] 等待简单

[32619541] 命令:广播 REQUEST.RequestSignal(11)

[32619546] [Part1:TransactionServer]事件排队:REQUEST.RequestSignal(值:11)

[32619551] [Part1:TransactionServer]事件调度:REQUEST.RequestSignal(值:11)

[32619557] [Part1:TransactionServer] 退出行为:StateMachine_State1

[32619562] [Part1:TransactionServer]转移

影响:影响

[32619567] RequestSignal 的实例。价值

[32619571] 11

[32619576] [Part1:TransactionServer] 入口行为:StateMachine_State2

[32619584]状态的进入行为:增加 RequestSignal 的实例。值1 :

[32619590] 12

[32619594] [Part1:TransactionServer]行为:StateMachine_State2

[32620168] [第 1 部分:TransactionServer] 完成:TransactionServer_StateMachine_State2

[触发器] 等待简单

[32622266] 命令:广播结束

[32622272] [Part1:TransactionServer]事件排队:END

[32622310] [Part1:TransactionServer]事件调度:END

[32622349] [Part1:TransactionServer] 退出行为:StateMachine_State2

[32622359] [Part1:TransactionServer]转移

影响:影响

[32622896] [第 1 部分:TransactionServer] 完成:TransactionServer_VIRTUAL_SUBMACHINESTATE

限制和解决方法

由于宏扩展涉及类型转换,因此用户有责任确保类型转换有效。

以下是模型中类型转换会遇到问题的一些常见情况的解决方法。

  • 一个转移
    具有不同信号类型的多个触发器
例如,一个转移

有triggerA(指定SignalA)和triggerB(指定SignalB); A这个转移

时,宏 %EVENT_PARAMETER(SignalA, attributeOfA)% 将不起作用转移

由 triggerB 触发。

我们建议创建两个转换,一个使用 triggerA(指定 SignalA),另一个使用 triggerB(SignalB)。

  • 一个状态是不同信号触发的多个Transition的目标
例如,TransitionA 和 TransitionB 都针对 MyState,TransitionA 由 SignalA 触发,TransitionB 由 SignalB 触发。

如果在状态的行为代码中使用了 EVENT_PARAMETER,则一个宏将无法同时适用于两种情况。

我们建议将处理信号属性的逻辑从状态的行为转移到转移

的效果。

  • 自定义模板和生成的代码
用户也可以更改默认模板,在类型转换前添加运行时间类型标识(RTTI)。用户也可以在生成后修改生成的代码,也可以满足编译后的模拟目的。