2014-04-08 55 views
0

我有一系列的TOFILE在我的Simulink模型塊,每有一個獨特的文件名(如「Pulse.mat」我要來存儲我仿真基於時間戳的文件夾中的結果大致就當我點擊運行按鈕/使用SIM命令。設置文件名已經完成

我的解決辦法是寫兩個劇本,一個InitFcn回調過程中調用,一個用於StopFcn/CloseFcn回調(和PreSaveFcn回調)。

該InitFcn回調會發現所有TOFILE塊,並從「Pulse.mat」文件名更改爲類似「../runs//Pulse.mat」,以及StopFcn/CloseFcn/PreSaveFcn他們恢復到其原來的「.MAT」的名字。這個工作對我的小測試模型,但是當我試圖把它融入我的實際模型,我收到以下錯誤:

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實際執行前的模擬是「完成「(無論什麼原因),但爲什麼它在我的初始測試模型中工作?我的實際模型中的ToFile塊是否有一些導致此錯誤發生的屬性集?

+1

你可以使StopFcn創建一個'計時器'所執行的StopFcn之後執行短時間對象,與模型將由時間已完全終止的期望。定時器功能然後將名稱更改。 (它可能要檢查,該模型仍然是開放的,該模型的SimulationStatus財產確認模擬已經終止。) –

回答

2

塊已經在你的更大的模型被虛擬化;這似乎正在改變執行點。一種選擇可能是在模型配置參數對話框的「優化」窗格中取消「塊減少」。

另外,有可能是另一種方法,你可以嘗試 - 設置模特屬性「StartFcn」喜歡的東西:

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

和設置模型屬性「StopFcn」到:

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

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

相關問題