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
相关推荐
今天吃饺子5 小时前
如何用MATLAB调用python实现深度学习?
开发语言·人工智能·python·深度学习·matlab
硬汉嵌入式8 小时前
专为 MATLAB 优化的 AI 助手MATLAB Copilot
人工智能·matlab·copilot
Dev7z15 小时前
基于Matlab遗传算法与蚁群算法的风光储并网微电网容量优化研究
算法·matlab·蚁群算法·多能源微电网
jllllyuz19 小时前
基于粒子群优化(PSO)的特征选择与支持向量机(SVM)分类
开发语言·算法·matlab
一只肥瘫瘫20 小时前
基于MATLAB的滑膜观测器仿真搭建
单片机·嵌入式硬件·matlab
bubiyoushang8882 天前
MATLAB 实现多能源系统(MES)多目标优化
支持向量机·matlab·能源
算法如诗2 天前
**MATLAB R2025a** 环境下,基于 **双向时间卷积网络(BITCN)+ 双向长短期记忆网络(BiLSTM)** 的多特征分类预测完整实现
开发语言·网络·matlab
bubiyoushang8882 天前
基于MATLAB的马尔科夫链蒙特卡洛(MCMC)模拟实现方法
人工智能·算法·matlab
轻微的风格艾丝凡2 天前
卷积的直观理解
人工智能·深度学习·神经网络·算法·计算机视觉·matlab·cnn