Используйте выход как новый вход в функциональный блок Matlab в Simulink - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть три входа в функциональный блок Matlab в моей модели Simulink.Входные данные состоят из одномерного массива thetaArray и двух переменных currentIndex и trackingError.Функциональный блок Matlab выведет две переменные с именами newIndex и theta.

. Какой идеальный способ использовать переменную newIndex в качестве моего нового входа в функциональный блок Matlab?

Вот изображение моей модели Simulink

А вот код функционального блока Matlab в модели :

function [newIndex,theta] = arraySelector(thetaArray,currentIndex,trackingError)

if currentIndex < length(thetaArray) && trackingError <= 0.00002
   newIndex = currentIndex + 1;
else
   newIndex = currentIndex;
end

theta = thetaArray(newIndex);
end

Заранее спасибо.

1 Ответ

0 голосов
/ 21 ноября 2018

Если тэта будет выходом и входом модели, у вас будет модель, которая содержит алгебраическая петля .

Из вашего вопроса неясно, если вы

  1. необходимо решить алгебраический цикл за один шаг по времени ИЛИ
  2. Вы хотите, чтобы ваша модель развивалась во времени с каждой итерацией цикла.

Для 2-го случая:

Это более простой случай. (скорее при изучении вашей модели). Здесь вы разорвете петлю, например введя блок задержки. Начальное условие блока задержки будет таким, какое вы сейчас определили в примере (блок theta_1).

Для 1-го случая:

Следуйте описанию в Как обрабатывать алгебраические циклы в модели . Я бы рекомендовал вам сначала изучить пример, в котором вы используете скаляр вместо массива. Вам необходимо определить начальное условие для индекса, например, введя IC-Block (как вы сделали для trackingerror) в цикл. Если simulink все еще не может решить алгебраический цикл, рассмотрите альтернативную реализацию внутри вашего функционального блока Matlab, которая изменяет состояние вашего ввода. от прямого прохода к не прямому проходу

...