添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

上一篇博客《Matlab编程技巧:批量获取/修改Simulink模块参数》中,说明了如果通过matlab脚本批量获取/修改Simulink模块参数。具体方法可以参考 https://blog.csdn.net/u013288925/article/details/103943921
Simulink中的信号线也是带有一些属性的,譬如名称和是否关联Simulink Signal Obj。本文介绍几个修改Simulink信号线的函数,并举例说明通过脚本修改信号线参数的方法。

1 相关函数

1.1 搜索出符合条件的模块、信号线、端口等

函数 Objects = find_system(System,Name,Value)
输入参数 1)System——模型名称;2)Name,Value——搜索条件的名称、值,可以输入多组名称、值
返回值 1)Objects——符合搜索条件的模块路径的元胞数组

这个函数和Matlab技巧(二)中是完全一样的,只是输入的参数比较特殊,‘FindAll’参数的值必须为’on’,‘Type’的参数必须为’Line’。这样的话,函数就会返回所有信号线的句柄。举个例子,假如有如下Simulink模块:
在这里插入图片描述
运行上面那句find_system的结果如下所示:

>> SignalHandle = find_system(gcs,'FindAll','on','Type','Line')
SignalHandle =
   42.0001
   43.0001
   41.0001
   40.0001

函数会返回信号线句柄组成的数组。如果信号线已经被命名,find_system里的参数可以再加上’Name’属性来定位到那条信号线的句柄。

1.2 获取信号线某个属性的值

函数V = get(H,‘PropertyName’)
输入参数1)H——信号线句柄,即find_system输出参数;2)PropertyName——信号线属性
返回值1)V——信号线属性的值

如果’PropertyName’不写,则函数返回含有该信号线句柄所有的参数值的结构体。如果不知道属性的字符串表示,也可以通过这种方式查看。以find_system输出的第一个句柄为例,如下所示

>> SignalProperties = get(SignalHandle(1))
SignalProperties = 
  包含以下字段的 struct:
                   DataLogging: 0
           DataLoggingNameMode: 'Use signal name'
               DataLoggingName: ''
       DataLoggingDecimateData: 0
         DataLoggingDecimation: '2'
         DataLoggingSampleTime: '-1'
    DataLoggingLimitDataPoints: 0
          DataLoggingMaxPoints: '5000'
                     TestPoint: 0
                  StorageClass: 'Auto'
       RTWStorageTypeQualifier: ''
     MustResolveToSignalObject: 0
                    SourcePort: 'In2:1'
             SignalObjectClass: 'Simulink.Signal'
                  SignalObject: []
                     CoderInfo: []
                  DocumentLink: ''
         ShowPropagatedSignals: 0
       TaskTransitionSpecified: 0
              TaskTransitionIC: '0'
           ExtrapolationMethod: 'Use global setting'
            TaskTransitionType: 'Use global setting'
          UserSpecifiedLogName: ''
             SignalPropagation: 'off'
                          Path: ''
                          Name: ''
                           Tag: ''
                   Description: ''
                          Type: 'line'
                        Parent: 'demo'
                        Handle: 42.0001
               HiliteAncestors: 'none'
               RequirementInfo: ''
                      FontName: 'auto'
                      FontSize: -1
                    FontWeight: 'auto'
                     FontAngle: 'auto'
                      Selected: 'off'
                   SegmentType: 'trunk'
                 SrcPortHandle: 25.0001
                SrcBlockHandle: 5.0001
                 DstPortHandle: 32.0001
                DstBlockHandle: 10.0001
                        Points: [2×2 double]
                    LineParent: -1
                  LineChildren: []
           SignalNameFromLabel: ''
                     Connected: 'on'

1.3 设置信号线某个属性的值

函数set(H,‘PropertyName’,PropertyValue)
输入参数1)H——信号线句柄,即find_system输出参数;2)PropertyName——信号线属性;3)PropertyValue——该属性的值
返回值

如果想要把第一个信号线的名称设置为“Signal1”,可以通过以下脚本:

>> set(SignalHandle(1),'Name','Signal1')

那么模型中的信号线就会自动加上名字了:
在这里插入图片描述

2 实例应用

通常来说,对于未命名的信号线,很难直接定位到它的句柄,因为它们的属性默认基本上都是一样的。但是实际情况中,我们只需要找到连接在特定模块上的信号线就行了,因此可以通过与信号线相连接的模块来顺腾摸瓜定位到信号线句柄。
譬如,在下图的模型中,如果要找到两个顶层Inport连接的信号线,将其命名为和Inport相同的名字并关联Simulink Signal Obj,可以通过以下几步:
在这里插入图片描述
1)通过fing_system获取Inport模块路径
2)获取Inport模块输出端口句柄
3)Inport模块输出端口句柄即为信号线源端口(SrcPortHandle),以此获取信号线句柄
4)set函数设置信号线名称和关联Simulink Signal Obj
脚本如下:

InportCell = find_system(bdroot,'SearchDepth',1,'BlockType','Inport');  %获取顶层Inport模块路径
for i = 1:length(InportCell)  
    InportName = get_param(InportCell{i},'Name');  %输入模块名称
    InportHandle = get_param(InportCell{i},'Handle');  %信号线句柄
    PortHandle = get(InportHandle,'PortHandles');  %端口句柄
    OutportHandle = PortHandle.Outport;  %输出端口句柄
    LineHandle = find_system(bdroot,'SearchDepth',1,'FindAll','on','Type','Line','SrcPortHandle',OutportHandle);  %通过输出端口句柄定位到信号线句柄
    set(LineHandle,'Name',InportName)  %设置信号线名称为输入模块名称
    set(LineHandle,'MustResolveToSignalObject',1)   %设置信号线关联Simulink Signal Obj

运行脚本后,就自动完成了名称设置和关联Simulink Signal Obj,可以看到模型中信号线的名字和左边的小叉子:
在这里插入图片描述
以上所有代码均在Matlab2018a/win10环境下测试通过。

>>返回个人博客总目录

在MBD(基于模型的设计)开发,可能需要反复修改simulink模型。传统的方式是通过在模型找到相应的模块,然后点进去修改参数。本文介绍一种通过matlab脚本批量获取Simulink模块参数,并修改参数的方法。 1 相关函数 1.1 Objects = find_system(System,Name,Value) 文章目录1 相关函数1.1 add_block1.2 add_line 1 相关函数 根据博主工作经验,一个Simulink控制模型应该是由两大元素构成:模块和信号线。因此,通过Matlab脚本创建模型也有两个函数分别用于创建模块和信号线,本章节会介绍这两个函数。 1.1 add_block 1.2 add_line 在汽车嵌入式软件开发,需要正确地配置Simulink的信号和参数,才能生成相应的标定量、输入输出变量和观测量。本文通过一个例子总结笔者工作所用的配置方法。 1 问题引入2 输出信号配置3 输入信号配置4 观测量配置5 标定量配置6 总结 1 问题引入 在Simulink代码生成(一) Embedded Coder配置这一篇博客,没有对输入输出信号做任何配置就生成了代码。此时生成的代码表现为结构体的形式,并且是在模块内定义的。 一个模型的输入信号可能来源于其他模型的输出或者底层 Matlab代码获取Simulink模块句柄属性 最近在使用matlab gui代码实现simulink的仿真管理时发现需要用到simukink部分模块的属性。因此考虑先获取此模块的handle,然后在进行下一步。 获取句柄的方法: %如下代码,在slFile获取Constant的句柄 get_param('slFile/Constant','handle') %然后再用get函数获取Constant的所有属性 获取属性后就可以在guisimulink的块进行操作控制。 go get https:/github.com/astaxie/beego package https:/github.com/astaxie/beego: "https://" not allowed in import pathgo get 可以从一个远程仓库获取包,比如github、googlecode,当然系统需要安装相应的版本控制软件。 我错误的把http://也写上里,发现报了这个 建模的方式千千种,很多方式都能实现一个功能,但首先大家风格最好统一利于集成和维护,另外,一些建模方式容易引起意外的错误,即使是熟悉建模的人员也可能忽视这些。所以我都建议模型开发人员,无论资深或新手入门,都要重视建模规范。当然,MAB内容很多而且全英文,这里总结一些基础的、常用的建模规则,不使用S function之类的应该够用。 分为三篇吧,分别为Simulink 、Stateflow、模型结构。 <br />比如<div style="filter:alpha(Opacity=20)" class="divc"><br />它没有设置宽度也可以呈现出来效果,应该div为块级元素,<br />而像<b>,这种需得设置宽度<br /> <br />或者<br /><b style='background:#2F2F2F;border:2px solid white;filter:Alpha(Opacity=20);Opacity:0.2;cursor:pointer;width:60px;display