2016-12-28 1 views
0

У меня есть модель динамической системы в Simulink (я не могу изменить структуру программирования). Его можно описать как осциллятор, подверженный периодическим колебаниям. Я стараюсь, в частности, контролировать его движение, чтобы максимизировать его (для выработки энергии).Удерживать постоянный сигнал

С фиксирующим управлением (популярной стратегией управления) идея состоит в том, чтобы «защелкнуть», то есть зафиксировать на месте, устройство, когда его скорость равна 0 в течение предопределенного времени, а затем отпустите его, пока его скорость не достигнет 0 снова.

Итак, что мне нужно сделать в Simulink, чтобы вывести сигнал 1 только сигнал скорости течения (или близко к) 0, держать его на постоянном уровне в течение определенного периода времени (в 1), а затем отпустите его (сигнал становится 0), и повторите процесс, как только скорость снова достигнет 0.

Я нашел хороший блог о проведении сигналов постоянные в Simulink: http://blogs.mathworks.com/simulink/2014/08/06/how-do-you-hold-the-value-of-a-signal/

Тем не менее, в моем случае, у меня есть два условия для определения сигнала: величина скорости и времени, в течение периода времени, , Теперь проблема заключается в том, что как только период завершается, и устройство отпускается (сигнал = 0), скорость все еще очень мала, что может привести к некорректному сигналу 1, если используется цикл if.

Я думаю, что использование S-функции может быть лучшим решением, но тогда мне придется использовать фиксированный шаг времени. Есть ли какие-то решения Simulink для решения этой проблемы?

+0

Является ли время удержания всегда одинаковым? Как вы определяете, что период удержания не должен начинаться снова, если после сохранения скорости все еще мало? (Кстати, почему вы считаете, что S-функция заставит вас использовать фиксированный шаг? Это маловероятно.) –

+0

Время удержания всегда одно и то же. Это связано с тем, что сила возбуждения является колебательной. В результате фиксация или удержание произойдет один раз для положительного смещения и один раз, когда смещение отрицательно в течение каждого волнового цикла. –

+0

У меня было ощущение, что использование S-функции потребует фиксированного шага, потому что я планировал использовать количество вызовов для определения продолжительности трюма с постоянной памятью. –

ответ

0

В итоге я использовал функцию Matlab как временное решение, и это очень эффективно. Я получил вдохновение от https://uk.mathworks.com/matlabcentral/answers/11323-hold-true-value-for-finite-length-of-time u - сигнал скорости.

function y = fcn(u,nlatch) 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% This function is used to determine the latching signal. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

% Using persistent memory: 
persistent tick started sign; 
% Initialize variables: 
if isempty(tick) 
    tick = 0; 
    started = 0; 
    sign = (u>0); 
end 
U=0;  % no latching   
s=(u>0); 

if s~=sign 
    started = 1; 
end 

if started 
    if tick<nlatch 
     tick=tick+1; 
     U = 1; 
    else 
     tick = 0; 
     started = 0; 
     sign = s; 
    end 
end 

y = U; 

end 

Однако, как я уже говорил, я должен использовать фиксированный шаг решатель, который не является большим делом для меня, но это может создать проблемы для других пользователей.

Если у кого-то есть более «Simulink-native» решение, пожалуйста, дайте мне знать!

Редактировать Теперь я изменил функцию: запорное теперь применяется, когда есть изменение знака в сигнале скорости, а не смотря на небольшую величину, как ранее (abs(u)<0.005), который был слишком регистру конкретный.

Мой коллега также нашел Simulink-родное решение: Simulink model Однако функция Matlab быстрее (меньше вычислений интенсивный), когда в то же время шага используется. Возможно, наименее вычислительным решением является C-функция.

+0

Правильно ли это?Рассмотрим первый шаг, когда 'tick> = nlatch', но предположим случай, когда' abs (u) 'все еще' <0,005'. Ваш результат будет '0'. Разве вы не хотите, чтобы это было «1» (и снова запустить таймер). –

+0

Это правда. Однако 0,005 отлично подходит для 1) моего временного шага, 2) ответа моей динамической модели. Следовательно, он адаптирован. Именно поэтому я искал непрерывное решение Simulink. –

+0

Мой коллега разобрался в этой проблеме, предложив использовать следующие блоки: перекресток, переменную задержку времени и память. –

 Смежные вопросы

  • Нет связанных вопросов^_^