2011-10-17 128 views
3

我想捕获Matlab/Simulink模型仿真过程中发出的所有警告。模拟的结果应该是一系列警告,因为可能有多个警告。如何在Simulink仿真过程中捕获所有警告?

理想的代码看起来是这样的(除了抓不警告工作):

try 
    sim('myModel'); 
catch warnings 
    for i=1:length(warnings) 
     <process each warning> 
    end 
end 

事情我已经尝试没有成功:

  • 开启警告成例外将无济于事,因为我只会得到第一个警告,而不是全部。
  • 用我自己的“@char \ warnings.m”覆盖内置的警告函数只会在我自己的脚本中捕获警告,但不会在sim函数中捕获警告。
  • lastwarn只会给我最后的警告信息,不是全部。

P.S .:我在Windows上使用Matlab 2010b。

回答

5

解决方法是记录simdiary的输出,并在模拟之后分析文件(警告格式非常规律)。

+0

它不是很漂亮,但它的工作原理。 – ChrisK

+0

确实不是很漂亮,但它似乎是唯一的方法。 –

1

我不认为这是可能的不幸。它也提出了“你想用警告做什么?”的问题。和“为什么?”。

我会用Mathworks技术支持来提高它。该try ... catch ...是严格的错误,所以我建议一个语法看起来更像如下:

recordWarnings on 
sim('myModel'); 
warnings = recordWarnings('history'); 
+1

我想模拟我的所有测试用例的固定点模型,并收集模拟过程中发生的所有溢出。有了这些信息,我想改进模型,直到没有更多的溢出报告。 – ChrisK

+1

你是否需要通过编程方式通过警告来做到这一点?为什么不设置诊断来触发错误并迭代,直到错误停止被抛出。 – Nzbuu

+0

或者,分析信号的实际范围并相应地设置模型。 – Nzbuu

0

如前所述,这是不可能直接抓到的警告,只有模拟命令的输出。但是当使用diary时,输出被写入文件,然后必须打开,解析并再次删除。

或者,您可以使用evalc命令,它直接将输出作为字符数组返回。这应该更容易在脚本中使用。

+0

您将如何使用'evalc'来获取所有警告?或者你只是想捕获所有的输出,然后过滤掉警告? –

+0

'sim'命令一次抛出多个警告。这里不可能使用'lastwarn'(另请参见问题),因为它不可能对命令进行分区,因为它是一个内置的Matlab函数。 – wls

-1

此解决方案不会给你所有的警告(为此,我建议使用diary),但这里是如何看到代码的哪些部分产生警告。

myWarnLog = {} 
part1 
myWarnLog(end+1) = lastwarning 
part2 
myWarnLog(end+1) = lastwarning 
... 

我不确定警告是什么样子,但如果需要,您还可以存储有关警告发生的时间/地点的信息。 这应该允许您进行更高效的调试,而无需解析diary

相关问题