simulink中调用C语言:S-Function

S函数的简单介绍

S函数:S-Function 可以使用 MATLAB, C, C++, Ada,或 Fortran 语言来编写。使用 MEX 实用工具,将 C, C++, Ada,和 Fortran 语言的 S-Function 编译成 MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到 MATLAB 中。

S-Function 使用一种特殊的调用格式让你可以与 Simulink 方程求解器相互作用,这与发生在求解器和内置 Simulink 块之间的相互作用非常相似。S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。

    1. S函数可以用m语言,c语言等多种语言编写,Simulink库中的User-Defined Functions中的S-Function Example包含了多种语言的多种模板, S-Function Builder 是一个 Simulink 模块,可以通过设定自动生成c语言的S函数;

图1 Simulink库中S函数相关模块

 2. S函数与Simulink的运行原理相似,要了解S函数是如何工作的,就要了解Simulink 是如何进行模型仿真的, Simulink 模型的执行分几个阶段进行。首先进行的是初始化阶段,在此阶段, Simulink 将库块合并到模型中来,确定传送宽度、数据类型和采样时间,计算块参数,确定块的执行顺序,以及分配内存。然后, Simulink 进入到“仿真循环”,每次循环可认为是一个“仿真步”。在每个仿真步期间,Simulink 按照初始化阶段确定的块执行顺序依次执行模型中的每个块。对于每个块而言, Simulink 调用函数来计算块在当前采样时间下的状态,导数和输出。如此反复,一直持续到仿真结束。

下图所示为一个仿真的步骤:

图片

图2  Simulink 执行仿真的步骤

  3. S函数使用一种特殊的调用格式使其在 Simulink 方程求解器相互作用,S函数主要通过多种特殊格式的回调函数,用来表示仿真执行的初始化、输出、计算导数、结束等多个阶段。

两电平逆变器调制的S函数示例 

图片

图3  两电平逆变器调制的S函数主体部分

该S函数主要包含以下回调函数:
a. mdlInitializeSizes回调函数
对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模块的采样周期个数、状态变量初始数值等;
b. mdlInitializeSampleTimes回调函数
该函数设置S-Function模块的采样时间,决定了mdlOutputs多久执行一次;
c. mdlInitializeConditions回调函数
初始化时调用,对输入输出数组指针地址进行定义;
 d. mdlOutputs回调函数
可以用来执行我们定义的函数,本例中执行了三个任务:
来自S函数的外部数据的输入;
执行100us的定时中断(计算输出电压相位,输出电压指令)、741us的定时中断(模拟PWM中断,调用两电平SVPWM调制算法)。
S函数输出(输出内部监视变量和PWM波占空比)
e. mdlUpdate回调函数
如果该块具有离散的状态变量,则在处理完所有块的输出函数之后的主要时间步中,将调用一次更新函数,本例未使用;
f.  mdlTerminate回调函数
S函数终止时执行的函数,本例未使用。
多个回调函数的执行顺序如下:

图片

图4  两电平逆变器调制的S函数回调函数执行顺序

完成S函数的c文件的编写后,需要在Matlab中调用编译器对S函数的c文件进行编译。由于Matlab存在32位和64位,调用的编译器也不一样。32位直接使用自带的lcc-win32即可,64位则需要额外安装的VS的C++编译器。matlab通过mex -setup命令选择编译器。

本示例模型在Simulink的File->Model Properties->Model Properties->Callbacks->InitFcn中通过以下命令对S函数编译,使模式在每次运行时执行该编译命令生成格式mexw64的文件给Simulink模型调用:

-g -v InveterController.c Func_SVPWM_2L.c...

仿真结果

运行仿真模型:INV_2L3Ph_SPWM.slx,在S函数的mdlOutputs回调函数中,调用Func_SVPWM_2L()调制函数之后,数组y_Scope输出ABC三相PWM波的占空比为:

图5  ABC三相PWM波的占空比

   在S函数的mdlOutputs回调函数中采集了逆变器的模拟量,通过数组y_Scope输出,其波形为:

图片

图6  S函数的输出波形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——03.差异表达基因筛选之热图绘制(4)

内容如下: 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的相关性分析…

【C语言】文件操作(中卷)

前言 在文件操作(上卷)中,讲到的主要都是正式文件操作开始之前的前置知识,而这一卷中,我们将开始正式地操作文件。 在上卷中我们已经说到,stdin stdout stderr是三个C语言程序启动时默认打开的流。这三个流…

猫头虎分享已解决Bug || **Eslint插件安装问题Unable to resolve eslint-plugin-猫头虎

猫头虎分享已解决Bug || **Eslint插件安装问题Unable to resolve eslint-plugin-猫头虎 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的…

cmake的基础使用

根据源程序文件生成可执行文件: 生成可执行文件: set设置变量: 指定输出路径: 搜索一个目录下的所有源文件: 制作静态库: 指定生成库的路径: 包含库文件: cmake中使用if语句: 使用me…

猫头虎分享已解决Bug || SyntaxError: Unexpected token < in JSON at position 0

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Python爬虫之简单学习BeautifulSoup库,学习获取的对象常用方法,实战豆瓣Top250

BeautifulSoup是一个非常流行的Python库,广泛应用于网络爬虫开发中,用于解析HTML和XML文档,以便于从中提取所需数据。它是进行网页内容抓取和数据挖掘的强大工具。 功能特性 易于使用: 提供简洁的API,使得即使是对网页结构不熟悉…

有损线、上升边退化与材料特性(七)

有损线的不良影响 当信号沿着实际有损线传输时,高频分量的幅度减小,而低频分量的幅度保持不变。由于这个种选择性的衰减,信号的带宽降低,信号的上升边会增长。如果上升边的退化与单位间隔比很小,同位模式将比较稳定与…

Redis学习笔记【实战篇--短信登录】

开篇导读 实战篇有什么样的内容 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更…

【多模态】34、LLaVA-v1.5 | 微软开源,用极简框架来实现高效的多模态 LMM 模型

文章目录 一、背景二、方法2.1 提升点2.2 训练样本 三、效果3.1 整体效果对比3.2 模型对于 zero-shot 形式的指令的结果生成能力3.3 模型对于 zero-shot 多语言的能力3.4 限制 四、训练4.1 数据4.2 超参 五、代码 论文:Improved Baselines with Visual Instruction …

什么是ACP?

前言 ACP指的是应用程序控制平面,是微服务架构中的一个关键组成部分。它负责管理微服务架构中的各个微服务,包括服务发现和注册、负载均衡、服务路由、熔断和降级、配置管理等方面的功能。 A:可用性 所有请求都有响应。C:强一致…

五种最新算法求解柔性作业车间调度问题(Flexible Job Shop Scheduling Problem,FJSP),提供MATLAB代码

一、WSA求解FJSP FJSP:波搜索算法(Wave Search Algorithm, WSA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码-CSDN博客 二、SBOA求解FJSP FJSP:蛇鹫优化算法(Secretary bird optimization algorithm&a…

打造你的专属Vue组件:基于FullCalendar超实用“日程任务管理组件”实战

打造你的专属Vue组件:基于FullCalendar超实用“日程任务管理组件”实战 在现代Web应用中,日程管理是一个常见而又关键的功能,它帮助用户高效安排和追踪日常任务及会议。Vue.js作为一个流行的前端框架,以其简洁的语法和强大的组件…

鸿蒙开发接口资源管理:【@ohos.i18n (国际化-I18n)】

国际化-I18n 说明:开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。I18N模块…

寄存器、缓存、内存(虚拟、物理地址)、DDR、RAM的关系

寄存器、缓存、内存、DDR、RAM的关系 1. 主要概念内部存储器:2.1 寄存器,register2.2 主存储器,内存,memory2.3 缓存,高速缓冲存储器,cache 外部存储器2.4 快闪存储器,闪存,flash Me…

快手游戏《无尽梦回》官宣开测:热血动作肉鸽来袭

易采游戏网最新消息:5月30日11:00,快手自研的梦境主题动作冒险手游《无尽梦回》正式宣布开启测试。此次测试名为“肉鸽进化实验”,旨在测试多角色技能交会的玩法。游戏将开放32人同局竞技,让玩家在激烈的战斗中角逐出唯一的胜利者…

Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)

前言 本来是想着写多表关系的,不过写了一半发现重复的部分太多了,想了想与其做一些重复性工作,不如把一些当时觉得抽象的东西记录一下,就当用一篇杂记完成专栏的最后一篇文章吧。 预加载 简单示例 预加载主要用于在多表关系中…

【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…

【Linux】中常见的重要指令(下)以及重要的几个热键

目录 一、时间相关的指令date 1.时间戳 二、Cal指令 三、find指令 1.whereis 2.which 四、grep指令 五、zip和unzip指令 六、tar指令 七、bc指令 八、重要的几个热键[Tab],[ctrl]-c,[ctrl]-d 一、时间相关的指令date date 指定格式显示时间&…

夜天之书 #98 Rust 程序库生态合作的例子

近期主要时间都在适应产品市场(Product Marketing)的新角色,不少想法还在酝酿和斟酌当中,于是文章输出没有太多时间来推敲和选题,只能保持每月发布相关的进展或一些零碎的思考。或许我可以恢复最早的模式,多…