Simulink: синхронизация и синхронизация

Чтобы смоделировать некоторые процессы, у меня возникла проблема с получением предопределенного рабочего порядка моих самомодельных блоков.

Как я могу быть уверен, что, например, блок A должен быть завершен до того, как блоки B и C начнут работать?

Проблема в том, что одни блоки будут работать после других, а некоторые нет. Я должен признать, что у меня не так много опыта работы с Simulink, чтобы делать вещи, зависящие от времени (хотя доступны базовые знания simulink).

Например, этот сценарий должен быть реализован:

A -> B, C -> D, E, F

Главное, что все блоки A-F не ​​имеют логической взаимосвязи друг с другом, все они выполняют несколько функций. Моя цель - заставить B и C начать работать после того, как A закончит. И D / E / F после завершения B AND C. В данном случае слово «параллельный» было неправильным, его не нужно рассчитывать на самом деле параллельно. Просто убедитесь, что это соответствует заранее заданному устойчивому порядку.

Изменить: Моя новая идея состоит в том, чтобы использовать рабочую область Matlab als buffer, чтобы мой блок A мог отправлять свои результаты в рабочую область (с помощью блока «to workspace»). Но теперь я должен убедиться, что блоки B и C могут читать результаты (с «Из рабочей области») A ПОСЛЕ того, как A отправил свою информацию в рабочую область ... как это сделать?

Edit2: Вот скриншот, который должен прояснить некоторые мысли: Как указано в документации «Сортированный порядок», настройка кажется правильной (включая время подсистем) . Но, к сожалению, проблема все еще существует. Переменная simin загружается из рабочей области до того, как она была записана :( Как вы видите, на дисплее отображается «1», чего не должно быть. В самом первом запуске моделирования я получаю исключение, что переменная "симина" не существует.

Было бы неплохо, если бы вы помогли мне с моей проблемой.

Привет, poeschlorn


person poeschlorn    schedule 28.01.2011    source источник


Ответы (3)


Итак, в вашем примере, если у вас есть блок A, подключенный к одному и тому же проводу как к B, так и к C, когда блок A будет завершен, блоки B и C будут работать параллельно.

РЕДАКТИРОВАТЬ: Я использую те же блоки, что и вы, но у меня это работает. Я думаю, вы слишком много усложняете. То, как вы устанавливаете приоритеты блоков, не отличается от того, как Simulink запускает блоки без них. Ниже вы можете увидеть мою настройку и результат на обоих двоичных дисплеях.

введите описание изображения здесь

Ошибка, которую вы видите при первом запуске, связана с тем, что Simulink не создает переменную до тех пор, пока не будет выполнен первый временной шаг. Когда Simulink строит симуляцию, он видит, что переменная, используемая в качестве входных данных из рабочего пространства, не создается.

person akd    schedule 28.01.2011
comment
если я правильно понимаю, мое решение блока A используется для вычисления B и C !? Извините за этот глупый вопрос, я знаю, что знания simulink очень рудиментарны - person poeschlorn; 31.01.2011
comment
Будет запущен блок A, затем его выход будет входом B и C. Таким образом, результат блока A можно использовать для вычислений в B и C. - person akd; 31.01.2011
comment
хорошо, это имеет смысл. Можно ли теперь сохранить результат в рабочей области, а затем прочитать его для дальнейшего расчета на том же этапе? В начале моей симуляции еще не было ясно, какой блок получает какие входные данные. Поэтому я должен использовать рабочую область в качестве буфера. - person poeschlorn; 01.02.2011
comment
ToWorkspace обновляются только в конце моделирования. Для этого вы можете использовать метки Goto / From (в Signal Routing). На самом деле это не хранилище, а просто соединение. - person Clement J.; 02.02.2011
comment
привет, я использовал функции приоритета блоков, и я прочитал, что они несовместимы с блоками goto / from, как вы можете видеть здесь: mathworks.com/help/toolbox/simulink/ug/f13-88939.html#f13-82250 есть ли другая возможность или обходной путь? - person poeschlorn; 02.02.2011
comment
Вам не нужно назначать приоритет везде, только тогда, когда вы хотите его принудительно. Приоритет меток всегда хорошо рассчитан. Кажется, ты слишком много думаешь, как на классическом (текстовом) языке. Пусть Simulink делает свое дело, в целом он работает. - person Clement J.; 02.02.2011
comment
Привет, akd, это абсолютно верно, это отлично работает. Моя злая проблема теперь - это блоки рабочей области from / to, поэтому to выполняется перед блоком from, используя рабочее пространство Matlab в качестве буфера. Я не могу жестко кодировать или фиксировать свои блоки, потому что они будут динамически связаны через переменные, поэтому мне нужно назначить переменные со значениями до и во время выполнения. Но вы абсолютно правы, жесткое соединение блоков работает абсолютно правильно и очень хорошо :) - person poeschlorn; 08.02.2011
comment
Блоки в и из рабочей области предназначены для использования в качестве входных данных из рабочей области и вывода в рабочую область. В вашем примере они оба используют одну и ту же переменную, поэтому значение, считываемое из рабочей области, всегда будет отставать во времени, поскольку выходные данные не сохраняются до завершения моделирования. - person akd; 08.02.2011

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

Совет для проверки порядка выполнения - добавить «встроенный блок Matlab» с командой disp, отображающей имя блока.

person Clement J.    schedule 02.02.2011
comment
Привет, я пробовал использовать это, но получаю сообщение об ошибке, потому что переменная еще не имеет имени. Ошибка при оценке параметра «VariableName» в «MySim / From Workspace»: неопределенная функция или переменная «output1». - person poeschlorn; 02.02.2011
comment
Какую часть моего ответа вы имеете в виду? - person Clement J.; 02.02.2011
comment
эй, я только что добавил скриншот, может это поможет разобраться в моей проблеме. Исключение генерируется только тогда, когда переменная не находится в рабочей области ... но относительно порядка (как показано на снимке экрана) она должна существовать после того, как блок рабочей области выполнил свою задачу. - person poeschlorn; 02.02.2011
comment
Как я уже писал в другом комментарии, вы должны использовать блок Goto / From. Они эквивалентны проводу (не буферу). To / FromWorkspace обновляются соответственно в начале / конце симуляции. - person Clement J.; 02.02.2011
comment
mathworks.com/help/toolbox/simulink/ug/ f13-88939.html # f13-82250 говорит, что невозможно заставить это работать с приоритетом ... есть ли обходной путь? - person poeschlorn; 02.02.2011
comment
Что касается вашего редактирования 2, проблема осталась прежней. Рабочая область «От» оценивается только в начале моделирования (отсюда проблема в первый раз, когда переменная не определена), а «Рабочая область« К »- в конце. Во время второго моделирования вы отправляете на дисплей результаты первого моделирования (и так далее). - person Clement J.; 07.02.2011
comment
привет, Клемент Дж., я получил подсказку, что блоки в / из рабочей области могут быть синхронизированы только, когда они используются в включенных подсистемах, я думаю, что я должен попробовать это. Возможно, эта включенная sybsystem обрабатывается как собственная симуляция в основной симуляции. - person poeschlorn; 08.02.2011
comment
Я пробовал это, похоже ты прав. Кажется, что из-за рабочего пространства происходит сбой, даже при включенных подсистемах. Есть ли другой способ сохранить около 160 сигналов в какой-либо другой структуре, чтобы мои блоки могли читать или записывать их в желаемом порядке? Мне нужно установить соединение между портами ввода и вывода моих блоков динамически с помощью m-файла конфигурации, который не должен быть одинаковым при каждой симуляции ... Я очень не понимаю, как это сделать - person poeschlorn; 08.02.2011
comment
Вы должны попробовать с Selector (в маршрутизации сигналов). Установите векторный элемент в вашем конфигурационном m-файле так, как вы хотите (но он не может измениться во время симуляции). (если сработает, хорошо бы принять мой ответ) - person Clement J.; 08.02.2011
comment
м-м, если я не могу изменить его во время симуляции, это не совсем подходит для моих нужд ... У меня есть другая идея, но я также не знаю, как ее реализовать ... когда я говорю, каждый блок, который я хочу читать / делать что-то / записывать в рабочее пространство должно быть собственной симуляцией, у меня может быть несколько блоков от / до рабочего пространства, потому что каждый блок инициализируется сам по себе ... но как я могу запустить несколько симуляций таким образом, чтобы они действуют друг за другом и не пересекаются? В этом случае рабочая область может выступать в качестве общего источника / приемника данных ... есть ли какие-либо возражения по этому поводу? - person poeschlorn; 09.02.2011

Не совсем понятно, о чем вы спрашиваете. Когда вы говорите, что блок A должен быть завершен, вы имеете в виду функцию вывода? Способ моделирования работает в Simulink заключается в том, что блоки запускаются последовательно, поэтому блоки B и C никогда не будут выполняться, пока блок A не завершит свою функцию вывода.

Я не знаю ни одного очевидного способа параллельного запуска блоков B и C в Simulink.

person MikeT    schedule 29.01.2011
comment
привет, я немного изменил свой вопрос, так что, надеюсь, мне станет понятнее - person poeschlorn; 31.01.2011