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

问题描述 投票:2回答:1

我正在开发具有许多C-s函数的Simulink模型。为了更容易处理,我想像在simulink-modell中那样在c-s函数中使用常量。所以我有一个带有预处理器常量的c头,例如:

#define THIS_IS_A_CONSANT 10

还有一个问题:如何以这种方式将其包含在Simulink中,例如,我可以在诸如工作区变量之类的恒定源中使用THIS_IS_A_CONSANT?

感谢和问候亚历克斯

matlab simulink
1个回答
7
投票

Simulink中有功能,可让您包括定义常量,变量等的自定义C头文件;但是,据我所知(并且可能会期望),这确实仅在生成和编译代码的情况下才有意义。

因此,在大多数情况下,仅当您使用Simulink Coder从模型生成独立可执行文件时,此特定功能才有意义。例如,this link显示了如何在代码生成过程中通过将Simulink.Parameter对象与模型的配置参数下的Custom Storage ClassesCode Generation - Custom Code Pane一起使用来包括存储在外部头文件中的参数。

Simulink文档中的

This link显示了如何使用#define定制存储类来实现类似的结果。

但是,听起来像这两个都没有真正解决您的问题,因为您想在仿真过程中使用头文件中的代码。

就是说,考虑到Simulink中有某些元素,例如Stateflow Charts和MATLAB Function模块,它们在模拟过程中“在幕后”生成并构建代码,因此(至少假设地)您可能能够使用一些在仿真过程中从上述元素之一访问上述头文件中的值的概念。例如,仅通过转到“配置参数”下的Simulation Target->Custom Code窗格,并在包含]下包含文本#include“ header.h”,就可以成功访问Stateflow图表中的预处理器宏。自定义C代码生成:头文件。 (在这种情况下,header.h包含您在帖子中包含的C代码行)

尽管您似乎应该可以进一步扩展此功能,但实际上这是我在模拟过程中访问头文件所能达到的极限。例如,我知道在Rapid Accelerator模式下运行模型实际上会在后台生成和构建代码,因此看来您应该能够使用上述技术的某种组合,以便能够在访问过程中从头文件访问值模拟。看起来,Rapid Accelerator模式生成的代码并不像Simulink / Embedded Coder那样,以相同的方式遵守这些技术定义的所有设置,所以我一直遇到编译错误。 (尽管也许我只是缺少一些创造性的设置组合,才能使该设置有效。)

希望这有助于解释Simulink关于包含C头文件的能力(和限制)。因此,总而言之,根据上面包含的链接,您所要求的几乎是[[almost,但实际上...并非如此。


因此,如果您真正想要的只是能够在头文件中的

preprocessor#define's

中创建工作区变量,那么像以前一样,使用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,如果您希望它在模型加载之前立即运行)。
© www.soinside.com 2019 - 2024. All rights reserved.