Текущий раздел:

Описания RDS

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.7. Краткий перечень вводимых в модель описаний и реакций на события

§3.7.3. Моделирование и переключение режимов

§3.7.3.1. Выполнение такта расчета

# Описание пользователя

## Глава 3. Использование стандартных модулей автокомпиляции

### §3.7. Краткий перечень вводимых в модель описаний и реакций на события

#### §3.7.3. Моделирование и переключение режимов

Рассматриваются реакции на события, связанные с переключением режимов RDS, работой в режиме расчета и изменением динамических переменных.

##### §3.7.3.1. Выполнение такта расчета

Выполнение такта расчета – это самое часто используемое в моделях событие. В режиме расчета оно в каждом такте возникает у всех простых блоков, у которых установлен флаг запуска в каждом такте или взведен входной сигнал готовности (обычно он называется «Start», см. пример в §3.6.2.1). Многие простейшие модели автокомпилируемых блоков состоят только из реакции на это событие. Как правило, в реакции на него модель блока вычисляет значения выходов по значениям входов, настроечных параметров, динамических переменных и т.п. Примеры использования этого события во множестве содержатся в §3.6.

Реакция на выполнение такта расчета вводится на вкладке «события» левой панели редактора модели: раздел «моделирование и режимы», подраздел «модель». При создании новой пустой модели вкладка для ввода этой реакции открывается автоматически. В классе блока для нее создается функция с именем rdsbcppModel:

      // One simulation step
      void rdsbcppBlockClass::rdsbcppModel(RDS_PINITIALCALCDATA InitialCalc)
      {
         … пользовательский текст реакции …
      }

Реакция на выполнение такта расчета может также вызываться и при так называемом инициализационном, или предварительном, расчете. Предварительный расчет выполняется в момент выхода из режима редактирования по запросу некоторых блоков – например, полей ввода. Он позволяет уменьшить число тактов переходного процесса в алгебраических цепочках, подключенных к таким блокам. Если, например, к полю ввода подключена цепочка из трех последовательно соединенных сумматоров или блоков умножения на константу, правильное значение на выходе третьего блока цепочки установится только через три такта после запуска расчета (см. рис. 10). Если же эти сумматоры или блоки умножения на константу поддерживают предварительный расчет, правильное значение установится на выходе непосредственно перед запуском расчета, поскольку все блоки цепочки будут последовательно вызваны для реакции на такт расчета (хотя расчет еще не идет) и их данные будут переданы на вход следующих блоков в момент выхода из режима редактирования. Для того, чтобы блок вызывался при предварительном расчете, в параметрах его модели должен быть включен флажок «блок участвует в инициализационном расчете». Чтобы блок начинал предварительный расчет, необходимо также включить флажок «блок начинает инициализационный расчет».

В большинстве случаев разработчику модели можно не задумываться над тем, вызвана данная реакция, как и положено, в нормальном режиме расчета, или при предварительном расчете. При необходимости, о причине вызова можно узнать по передаваемому в функцию указателю InitCalc. В режиме расчета этот параметр будет равен NULL, при предварительном расчете он будет указывать на структуру RDS_INITIALCALCDATA, содержащую единственное поле FirstInChain типа BOOL. В этом поле будет находиться значение TRUE, если блок был вызван из-за того, что он сам начинает предварительный расчет, и значение FALSE, если он вызван из-за прихода на вход данных от другого блока в процессе предварительного расчета.

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

При написании моделей блоков без использования модуля автокомпиляции событию такта расчета соответствует константа RDS RDS_BFM_MODEL.