我正在使用Matlab 2012a和Simulink Coder (aka Real-Time Workshop) . 我想使用Simulink Coder编译模型,但保留模型回调的功能 .
请考虑以下简单示例 . 我有一个Simulink模型 callBackTest
,它读取一个常量并输出到a . input1
在 myValues.m
中定义,并使用PreLoadFcn model callback加载到模型工作区中 . 首次打开模型时执行PreLoadFcn回调 . 通过使用PreLoadFcn回调,每次打开模型时都会自动定义 input1
.
假设 myValues.m
最初编码为 input1=1
. 运行模拟时, yout
将是1的数组 . 此外,如果我使用Simulink编码器编译模型,输出也将是1的数组 . 但是,如果我修改 myValues.m
以便 input1 = 2
并且不重新编译,则实时输出仍为1.这是错误的,那么如何使用已编译的模型将文件中的变量读入模型工作区?
2 回答
您无法为模型回调生成代码 . 如果您不想在每次更改输入时重新生成代码,可以尝试使用“From File”块来读取.mat文件中的数据 . 当您想要更改数据时,可以运行MATLAB代码并将输出数据保存到同一个.mat文件中 . 对于从此块生成代码所支持的数据类型,存在一些限制 . 有关详细信息,请查看该块的文档 .
如果您的数据不是太大,您还可以编辑生成的源以修改数据 . Constant块中的数据通常在生成的源代码中内嵌 . 编辑后,您可以编译生成的代码以生成新的二进制文件 .
另一种方法是编写自定义C S函数,您可以从自己的数据源中读取 . 您需要编写TLC文件以支持此S-Function的代码生成 .
如果这些不适合您,则需要重新编译模型 . http://www.mathworks.com/help/simulink/ug/importing-signal-data-in-simulink.html的文档列出了将信号数据导入Simulink的不同方法 .
这不会回答您关于模型回调的问题,但无论如何它可能会有所帮助 .
如果选中“内联参数”选项:首选项 - >优化 - >信号和参数
没有办法在已编译的模型中更改值,因为它们是硬编码的 . 关闭此选项并重新编译后,您可以连接外部模式并运行myValues.m脚本并更新值(除非您将它们标记为不可调) .