2015-09-09 5 views
1

У меня есть двухдорожечная модель, реализованная в simulink. Для того, чтобы контролировать скорость я использую ПИД-регулятор, так что выход скорости выглядит следующим образом:Сохранение определенного времени моделирования

simulink

теперь я хочу, чтобы реализовать функцию или Simulink блок MATLAB, который отслеживает время, когда скорость достигает стабильного поведения и помещает его в какое-то хранилище. Я пытался реализовать что-то подобное с помощью следующей функции MATLAB с MATLAB-функцией-блоком:

function y = fcn(t,v,dv,tv) 
    %#codegen 
    if (v==tv+0.01) & (dv<0) 
    y=t 
end 

Т часами сигнал, v скорость, Dv первого вывода скорости и тв является targetvelocity. Проблема с этой функцией заключается в том, что «y не определен на некоторых путях выполнения». есть ли у вас какие-либо идеи, как сделать эту работу?

ответ

4

simulink

Я решил проблему без функции MATLAB с использованием Simulink блоков data store memory и его read & write блоков. Сигналом, который поступает с нижней правой стороны, является мгновенная скорость. if утверждение

(u1 >= 22.2) & (u1<=22.3) & (u2<0) 

Поскольку Simulink использует временные шаги и мгновенная скорость никогда не будет точно 22.2, вы не можете использовать u1==22.2

3
function y = fcn(t,v,dv,tv) 
    %#codegen 
y = zeros(length(t),1); % Initialise the array 
for ii = 1:length(t) 
    if (v==tv+0.01) & (dv<0) 
    y(ii)=t; 
    else 
    y(ii)=0; 
    end 
end 
y(y==0)=[]; 
end 

Два изменения: добавили точку с запятой после y=t, чтобы заставить его не печатать его каждый раз, когда он установлен. Во-вторых, ваш вопрос, else y=[];, что означает, что y будет пустой матрицей, если вы не придерживаетесь своего заявления if.

Он теперь хранит 0 каждый раз, когда вы не придерживаетесь инструкции if. Строка y(y==0)=[]; удаляет все нули, комментирует эту строку, если вы хотите, чтобы ваш y был такой же длины, как и входные переменные.

function y = fcn(t,v,dv,tv) 
    %#codegen 
y = zeros(length(t),1); % Initialise the array 
ii=1; 
while exist(t) 
    if (v==tv+0.01) & (dv<0) 
    y(ii)=t; 
    else 
    y(ii)=0; 
    end 
ii = ii+1; 
end 
y(y==0)=[]; 
end 
+0

все в порядке, это первая часть моей проблемы, но до сих пор ее не решает. вероятно, я не делал этого достаточно ясно: я хочу, чтобы функция запоминала время, когда оператор if был прав в течение первого времени. Но если я оставлю это так, он будет перезаписывать y на каждом этапе моделирования, потому что if всегда будет истинным после этого первого раза. Можете ли вы решить это? – Max

+0

См. Обновленный ответ – Adriaan

+0

хорошо, это выглядит хорошо для меня, но к несчастью не работает с simulink. я думаю, это потому, что simulink не может определить длину t или t, всегда имеет длину 1 для каждого шага моделирования.ошибка говорит об этом: Размер 2 фиксирован с левой стороны, но изменяется справа ([1 x 1] ~ = [1 x:?]). Функция «Steuerung/MATLAB Function» (# 194.168.169), строка 10, столбец 1: «y» Запустить диагностический отчет. Компонент: Функция MATLAB | Категория: Ошибка кодера – Max

3

В Simulink добавить второй выход и пятый вход в вашу функцию. Затем используйте этот новый вывод в качестве обратной связи с функцией.

function [y, output] = fcn(t,v,dv,tv,input) 
y = 0; 
output = input; 
if (v == tv + 0.01) && (dv < 0) 
    y = t; 
    if (input == -1) 
     output = t; 
    end 
end 

Прикрепите output к IC блок, где вы установить input начальное значение -1 или каким-либо значение, которое вы хотите использовать. Затем присоедините блок IC к функции input. output будет постоянно получать обратную связь через функцию. Как только он будет установлен, он будет навсегда зависеть от его ценности.

+0

спасибо за ваши усилия, но я решил проблему сам по себе. так как ваше решение работает, я все равно его поддержал! – Max