Навигация:
<< >> Оглавление Указатель

Приложения

Приложение А. Функции, константы и структуры 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_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 {
     FirstInChain; // Этот блок начинает передачу из-за флага 
  } RDS_INITIALCALCDATA;
  typedef RDS_INITIALCALCDATA *RDS_PINITIALCALCDATA;

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

Пример

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

См. также

RDS_BFM_PREMODEL, RDS_BFM_VARCHECK, rdsSetExclusiveCalc.


<< >> Оглавление Указатель