模型完成后设置ToFile块的文件名

时间:2014-04-08 00:01:14

标签: callback simulink

我的Simulink模型中有一系列ToFile块,每个块都有一个唯一的文件名(例如" Pulse.mat"。我想将我的模拟结果存储在带时间戳的文件夹中,大致基于何时我点击运行按钮/使用sim命令。

我的解决方案是编写两个脚本,一个在InitFcn回调期间调用,另一个用于StopFcn / CloseFcn回调(和PreSaveFcn回调)。

InitFcn回调将找到所有ToFile块并从" Pulse.mat"更改文件名。类似于" ../运行// Pulse.mat",以及StopFcn / CloseFcn / PreSaveFcn将它们恢复为原始的"。垫"名。这适用于我的小型测试模型,但是当我尝试将其集成到我的实际模型中时,我收到以下错误:

Error evaluating 'StopFcn' callback of block_diagram '<model_name>'.

Caused by:
Cannot change parameter 'Filename' of '<ToFile Block>' while simulation is running. The block was made virtual as it was optimized for simulation

从我的研究中我发现StopFcn实际执行之前模拟已完成&#34; (无论出于何种原因),但为什么它在我的初始测试模型中有效?我的实际模型中的ToFile块是否有一些属性设置会导致出现此错误?

1 个答案:

答案 0 :(得分:2)

该块已在您的大型模型中虚拟化;这似乎正在改变执行点。一种选择可能是解开&#39; Block Reduction&#39;在优化&#39;窗格的模型配置参数对话。

或者,您可以尝试另一种方法 - 设置模型属性&#39; StartFcn&#39;类似于:

evalin('base','resultTimTag = datestr(clock, ''yyyymmdd_HHhMM'');')

并设置模型属性&#39; StopFcn&#39;致:

targetDir = evalin('base','resultTimTag');
mkdir(targetDir);
outputs = dir('*.mat');
for i=1:length(outputs)
    movefile(outputs(i).name,targetDir);
end
evalin('base','clear resultTimeTag');

它可能比你的方法更蛮力,但似乎工作得很好......