Hz_xi 2024-04-23 16:29 采纳率: 100%
浏览 17
已结题

simulink模型转成的C代码如何在visualstudio运行

img


麻烦帮忙看一下,simulink生成的C++代码如何在visual studio中运行,图片是主函数设置,红色框是想给定输出的值然后输出相应的值,目前报错,不知道如何解决了

img

img


我加了一个动态库,以后代码是可以运行了,但是给定输入,输出的结果一直为0,好像就没有通过模型计算,这个麻烦各位看一下是哪一步问题,感谢

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 16:29
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试将Simulink生成的C代码移植到Visual Studio中并进行调试。首先,你需要确保所有必要的头文件都被正确包含,并且所有的函数和变量都在正确的命名空间内。从错误信息来看,存在几个问题:未定义的标识符、缺少类/结构/联合声明。

    以下是针对这些问题的步骤和修改建议:

    1. 包含头文件: 确保你已经包含了所有需要的头文件。根据错误提示,你可能需要添加rtsystem.h和可能还有其他 Simulink 生成的头文件。在 ERT_main.cpp 文件顶部添加以下行:

      #include "rtsystem.h"
      #include "ETS.h"
      
    2. 定义全局变量: 错误提示显示未定义标识符"rtY",这可能是由于rtY没有被正确地初始化。在 main() 函数开始之前,你需要创建一个 RT_MODEL_EMS 类型的对象,例如 RT_MODEL_EMS rtY = RT_MODEL_EMS_DEFAULT

      RT_MODEL_EMS rtY = RT_MODEL_EMS_DEFAULT;
      
    3. 类成员访问: 错误提示表明你不应该直接访问 .MSC_stMot_mb.MSC_StpMot_mp,而是通过对象实例来访问。你需要先获取模型实例,然后访问其成员。在 main() 函数内部,找到 RT_MODEL_EMS 对象对应的指针,通常为 const void *inst,然后通过它来访问成员。但是,根据Simulink生成的代码,这个指针可能是在 rt_OneStep() 函数中传递的。所以,你可能需要调整代码结构,以便正确处理模型实例。

    4. 调用函数: 在Simulink生成的代码中,ETS_step 可能是一个私有函数,因此你不能直接在 main() 中调用。你应该通过 rt_OneStep() 来执行模型的一步计算。

    5. 模型输出: 如果你想从模型中获取输出值,你需要在 Simulink 模型中配置数据日志或者MATLAB引擎接口来实现。因为 Simulink 生成的 C 代码不会自动打印输出值。

    下面是修改后的代码示例:

    #include <stdio.h>
    #include "rtsystem.h"
    #include "ETS.h"
    
    int my_i = 0;
    
    void rt_OneStep(void* const inst)
    {
        // 这里应该是 Simulink 生成的一步计算函数,你不需要修改这部分
    }
    
    int main(int argc, const char argv[])
    {
        RT_MODEL_EMS rtY = RT_MODEL_EMS_DEFAULT;
    
        rt_InitExtModeIO(&rtY);
        rt_Initialize(&rtY, NULL);
    
        printf("Warning: The simulation will run forever. \
                Generated ERT main won't simulate model step behavior. \
                To change this behavior select the 'MAT-file logging' option.\n");
    
        while (1)
        {
            my_i++;
            rt_OneStep(NULL); // 使用NULL作为参数,因为你没有提供具体的实例指针
    
            if (my_i == 5)
            {
                double y1, y2;
                // 获取输出值,这里假设MSC_stMot_mb和MSC_StpMot_mp是模型的输出信号名称
                // 注意,这些名字需要与Simulink中的实际输出信号匹配
                ETS_Y_getValues(rtY.Y, &y1, &y2);
                printf("\n%f and %f", y1, y2);
            }
        }
    
        return 0;
    }
    

    请注意,上述代码仅供参考,具体实现可能会因Simulink模型的不同而有所不同。如果你仍然遇到问题,可能需要检查Simulink模型的配置,特别是数据日志和实时参数选项。

    此外,为了在Visual Studio中编译和运行这段代码,请按照以下步骤操作:

    1. 打开Visual Studio。
    2. 选择 "文件" -> "新建" -> "项目"。
    3. 选择 "Win32 控制台应用程序",然后点击 "下一步"。
    4. 命名项目,选择位置,然后点击 "创建"。
    5. 在新项目的源文件夹下,右键选择 "添加" -> "现有项",然后添加 erts_main.cpp 和其他必要的 Simulink 生成的头文件和源文件。
    6. 在项目属性中,确保已启用 C++ 标准库(例如,C++11 或更高版本),并且编译器设置正确。
    7. 编译并运行项目。

    如果仍然有问题,可能需要检查 Visual Studio 的编译器设置、Simulink 模型的配置,以及是否安装了正确的 MathWorks C/C++ 仿真器支持包。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 修改了问题 4月24日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错