Руководство программиста
Глава 1. Устройство RDS
§1.3. Режимы работы RDS
Описываются три режима работы RDS и циклический вызов моделей блоков в режиме расчета.
RDS может находиться в одном из трех режимов: редактирования, моделирования и расчета (см. §1.3 описания пользователя).
В режиме редактирования пользователь может изменять схему, добавляя и удаляя блоки и связи и вводя их параметры. При этом информация о движении курсора и нажатии кнопок мыши и клавиш не передается в модели блоков. Тем не менее, блоки продолжают реагировать на остальные события пользовательского интерфейса: вывод всплывающей подсказки, вызов настройки, перемещение и т.п.
В режиме моделирования пользователь не может ни редактировать схему, ни вызвать функцию настройки блока – все события мыши и клавиатуры передаются в функцию модели.
В режиме расчета все события мыши и клавиатуры также передаются в функции блоков. Кроме того, постоянно (как правило, в отдельном потоке) циклически выполняется следующая последовательность действий:
- По очереди в произвольном порядке вызываются все модели простых блоков (при этом в функцию модели передается идентификатор события RDS_BFM_MODEL), у которых установлен параметр «запуск каждый такт» или значение первой однобайтовой статической переменной (как правило, она называется «Start») равно единице. При этом перед вызовом каждой модели значение переменной «Start» сбрасывается в 0, и второй однобайтовой статической переменной блока (как правило, она называется «Ready») присваивается единица. Перед вызовом реакции RDS_BFM_MODEL у блоков, модели которых взвели флаг RDS_CTRLCALC в своей структуре данных RDS_BLOCKDATA, вызывается дополнительная реакция RDS_BFM_PREMODEL.
- Для всех простых блоков, у которых переменная «Ready» имеет значение 1, выполняется передача данных по связям, подключенным к выходам (некоторые выходы блока могут быть запрещены, в этом случае передача данных этого выхода не производится). Таким образом, все сработавшие блоки передают свои данные. После передачи значение «Ready» сбрасывается в 0.
- Начинается следующий такт расчета: снова вызываются все модели простых блоков, передаются данные по связям, и т.д. до тех пор, пока пользователь или один из блоков не даст команду остановить расчет.
Переменные Start и Ready (их названия можно изменить, главное, чтобы это были первая и вторая переменные блока) играют роль сигналов запуска и готовности. Модель может сама изменять значения этих переменных для управления работой блока. Например, если присвоить переменной Start значение 1, модель блока будет снова запущена в следующем такте расчета, даже если связь, присоединенная к этой переменной, не сработает. Если же присвоить переменной Ready значение 0, данные с выхода блока не будут переданы по связям, несмотря на то, что блок сработал в этом такте.
В расчете участвуют только простые блоки. Ни подсистемы, ни внешние входы/выходы, ни вводы шин в расчете не участвуют, то есть их модели вообще никогда не вызываются в режиме RDS_BFM_MODEL в такте расчета. Если, например, данные передаются от простого блока «Block1» внутрь подсистемы «Sys1» через внешний вход «Input1» ко второму простому блоку «Block2» (рис. 4), то ни модель подсистемы, ни модель внешнего входа вызвана не будет. Будут вызваны только модели первого и второго блоков, при этом после срабатывания первого блока данные его выхода y передадутся непосредственно на вход второго блока x, на вход Input1 подсистемы «Sys1» и на выход ее внешнего входа «Input1». Такой подход позволяет ускорить расчет за счет исключения промежуточных ступеней. Следует иметь в виду, что статические переменные подсистемы и внешнего входа все равно получат данные первого блока, хотя их модели и не вызываются. Это может оказаться полезным в тех случаях, когда подсистема или внешний вход имеют векторную картинку: если какие-либо элементы этой картинки связаны с переменными, изменившиеся значения этих переменных отразятся на внешнем виде блоков. Например, если добавить в векторную картинку подсистемы «Sys1» строку текста и связать ее с входом Input1 этой подсистемы, в режимах расчета и моделирования на изображении подсистемы будет выводиться числовое значение входа Input1, полученное по связи от блока «Block1».
Рис. 4. В расчете участвуют только блоки 1 и 2