统一MATLAB和Simulink:用户故事第3部分
在今天的文章中,我将在上一篇文章中介绍的框架中添加一些特性,以帮助控制变量。
如果你错过了本系列之前的文章,这里是所有文章的链接:
- 统一MATLAB和Simulink:用户故事第1部分:用MATLAB对象参数化模型
- 统一MATLAB和Simulink:用户故事第2部分:slPart类、块模板和数据变量
- 统一MATLAB和Simulink:用户故事第3部分:用MATLAB对象控制变量
- 统一MATLAB和Simulink:用户故事第4部分:后期处理和可视化记录数据
- 统一MATLAB和Simulink:用户故事第5部分:更大的例子
变体slPart块
当我将这个块复制到模型时,我将能够添加尽可能多的算法变量。
向slPart添加变体规范
这里的目标是基于对象的类选择活动变量,对象的类是作为掩码参数指定的。为此,我将以下代码添加到
maskInit
的方法
slPart
:
classdefslPart <句柄
属性(隐藏=真)
BlockPath字符
结束
方法
函数obj = maskInit(obj,blk)
obj。BlockPath = block;
如果块有变量,根据对象类设置活动变量
如果比较字符串(get_param(黑色,“变异”),“上”)
varantchoices = get_param(blk,“VariantChoices”);获取所有的变量选择
variantChoices = {variantChoices. name}';%提取标签
classList = [class(obj);超类(obj)];获取类和超类的列表。
matchingChoices = intersect(classList,variantChoices);查找与类或最近的超类匹配的标签
set_param(黑色,“LabelModeActiveChoice”, matchingChoices {1});应用第一个匹配
结束
结束
结束
结束
实现一个变体slPart
让我们继续构建上一篇文章中的spring示例。我将我的模板块添加到一个模型中,并创建了两个变体,一个是与前一个示例相同的线性弹簧,另一个是非线性版本:
我创建了一个新的
slPart
类,并将其保存在
+ springLib
在上一篇文章中创建的包。从现在起,我将把这门课称为
springLib.springNonLinear:
classdefspring非线性< slPart
属性
米
displacementBreakPoints;
stiffnessTable;
velocityBreakPoints;
dampingTable;
结束
方法
函数obj = spring非线性()
obj。米= 1;
obj。位移breakpoints = -5:5;
obj。hardnesstable = tanh(-5:5);
obj。velocityBreakPoints = -5:5;
obj。dampingTable = 2*tanh(-5:5);
结束
结束
结束
现在,掩码初始化方法能够设置适当的变量的关键是
将每个变量的标签设置为对应类的名称
.
我想在这里指出的一件事是,它有可能获得一个类似的变量激活逻辑使用
表达模式
而不是
标签模式
.主要的区别在我看来是,通过使用标签模式控制的掩码初始化方法定义
slPart
超类中,复杂性被管理在一个单独的地方:在
slPart
超类。而表达模式提供了更多的可能性,例如不同
激活时间
,它把写下条件表达式的复杂性放在每个添加新变量的用户身上。
更多不同的参数化
和那些保存在
+ springLib
现在,我的spring库的大小增加了一倍,我仍然可以通过制表符补全访问:
选择零件并模拟相应的变型
一旦正确配置了模型,创建了MATLAB类,我就可以将所需类型的对象分配给块掩码对话框中指定的变量,Simulink将在模拟过程中自动使用适当的变量子系统。
我喜欢这样一个事实,如果我把这个模型给某人,那个人需要做的就是从
springLib
包中。不需要知道或关心它可能正在激活一个不同的子系统。
通过这种方式,您继承了一个内部机制已经被抽象的组件,这样您就可以专注于使用它,而不会被实现细节分散注意力。
现在轮到你了
显然,我在这里展示的是使该技术工作的最低限度。对于一个现实的项目,我会添加验证代码和错误检查,以便在出现错误时更好地指导用户。
你对这种处理变量的方法有什么看法?你或你的公司有没有想出其他系统控制变异的方法?我很想知道与我在这篇文章中描述的可用性相比如何。
请在下面的评论中告诉我们。
- 类别:
- 世界杯预选赛小组名单社区,
- 屏蔽,
- 建模、
- 参数
评论
如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。