Приложения
Приложение А. Функции, константы и структуры RDS
А.2. События блока и связанные с ними описания
А.2.4. События общего назначения
А.2.4.13. RDS_BFM_MODEL – выполнение такта расчета
Поток, в котором вызывается функция модели
Поток расчета.
Первый параметр функции модели (int CallMode)
Константа RDS_BFM_MODEL.
Третий параметр функции модели (void *ExtParam)
ПРи обычном расчете – не используется (NULL), при инициализационном расчете – указатель на структуру RDS_INITIALCALCDATA.
Возвращаемое функцией модели значение
Не используется, можно возвращать любое значение.
Примечания
В режиме расчета реакция на событие RDS_BFM_MODEL циклически вызывается у простых блоков в каждом такте. Именно в ней обычно выполняется основной объем вычислений блока, производимых им в режиме расчета. Эта реакция вызывается для блока только в том случае, если запуск модели разрешен, то есть если одновременно выполняются следующие условия:
- Данный блок – простой. У подсистем, внешних входов/выходов и вводов шин эта реакция не вызывается, поскольку они не участвуют в расчете.
- В параметрах блока установлен запуск каждый такт или его первая статическая переменная (сигнальный вход запуска модели, чаще всего называющийся «Start») имеет ненулевое значение.
- Данный блок не находится за пределами подсистемы, для которой в данный момент включен режим отдельного расчета функцией 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 и далее.
См. также