simulink mask、sfunction和tlc的联动、接口

这里全部是讲的level2 sfunction(用m语言编写),基于matlab 2020a。

1.mask的参数操作

1)mask通过set_param和get_param这2个函数接口对mask里面定义的Parameters&Dialog的参数的大部分属性进行读写,一般是Value值,但是有例外:

例如 Popup控件,除了Value还有一个列表框内容的属性,如果需要动态填充,需要操作Simulink.MaskParameter 类,见MATLAB帮助"以编程方式控制封装"

例如Popup写入TyepOptions参数,如果使用set_param写的Value值,写入TypeOptions的值,需要获得指针后获得成员写入。

Matlab 复制代码
aMaskObj = Simulink.Mask.get(gcbh);
cnt = 5;%这里替换为你自己的赋值
myCellArray = cell(1, cnt);
%这里你需要给你的myCellArray 内容赋值
msgList_obj = aMaskObj.getParameter('PopupName');
msgList_obj.TypeOptions = myCellArray;

%这里只是设置PopupName这个Popup控件的Value值为myCellArray的第一个元素(matlab从1开始)
set_param(gcbh,'PopupName',myCellArray{1});

2)一般使用gcbh对本模块进行访问,获得本模块的函数指针,但是偶尔有些属性不支持,需要用gcb,这个有不确定性,当一个不行的时候,试另外一个,matlab帮助文档没有直说。

2.mask 与sfunction的参数传递

1.)所有mask的回调函数无法直接通过set_param函数操作block的端口数量、类型,其他方法也没试出来,唯一可以操作的是端口的名字,而且只能通过mask的port_label函数在Icon&Ports中修改。

2).所有mask的数据只能通过参数传递给sfunction。

就是在mask中定义的Parameter数据,而且如果Parameter设置为不可见Visible=false,就不能同步(apply无效),切记切记。

3).Parameter的控件名字就是参数的名字

在Initialization的选项卡中,可以看到所有有效参数的名字(容器这些Name并不是有效参数)

4).先在mask中定义好参数名,然后在普通视图下,填写参数名,顺序可以与Initialization的选项卡中的不一致。

5).在sfunction中按照这个顺序取数即可

例如下面这个句子是在sfunction中的某个函数中,定义了一个变量变量outNumSF,它对应mask参数列表中的第4个参数outNum。

outNumSF= block.DialogPrm(4).Data;

6).sfunction不能反过来操作mask的Parameter显示,只能是自己改了block的属性,然后mask通过get_param函数回读。

3.sfunction与tlc的数据传递

1)首先需要知道,level2 sfunction的m语言版 的几个必要的回调函数,是必须注册的,不然要么无法仿真,要么无法生成代码。其中WriteRTW这个函数就是负责tlc的数据传递,在模型CTRL+B执行编译或用户点击"代码生成"时,就会调用这个函数。

block.RegBlockMethod('Outputs', @Outputs);

block.RegBlockMethod('SetInputPortDimensions', @SetInpPortDims);

block.RegBlockMethod('SetOutputPortDimensions', @SetOutPortDims);

block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);

block.RegBlockMethod('SetInputPortDimensionsMode', @SetInputPortDimensionsMode);

block.RegBlockMethod('WriteRTW', @WriteRTW);

2)WriteRTW中主要是调用block.WriteRTWParam这个函数写入参数,写入的必须是字符数组!!。

本人对tlc语言理解还不够深刻,本来想直接写入一个二维数组,但是写进去了到tlc这边不知道怎么拆,只有做了一个循环拆成了很多一维字符数组,到tlc这边来拆。

一维数组这边,自己定义一个参数名,然后把循环的index与参数名拼接写入.

Matlab 复制代码
function WriteRTW(block) 
    for i=1:n

      block.WriteRTWParam('string',strcat('sigInfo_',num2str(i-1)), '112233');

    end

模型编译后,可以在rtw文件中找到自己定义的参数(如果没有生成rtw文件,可以在模型配置里面勾选)。

上述rtw中可以看到, 生成的参数在ParamSettings这个记录下面,名字是关键字+序号的拼接,注意rtw 和tlc的下标是从0开始,与matla从1开始不同,2者注意转换一下。

3)编写tlc文件,生成代码

tlc文件的文件名,一定要与sfunction的m文件名一致,并且在同一个目录下。

通过字符串拼接的方法取数,原理见:

matlab/simulink TLC语法基础练习实例-CSDN博客

bash 复制代码
%function Outputs(block, system) Output  
   
    
    %foreach loopIdentifier = 3
        %assign sigInfoStr = "ParamSettings.sigInfo_"+ STRING(loopIdentifier)%%字符串拼接
        %assign varStr = %<sigInfoStr>      
        %%输出端口字符串 与 取数后的字符串再拼接 
        %<LibBlockOutputSignal(loopIdentifier, "", "", 0)> = %<varStr> 
    %endforeach   
    

%endfunction
相关推荐
bu_shuo2 小时前
安装MATLAB205软件记录
matlab·matlab安装
MATLAB代码顾问2 小时前
MATLAB可以实现的各种智能算法
开发语言·matlab
软件算法开发20 小时前
基于LSTM深度学习的网络流量测量算法matlab仿真
深度学习·matlab·lstm·网络流量测量
wheeldown2 天前
【数学建模】数据预处理入门:从理论到动手操作
python·数学建模·matlab·python3.11
小白的高手之路2 天前
Matlab中的积分——函数int()和quadl()
matlab
机器学习之心2 天前
PINN物理信息神经网络用于求解二阶常微分方程(ODE)的边值问题,Matlab实现
人工智能·神经网络·matlab·物理信息神经网络·二阶常微分方程
WangYan20222 天前
MATLAB 2023a深度学习工具箱全面解析:从CNN、RNN、GAN到YOLO与U-Net,涵盖模型解释、迁移学习、时间序列预测与图像生成的完整实战指南
深度学习·matlab·matlab 2023a
迎风打盹儿2 天前
均匀圆形阵抗干扰MATLAB仿真实录与特点解读
matlab·信号处理·抗干扰·均匀圆阵·波束合成
数维学长9863 天前
【全网最全】《2025国赛/高教杯》C题 思路+代码python和matlab+文献 一到四问 退火算法+遗传算法 NIPT的时点选择与胎儿的异常判定
开发语言·算法·matlab
dlraba8023 天前
用遗传算法破解一元函数最大值问题:从原理到 MATLAB 实现
开发语言·matlab