首页 文章

如何在Matlab Simulink中包含带常量的c-header

提问于
浏览
2

我正在开发一个具有许多C-s功能的Simulink模型 . 为了更容易处理,我想在simulink-modell中使用c-s函数中的常量 . 所以我有一个带有preprocesser常量的c-header,如:

#define THIS_IS_A_CONSANT 10

还有一个问题:如何以这种方式将其包含在Simulink中我可以使用THIS_IS_A_CONSANT,例如在像工作空间变量这样的常量源中?

谢谢并问候亚历克斯

1 回答

  • 7

    Simulink中有一些功能,允许您包含定义常量,变量等的自定义C头文件 . 但是,据我所知(并且正如人们所预料的那样),这实际上仅在生成和编译代码的情况下才适用 .

    因此,在大多数情况下,只有在使用Simulink Coder从模型生成独立可执行文件时,此特定功能才有用 . 例如,this link显示了如何在代码生成期间通过在模型的配置参数下使用带有Custom Storage ClassesCode Generation - Custom Code PaneSimulink.Parameter对象来包含存储在外部头文件中的参数 .

    来自Simulink doc的This link显示了如何使用#define自定义存储类来实现类似的结果 .

    但是,听起来这些都不能解决您的问题,因为您希望在模拟过程中使用头文件中的代码 .

    也就是说,考虑到Simulink中有一些元素,例如Stateflow Charts和MATLAB Function block,它们在模拟过程中生成并构建代码"under the hood",(至少在假设上)你可能能够使用上面描述的一些概念 . 在模拟期间从其中一个元素访问头文件中的值 . 例如,我成功地只能通过转到配置参数下的Simulation Target->Custom Code窗格并在包含生成的头文件中的自定义C代码下的文本 #include "header.h" 来访问状态流图表中的预处理器宏 . (在这种情况下,header.h包含您在帖子中包含的C代码行)

    虽然看起来您应该能够进一步扩展此功能,但这实际上是我在模拟期间访问头文件时能够实现的限制 . 例如,我知道在Rapid Accelerator模式下运行模型实际上会生成并构建代码,因此看起来您应该能够使用我上面描述的技术的某种组合,以便能够在模拟期间从头文件中访问值 . 它看起来像Rapid Accelerator模式生成的代码并没有错过一些创造性的设置组合,可以使其工作) .

    希望这有助于解释Simulink关于包含C头文件的能力(和限制) . 总而言之,根据上面的链接,你要求的几乎是不可能的,但在实践中......并非如此 .


    因此,如果您真正想要的是能够在头文件中的预处理器#define中创建工作空间变量,那么使用MATLAB脚本手动解析文件可能是最简单的,就像之前在注释中建议的那样 . 这是一个快速而脏的脚本,它加载到头文件中,遍历每一行,使用正则表达式(如果需要可以改进),以解析#define语句,然后调用eval从解析中创建变量输入 .

    filename = 'header.h';
    pattern = '^\s*#define\s*(\w*)\s*(\d*\.?\d+)';
    fid = fopen(filename);
    tline = fgetl(fid);
    while ischar(tline)
       tokens = regexp(tline, pattern,'tokens','once');
       if(numel(tokens) == 2)
           eval([tokens{1} ' = ' tokens{2}]);
       end
       tline = fgetl(fid);
    end
    fclose(fid);
    

    您可以将此代码放在回调中,以便每次加载模型时都会执行该代码 . 只需转到文件 - >模型属性 - >模型属性,单击回调选项卡,然后将代码放在您想要的任何回调下(例如PreLoadFcn,如果您希望它在模型加载之前立即运行) .

相关问题