Simulink 模型构建 C 代码流程

超详细的simulink代码生成 第一步 打开模型 首先我们要确保模型仿真是正确的,即能够正常仿真。 第二步 将输入和需要的输出换成input和output模块 第三步 离散化模型 如果你的模型中有连续模块,比如积分环节,那麽一定要离散化,否则即使生成C代码也会报错。 点击设置 设置求解器,采样时间。 最后点击Apply,点击OK。 点击Analysis->Control Designer->Model Discretizer。 设置和刚才一样的采样时间,点击转换。 转换完成后的状态空间模型和积分模块。 第四步 阅读详情

目录

一、安装插件

1.1 安装方式

1.2 安装列表

二、新建 Simulink 工程

2.1 保存文件

2.2 模型设置

2.3 新建数据字典

2.4 生成代码

 3.5 新建工程

三、使用 Simulink bus 生成代码

3.1 模块规范

3.2 创建 Simulink bus

​编辑

3.3 创建子系统

3.4 子系统使用 Simulink bus 数据

3.5 将所有结构体再次打包

四、关于 DW 数据

4.1 DW 数据是什么

4.2 Simulink 建模

4.3 修改 DW 和其他变量的命名格式


一、安装插件

1.1 安装方式

在这里在线安装就可以了。

1.2 安装列表

  • Simulink Coder:生成 C 代码
  • Embedded Coder:工业级嵌入式代码生成
  • ARM Cortex-M Support from Embedded Coder:支持 ARM Cortex-M 和 CMSIS

在线安装速度视网络情况决定。

关于 ARM 支持包 MATLAB 官网有一个专题页:

ARM Support from Embedded Coder - Hardware Support - MATLAB & Simulink

二、新建 Simulink 工程

2.1 保存文件

新建一个文件夹:

使用 MATLAB 打开: 

打开 MATLAB R2025b 后 点击 Simulink 模块:

    我们选择Embedded Coder 下的单速率应用程序:

     打开后,界面内已经有一个现成的两个变量相加的案例,我们选择模型设置。

    其于多速率应用程序区别在于:

    • 单速率 (Single-rate):整个系统,一个节拍跑到底
    • 多速率 (Multi-rate):不同模块,按不同频率运行

    因为我们只是简单案例,所以选择单速率应用程序即可。

    打开后保存文件:

    文件夹内多了一个 .slx 模型文件:

    2.2 模型设置

    我们选择定步长,每一步长度为 1e-5 秒,也就是 0.00001 秒:

    选择仅生成代码:

    选择代码样式中的缩进格式,不修改也没关系:

    选择创建代码生成报告:

    设置目标中,选择执行效率和可溯源性优先:

    2.3 新建数据字典

    我们添加一个 Gain 模块:

    其这个变量名设为 k,因为 k 这个变量不存在,所以周围一圈是红色的:

    我们选择基础工作区,添加 k 变量:

    选择新建数据字典:

    在我们新建的数据字典中,新建一个 k 变量。

    关于 parameter 详细可以看:

    Simulink.Parameter - 存储、共享和配置参数值 - MATLAB

    简单来说,使用 Simulink.Parameter 对象可以:

    • 在多个模块参数之间共享一个值
    • 表示工程常量或可调标定参数
    • 将参数值与其数据类型和其他属性分离
    • 配置用于代码生成的参数数据

    根据下图选择:

    其数据类型选择 single;StorageClass 选择 model default

    这样在生成 C 代码时 k 就不是常量了:

    生成好之后右键保存我们的 .sldd:

    在空白处右键选择模型属性:

    在这里选择我们刚创建的 .sldd 文件,载入:

    2.4 生成代码

    选择 Embedded Coder:

    进入 Embedded Coder 后,选择生成代码和查看代码:

    可以阅读代码生成报告:

     3.5 新建工程

    最后我们回到 Matlab 界面,新建一个工程:

    三、使用 Simulink bus 生成代码

    3.1 模块规范

    对于每一个模块来说,我们均需要给他配置三个结构体,分别为:

    • input
    • config
    • outout

    模块最外围被一个子系统包括,三个 Simulink 总线进行输入和输出。

    以一个 MIT 控制的 Simulink 仿真示例:

    等到我们生成每一个 Simulink 模块的时候,均会将数据生成这三个结构体:

    MitCtlInput{}:

    typedef struct
    {
        /* 前馈力矩电流 */
        real32_T tq_set_NM;
     
        /* 目标位置 */
        int64_T pos_tar_p;
     
        /* 当前位置 */
        int64_T pos_now_p;
     
        /* q轴最大输出电流 */
        real32_T iq_max_A;
     
        /* 目标速度 */
        real32_T speed_tar_p_s;
     
        /* 当前速度 */
        real32_T speed_now_rad_s;
    }
     
    MitCtlInput;

    MotorCtlSmConfig{}:

    typedef struct
    {
        /* 运行模式 */
        int8_T mode;
     
        /* 欠压保护阈值 */
        real32_T under_voltage_protection_V;
     
        /* 过压保护阈值 */
        real32_T over_voltage_protection_V;
     
        /* 过速保护阈值 */
        real32_T over_speed_protection_rad_s;
     
        /* 欠温保护阈值 */
        real32_T under_temperature_protection_d;
     
        /* 过温保护阈值 */
        real32_T over_temperature_protection_d;
     
        /* 位置跟随误差保护阈值 */
        int32_T position_following_error_protection;
     
        /* 保护生效 */
        uint32_T error_enable;
     
        /* 过流保护阈值 */
        real32_T over_current_protection_A;
    }
    
    MotorCtlSmConfig;

    MitCtlOutput{}:

    typedef struct
    {
        /* 目标q轴电流 */
        real32_T iq_tar_A;
    }
     
    MitCtlOutput;

    3.2 创建 Simulink bus

    创建总线:

    创建三个总线:

    代码生成这里我们自定义一个名字,三个都要相同:

    3.3 创建子系统

    框选我们之前的模型,创建子系统:

    至此,我们得到了这样的模型:

    3.4 子系统使用 Simulink bus 数据

    对这三个 Inport 分别配置成:

    • Bus: untited_input
    • Bus: untited_config
    • Bus: untited_output

    将子系统内的数据使用 Bus Selector 分发:

    此时生成代码,便将其创造到我们指定的文件夹中,同时也是结构体形式:

    3.5 将所有结构体再次打包

    创建 untited_Bus:

    同样的,这个总线也需要修改头文件:

    为了这个数据结构参与编译,我们设置一个透传,输入和输出直接相连即可:

    最后,我们得到了这样的一个结构体:

    建议使用指针去访问:

    typedef struct
    {
        untited_config untited_config;
        untited_input untited_input;
        untited_output untited_output;
    } 
    
    untited_Bus;
    
    untited_Bus bus;
    
    void init(){
        
        untited_Bus *pBus = &bus;
        pBus->untited_config.k = 10;
    }
    

    四、关于 DW 数据

    4.1 DW 数据是什么

    DW是 Simulink 生成代码中的 Discrete Work vector,用于保存需要跨周期保留的离散状态。可以理解为 Simulink 模块中的静态变量。

    4.2 Simulink 建模

    如果我们为代码模组增加一个积分,生成的 C 代码就会多一个 DW 结构体。

    可见,生成了一个 rtDW 结构体,用于计算这个积分:

    4.3 修改 DW 和其他变量的命名格式

    如下图,生成的代码中,全局变量和结构体的名字都被修改了:

    实例讲解Simulink应用层模型生成c代码操作详细步骤 在电动汽车VCU开发中,在应用层模型搭建好之后,需要编译生成c代码,才能再后边的流程中与底层程序联合编译生成控制器可执行程序。本文通过对空调控制器Simulink应用层模型编译生成c代码的过程,介绍了Simulink应用层模型生成c代码的一版步骤与方法,希望能给相关技术人员带来一定参考和帮助。 阅读详情

    相关推荐

    Simulink代码生成的步骤

    (一定要在window explorer里面操作,不要在matlab里面操作,否则很快会被注册到matlab)创建“包”和“类”(create your own package and class)Create "mycsc", customer storage class(创建,客户存储类)现在需要用这样的类创建一个新的Parameter。使用脚本对模型进行属性更改,另外最好使用版本管理。11.链接到dd对象。删除以前“Ratio_C”类Parameter。拷贝到自己的工程目录。

    huahuayuyuyu的博客 1035

    MatlabSimulink生成CC++代码的实现

    将MatlabSimulink生成CC++代码,并应用于实际的控制环境中

    别再手写嵌入式代码了!5分钟带你用Simulink模型生成C代码,并集成到你的工程里编译

    本文详细介绍了如何利用Simulink模型生成C代码并集成到嵌入式工程中的完整流程。通过基于模型的设计(MBD)方法,开发者可以大幅提升开发效率,避免手动编写代码的错误,并实现早期验证。文章涵盖了环境配置、模型构建、代码生成、工程集成及调试优化等关键步骤,为嵌入式开发提供了一套高效、可靠的解决方案。

    hintcnuie 394

    Simulink模型生成C语言

    本文详细介绍了simulink(matlab2021)连续模型离散化,代码生成以及最终运行到Visual Studio 2022环境的详细过程,希望对大家有帮助。 第一步 创建Simulink模型 运行之后,通过Scope查看结果如下 注意:我们要确保模型仿真运行没有问题 第二步 将输入和需要的输出换成input和output模块 第三步 离散化模型 如果创建的Simulink模型中有连续模块,比如积分环节,那麽一定要离散化,否则即使生成C代码也会报错。(为什么报错?先挖个坑) 点击设置 停止时间设置

    如有侵权,请联系作者删除 1万+

    Simulink模型嵌入式C代码生成实战:配置、优化与工作流全解析

    在嵌入式系统开发中,模型化设计已成为提升算法开发效率的关键技术。其核心原理是通过图形化建模工具(如Simulink)进行系统设计与仿真,再通过代码生成技术将模型自动转换为可在微控制器上运行的C代码。这项技术的核心价值在于,它极大地缩短了从算法设计到硬件部署的周期,并保证了模型与实现代码的一致性,是汽车电子、工业控制等安全关键领域的主流开发范式。其典型应用场景包括电机控制、电池管理系统和自动驾驶感知融合算法等。本文聚焦于Embedded Coder这一核心工具,深入剖析其**三层配置架构**与**硬件支持包*

    weixin_30687051的博客 616

    基于NXP KVx的模型驱动开发实战:从Simulink模型到嵌入式C代码自动生成

    模型驱动开发是一种通过图形化建模替代传统手工编码的嵌入式系统设计方法。其核心原理是使用Simulink等工具构建系统行为模型,通过仿真验证功能,再借助代码生成器自动转换为高质量的C代码。这项技术的价值在于将开发重心从底层实现细节前移到算法与架构设计,大幅提升复杂系统的开发效率与可靠性。在嵌入式开发领域,尤其是在电机控制、汽车电子等对实时性和可靠性要求极高的场景中,模型驱动开发能显著缩短从设计到部署的周期。NXP Model-Based Design Toolbox for KVx系列正是这一理念的典型实践,

    dfuw13072的博客 438

    【Simulink专题】Simulink模型设置(三):代码生成

    Simulink中模型设置是关乎着整个模型的运行模式以及代码生成样式,不同的设置关乎着不同的结果,今天就给大家讲解下作者对整个模型设置的理解,有疑问的地方还需要大家多多指出,谢谢 使用版本:MATLAB 2022a

    博客 3万+

    从Simulink模型到开发板亮灯:我的Matlab/Simulink嵌入式开发初体验(STM32F103平台实录)

    本文分享了作者使用Matlab/Simulink进行STM32嵌入式开发的初体验,详细介绍了从Simulink模型到STM32F103开发板LED控制的完整流程。内容包括环境搭建、STM32CubeMX配置、Simulink建模、代码生成与硬件部署等关键步骤,并提供了常见问题排查和性能优化技巧,帮助读者快速掌握Matlab/Simulink与STM32的协同开发方法。

    weixin_33686714的博客 380

    磷酸铁锂Simulink模型包:一阶RC与热模型仿真及代码生成

    等效电路模型是电池管理系统算法验证的基础,其中一阶RC模型因结构简单、参数辨识容易,在磷酸铁锂场景下被广泛采用。其原理是通过欧姆内阻与RC并联环节描述极化效应,结合HPPC工况数据可提取R0、R1、C1等关键参数。在工程实践中,该模型常与热模型耦合,用于储能系统仿真和BMS算法开发。针对磷酸铁锂OCV-SOC曲线平坦的特性,一阶RC模型能有效补偿动态电压变化,提升SOC估算精度。本文围绕9个Simulink模型文件,详解一阶RC参数辨识、热模型产热与散热设置、电热耦合实现,以及利用Simulink Code

    weixin_26886855的博客 256

    从手写C到Simulink生成代码:Legacy Code Tool如何帮你平滑过渡MBD?

    本文详细解析了Legacy Code Tool(LCT)如何帮助开发者将手写C代码无缝迁移到Simulink模型驱动开发(MBD)环境。通过自动化封装C函数为S-function模块,LCT显著提升代码集成效率3-5倍,支持多速率系统和复杂结构体处理,是嵌入式系统开发模式转型的理想工具。

    weixin_30567225的博客 123

    不会写C代码也能玩转飞控?用Matlab/Simulink和FMT实现MBD(模型设计)全流程实战

    本文详细介绍了如何利用Matlab/Simulink和FMT开源飞控系统实现基于模型设计(MBD)的全流程开发,无需深入C语言编程即可构建和部署飞控算法。通过环境搭建、模型构建、仿真验证到硬件部署的完整步骤,帮助开发者高效实现从仿真到真实飞行的过渡,大幅降低飞控系统开发门槛。

    weixin_30693683的博客 137

    simulink仿真——隔离正激 (仿真嵌入C/C++代码)

    摘要:本文介绍了在MATLAB/Simulink中搭建隔离正激变换器仿真模型并嵌入C/C++代码的方法。首先通过Simulink库搭建电路模型,包含电源、MOS管、变压器等元件,并设置离散化仿真参数。然后安装C/C++编译环境,将控制算法代码嵌入模型,添加采样保持器和延迟环节模拟实际控制过程。最后通过PID控制器验证仿真结果与代码生成的一致性,重点关注输出电压和变压器磁复位情况。整个流程涵盖了从模型搭建、参数设置到代码嵌入的完整步骤,为电力电子系统的仿真与控制提供参考。

    行秋的博客 717

    Simulink入门到实战:从图形化建模到代码生成的完整指南

    动态系统仿真与嵌入式开发是现代工程领域的核心技术,它通过数学模型在虚拟环境中预测和优化系统行为,为产品设计提供高效、低成本的验证手段。其原理在于将物理系统抽象为数学方程,利用数值求解器进行时间演进计算,从而模拟真实世界的动态响应。这项技术的核心价值在于实现了基于模型的设计(MBD)范式,能够显著提升复杂系统(如汽车控制、机器人、信号处理)的开发效率与可靠性,并直接生成产品级嵌入式代码。在应用场景上,它广泛服务于控制系统设计、算法验证和硬件在环测试等环节。本文聚焦于利用Simulink这一主流图形化建模环境,

    weixin_30421809的博客 370

    Simulink MPC车辆行驶控制器仿真:从模型搭建到参数整定全流程

    模型预测控制(MPC)是一种基于滚动时域优化的先进控制策略,能够在满足物理约束的前提下预测未来轨迹并求解最优控制序列,因此特别适合车辆这类多变量、强约束的动态系统。与PID和LQR相比,MPC可显式处理转向角、加速度等硬约束,在车道保持、避障和轨迹跟踪等场景中表现出色。依托MATLAB/Simulink的MPC Toolbox,开发者无需从零编写求解器,只需搭建被控对象模型、配置预测模型与约束条件,即可快速完成仿真验证。本文围绕基于Simulink的MPC车辆行驶控制器仿真项目,系统梳理了自行车模型建立、M

    weixin_29291573的博客 294

    Simulink文件导入与模型仿真全流程实战

    在使用 MATLAB Function Block 时,必须明确定义所有输入输出变量的数据类型与维度,否则会导致编译失败或运行时错误。默认情况下,Scope每帧刷新一次。对于高频信号,可启用“Limit data points to last”选项并设置较大缓存,避免内存溢出。这样仅保留最近1万个数据点,适合长时间仿真。

    weixin_42163404的博客 1883

    基于SIMULINK的DSP系统设计与代码自动生成

    SIMULINK是一个基于MATLAB的图形化编程环境,它允许工程师和研究人员对动态系统进行建模、仿真和分析。该工具的主要优势在于其直观的拖放界面,该界面可以快速组合和测试系统组件,从而缩短了开发周期并降低了复杂性。

    weixin_42284380的博客 1226

    基于Simulink的IEEE 14节点系统机电暂态仿真模型构建指南

    电力系统仿真作为电力电子与电网分析的核心技术,其原理在于通过数学模型模拟真实电网的动态行为,从而在数字环境中进行稳定性分析与控制策略验证。这项技术的价值在于能够以极低的成本和风险,对新能源并网、故障穿越等关键场景进行预测性测试。在工程实践中,MATLAB/Simulink因其丰富的模块库和可视化环境,成为实现机电暂态仿真的主流平台。本文聚焦于经典的IEEE 14节点测试系统,详细阐述了如何将静态的标幺值参数转化为Simulink中可运行的动态模型,其中涉及同步发电机详细数学模型(如六阶模型)的参数转换、系统

    weixin_30892889的博客 422

    实现自抗扰控制器的C语言代码转换

    自抗扰控制器(Active Disturbance Rejection Control,ADRC)是一种在控制理论领域出现相对较晚但发展迅速的控制策略。它通过在线实时估计并补偿系统的内外扰动,将复杂的控制问题转化为简单的误差驱动控制问题。ADRC具有结构简单、适应性强、鲁棒性好等优点,特别适合于非线性、时变以及不确定性的系统控制。在现代控制工程中,ADRC的应用范围非常广泛,从工业过程控制到航空航天领域都有其活跃的身影。

    weixin_42153793的博客 1377
    上一篇: 配置 CodeX 环境的 Simlink AI 工具链
    下一篇: 自然常数 e 与欧拉恒等式
    崔佳宇_
    崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
    博客等级 码龄10年 1万+粉丝 173原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

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

    抵扣说明:

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

    余额充值