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

时间:2013-08-25 11:54:06

标签: matlab simulink

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

#define THIS_IS_A_CONSANT 10

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

谢谢和问候 亚历

1 个答案:

答案 0 :(得分:7)

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

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

来自Simulink doc的

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

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

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

虽然您似乎应该能够进一步扩展此功能,但这实际上是我在模拟期间访问头文件时能够实现的限制。例如,我知道在Rapid Accelerator模式下运行模型实际上会生成并构建代码,所以看起来您应该能够使用我上面描述的技术的某种组合来访问标题中的值模拟期间的文件。看起来Rapid Accelerator模式生成的代码并不像Simulink / Embedded Coder那样遵循这些技术定义的所有设置,所以我只是遇到了编译错误。 (虽然我可能只是错过了一些创造性的设置组合,可以使其发挥作用)。

希望这有助于解释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,如果您希望它在模型加载之前立即运行)。