Полный исходный текст модели счетчика сигналов на языке 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 } //=========================================