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

Описания RDS

Руководство программиста

Глава 2. Создание моделей блоков

§2.6. Динамические переменные

§2.6.2. Подписка на динамическую переменную

Полный исходный текст на языке C++ для библиотеки (DLL) с моделью, обращающейся к стандартной динамической переменной времени «DynTime» для вычисления синусоиды.

      // Подписка на динамическую переменную
      #include <windows.h>
      #include <math.h>
      #include <RdsDef.h>
      // Подготовка описаний сервисных функций
      #define RDS_SERV_FUNC_BODY GetInterfaceFunctions
      #include <RdsFunc.h>

      //========== Главная функция DLL ==========
      int WINAPI DllMain(HINSTANCE /*hinst*/,
                               unsigned long reason,
                               void* /*lpReserved*/)
      { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
          { // Получение доступа к функциям RDS
            if(!GetInterfaceFunctions())
              RDS_SERV_ERROR_MSGW // Сообщение: старая версия RDS
          }
        return 1;
      }
      //========= Конец главной функции =========

      //============= Модель блока ==============
      extern "C" __declspec(dllexport)
           int RDSCALL TestDynSinT(int CallMode,
                                   RDS_PBLOCKDATA BlockData,
                                   LPVOID ExtParam)
      {
      // Макроопределения для статических переменных
      #define pStart ((char *)(BlockData->VarTreeData))
      #define Start (*((char *)(pStart)))
      #define Ready (*((char *)(pStart+RDS_VSZ_S)))
      #define A (*((double *)(pStart+2*RDS_VSZ_S)))
      #define y (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_D)))
        // Вспомогательная переменная – указатель на структуру подписки
        RDS_PDYNVARLINK Link;

        switch(CallMode)
          { // Инициализация блока
            case RDS_BFM_INIT:
              // Подписка на динамическую переменную DynTime
              Link=rdsSubscribeToDynamicVar(RDS_DVPARENT, // В родителе
                                            "DynTime",    // Переменная
                                            "D",          // Тип
                                            TRUE);        // Искать
              // Запомнить указатель на структуру подписки
              BlockData->BlockData=Link;
              break;

            // Очистка
            case RDS_BFM_CLEANUP:
              // Запомненный указатель на структуру подписки
              Link=(RDS_PDYNVARLINK)BlockData->BlockData;
              // Прекратить подписку на DynTime
              rdsUnsubscribeFromDynamicVar(Link);
              break;

            // Проверка типа статических переменных
            case RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SSDD}")==0)
                return RDS_BFR_DONE;
              return RDS_BFR_BADVARSMSG;

            // Выполнение такта моделирования
            case RDS_BFM_MODEL:
              // Запомненный указатель на структуру подписки
              Link=(RDS_PDYNVARLINK)BlockData->BlockData;
              // Проверка существования DynTime
              if(Link!=NULL && Link->Data!=NULL)
                { // DynTime существует – привести указатель на область
                  // данных переменной к типу "double*"
                  double *pT=(double*)Link->Data;
                  // pT – указатель на данные DynTime
                  y=A*sin(*pT); // Вычисление выхода
                }
              else // DynTime не существует
                Ready=0; // Не передавать данные по связям
              break;

            // Реакция на изменение динамической переменной
            case RDS_BFM_DYNVARCHANGE:
              Start=1; // Запустить модель в следующем такте расчета
              break;
          }
        return RDS_BFR_DONE;
      // Отмена макроопределений
      #undef y
      #undef A
      #undef Ready
      #undef Start
      #undef pStart
      }
      //=========================================