我正在开发一个具有许多C-s功能的Simulink模型 . 为了更容易处理,我想在simulink-modell中使用c-s函数中的常量 . 所以我有一个带有preprocesser常量的c-header,如:
#define THIS_IS_A_CONSANT 10
还有一个问题:如何以这种方式将其包含在Simulink中我可以使用THIS_IS_A_CONSANT,例如在像工作空间变量这样的常量源中?
谢谢并问候亚历克斯
Simulink中有一些功能,允许您包含定义常量,变量等的自定义C头文件 . 但是,据我所知(并且正如人们所预料的那样),这实际上仅在生成和编译代码的情况下才适用 .
因此,在大多数情况下,只有在使用Simulink Coder从模型生成独立可执行文件时,此特定功能才有用 . 例如,this link显示了如何在代码生成期间通过在模型的配置参数下使用带有Custom Storage Classes和Code Generation - Custom Code Pane的Simulink.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,如果您希望它在模型加载之前立即运行) .
1 回答
Simulink中有一些功能,允许您包含定义常量,变量等的自定义C头文件 . 但是,据我所知(并且正如人们所预料的那样),这实际上仅在生成和编译代码的情况下才适用 .
因此,在大多数情况下,只有在使用Simulink Coder从模型生成独立可执行文件时,此特定功能才有用 . 例如,this link显示了如何在代码生成期间通过在模型的配置参数下使用带有Custom Storage Classes和Code Generation - Custom Code Pane的Simulink.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从解析中创建变量输入 .
您可以将此代码放在回调中,以便每次加载模型时都会执行该代码 . 只需转到文件 - >模型属性 - >模型属性,单击回调选项卡,然后将代码放在您想要的任何回调下(例如PreLoadFcn,如果您希望它在模型加载之前立即运行) .