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

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,如果您希望它在模型加载之前立即运行) .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值