S-Function(三)——参数传递

一、Mask中参数的传递

在编写Mask界面时每一个控件都有设置其参数名称

将需要传递的参数名字写在S-Function参数框里,即可在S-Function的代码中对该代码进行引用

1.Edit控件参数的传递

Edit控件可传入数字、字符串

1.1字符串类型参数传递

%输入:S,ParaIndex:参数索引(从0开始),strs:字符串变量
%返回值:无
%描述:获取传入参数中的字符串内容赋值给strs
void GetStrPara(SimStruct *S, int_T ParaIndex, char_T **strs)
{
    char_T *tmpStr;%存储参数内容

    int_T length  = (int_T)mxGetNumberOfElements(ssGetSFcnParam(S,ParaIndex));%获取参数长度

    if ( (tmpStr=(char_T*)malloc(length+1)) == NULL )%开辟存储空间
    {
        ssSetErrorStatus(S,"Memory allocation error in mdlStart");
        return;
    }    
    if ( mxGetString(ssGetSFcnParam(S,ParaIndex),IpAddrStr,length+1) != 0 ) %将MATLAB字符串变量转成C语言字符串变量
    {
        free(IpAddrStr);
        ssSetErrorStatus(S,"mxGetString error in mdlStart");
        return;
    }
    
    *strs=tmpStr;%将参数内容赋值给字符串变量,完成参数的传递
    //printf("String is %s\n",*strs);
     
}

用一重指针MATALB运行的时候老是报错,用二重指针就可以正常工作,不知道什么原因

函数的引用

char_T *Net_ip;
GetStrPara(S,0,&Net_ip);
%这样就把S-Function的第1个参数以字符串格式取出,赋值给*Net_ip

1.2数字类型参数传递

real_T*   Channels;
Channels = mxGetPr(ssGetSFcnParam(S,0));      

取出参数返回一个指向浮点类型的指针,赋值给Channels

2.Popup控件参数的传递

Popup控件的参数传递方式和Edit控件一致,根据参数的类型选择字符串传递还是数字类型传递,不过要强调的是传进去的参数具体是什么。

传进去的参数是Value框内的值,也就是Popup控件所选的当前值。

3.Table控件参数传递

3.1获取整个表格的数据

将Table对应的参数名写到S-FUnction参数框中,然后使用GetStrPara函数对参数进行取值

将会取出Table的Value值,结果为:(指向字符类型的指针)

{ 'Adc_ch2', '2'; 'Adc_ch5', '5'; 'Adc_ch6', '6' }

;代表了表格的下一行

这里需要强调的是直接从表格取出的值是一串字符串,并不是矩阵,虽然看起来格式很像矩阵,但不能通过索引进行取值。

如何将其转化为矩阵呢?

假设我们取出的值存储在变量Info中,如何将Info转化为矩阵呢

MxInfo=eval(Info);

MxInfo存储的就是矩阵

3.2获取表格属性

3.2.1获取表格行列

上面取出了表格的矩阵

[Row,Column]=size(MxInfo);

Row为表格的行数

Column为表格的列数

基本函数使用不清楚的地方请参考

S-Funcion(一)——常用函数-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_55973556/article/details/135860049?spm=1001.2014.3001.5502

二、S-Function间参数传递

不同S-Function间如何共用参数呢

比如现在我有两个S-Function:setup和CanRx

从setup向CanRx传递一个参数

打开properities页面

里面有一些Callback,可以再里面写一些函数,来实现功能

不同的Callback代表触发时机不一样,例如我们这次用到的InitFcn触发时机为执行前

通过get_param获取参数,赋值给Path就会在工作区创建Path变量

 打开CanRx的properities页面,在InitFcn获取参数,evalin为从工作区获取参数的值

然后将值赋给CanRx内的参数

如此实现了S-Function间参数的传递

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前 言 visual basic继承了basic语言易学易用的特点,特别适合于初学者学习windows系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。于是我们小组着手设计开始一个这样的游戏软件。通过这学期来Visual Basic的学习,我初步掌握了Visual Basic语言的最基本的知识,于是在化希耀张兵等老师的指导下动手用Visual Basic编写俄罗斯方块游戏。 无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。 在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。 为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。 工程概况 1.1 项目名称 俄罗斯方块游戏 1.2 设计平台 VB 全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。 Vb是microsoft公司于1991年退出的windows应用程序开发工具visual意思是“可视化的”。在它刚推出来时,自身还存在一些缺陷,功能也相对少一些。但是经过多年的开发研究。最近microsoft公司又推出了VB6.0版本 VB6.0运行环境:硬件,要求486以上的处理器、16MB以上内存,50MB 以上的硬盘,cd-rom驱动器,鼠标。软件:要求windows 95以上版本。 1.3程序设计思想 游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。 俄罗斯方块游戏设计的主要步骤为以下10个方面: (1)游戏界面的设计。 (2)俄罗斯方块的造型。 (3)俄罗斯方块的旋转。 (4)俄罗斯方块的运动情况(包括向左,向右和向下)。 (5)俄罗斯方块的自动消行功能。 (6)游戏级别的自由选择。 (7)游戏速度的自由选择。 (8)游戏得分的计算。 (9)游戏菜单选项的设计及功能实现。 (10)游戏的背景音乐。 1.4运用的控件和主要对象 我们在设计过程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,windows media player控件等等。 1.5主要实现的功能 我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 1.可以灵活控制方块在图形框中运动。 2.游戏过程中方块可以自由旋转。 3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。 4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。 5.游戏的得分支持积分,并且按照公式: 得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1) 这样,你同一时间消除
S-Function 可以使用MATLAB®,C,C ,Ada,或Fortran 语言来编写。使用MEX 实用工具,将C,C ,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。 S-Function 使用一种特殊的调用格式让你可以与Simulink 方程求解器相互作用,这与发生在求解器和内置Simulink 块之间的相互作用非常相似。S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。 S-function 为你提供了一种在Simulink 模型中增加自制块的手段,你可以使用MATLAB,C,C ,Ada,或Fortran 语言来创建自己的块。按照下面一套简单的规则,你可以在S-function 中实现自己的算法。在你编写一个S-Functin 函数,并将函数名放置在一个S-Functin 块中(在用户定义的函数块库中有效)之后,通过使用masking 定制用户界面。 目录 S-FUNCTION 概述.......... 1 什么是 S-FUNCTION...... 2 在模型中使用S-FUNCTION...... 3 向 S-Function 传递参数....... 3 何时使用 S-Function 4 S-FUNCTION 的工作原理.......... 5 Simulink 块的数学关系........ 5 仿真过程......... 5 S-Function 回调程序. 6 S-FUNCTION 的实现...... 8 M-文件的S-Function.......... 8 MEX 文件的S-function ....... 8 MEX 文件与M-文件的S-function 比较... 9 S-FUNCTION 的概念..... 10 直接馈通....... 10 动态维矩阵... 10 设置采样时间和偏移量.......11 S-FUNCTION 范例........ 14 M 文件S-function 范例...... 15 C S-Function 范例... 16 Fortran S-Function 范例.... 18 C S-Function 范例......... 18 Ada S-Function 范例......... 18 编写 M S-FUNCTION.... 19 概述........ 20 S-Function 参数...... 20 S-Function 的输出... 20 定义 S-FUNCTION 块特性....... 22 处理 S-FUNCTION 参数 22 M 文件的S-FUNCTION 范例... 23 范例 1——简单的M 文件S-Function ... 23 范例 2——连续状态S-Function . 25 范例 3——离散状态S-Function . 27 范例 4——混合系统S-Function . 28 范例 5——变步长S-Function ..... 31 ii 使用C 语言编写S-FUNCTION .......... 33 概述........ 34 创建 C MEX S-Function.... 35 自动生成 S-FUNCTION 36 配置生成的 S-Function...... 37 S-Function Builder 如何生成S-Function......... 37 设置 include 路径.... 37 S-FUNCTION BUILDER 的对话窗........ 39 Initialization 选卡..... 39 Data Properties 选卡......... 40 Libraries 选卡.......... 42 Outputs 选卡 43 Continuous Derivatives 选卡....... 45 Discrete Update 选卡........ 46 Build Info 选卡........ 47 一个基本的 C MEX S-FUNCTION 范例....... 48 定义与包含... 49 回调函数的实现...... 50 Simulink/Real-Time Workshop 接口..... 51 Building Timestwo 范例..... 51 C S-FUNCTION 模板..... 52 S-Function 源文件必需的内容..... 52 SimStruct...... 53 编译 C S-Function.. 53 SIMULINK 如何与C S-FUNCTION 相互作用 54 进程层面....... 54 数据层面....... 56 编写回调函数... 59 将 LEVEL 1 C MEX S-FUNCTION 转换到LEVEL 2 . 60 创建 C S-FUNCTION 63 创建 ADA S-FUNCTION.......... 64 创建 FORTRAN S-FUNCTION 65 实现块特性 67 对话框参数....... 68 iii 可调参数....... 68 运行参数 70 创建运行参数.......... 70 更新运行参数.......... 71 创建输入和输出端口... 72 创建输入端口.......... 72 创建输出端口.......... 73 输入的标量扩展...... 74 掩码多端口 S-Function...... 75 自定义数据类型.......... 76 采样时间 77 基于块的采样时间... 77 指定基于端口的采样时间.. 79 基于块与基于端口的混合采样时间 ........ 81 多速率 S-Function 块......... 82 多速率 S-Function 块的同步........ 83 工作向量 84 工作向量与过零检测.......... 85 包括指针工作向量的范例.. 85 内存分配....... 86 FUNCTION-CALL 子系统.......... 87 错误处理 89 防超程代码... 89 SsSetErrorStatus 的终止条件..... 90 数组边界检查.......... 90 S-FUNCTION 范例........ 91 连续状态的 S-Function 范例........ 92 离散状态的 S-Function 范例........ 93 混合系统的S-Function 范例........ 93 变步长的 S-Function 范例. 94 过零检测的 S-Function 范例........ 94 时变连续传递函数的 S-Function 范例... 94
在 Simulink S-Function 中,有一个名为 `mdlOutputs` 的函数,它负责计算 S-Function 的输出。此函数的输入参数 `flag` 表示当前的计算模式,有以下几种可能: - `0`: 预处理模式(pre-process mode) - `1`: 正常模式(normal mode) - `2`: 无连续状态模式(no continuous states mode) - `3`: 停止模式(stop mode) 对于每种模式,`mdlOutputs` 函数需要进行不同的计算。其中,在正常模式下,`mdlOutputs` 函数需要根据输入参数 `u` 计算输出参数 `y`。而在预处理模式下,`mdlOutputs` 函数需要根据输入参数 `u` 和 `flag` 计算一些其他的参数,例如 S-Function 的状态向量长度等。 至于您提到的 `switch flag` 差参数,我猜测您可能是想问在 `mdlOutputs` 函数中如何根据输入参数 `flag` 来进行不同的计算。这时可以使用 `switch` 语句,例如: ```matlab void mdlOutputs(SimStruct *S, int_T tid) { switch (ssGetSimMode(S)) { case SS_SIM_MODE_NORMAL: // 正常模式下的计算 break; case SS_SIM_MODE_PRE: // 预处理模式下的计算 break; case SS_SIM_MODE_NO_CSE: // 无连续状态模式下的计算 break; case SS_SIM_MODE_STOP: // 停止模式下的计算 break; default: // 未知模式下的计算 break; } } ``` 在 `switch` 语句中,根据 `ssGetSimMode(S)` 函数的返回值来判断当前的计算模式,并执行相应的计算。注意,在上述代码中,我使用了 `ssGetSimMode(S)` 来获取当前的计算模式,这是 Simulink 提供的一个函数。如果您需要获取其他的参数,可以使用类似的方式,例如 `ssGetInputPortSignal(S, portIdx)` 来获取输入端口 `portIdx` 的输入信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值