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

Описания RDS

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

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

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

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

§3.7.3.7. Изменение динамической переменной

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

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

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

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

##### §3.7.3.7. Изменение динамической переменной

Событие изменения динамической переменной возникает во всех блоках, подписанных на эту переменную, при ее создании, уничтожении, или при вызове для нее функции уведомления подписчиков об изменениях (что такое динамические переменные и как с ними работать объясняется в §3.5.3 и в §3.6.3. Реакция на это событие вводится на вкладке «события» левой панели редактора модели: раздел «моделирование и режимы», подраздел «изменение динамической переменной». В этой реакции обычно выполняют действия, для которых требуется значение изменившейся переменной. Во многих блоках, получающих данные через динамические переменные, выгоднее производить вычисления не каждый такт, а только при изменении этих переменных.

В классе блока для реакции на событие изменения динамической переменной создается функция с именем rdsbcppDynVarChange, параметр которой указывает на изменившуюся переменную:

      // Dynamic variable has changed
      void rdsbcppBlockClass::rdsbcppDynVarChange(RDS_PDYNVARLINK Link)
      {
         … пользовательский текст реакции …
      }

Параметр функции Link представляет собой указатель на структуру подписки блока на переменную RDS_DYNVARLINK:

      typedef struct {
        LPVOID Data;          // Адрес области данных переменной

        // Имя переменной
        RDSCSTR VarNameA;     // UTF8
        RDSWCSTR VarNameW;    // UTF16
        //RDSXCSTR VarName;   // поле-псевдоним

        // Тип переменной
        RDSCSTR VarTypeA;     // UTF8
        RDSWCSTR VarTypeW;    // UTF16
        //RDSXCSTR VarType;   // поле-псевдоним

        RDS_BHANDLE Provider; // Блок-владелец переменной
        LPVOID UID;           // Служебный идентификатор переменной
                              // (служебное поле, изменять нельзя)
        RDS_VHANDLE Var;      // Идентификатор переменной для
                              // использования в сервисных функциях
      } RDS_DYNVARLINK;
      typedef RDS_DYNVARLINK *RDS_PDYNVARLINK;

Поля структуры имеют следующий смысл:

Data(LPVOID)
  Указатель на область данных переменной (в автокомпилируемых моделях не используется).
VarNameA(RDSCSTR),VarNameW(RDSWCSTR),VarName(RDSXCSTR)
  Указатель на строку (char*, wchar_t*) с именем динамической переменной. Строка находится во внутренней памяти RDS, ее нельзя изменять.
VarTypeA(RDSCSTR),VarTypeW(RDSWCSTR),VarType(RDSXCSTR)
  Указатель на строку типа динамической переменной (в автокомпилируемых моделях не используется).
Provider(RDS_BHANDLE)
  Идентификатор блока, в котором находится данная динамическая переменная (может использоваться, например, для прямого вызова у этого блока какой-либо функции, см. §3.6.13.
UID(LPVOID)
  Служебный идентификатор данной переменной, используемый внутри RDS. Значение этого поля нельзя изменять.
Var(RDS_VHANDLE)
  Идентификатор переменной, используемый в некоторых сервисных функциях для работы с переменными. В автокомпилируемых моделях этот идентификатор обычно не используется.

В автокомпилируемых моделях поля этой структуры практически никогда не используются. Чаще всего указатель на эту структуру служит своего рода уникальным идентификатором динамической переменной внутри блока, по которому можно понять, какая именно из переменных изменилась, если в блоке их несколько. Например, если в модель блока добавлена динамическая переменная с именем «DynVar1», в реакции на изменение динамической переменной можно сделать следующую проверку:

      if(DynVar1.CheckLink(Link))
        { // Действия при изменении DynVar1
          ...
        }

Следует помнить, что событие изменения динамической переменной не возникает автоматически при присваивании ей в модели нового значения: присвоивший значение блок должен явно вызвать у объекта переменной функцию-член NotifySubscribers, чтобы уведомить всех подписчиков на переменную о произведенном изменении. Например, уведомить всех подписчиков на переменную «DynVar1» о присвоении ей нового значения можно так:

      DynVar1=10;                  // Присвоение значения
      DynVar1.NotifySubscribers(); // Уведомление подписчиков

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