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