仿真

仿真功能包括参数图的解算和行为图(活动图、序列图和状态机图)的模拟运行。参数图的解算验证模型中定义的约束,按照约束关系自动计算实例的属性值,是进行设计方案权衡分析的重要工作。行为模型的模拟运行帮助你理解或进一步检查系统的行为模型是否符合真实的情况,功能设计是否完善,是细化需求分析的重要工作。系统的行为模型包括活动图、序列图和状态机图。行为模型中反映的是系统在运行时动态的状态信息、消息传递过程、顺序,以及功能(活动、动作等)执行顺序。行为模型可能包含条件、分支、循环等复杂的逻辑,行为模型的仿真可以模拟出每个可能的逻辑路径。模拟的结果也可以作为真实系统测试的方案。

启动仿真

如果是对参数图进行仿真,在模型浏览器或元素定义的图中,选择参数图代表的“模块”(Block)元素,然后右键菜单“仿真”—“运行”,启动仿真;如果是对活动图、序列图、状态机图仿真,直接打开象形的图,然后从主工具栏“分析”—“开始图片 57”工具启动仿真;或者在模型浏览器中选择对应的活动、交互或状态机元素,从右键菜单“仿真”—“运行”启动仿真。

如果是选择一个“模块”进行仿真,仿真的过程是按照“面向对象”的实体执行过程,先实例化模块,生成一个仿真对象;然后初始化实例对象的属性(生成对应的“槽”Slot),“槽”的值取属性的默认值;解算模块的所有约束。完成以上工作后,如果模块有“类目行为”(ClassifierBehavior),则接下来自动执行这个类目行为对应的图。

仿真分析的界面说明

启动仿真之后,会出现四个仿真对象监视的的窗口(默认是出现在软件窗口的下方)。

场景窗口

场景窗口中显示当前启动的仿真对象。这个对象是一个实例,名称是仿真模块的名称,值是模块名称及实例元素的内部ID。

在这个窗口中仿真操作的工具栏,功能和主工具栏功能一样。说明如下:

“开始”、“继续”:开始模块或一个行为图的仿真。如果仿真的是行为图,此时图中的起始节点状态为运行状态(绿色),起始节点的输出边也变化运行状态(绿色),而这个边末端连接的动作节点将成为即将运行状态(蓝色)。当暂停状态时,“开始”按钮名称会变为“继续”。点击“继续”,将继续自动运行。

图片 210 暂停”:当自动运行时,点击暂停,将会停止自动运行。

图片 222 “停止”:停止当前的仿真,所有节点运行状态取消,返回到没有仿真的状态。此时,可以再次点击“开始”运行一个仿真。

图片 223 “逐步”,将运行一步。即将运行状态(蓝色)的节点将变为运行状态(绿色)。如果点击“逐步”,即将运行节点是“调用行为动作”的话,将会打开行为对应的图,继续运行这个新打开的图。

图片 224 “逐过程”,也是运行一步。但运行节点是“调用行为动作”的话,则不会打开节点对应行为的图,直接标记当前节点为运行状态,准备下一个节点的运行。

图片 225 “跳出”:如果是连续运行到一个“调用行为动作”或“交互使用”、“子机状态”节点代表的一个子图中,“跳出”直接运行到当前图的结束节点,并退回到调用这个图的节点。

“单步”、图片 226 “连续”运行:如果是单步运行,每次只运行一个动作节点;如果是“连续”运行,则按照设置的“延时”时间,根据连接关系自动运行每个节点;

图片 229“跳出循环”:当仿真流程是在循环结构化节点中(循环活动节点、循环组合片段节点)的时候,点击此键,流程退出循环,继续后面的流程。

图片 228 “发送令牌”:仿真运行中,对于是“流”的参数节点或输出栓,默认是只发送一个“对象令牌”。你可以选择一个运行状态的、“流”类型的参数节点、输出栓,或者一个动作节点,点击“发送令牌”,这些节点将会变成“即将执行”状态,继续点击“单步”或“逐过程”键,这些节点将再次运行。

延时:当仿真方式是“连续”的时候,“延时”设置每个节点停留的时间。可以选择每个节点停留“1秒~5秒”之间的一个时间。

控制台

控制台窗口显示仿真过程每一步执行的结果。可进行的操作如下:

图片 230复制:将控制台中的显示内容复制到剪贴板。你可以在其它软件中“粘贴”,将复制的内容粘贴到相应的文件中。

Picture 24清理控制台:清空控制台中的内容。

控制台窗口界面如下:

变量

变量窗口显示当前仿真对象实例化后每个属性产生的槽(仿真对象是一个模块的时候)的值。在这个窗口中可以进行的操作如下:

Picture 23 刷新:刷新当前仿真对象值的显示;

Picture 22 保存该实例:将当前仿真结果对象(作为一个实例)保存到模型中。实例的每个槽的值都会保存。这样,以后可以随时查看仿真的结果。

Picture 21导出到新的实例:将最新的实例结果保存为一个新的实例。

Picture 20导出到已有实例:将当前实例的所有槽的值保存到已有的一个实例,将会覆盖已有实例的槽的值。

变量窗口内容如下:

断点

断点窗口中显示当前设置的所有断点元素。当仿真过程遇到这些元素的运行或解算时,就会暂停下来。需要再次按“继续”键才能继续仿真步骤。

窗口中的功能包括:

Picture 19 去除断点:取消选择的断点;

图片 241 去除所有断点:取消所有断点。

参数图仿真说明

参数图及其仿真计算主要用于系统设计指标的定量分析。例如计算系统的总质量、系统总的可靠度等指标,从而进行不同设计方案的权衡分析。

参数图的仿真计算,依赖于参数图中约束表达式的解析计算。参数图的仿真将以模块值属性的默认值为基础,解析每个约束,然后计算出仿真实例中属性对应的每个槽的值。约束表达式的定义,必须符合一定的语法规则。在MBSES软件中,这个语法规则说明如下。

约束表达式的语法规则

MBSES软件中约束表达式的语法参考类C语言的语法规则。

  1. 语句类型

    约束表达式的语句分为两类,“比较语句”和“赋值语句”。

    “赋值语句”左边只能有一个变量,中间只有一个“=”号(两个等号“==”认为是比较语句),右边是一个含多个变量的多项式。赋值语句的解析结果,将会把表达式右边的计算结果,赋给左边的变量。

    “比较语句”计算比较运算符左右两边多项式的值。如果条件语句成立,则约束属性的值为“true”;否则为“false”。比较运算支持关系运算符“>”、“>=”、“<”、“<=”、“==”。

  2. 表达式中的变量

    约束表达式中的变量名称应该和约束属性所属的约束模块的参数名称相同,或者与所属模块中的属性名称相同。

  3. 表达式中的运算符

    表达式中的运算符,支持常规运算符“+”、“-”、“*”、“、”。

    另外支持:

    求余运算“%”:例如“7%4”结果为“3”。

    移位运算符:

                左移位运算“<<”:例如“8<<1”结果为“16”。“8”转为二进制是“1000”,左移一位,右边空出补0,结果为二进制“10000”,十进制为16;

                 右移位运算“>>”:例如“8>>1”结果为“4”。“8”转为二进制是“1000”,右移一位,右边去掉一位,结果为二进制“100”,十进制为4;

    位运算符:

                 “与”位运算“&”:例如“1&0”结果为“0”;“1&1”结果为“1”;

                 “或”位运算“|”:例如“1&0”结果为“1”;“0&0”结果为“0”;

                  “异或”位运算“^”:相同为0,不同为1。例如“1^0”结果为“1”;“0^1”结果为“1”;“1^1”结果为“0”;“0^0”结果为“0”;

    逻辑运算符:

                    与运算符“&&”:两边子表达式的值都为“true”,则结果为“true”;否则结果为“false”;

                     或运算符“||”:两边子表达式中有至少一个为“true”,则结果为“true”;否则为“false”;

  4. 表达式中运算符优先级:

    运算符优先级从高低如下:

    “()”优先级最高;

    “*”   “/”    “%”

    “+”    “-”

    移位运算符“>>”、“<<”

    关系运算符“>”、“>=”、“<”、“<=”、“==”

    位运算符“&”    “|”    “~”

    逻辑与“&&”

    逻辑或“||”

    赋值“=”

  5. 表达式中的函数

    数学函数:

    abs(x):求x的绝对值;

    exp(x):求e的x次方;

    pow(a,b):求a的b次方;

    sqrt(x):求x的平方根;

    log(x):求e为底x的对数;

    log10(x):求10为底x的对数;

    max(a,b):求a和b中较大的一个;

    min(a,b):求a和b中较小的一个;

    truncate(x):求x的整数部分;

    round(a,b):a保留b位小数;

    ceiling(x):求大于或等于x的最小整数值;

    floor(x):求小于或等于x的最大整数值;

    sin(x):求角度x的正弦值;

    cos(x):求角度x的余弦值;

    tan(x):求角度x的正切值;

     

    字串串函数:

    strlen(x)统计字符串的长度

    strcat(a,b) 字符串a加字符串b

    strcmp(a,b) 比较两个字符串是否相同

    strchr(a , b) 查找字符串a中字符b首次出现的位置

    strrchr(a,b)查找字符串a中字符b最后出现的位置

    strstr(a,b)查找字符串a中是否存在字符串b

    strsub(a,b,c)截取字符串a中第b个字符往后共c个字符

    strssub(a,b)截取字符串a中第b个字符往后所有字符

    strrem(a,b,c) 删除字符串a中第b个字符往后c个字符

    strsrem(a,b)删除字符串a中第b个字符往后所有字符

    strrepchr(a,b,c)替换字符串a中字符b为字符c

    strrepstr(a,b,c)替换字符串a中字符串b为c

    strfirwit(a,b)字符串a是否以字符串b开头

    strendwit(a,b)字符串a是否以字符串b结尾

    strspl(a,b)字符串a以字符c分隔

    strupr(x)字符串x全部大写

    strlor(x)字符串x全部小写

    strtrm(x)去掉字符串x两端的空格

     

  6. 迭代表达式的说明

赋值表达式可以写为迭代的方式。例如:

{x=x+a+b}

也就是在迭代表达式中,作为被赋值的变量,也允许在“=”右边出现。迭代表达式的解析,将先使用变量的当前值(如果没有赋值过,使用默认值)计算赋值语句右边子表达式的值,然后把结果赋给左边的变量。

迭代表达式用于连续自动仿真。见下面的说明。

参数图的连续仿真

启动一个模块的仿真之后,模块相关的参数图只执行一次。如果要多次的执行仿真,可以通过一个图表,设置仿真的自变量变化范围和变化间隔,实现多次的联系的仿真。操作如下:

  1. 选择要仿真的模块,启动仿真,执行第一次仿真。
  2. 新建或打开一个模块定义图。
  3. 在图中增加一个“图表”节点(在1.5版以后的系统库支持图表节点)。

    如下图案例所示,对Test1模块的仿真,增加一个图标节点。Test1中的属性关系,直接通过定义一个约束表达式来表示。(可重用的约束关系,可以通过定义约束模块及参数图来定义)。

  4. 选择“图表”节点,右键“设置仿真曲线”。

在仿真设置窗口中,选择自变量以及变量泛化;然后选择因变量。自变量和因变量都是当前仿真模块“Test1”的属性。点击“开始”,如果当前仿真的实例没有保存过,会提示保存实例。之后,系统自动设置自变量的值,进行连续的仿真。

自变量和因变量不一定有数据关系。自变量可以仅仅是控制仿真的次数。例如上面Test1模块,每次仿真对约束“{c=c+1}”进行解析计算,自变量a每变化一次,c在上次仿真结果基础上+1。仿真如下图中左图所示。自变量参与约束表达式的计算,将上述约束改为“{c=c+a+1}”,则每次仿真用自变量的当前值进行计算。如下图右图所示。

行为图仿真说明

节点运行状态

节点的运行状态有四种:

默认显示状态,边框为黑色,表示节点“未运行”;或者“禁止”(disable)控制命令到达,节点已经从运行状态(绿色)转为停止状态。

蓝色边框:

对于一个动作(Action),代表至少一个输入栓已有令牌到达,即将运行,但还没有运行。

对于一个结构化活动节点(StructuredActivityNode),表示已有子节点即将运行或正在运行,但还有子节点没有运行,整个结构化节点没有运行完。

对于一个状态(State),代表输入的转移已经运行,即将进入状态。

对于一个组合状态(CompositeState),代表组合状态中已有有子状态即将执行或部分子状态已经执行完,但还有子状态没有执行,整个组合状态还没有运行完。

对于一个消息(Message),代表消息的发送事件已经发生,接收事件还没有发生。

对于一个组合片段(CombinedFragment),代表组合片段中已有交互片段在运行,但还有交互片段没有运行过,整个组合片段没有运行完。

红色边框:

节点正在运行状态。

对于一个调用行为动作(CallBehaviorAction),这个动作调用的行为的图正在运行。

对于一个交互使用(InteractionUse),对应交互的序列图正在运行。

对于一个子机状态(SubmachinState),对应的状态机的图正在运行。

对于一个状态机(State),状态中的内部行为对应的图在运行的时候。

绿色边框:

对于一个动作(Action),代表所有输入栓已有令牌到达,满足运行要求,正在运行,或者已经运行过一次。

对于一个结构化活动节点(StructuredActivityNode),表示子节点已经全部运行过。

对于一个状态(State),代表状态的内部行为已经执行完。

对于一个组合状态(CompositeState),代表组合状态中所有子状态已经执行完。

对于一个消息(Message),代表消息的发送事件和接收事件都已经发生

对于一个组合片段(CombinedFragment),代表组合片段中所有交互片段已经运行过。

 

活动图的仿真

活动图仿真界面如下:

活动图执行的原则说明如下:

图中作为开始节点的节点条件如下:

  1. 当图开始执行的时候,图中如果有“开始”节点,则开始节点将执行;
  2. 当图开始执行的时候,如果图中有参数节点,而且参数节点对应的参数方向为“进”(in)或“进出”(inout)的时候,节点将进入执行状态。
  3. 动作节点没有任何输入的对象流或控制流,这个节点将进入执行状态。

图中的中间节点执行的条件如下:

  1. 动作节点(Action),所有输入的控制流都有令牌到达(输入的控制流都是执行状态),以及对象流都有令牌到达,或者对象流对应的输入栓的下限是0(可选的)。

图中节点的执行:

  1. 调用行为动作(CallBehaviorAction),将打开对应行为元素的图。当这个图执行完毕后,再返回此节点后面的节点执行。
  2. 发送信号动作(SendMessageAction),如果有“目标”输入栓,则信号将发送到目标栓类型的模块的类目行为中,接收信号动作的信号类型是这种信号的那个接收信号动作;否则,信号发送给当前图中接收信号类型是这种信号的动作。
  3. 接收事件动作。接收事件动作如果没有输入的控制流,则图形仿真开始的时候处于准备执行状态。如果接收事件动作的触发器是信号接收事件,当接收到信号的时候开始执行。
  4. 分支节点,每个分支将开始一个线程。每执行一步,每个线程都执行一步。
  5. 集合节点,当所有分支都执行完之后,集合节点后面的节点才开始执行。
  6. 决定节点,第一次运行需要指定运行那个分支。用鼠标选择要执行的分支,然后执行下一步,将执行这个选择的分支。当只有一个分支未执行的时候,会自动选择这个分支执行。
  7. 对于参数节点或输出栓,如果是“流”或者“连续”类型,当执行过一次后,模拟又有一个令牌到达或发出,可以选择节点,然后点击“发送令牌”按钮。

当前图结束:

  1. 任何执行分支如果执行到“活动终止”节点,图中所有分支停止执行,退回到调用这个图的节点处;或者整个仿真过程结束。

 

序列图的仿真

序列图仿真执行的原则如下:

  1. 图中最上面、最外层的消息先执行。
  2. 根据图中生命线、消息的位置关系,从上到下依次执行。
  3. 如果有组合片段,以整个组合片段覆盖范围内的消息的位置关系判断执行顺序。
  4. 对于并行的组合片段,每个操作域并行执行。
  5. 对于备选的组合片段,选择一个操作域执行。
  6. 对于交互使用节点,进入下级交互元素代表的图执行。
  7. 当所有可执行的节点、消息执行完后,整个图认为执行完。

 

如下图所示:

图片 240
 

状态机图的仿真

状态机图仿真根据状态及状态之间的转移关系自动进行状态的转换显示。

状态机图仿真执行的原则如下:

  1. 从初始伪状态节点开始执行。
  2. 进入状态的转移执行完毕后,则状态开始执行。
  3. 每个状态,如果状态有内部行为,则进入内部行为的图执行(从entry、到do依次执行)。如果内部行为只是一个描述,则忽略。
  4. 状态的entry、do内部行为执行完毕后,等待触发器事件发生;如果在仿真工具栏中触发器下拉框选择其中一个触发器,则对应的转移触发;此时,先执行当前状态的exit行为;之后,这个选中的转移执行。
  5. 如果一个状态,转出的转移只有一个,而且没有触发器对象(空,或者只有触发器描述),则自动执行这个转移。如果有多个这样的转移,则需要在“分析”“仿真”工具栏中的触发器下拉框中选中一个转移,才能够继续执行。如“捕获”状态的转出转移,因为有一个“连接伪状态”,有两个分支,所以,必须在触发器下拉框中选择“姿态更新(当前姿态)”,然后再选择第一个“当前姿态==规则姿态”,才会走到组合状态“在站”。
  6. 执行的转移如果有“影响”行为,则执行这个行为。如果无影响行为,则忽略。转移设置“为已执行”。
  7. 进入下一个状态的执行。
  8. 如果进入复合状态,先执行行为的“entry”、“do”;然后从复合状态内部的“初始伪状态”开始,按转移关系执行各状态;如果转移到复合状态外的状态,先执行复合状态的“exit”,复合状态执行完毕。
  9. 遇到“终态”节点,停止状态机图的执行。

如下所示:

 

MBSES用户使用说明书