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

Описания RDS

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

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

§2.5. Статические переменные блоков

§2.5.1. Доступ к статическим переменным и работа в режиме расчета

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

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

      #include <windows.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 TestSub(int CallMode,
                            RDS_PBLOCKDATA BlockData,
                            LPVOID 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 RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SSDDD}")==0)
                return RDS_BFR_DONE;
              return RDS_BFR_BADVARSMSG;

            // Выполнение такта моделирования
            case RDS_BFM_MODEL:
              y=x1-x2;	// Вычисление значения выхода
              break;
          }
        return RDS_BFR_DONE;
      // Отмена макроопределений
      #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 <RdsFunc.h>

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

      //========== Главная функция 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
            else
              rdsGetHugeDouble(&DoubleErrorValue);

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

      extern "C" __declspec(dllexport)
        int RDSCALL TestSub(int CallMode,
                            RDS_PBLOCKDATA BlockData,
                            LPVOID 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 RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SSDDD}")==0)
                return RDS_BFR_DONE;
              return RDS_BFR_BADVARSMSG;

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