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

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 sqpingboot在父模块已经引入了mybatisplus 在子组件不写版本号还是报错
  • ¥20 Lumerical FDTD solutions 中模型的相对阻抗,有效介电常数和有效磁导率的实部和虚部的数据如何获得?
  • ¥100 sql reporting service 远程smtp服务器配置支持
  • ¥15 ppyoloe_r带角度目标检测,loss_cls没法收敛
  • ¥15 淘宝交易指数如何解读,其关联的数据指标是什么
  • ¥15 Linux下安装搜狗拼音不能显示中文
  • ¥15 事件7000导致的自动重启如何解决
  • ¥15 (标签-matlab|关键词-m3)
  • ¥20 做一个web书店,带答辩
  • ¥15 #求带 python,使用pycharm爬取智联招聘数据资源并保存为Excel文件,同时以图表形式呈现