Angebric循环Simulink中的持久变量

时间:2019-01-15 19:35:31

标签: matlab if-statement simulink persistent

我在simulink中有一个闭环,如下所示:

enter image description here

{"@odata.context":"https://test.crm.dynamics.com/api/data/v9.0/$metadata#Microsoft.Dynamics.CRM.QueryScheduleResponse","TimeInfos":[{"Start":"2019-01-15T00:00:00Z","End":"2019-01-16T00:00:00Z","TimeCode":"Available","SubCode":"Schedulable","SourceId":"15f40c32-1609-46db-93da-1bbb8eb19c9d","CalendarId":"69b0ee2b-bad7-4b8e-9bcc-d03e76b45a03","SourceTypeCode":4004,"IsActivity":false,"ActivityStatusCode":-1,"Effort":1.0,"DisplayText":""}]} 块(用红色标记)是matlab函数,该函数基本上计算多项式根,并返回最大的实根,如下所示:

Tgo

在这个方框中,我不得不使用function Tgo = fcn(g,r,v,vw,rho_u,rho,a,cd,m) persistent Tgo2 Real_tgo = [0 + 0i,0 + 0i,0 + 0i,0 + 0i]; more lines for polynomial... rr = roots(poly); for k = 1:4 if abs(imag(rr(k))) < 0.001 Real_tgo(k) = rr(k); else Real_tgo(k) = 0; end end Tgo2 = real(max(Real_tgo)); Tgo = Tgo2; ,因为它不会让我得到真正的答案。 (它一直说我需要确定输出的类型和大小,只有持久变量才能为我解决)。

但是,当我想使用persistent variable使用闭环时,出现以下错误:

if block/ if action subsystem

因此,据我了解,基本上可以有两种解决方案:

1)以某种方式避免使用持久变量,而仍然从Tgo块中获取一个值,这将不是我必须预先定义的值。

2)以允许持久变量的其他方式确定if条件。

我俩都尝试了几次而没有成功。

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

根据您显示的代码,现在还不清楚为什么根本需要Tgo2。看来以下应该可行。

function Tgo = fcn(g,r,v,vw,rho_u,rho,a,cd,m)

Tgo = 0;
Real_tgo = [0 + 0i,0 + 0i,0 + 0i,0 + 0i];

more lines for polynomial...

rr = roots(poly);

for k = 1:4
    if abs(imag(rr(k))) < 0.001
        Real_tgo(k) = rr(k);
    else
        Real_tgo(k) = 0;
    end
end

Tgo = max(real((Real_tgo));