YAOTU INSIGHTS

转移、时间运算符与消息

转移、时间运算符与消息
1. 概念讲解Test Sequence 模块以 MATLAB 作为动作语言。一个测试步骤执行完之后如何进入下一个步骤由 Transition 单元格中的表达式决定。指南把这类表达式归为三类依据条件逻辑直接比较信号值如M 3.5、时间运算符Temporal Operators评估仿真时间与事件/转移运算符Transition Operators评估信号事件如值刚发生变化。指南用一个直观例子引出这三类运算符一个测试序列以三种频率输出正弦波它根据开关信号Switch的变化逐步推进——Initialize输出零后无条件进入SineSine在hasChanged(Switch)时进入Sine8Sine8在hasChangedFrom(Switch,1)时进入Sine16Sine16在hasChangedTo(Switch,13.344)时进入Stop。时间运算符回答时间到了没有。需要注意两个易混点其一et度量的是当前测试步骤已经停留的时间而t度量的是整个仿真已经进行的时间其二在信号条件中使用的变量必须是 Test Sequence 模块中的输入、参数或常量。转移运算符回答信号是否刚发生了某种变化。它不是电平判断而是事件判断hasChanged(h)只在h自进入本步骤以来发生变化的那一刻为真。这类运算符要求u必须是输入数据符号。消息Message则用于建模异步事件。普通数据信号是每拍刷新的电平而消息是排队的、被评估后才被取出的事件消息在队列中排队直到你用receive评估它才会出队消息在被转发或当前时间步结束前一直有效。消息可以在 Test Sequence 模块与 Stateflow 图等其他块之间传递数据详见 Stateflow 文档的 Messages 一节。2. 操作步骤 / 工作流1时间运算符速查运算符语法含义示例etet(TimeUnits)本测试步骤已经停留的时间省略 TimeUnits 时返回秒et(msec)以毫秒计的步骤停留时间tt(TimeUnits)整个仿真已经进行的时间省略 TimeUnits 时返回秒t(usec)以微秒计的仿真时间afterafter(n, TimeUnits)自进入本步骤起经过 n 个时间单位后为真after(4,sec)进入步骤满 4 秒后beforebefore(n, TimeUnits)自进入本步骤起的前 n 个时间单位内为真before(4,sec)进入步骤未满 4 秒时durationElapsedTime duration(Condition, TimeUnits)返回条件 Condition 持续为真的时间当步骤被重新进入、或条件不再为真时该计时复位duration(Phi1,msec) 550Phi1 持续超过 550 毫秒参数约定TimeUnits取值为sec、msec、usecCondition是一个逻辑表达式如u 0、x 1.56其中的变量可以是输入、参数或常量最多允许一个局部或输出数据。2转移运算符速查运算符语法含义示例hasChangedhasChanged(u)自进入本步骤以来u的值发生过变化则为真否则为假hasChanged(h)hasChangedFromhasChangedFrom(u, A)u刚从值 A 变化而来则为真hasChangedFrom(h,1)hasChangedTohasChangedTo(u, B)u刚变化到值 B 则为真hasChangedTo(h,0)三个运算符中的u都必须是输入数据符号。3在测试序列中使用消息接收消息要在动作或转移中使用队列里的消息必须先用receive。receive(M)判断输入队列M中是否有消息有则取出并返回 true无则返回 false。取出后用点号写法M.data访问消息数据。创建消息输入的方法是在 Symbols 侧栏指向 Input单击添加消息图标输入消息名。发送消息创建一个消息输出Symbols 侧栏指向 Output单击添加消息图标用M.data给消息数据赋值再用send(M)发送。转发消息先receive取出消息再用forward(M, M_out)把输入队列消息转发到输出端口。队列类型消息出队顺序取决于队列类型。在 Symbols 侧栏单击该消息输入旁的编辑图标在消息属性对话框中设置Queue type。3. 示例指南给出了一个对比示例sltest_testsequence_data_vs_message模型包含两对 Test Sequence 块第一对用普通数据收发第二对用消息收发以此展示两者行为差异。用普通数据的一方DataSender 块给数据输出M赋值M 3.5DataReceiver 块等待 3 秒后转移到 S2S2 用M 3.5的条件转移到 S3S3 再用同样条件转移到 S4。用消息的一方MessageSender 块给消息输出M_out的消息数据赋值M.data 3.5再send(M)把消息发给 MessageReceiver。MessageReceiver 等待 3 秒后转移到 S2S2 的转移条件是receive(M) M.data 3.5——receive(M)把消息从队列取出队列中确实有消息故返回 true再比较M.data 3.5成立于是转移到 S3。而 S3 的转移条件receive(M)评估时队列中已没有消息返回 false因此 S3 不会转移到 S4。完整命令序列model sltest_testsequence_data_vs_message; open_system(model) % ... 在 Test Sequence 编辑器中观察上述步骤 ... open_system([model /Scope]) sim(model) close_system(model,0) clear(model)model sltest_testsequence_data_vs_message; open_system(model) % ... 在 Test Sequence 编辑器中观察上述步骤 ... open_system([model /Scope]) sim(model) close_system(model,0) clear(model)仿真后对比 Scope 中两个通道dataStep 通道在 3 秒后依次走到 S3、S4messageStep 通道在 S2 之后停住——因为消息只被receive了一次第二次receive时队列已空。4. 要点与注意事项et与t不要混用after(4,sec)等价于在本步骤待满 4 秒它基于et若你要表达整个仿真进行到第 4 秒应直接在条件里写t(sec) 4。duration(Condition, TimeUnits)的计时会在两种情况下复位重新进入该步骤或条件变为不真。写持续时间判据如信号必须稳定保持 550 ms时要意识到这种复位语义。hasChanged系列只在进入本步骤之后的变化才计数。如果信号在进入本步骤之前就已经处于目标电平转移不会触发——这是最常见的事件转移不生效原因。hasChanged系列的u必须是输入数据符号不能对 Local 或输出数据使用。消息必须先receive才能访问M.data消息只在被转发或当前时间步结束前有效不要指望跨时间步保留。队列类型FIFO 等决定多条消息的出队顺序需要时在消息属性对话框中设置。本讲运算符同样可在 Stateflow 图的状态与转移中使用但square、sawtooth、triangle、ramp、heaviside、latch等信号生成函数不支持 Stateflow 图。