Интеграция системы GPSS World с источниками данных и внешними библиотеками

Отметим, что в системе GPSS World есть блоки, предназначенные для записи и чтения из внешних ASCII-файлов. Эти блоки могут быть очень полезны, если вы хотите считать данные из внешнего файла, составить свой собственный отчет, собрать один или два набора данных, полученные в разные интервалы модельного времени, в один файл.

Для организации файлового ввода (вывода) данных используются следующие блоки: OPEN, READ, SEEK, WRITE и CLOSE.

Для этих блоков существуют эквивалентные процедуры. При объединении этих блоков или библиотечных процедур с функциями обработки строк обеспечивается выполнение сложных задач, связанных с управлением данными и форматированием текста.

Как правило, при работе с потоками данных и обработке строк используются следующие операторы:

  • Catenate — объединить;
  • Seek — искать;
  • Insert — вставить;
  • Sequential — последовательный;
  • Replace — заменить;
  • String — строка;
  • Read — считать;
  • Write — записать.

Рассмотрим простой пример считывания данных и записи значения в матрице GPSS World, объявленной с помощью оператора MATRIX ,10,1. В данном случае будет создана матрица размерностью 10 строк и 1 столбец.

Пусть имеется некоторая модель MODEL.GPS и файл MODEL. TXT. Модель имеет следующий вид.

Модель: MODEL.GPS

Total MATRIX ,10,1

GENERATE ,„1

OPEN (“MOI)EL.TXT”)„flag

Again READ Numero„Finis

SAVEVALUE Nrow+,1

ASSIGN Numrow,X$Nrow

MSAVEVALUE Total,P$Numrow,l,P$Numero

TRANSFER .Again

Finis CLOSE Prob„Flagl

TERMINATE 1

Flag TERMINATE 1

Flagl TERMINATE 1

Файл данных MODEL.TXT имеет следующее содержание: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Тогда в матрицу Total будут считаны значения из файла MODEL.TXT (всего 10 значений). Так как путь к файлу MODEL.TXT не указан, он должен быть расположен в той же папке, что и сама модель. Отметим, что сохранение данных в матрице Total обеспечивается с помощью блока MSAVEVALUE, одним из атрибутов которого является параметр Numrow. В свою очередь, значение параметра Numrow ранее устанавливается с помощью блока ASSIGN Numrow, X$Nrow, где X$Nrow — значения ячейки номера строки.

Следующий пример демонстрирует запись указанной строки в файл с использованием метода случайного доступа.

Модель: MODEL2.GPS ; GPSS World Sample File - MODEL2.GPS

:?ез{с9]с:{сз|езЕсз|езЭез{сз|с:{ез)ез{сз{сзЭсз|сэ|сз{сз)с’?з{с$!|с4с$$$:{с’!<:(с$$$$>к’1<з{'$>!(’{сэ1с:{'4с$$’Зс:{с’!с’(с$!(сэ{<

GENERATE ,„1

OPEN (“MODEL2.TXT”)„Flag

SEEK 3

WRITE 2456„Flagl,Off CLOSE Prob„Flag2 TERMINATE 1 Flag TERMINATE 1 Flagl TERMINATE 1 Flag2 TERMINATE 1

В результате файл данных M0DEL2.TXT будет иметь следующие записи: «Строка 1», «2456», «Строка 3», «Строка 4» и т.д. Таким образом, вторая строка заменена на «2456».

Здесь процедура SEEK 3 обеспечивает переход указателя на третью строку данных файла M0DEL2.TXT, а процедура WRITE 2456„Flagl,Off заменяет строкой «2456» вторую строку данных (перед строкой 3) в файле M0DEL2.TXT. Таким образом, блок WRITE работает в режиме замены (включена опция Off). Для включения режима вставки записей (вместо замены) для блока WRITE необходимо указать опцию On.

Отметим, что в системе GPSS World поддерживаются процедуры динамического вызова. Они используются для вызова функций, хранящихся во внешних исполняемых файлах, включая динамически подключаемые библиотеки Dll. Соответствующие процедуры можно использовать для запуска функций, предоставляемых другими фирмами в отдельных исполняемых файлах и поддерживающих протокол CDECL.

Напомним, что D/Z-библиотска — это набор подпрограмм, которые могут использоваться внешним приложением (в частности, в системе GPSS World) или другой Dll-библиотекой. D/Z-библиотека является отдельно компилируемым исполняемым кодом, который подключается к вызывающему приложению не во время компиляции, а во время работы приложения.

D/Z-библиотеки, поддерживающие протокол CDECL, как правило разрабатываются на языках программирования С и C++, в частности с использованием приложения Microsoft Visual Studio. Основными соглашениями о вызовах в языке C++ являются _cdecl, _stdcall, ffastcall и _thi sc all. Но умолчанию используется jcdecl. Модификатор, определяющий соглашение о вызовах, записывается после типа результата функции:

void _ cdecl function() {... >

Соглашение о вызовах _cdecl подразумевает, что очистка стека осуществляется вызывающей программой. Остальные соглашения о вызовах подразумевают, что очистка стека осуществляется подпрограммой. При использовании соглашения о вызовах _cdecl генерируемый код получается больше, чем при использовании соглашения о вызовах _stdcalf так как после каждого вызова функции необходимо вставлять команды очистки стека. Однако это соглашение о вызовах позволяет реализовывать и вызывать функции с переменным числом параметров.

Для создания ^///-библиотеки в приложении Microsoft Visual Studio необходимо создать новый проект Win32 и после задания имени проекта в окне параметров приложения выбрать тип приложения DLL. Если остальные параметры оставить без изменений, Microsoft Visual Studio автоматически сгенерирует шаблон библиотеки. Если же создать пустой проект (empty project), то инициализирующую часть кода придется писать самостоятельно. В языке C++ основной функцией (///-библиотеки является функция, которую обычно называют DllMain, и которая выглядит следующим образом.

//dllmain.cpp: Определяет точку входа для применения DLL #include

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_ reason_for_call, LPVOID IpReserved)

{switch (ulreasonforcall)

{ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL PROCESS DETACII: break;

>

return TRUE;

>

Функция DllMain получает три параметра. Первый является идентификатором библиотеки. Второй определяет причину вызова функции DllMain. Третий параметр зарезервирован для внутреннего использования в Windows.

Функции, которые будут экспортироваться из (///-библиотеки,

должны быть объявлены со спецификацией extern «С»_declspec

(dllexport), которая указывает, что функция должна быть доступна приложению, использующему библиотеку, и что имена должны преобразовываться по правилам языка С:

extern “С”_declspec(dllexport) <тип> <имя> (<параметры>) {...}

Ниже представлен пример (///-библиотеки на языке C++, которую можно в дальнейшем использовать в системе GPSS World.

// Первый файл dllmain.cpp: Определяет точку входа для применения DLL

// Второй файл ExampleDll.cpp: Определяет экспортируемые функции для применения DLL

extern “С”_declspec(dllexport) void ExampleFunction(double x)

{

int y=100; x = x * y;

}

После успешной компиляции файлов dllmain.cpp и ExampleDll. срр будут сформированы файлы .dll и .lib. Файл с расширением lib — это так называемая библиотека импорта, которая требуется при статическом подключении (///-библиотеки. Соответственно, в системе GPSS World следует использовать файл с расширением .dll.

Итак, в системе GPSS World поддерживаются следующие способы вызова (///-процедур:

Call — вызов внешней CDECL-функции без аргументов. Например:

ReturnCode = Call(Executable File Name, Function Name)

где Executable File Name — имя модуля DLL-файла; Function Name - имя функции;

Calllnteger — вызов внешней CDLCL - фу н к ц и и с одним целочисленным аргументом. Например:

ReturnCode = Call_Integer(Executable File Name, Function Name, Argument)

где Argument — целочисленный аргумент;

Call_String — вызов внешней CDLCL-функции с одним символьным аргументом. Например:

ReturnCode = Call_Integer(Executable File Name, Function Name, Argument)

где Argument — символьный аргумент;

Call Real — вызов внешней CDLCL-функции с одним вещественным аргументом. Например:

ReturnCode = Call_Real(Executable File Name, Function Name, Argument)

где Argument — вещественный аргумент.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >