讨论建模规范时经常遇到的一个问题就是 Goto From block的使用,在这个问题上关心最多的是block的使用范围问题,但是,除此之外还有信号线及命名等其它问题,我们这里做个总结。
在规范库中找到10条关于goto from block的规范,这些规范在以下几个方面规范了goto from的使用:
1.使用层级(db_0143) 为了允许将模型划分为离散单元, 模型每一层级的构建都必须用相同类型的模块 (即只能用子系统或只能用基础模块), goto from block 由于只用于信号传递,可以放在模型的任意层级中。
2.可见范围(ds_0043)为避免出现隐藏的信号流并限制全局变量的使用,goto from block只能使用在同一个子系统中,Tag可见范围只能为local。(jm_0001)不要使用 goto tag visibility block(在goto block的tag可见属性设置为scoped时使用此block定义其具体可见范围)
3.避免过度使用(jc_0171)两个子系统之间如有信号传递,为清楚表达两个子系统之间的关系及执行顺序,在每一个方向上至少要有一个信号线连接两个子系统,因此,不能全部使用goto from block连接两个子系统, 在反馈回路中一定不要使用 goto from block。
4.Tag及信号线命名(misra_slsf_018)整个模型中所有block的tag必须唯一,同时没有无法匹配的goto或者from block。(na_0008,jc_0602,misra_slsf_027)连接的信号线必须命名或者显示名字,名字应该和tag相同,(jc_0009)from block 信号线应该选择属性show propagated signals为 on,如果有传递的信号名的话。
5.隐藏block的名字 (misra_slsf_026)goto from block的名字应该隐藏,(misra_slsf_025)block的大小应该能显示完整的tag。
下图是一个使用goto from block的完整例子Datastore memory block也是用来进行数据传递,但是和goto from block不同的是,datastore memory block可以在不同采样时间的子系统之间及不同的时间点进行数据传递。
1.使用层级(db_0143)和goto from block一样,可以使用在任何层级中。
2.使用范围misra_slsf_005及ds_0042规定只能用在同一个子系统中,mab5_jc_0161中规定应定义在最小可能的范围内,考虑到datastore memory block可以传递不同采样时间的子系统之间的数据,因此不能限制其只能应用于同一个子系统中,在TargetLink中可以限制其不能应用于不同的TargetLink子系统。不要用在数据流层中进行简单的数据传递,这种情况下可以使用信号线或者goto from block。
3.命名(mab5_jc_0732)名字必须唯一,且在Stateflow中不能和数据及状态名称相同
4.全局变量maab的早期版本中的na_0024规定可以使用datastore memory block模拟全局变量,而mab5中将此条删除,规定在matlab function之间传递数据时要使用信号线,而不是使用datastore memory,但是鉴于datastore memory block的特性,我们认为还是可以作为全局变量使用。
5.读写顺序作为程序编写的基本要求,datastorememory block在使用过程中应遵循先写后读的顺序,避免写前读,读后写,写后再写的操作顺序出现。这类错误的读写顺序可以使用design verifier的功能进行检测。下图中给出了违反该规则的示例,该示例中主系统的datastore write block(alpha)在每次执行时总是被写入,而对应的datastore memory block 在write Subsystem中也总是被写入,因此此处会发生写后再写的问题, 在In3的值大于0时,alpha 会被读取,因此也会发生读后再写的问题; 在In2>In1 并且in3<0时,在write Subsystem只有alpha被写入,beta没有被写入,在read subsystem中beta被读取,因此datastore memory(beta)会发生写之前读取的问题。
6.参数设置(经验)为避免重复的datastore memory名字出现,模型参数Diagnostics: Data Validity-> Data store memory block Duplicate datastore names 应设置为 error 或者 warning。