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

Полные исходные тексты моделей блоков на языке C++.

Пример модели, вычисляющей разность входов блока x1 и x2, и выдающей ее на выход y. В первом варианте примера входы блока не проверяются на допустимость.

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

  //========== Главная функция DLL ==========
  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  TestSub(int CallMode,
                         BlockData,
                         ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))                         // 0
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))               // 1
  #define x1 (*((double *)(pStart+2*RDS_VSZ_S)))              // 2
  #define x2 (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_D)))    // 3
  #define y (*((double *)(pStart+2*RDS_VSZ_S+2*RDS_VSZ_D)))   // 4
    switch(CallMode)
      { // Проверка типа переменных
        case :
          if(strcmp((char*)ExtParam,"{SSDDD}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          y=x1-x2;	// Вычисление значения выхода
          break;
      }
    return ;
  // Отмена макроопределений
  #undef y
  #undef x2
  #undef x1
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================

Улучшенный пример той же самой модели, в которую включена проверка допустимости вещественных входных значений (изменения выделены цветом).

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

  // Глобальная переменная для значения ошибки 
  double DoubleErrorValue;

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

      }
    return 1;
  }
  //========= Конец главной функции =========

  extern "C" __declspec(dllexport)
    int  TestSub(int CallMode,
                         BlockData,
                         ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))                         // 0
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))               // 1
  #define x1 (*((double *)(pStart+2*RDS_VSZ_S)))              // 2
  #define x2 (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_D)))    // 3
  #define y (*((double *)(pStart+2*RDS_VSZ_S+2*RDS_VSZ_D)))   // 4
    switch(CallMode)
      { // Проверка типа переменных
        case :
          if(strcmp((char*)ExtParam,"{SSDDD}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          if(x1==DoubleErrorValue || x2==DoubleErrorValue)
            y=DoubleErrorValue; // Один из входов - ошибочное значение 
          else
            y=x1-x2; // Вычисление значения выхода
          break;
      }
    return ;
  // Отмена макроопределений
  #undef y
  #undef x2
  #undef x1
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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