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

Ale*_*x44 2 matlab simulink

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

#define THIS_IS_A_CONSANT 10
Run Code Online (Sandbox Code Playgroud)

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

谢谢并问候亚历克斯

小智 7

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

因此,在大多数情况下,只有在使用Simulink Coder从模型生成独立可执行文件时,此特定功能才有用.例如,此链接显示如何通过在模型的配置参数下使用带有自定义存储类Simulink.Parameter对象和代码生成 - 自定义代码窗格,在代码生成期间包含存储在外部头文件中的参数.

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

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

也就是说,考虑到Simulink中有一些元素,例如Stateflow Charts和MATLAB Function block,它们在模拟过程中"在引擎盖下"生成和构建代码,它(或者至少是假设的)可能会使用某些元素.上面描述的概念,用于在模拟期间从其中一个元素访问头文件中的值.例如,我只是通过转到配置参数下的模拟目标 - >自定义代码窗格,并在生成的包含自定义C代码下的文本#include"header.h"成功访问状态流图表中的预处理器宏:Header档案.(在这种情况下,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);
Run Code Online (Sandbox Code Playgroud)

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