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

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

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

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

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
       int  TestDynSinT(int CallMode,
                                BlockData,
                                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)))
    // Вспомогательная переменная – указатель на структуру подписки
     Link;

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

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

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

        // Выполнение такта моделирования
        case :
          // Запомненный указатель на структуру подписки
          Link=()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 :
          Start=1; // Запустить модель в следующем такте расчета
          break;
      }
    return ;
  // Отмена макроопределений
  #undef y
  #undef A
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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