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
相关推荐
t198751282 小时前
matlab实现求解兰伯特问题
开发语言·算法·matlab
是数学系的小孩儿7 小时前
20250531MATLAB三维绘图
开发语言·数学·matlab·电脑
Expecto01 天前
Matlab绘图
matlab
机器学习之心HML1 天前
聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化
开发语言·matlab·聚类
机器学习之心1 天前
光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)
matlab·bilstm·光伏功率预测
机器学习之心2 天前
分类预测 | Matlab实现CNN-LSTM-Attention高光谱数据分类
matlab·attention·cnn-lstm-att·高光谱数据分类
三三十二2 天前
MATLAB实战:机器学习分类回归示例
机器学习·matlab·分类·回归
fie88892 天前
matlab全息技术中的菲涅尔仿真成像
人工智能·算法·matlab
showmethetime2 天前
wolf法计算最大李雅普诺夫指数
前端·人工智能·matlab