仿真功能包括参数图的解算和行为图(活动图、序列图和状态机图)的模拟运行。参数图的解算验证模型中定义的约束,按照约束关系自动计算实例的属性值,是进行设计方案权衡分析的重要工作。行为模型的模拟运行帮助你理解或进一步检查系统的行为模型是否符合真实的情况,功能设计是否完善,是细化需求分析的重要工作。系统的行为模型包括活动图、序列图和状态机图。行为模型中反映的是系统在运行时动态的状态信息、消息传递过程、顺序,以及功能(活动、动作等)执行顺序。行为模型可能包含条件、分支、循环等复杂的逻辑,行为模型的仿真可以模拟出每个可能的逻辑路径。模拟的结果也可以作为真实系统测试的方案。
如果是对参数图进行仿真,在模型浏览器或元素定义的图中,选择参数图代表的“模块”(Block)元素,然后右键菜单“仿真”—“运行”,启动仿真;如果是对活动图、序列图、状态机图仿真,直接打开象形的图,然后从主工具栏“分析”—“开始”工具启动仿真;或者在模型浏览器中选择对应的活动、交互或状态机元素,从右键菜单“仿真”—“运行”启动仿真。
如果是选择一个“模块”进行仿真,仿真的过程是按照“面向对象”的实体执行过程,先实例化模块,生成一个仿真对象;然后初始化实例对象的属性(生成对应的“槽”Slot),“槽”的值取属性的默认值;解算模块的所有约束。完成以上工作后,如果模块有“类目行为”(ClassifierBehavior),则接下来自动执行这个类目行为对应的图。
启动仿真之后,会出现四个仿真对象监视的的窗口(默认是出现在软件窗口的下方)。
场景窗口中显示当前启动的仿真对象。这个对象是一个实例,名称是仿真模块的名称,值是模块名称及实例元素的内部ID。
在这个窗口中仿真操作的工具栏,功能和主工具栏功能一样。说明如下:
“开始”、“继续”:开始模块或一个行为图的仿真。如果仿真的是行为图,此时图中的起始节点状态为运行状态(绿色),起始节点的输出边也变化运行状态(绿色),而这个边末端连接的动作节点将成为即将运行状态(蓝色)。当暂停状态时,“开始”按钮名称会变为“继续”。点击“继续”,将继续自动运行。
暂停”:当自动运行时,点击暂停,将会停止自动运行。
“停止”:停止当前的仿真,所有节点运行状态取消,返回到没有仿真的状态。此时,可以再次点击“开始”运行一个仿真。
“逐步”,将运行一步。即将运行状态(蓝色)的节点将变为运行状态(绿色)。如果点击“逐步”,即将运行节点是“调用行为动作”的话,将会打开行为对应的图,继续运行这个新打开的图。
“逐过程”,也是运行一步。但运行节点是“调用行为动作”的话,则不会打开节点对应行为的图,直接标记当前节点为运行状态,准备下一个节点的运行。
“跳出”:如果是连续运行到一个“调用行为动作”或“交互使用”、“子机状态”节点代表的一个子图中,“跳出”直接运行到当前图的结束节点,并退回到调用这个图的节点。
“单步”、
“连续”运行:如果是单步运行,每次只运行一个动作节点;如果是“连续”运行,则按照设置的“延时”时间,根据连接关系自动运行每个节点;
“跳出循环”:当仿真流程是在循环结构化节点中(循环活动节点、循环组合片段节点)的时候,点击此键,流程退出循环,继续后面的流程。
“发送令牌”:仿真运行中,对于是“流”的参数节点或输出栓,默认是只发送一个“对象令牌”。你可以选择一个运行状态的、“流”类型的参数节点、输出栓,或者一个动作节点,点击“发送令牌”,这些节点将会变成“即将执行”状态,继续点击“单步”或“逐过程”键,这些节点将再次运行。
延时:当仿真方式是“连续”的时候,“延时”设置每个节点停留的时间。可以选择每个节点停留“1秒~5秒”之间的一个时间。
控制台窗口显示仿真过程每一步执行的结果。可进行的操作如下:
复制:将控制台中的显示内容复制到剪贴板。你可以在其它软件中“粘贴”,将复制的内容粘贴到相应的文件中。
清理控制台:清空控制台中的内容。
控制台窗口界面如下:
变量窗口显示当前仿真对象实例化后每个属性产生的槽(仿真对象是一个模块的时候)的值。在这个窗口中可以进行的操作如下:
刷新:刷新当前仿真对象值的显示;
保存该实例:将当前仿真结果对象(作为一个实例)保存到模型中。实例的每个槽的值都会保存。这样,以后可以随时查看仿真的结果。
导出到新的实例:将最新的实例结果保存为一个新的实例。
导出到已有实例:将当前实例的所有槽的值保存到已有的一个实例,将会覆盖已有实例的槽的值。
变量窗口内容如下:
断点窗口中显示当前设置的所有断点元素。当仿真过程遇到这些元素的运行或解算时,就会暂停下来。需要再次按“继续”键才能继续仿真步骤。
窗口中的功能包括:
去除断点:取消选择的断点;
去除所有断点:取消所有断点。
参数图及其仿真计算主要用于系统设计指标的定量分析。例如计算系统的总质量、系统总的可靠度等指标,从而进行不同设计方案的权衡分析。
参数图的仿真计算,依赖于参数图中约束表达式的解析计算。参数图的仿真将以模块值属性的默认值为基础,解析每个约束,然后计算出仿真实例中属性对应的每个槽的值。约束表达式的定义,必须符合一定的语法规则。在MBSES软件中,这个语法规则说明如下。
MBSES软件中约束表达式的语法参考类C语言的语法规则。
约束表达式的语句分为两类,“比较语句”和“赋值语句”。
“赋值语句”左边只能有一个变量,中间只有一个“=”号(两个等号“==”认为是比较语句),右边是一个含多个变量的多项式。赋值语句的解析结果,将会把表达式右边的计算结果,赋给左边的变量。
“比较语句”计算比较运算符左右两边多项式的值。如果条件语句成立,则约束属性的值为“true”;否则为“false”。比较运算支持关系运算符“>”、“>=”、“<”、“<=”、“==”。
约束表达式中的变量名称应该和约束属性所属的约束模块的参数名称相同,或者与所属模块中的属性名称相同。
表达式中的运算符,支持常规运算符“+”、“-”、“*”、“、”。
另外支持:
求余运算“%”:例如“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”;
运算符优先级从高低如下:
“()”优先级最高;
“*” “/” “%”
“+” “-”
移位运算符“>>”、“<<”
关系运算符“>”、“>=”、“<”、“<=”、“==”
位运算符“&” “|” “~”
逻辑与“&&”
逻辑或“||”
赋值“=”
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两端的空格
赋值表达式可以写为迭代的方式。例如:
{x=x+a+b}
也就是在迭代表达式中,作为被赋值的变量,也允许在“=”右边出现。迭代表达式的解析,将先使用变量的当前值(如果没有赋值过,使用默认值)计算赋值语句右边子表达式的值,然后把结果赋给左边的变量。
迭代表达式用于连续自动仿真。见下面的说明。
启动一个模块的仿真之后,模块相关的参数图只执行一次。如果要多次的执行仿真,可以通过一个图表,设置仿真的自变量变化范围和变化间隔,实现多次的联系的仿真。操作如下:
如下图案例所示,对Test1模块的仿真,增加一个图标节点。Test1中的属性关系,直接通过定义一个约束表达式来表示。(可重用的约束关系,可以通过定义约束模块及参数图来定义)。
在仿真设置窗口中,选择自变量以及变量泛化;然后选择因变量。自变量和因变量都是当前仿真模块“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),代表组合片段中所有交互片段已经运行过。
活动图仿真界面如下:
活动图执行的原则说明如下:
图中作为开始节点的节点条件如下:
图中的中间节点执行的条件如下:
图中节点的执行:
当前图结束:
序列图仿真执行的原则如下:
如下图所示:
状态机图仿真根据状态及状态之间的转移关系自动进行状态的转换显示。
状态机图仿真执行的原则如下:
如下所示:
MBSES用户使用说明书