Полный исходный текст на языке C++ для библиотеки (DLL) с моделью, обращающейся к стандартной динамической переменной времени «DynTime» для вычисления синусоиды.
// Подписка на динамическую переменную #include <windows.h> #include <math.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 TestDynSinT(int CallMode, RDS_PBLOCKDATA BlockData, LPVOID ExtParam) { // Макроопределения для статических переменных #define pStart ((char *)(BlockData->VarTreeData)) #define Start (*((char *)(pStart))) #define Ready (*((char *)(pStart+RDS_VSZ_S))) #define A (*((double *)(pStart+2*RDS_VSZ_S))) #define y (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_D))) // Вспомогательная переменная – указатель на структуру подписки RDS_PDYNVARLINK Link; switch(CallMode) { // Инициализация блока case RDS_BFM_INIT: // Подписка на динамическую переменную DynTime Link=rdsSubscribeToDynamicVar(RDS_DVPARENT, // В родителе "DynTime", // Переменная "D", // Тип TRUE); // Искать // Запомнить указатель на структуру подписки BlockData->BlockData=Link; break; // Очистка case RDS_BFM_CLEANUP: // Запомненный указатель на структуру подписки Link=(RDS_PDYNVARLINK)BlockData->BlockData; // Прекратить подписку на DynTime rdsUnsubscribeFromDynamicVar(Link); break; // Проверка типа статических переменных case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSDD}")==0) return RDS_BFR_DONE; return RDS_BFR_BADVARSMSG; // Выполнение такта моделирования case RDS_BFM_MODEL: // Запомненный указатель на структуру подписки Link=(RDS_PDYNVARLINK)BlockData->BlockData; // Проверка существования DynTime if(Link!=NULL && Link->Data!=NULL) { // DynTime существует – привести указатель на область // данных переменной к типу "double*" double *pT=(double*)Link->Data; // pT – указатель на данные DynTime y=A*sin(*pT); // Вычисление выхода } else // DynTime не существует Ready=0; // Не передавать данные по связям break; // Реакция на изменение динамической переменной case RDS_BFM_DYNVARCHANGE: Start=1; // Запустить модель в следующем такте расчета break; } return RDS_BFR_DONE; // Отмена макроопределений #undef y #undef A #undef Ready #undef Start #undef pStart } //=========================================