использование таймера для чтения данных времени выполнения - PullRequest
0 голосов
/ 23 октября 2018

Я хочу использовать таймер для чтения данных из блока simulink в рабочее пространство во время симуляции.Я сделал простую модель MDL, состоящую из часов, связанных с областью видимости.Затем я написал этот простой код:

t=timer('period', 1, 'taskstoexecute', 10, 'executionmode', 'fixedrate');
t.Timerfcn={@TimeStep}; 
start(t)

function time = TimeStep (~,~)
load_system('mymodel');
set_param('mymodel','SimulationCommand','start');
block='mymodel/Clock';
rto=get_param(block,'runtimeObject');
time=rto.OutputPort(1).Data;
disp(time);

Проблема в том, что когда я запускаю код для времени моделирования 10, он показывает мне «0» в рабочем пространстве и повторяет его десять раз.Я предполагаю, что он должен показывать мне время от 1 до 10. Я также изменяю решатель на дискретный решатель с шагом по времени = 1.Другая вещь, которую я не понимаю, это то, что когда я ставлю функцию линейного изменения вместо часов и изменяю ее на: block = 'mymodel / Ramp'; '

, тогда я получаю ошибку "слишком много входов",Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 24 октября 2018

У вас есть две вещи, которые считают время и, кажется, думают, что одна из них контролирует время в другой.Это не так.

В частности, у вас есть

  1. «Таймер» в MATLAB, который вы просили запускать определенный фрагмент кода один раз в секунду в течение 10секунд.(Оба времени измеряются в настенных часах.)

  2. Некоторый код MATLAB, который загружает модель Simulink (если она еще не загружена);запускает модель (если она еще не запущена);и получает значение на выходе блока Clock, который находится в модели (он делает это только один раз при каждом выполнении кода).Как и в случае с любой моделью Simulink, она будет выполняться так быстро, как только может, пока не будет достигнуто время окончания моделирования (или что-то еще остановит его).

Таким образом, в вашем случае каждый разTimer выполняется, моделирование запускается, значение / вывод значения выводится / распечатывается (что, поскольку это происходит очень быстро после запуска модели, выводит, что время моделирования равно 0);и затем (поскольку у вас есть очень простое моделирование, которое не требует времени для завершения), моделирование завершается.

Вышеуказанное происходит 10 раз, каждый раз печатая значение часов в начале моделирования,т. е. 0.

Чтобы увидеть другие значения, вам нужно, чтобы ваша симуляция продолжалась дольше - занимая как минимум 1 секунду времени настенных часов.Например, если вы измените решатель на фиксированный шаг и добавите очень маленький размер шага, например, 0,000001, то для моделирования, вероятно, потребуется несколько секунд (времени настенных часов).

Теперь вам следуетсм. Timer печать в разное время, так как иногда модель будет по-прежнему выполняться при вызове кода (1 секунда времени настенных часов позже).

Но, по сути, вы должны понимать, что Timer неконтролирует, и не зависит от времени моделирования, и наоборот.

(Я не уверен насчет проблемы с использованием Ramp, но подозреваю, что это связано с Clock, являющимся фундаментальным блокомв то время как Ramp является подсистемой в маске.)

...