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

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

  #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  TestCounter(int CallMode,
       BlockData,
       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 :
          if(strcmp((char*)ExtParam,"{SSSSIS}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          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 ;
  // Отмена макроопределений
  #undef Carry
  #undef Count
  #undef Clk
  #undef Reset
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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