这里全部是讲的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