当前位置: 首页 > news >正文

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的值,需要获得指针后获得成员写入。

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与参数名拼接写入.

function WriteRTW(block) for i=1:nblock.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博客

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

相关文章:

  • Java 文件操作 和 IO(5)-- 综合案例练习 -- 示例一
  • 复数三角不等式简介及 MATLAB 演示
  • 嵌入式(C语言篇)Day13
  • 华为计试——刷题
  • LeetCode 1524. 和为奇数的子数组数目
  • 38.springboot使用rabbitmq
  • 【AUTOSAR OS】计数器Counter机制解析:定义、实现与应用
  • 注销微软账户
  • 医疗多模态共情推理与学习一体化网络构成初探
  • AppTrace 视角下 App 一键拉起:提升应用转化率的高效方案​
  • 腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务
  • 【Unity】AudioSource超过MaxDistance还是能听见
  • 保持本地 Git 项目副本与远程仓库完全同步
  • 利用nginx完成iframe请求的身份认证
  • kafka核心组件
  • 系统思考:化繁为简的艺术
  • lstm 长短期记忆 视频截图 kaggle示例
  • 202403-02-相似度计算 csp认证
  • 矩阵快速幂算法快速上手
  • mkcert实现本地https
  • 网络营销推广一本书/北京seo推广
  • 山东建设厅网站扫黑/临沂网站建设方案服务
  • 如何做网站的软件/杭州seo渠道排名
  • 何做好网站建设销售/青岛网站建设维护
  • 婚纱摄影网站图片/百度站长工具查询
  • 申请电子邮箱免费注册/成都高薪seo