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

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.2. События блока и связанные с ними описания

А.2.4. События общего назначения

А.2.4.13. RDS_BFM_MODEL – выполнение такта расчета

# Приложения

## Приложение А. Функции, константы и структуры RDS

### А.2. События блока и связанные с ними описания

#### А.2.4. События общего назначения

##### А.2.4.13. RDS_BFM_MODEL – выполнение такта расчета

Поток, в котором вызывается функция модели

Поток расчета.

Первый параметр функции модели (int CallMode)

Константа RDS_BFM_MODEL.

Третий параметр функции модели (void *ExtParam)

ПРи обычном расчете – не используется (NULL), при инициализационном расчете – указатель на структуру RDS_INITIALCALCDATA.

Возвращаемое функцией модели значение

Не используется, можно возвращать любое значение.

Примечания

В режиме расчета реакция на событие RDS_BFM_MODEL циклически вызывается у простых блоков в каждом такте. Именно в ней обычно выполняется основной объем вычислений блока, производимых им в режиме расчета. Эта реакция вызывается для блока только в том случае, если запуск модели разрешен, то есть если одновременно выполняются следующие условия:

1. Данный блок – простой. У подсистем, внешних входов/выходов и вводов шин эта реакция не вызывается, поскольку они не участвуют в расчете.
2. В параметрах блока установлен запуск каждый такт или его первая статическая переменная (сигнальный вход запуска модели, чаще всего называющийся «Start») имеет ненулевое значение.
3. Данный блок не находится за пределами подсистемы, для которой в данный момент включен режим отдельного расчета функцией rdsSetExclusiveCalc.

RDS в режиме расчета производит (как правило, в отдельном потоке) следующие действия (см.также §1.3 руководства программиста):

- Для всех простых блоков, модели которых взвели флаг RDS_CTRLCALC, вызывается реакция на событие RDS_BFM_PREMODEL, если запуск модели данного блока разрешен (см. выше).
- Для всех простых блоков, запуск моделей которых все еще разрешен (предыдущий вызов RDS_BFM_PREMODEL мог запретить вызов модели блока), вызывается реакция на событие RDS_BFM_MODEL. Перед вызовом реакции сигналу запуска модели (первой статической переменной блока) присваивается нулевое значение – по умолчанию в следующем такте расчета модель блока не запустится, если только она не взведет свой сигнал запуска самостоятельно внутри реакции RDS_BFM_MODEL, или на него не поступит единица по связи от другого блока, или в параметрах блока не указан запуск каждый такт (в этом случае значение сигнала запуска игнорируется). Кроме того, перед вызовом реакции RDS_BFM_MODEL второй статической переменной блока (сигналу готовности блока «Ready») присваивается единица – по завершении реакции блок будет считаться сработавшим и его выходы передадутся по связям, если только модель блока принудительно не обнулит сигнал готовности внутри реакции. После передачи данных выходов блока по связям сигнал готовности обнулится автоматически.
- Начинается следующий такт расчета с новым вызовом реакций RDS_BFM_PREMODEL и RDS_BFM_MODEL.

В большинстве случаев вычисление выходов блока производится именно в реакции на событие RDS_BFM_MODEL, поскольку этот вызов постоянно производится в режиме расчета, чередуясь с передачей данных по связям. Самые простые модели (например, модели алгебраических блоков) состоят всего из двух реакций: RDS_BFM_MODEL и RDS_BFM_VARCHECK. Для управления запуском модели в такте расчета используется сигнал запуска (первый сигнальный вход, «Start») и флаги запуска входов блока. Внутри реакции модель блока может принудительно перезапустить себя в следующем такте (взведя свой собственный флаг запуска), а также запретить передачу по связям всех своих выходов (сбросив свой сигнал готовности).

Следует помнить, что реакция на событие RDS_BFM_MODEL обычно вызывается в цикле в отдельном потоке расчета, поэтому в ней нельзя открывать модальные окна, поскольку это приведет к остановке всего потока расчета до закрытия окна (см. §1.8 руководства программиста).

Если модель блока при инициализации взвела флаги RDS_INITCALC или RDS_INITCALCFIRST, то в момент выхода из режима редактирования сразу после загрузки схемы или сброса расчета (то есть если расчет еще не начинался), модель будет вызвана для реакции на событие RDS_BFM_MODEL для «инициализационного» расчета, цель которого – установить начальные значения на входах блоков перед самим расчетом. Например, если поле ввода подключено к блоку умножения на константу, а выход этого блока умножения – ко входу какого-либо сложного вычислительного блока, инициализационный расчет обеспечит передачу на вход этого сложного блока значения, равного значению поля ввода, умноженного на константу. При инициализационном расчете в третьем параметре функции модели передается указатель на структуру RDS_INITIALCALCDATA:

      typedef struct {
        BOOL FirstInChain; // Этот блок начинает передачу из-за флага RDS_INITCALCFIRST
      } RDS_INITIALCALCDATA;
      typedef RDS_INITIALCALCDATA *RDS_PINITIALCALCDATA;

Единственное поле структуры FirstInChain имеет значение TRUE, если данный блок начинает цепочку передачи, то есть его модель взвела флаг RDS_INITCALCFIRST (например, это поле ввода). Если этот блок преобразует значение входа в значение выхода, и его модель взвела флаг RDS_INITCALC (например, это блок умножения на константу), поле будет иметь значение FALSE.

Пример

Многочисленные примеры реакций на событие RDS_BFM_MODEL приведены в §2.5 и далее.

См. также

RDS_BFM_PREMODEL, RDS_BFM_VARCHECK, rdsSetExclusiveCalc.