我的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块是否有一些属性设置会导致出现此错误?
答案 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');
它可能比你的方法更蛮力,但似乎工作得很好......