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

Описания RDS

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

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

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

§2.5.2. Особенности использования сигналов

Полный исходный текст модели счетчика сигналов на языке C++. В этом варианте модели при одновременном поступлении сигналов сброса и счета сигнал счета игнорируется. В основном тексте описаны изменения, которые нужно внести в модель, чтобы сигнал счета не игнорировался даже при поступлении сигнала сброса.

      #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 TestCounter(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 Reset (*((char *)(pStart+2*RDS_VSZ_S)))             // 2
      #define Clk (*((char *)(pStart+3*RDS_VSZ_S)))               // 3
      #define Count (*((RDSINT32 *)(pStart+4*RDS_VSZ_S)))         // 4
      #define Carry (*((char *)(pStart+4*RDS_VSZ_S+RDS_VSZ_I)))   // 5
        switch(CallMode)
          { // Проверка типа переменных
            case RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SSSSIS}")==0)
                return RDS_BFR_DONE;
              return RDS_BFR_BADVARSMSG;

            // Выполнение такта моделирования
            case RDS_BFM_MODEL:
              if(Reset)  // Поступил сигнал Reset
                { Reset=0;  // Сброс этого сигнала
                  Clk=0;    // Сброс сигнала Clk
                  Count=0;  // Обнуление счетчика
                  Carry=0;  // Сброс сигнала переноса
                }
              else if(Clk)  // Поступил сигнал Clk
                { Clk=0;    // Сброс этого сигнала
                  Count++;  // Увеличение счетчика
                  if(Count>=10)  // Досчитали до 10
                    { Count=0;      // Обнуление счетчика
                      Carry=1;      // Выдача сигнала переноса
                    }
                }
              break;
          }

        return RDS_BFR_DONE;
      // Отмена макроопределений
      #undef Carry
      #undef Count
      #undef Clk
      #undef Reset
      #undef Ready
      #undef Start
      #undef pStart
      }
      //=========================================