我目前正在研究用M-Script编写的工具,该工具对给定的simulink模型执行一组检查.这个工具不编译/执行模型,我正在使用find_system并get_param检索我需要的所有信息,以便运行我的工具的例程.
我已经到了需要确定某个块是否具有直接馈通的点.我不完全确定如何做到这一点.我想到了两种可能的解决方案:
get_param.在调查之后,我找不到任何这样的财产.非常感谢任何帮助或指向可能的解决方案.
经过一番进一步研究......
Matlab有一个"官方解决方案":
它表明我的想法并不那么糟糕;)
为了记录,我的想法:
我认为这很容易实现.我还不能给你一些代码,但我会看到我能做些什么.我的想法如下:
Constant源块和aTerminatoradd_line小号xout工作空间中的变量.try/catch错误捕获特殊情况这样,只需将块迁移到另一个模型就可以分析块直接馈通,而无需编译实际的主模型.这不是最快的解决方案,但我无法想象性能对您来说意义重大.
我们在这里,这个脚本适用于我的例子:
function feedthrough = hasfeedthrough( input )
% get block path
blockinfo = find_system('simulink','Name',input);
blockpath = blockinfo{1};
% create new system
new_system('feed');
open_system('feed');
% add test model elements
src = add_block('simulink/Sources/Constant','feed/Constant');
src_ports = get_param(src,'PortHandles');
src_out = src_ports.Outport;
dest = add_block('simulink/Sinks/To Workspace','feed/simout');
dest_ports = get_param(dest,'PortHandles');
dest_in = dest_ports.Inport;
test = add_block(blockpath,'feed/test');
test_ports = get_param(test,'PortHandles');
test_in = test_ports.Inport;
test_out = test_ports.Outport;
add_line('feed',src_out,test_in);
add_line('feed',test_out,dest_in);
% setup simulation
set_param('feed','StopTime','0.1');
set_param('feed','Solver','ode3');
set_param('feed','FixedStep','0.05');
set_param('feed','SaveState','on');
% run simulation and get states
sim('feed');
% if condition for blocks like state space
feedthrough = isempty(xout);
if ~feedthrough
a = simout.data;
if ~any(a == xout);
feedthrough = ~feedthrough;
end
end
delete system
close_system('feed',1)
delete('feed');
end
Run Code Online (Sandbox Code Playgroud)
当输入例如'Gain'它将返回1,当你输入'Integrator'它将返回0.
我古老的机器上的执行时间是1.3秒,并没有那么糟糕.
您可能仍需要做的事情:
1如此,它应该也能正常工作.试试一切,至少它是你工作的良好基础.
一个着名的例外是StateSpaceBlock,它可以有直接馈通和状态.但是这种"行为"没有太多标准块.如果你还需要处理第三方障碍,你可能会遇到麻烦,我不得不承认.
为状态空间可能的解决方案:如果一个比较xout与yout多于一个的可以找到直接馈通的另一指示符:如果存在,所述载体是不相等的.如果是这样,他们是平等的.只是一个例子,但我可以想象,有可能找到更一般的方法来测试这样的事情.
除了simout上面添加的块之外,还需要一个条件:
% if condition for blocks like state space
feedthrough = isempty(xout);
if ~feedthrough
a = simout.data;
if ~any(a == xout);
feedthrough = ~feedthrough;
end
end
Run Code Online (Sandbox Code Playgroud)