Опубликован: 16.11.2010 | Уровень: специалист | Доступ: свободно
Лекция 9:

Разработка имитационных моделей в виде приложений с интерфейсом

Аннотация: Подробно рассматривается разработка моделей. Разработка модели в GPSS World. Создание стартовой формы приложения - имитационной модели. Добавление компонент в стартовую форму имитационной модели. События и процедуры обработки событий.

8.1. Применение текстовых объектов и потоков данных

Модель представляет собой набор операторов, содержащихся в одном объекте "Модель" и в любом количестве необязательных текстовых объектов.

Текстовые объекты с наборами операторов модели подключаются к объекту "Модель" командой INCLUDE. Формат команды:

INCLUDE         A

Операнд А - спецификация файла (полный путь доступа к файлу). Допустимые значения - String. Например:

INCLUDE         "DanDon.txt"
INCLUDE          "D:\Primer\DanZad.txt"

В первом примере путь доступа к файлу не приводится, так как предполагается, что файл с указанным именем находится в папке модели. Во втором примере указан путь доступа к файлу.

Команда INCLUDE является срочной командой. При трансляции она заменяется файлом. Поэтому располагать в модели команду INCLUDE нужно там, где должны быть операторы или команды, содержащиеся в файле.

Все дополнительно вводимые файлы нумеруются транслятором целыми числами, начиная с 0. Номер 0 присваивается объекту-модели. Нескольким вводам одного файла также присваиваются уникальные номера, т. е. каждый ввод файла приводит к созданию отличающихся наборов блоков.

Команда INCLUDE допускает пять уровней вложенности файлов модели. Нельзя помещать команду INCLUDE в Plus-процедуру.

Операторы INCLUDE можно также закреплять за функциональными клавишами. Это позволяет одним нажатием клавиши объекту "Процесс моделирования" передать набор команд и (или) Plus-операторов, содержащихся в текстовом файле.

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

Поток данных - это последовательность текстовых строк, используемых процессом моделирования. Существуют два типа потоков данных:

  • потоки ввода-вывода (I/O или "файловые" потоки) для доступа к файлам;
  • потоки в памяти для тестирования или прямого доступа к внутренним данным.

Основной элемент потока данных - текстовая строка, которая является строкой печатных символов, включая пробелы.

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

Перейдем к рассмотрению блоков обработки потоков данных.

8.1.1. Блок OPEN

Блок OPEN предназначен для инициализации потока данных. Формат блока:

OPEN   A,[B],[C]

Операнд А - дескриптор потока данных. Операнд определяет тип потока данных. Он обрабатывается как строка. Если это нулевая строка, создается поток в памяти. Если это канальное имя, такое как "\pipe\mypipe", создается канальный поток. В противном случае создается поток ввода-вывода и предполагается, что операнд А является спецификацией файла.

Операнд В - номер потока данных, произвольное положительное число, задаваемое пользователем. Нумерация потоков введена с целью использования одновременно в одном процессе моделирования нескольких потоков данных. По умолчанию номер потока данных равен 1.

Операнд С - метка блока, в который направляется транзакт в случае ошибки инициализации потока данных. Коды ошибок:

  • 0 - нет ошибки;
  • 10 - длинное имя файла;
  • 11 - ошибка чтения внешнего файла;
  • 12 - во время попытки открыть файл был запрещен доступ к памяти.
OPEN   ("Plan.txt"),3,Kon1
OPEN   ("G\Model\NorPogr.txt")
OPEN   ("")

В первом примере открывается поток ввода-вывода, потоку присваивается номер 3 и в случае ошибки открытия активный транзакт направляется к блоку с меткой Kon1. Операндом А указан неполный путь доступа к файлу, поэтому подразумевается, что используется папка объекта "Процесс моделирования". Если файл с указанным именем не найден, то предполагается, что файл создается, и ошибка не возникает.

Во втором примере операндом А указан полный путь доступа к файлу, открываемому потоку ввода-вывода по умолчанию присваивается номер один. В случае ошибки открытия активный транзакт направляется к следующему по порядку блоку.

В третьем примере открывается поток в памяти.

Замечание.Если указанный операндом А файл найден, во время обработки блока OPEN он полностью загружается в виртуальную память. Все находившиеся в файле данные хранятся как часть объекта "Процесс моделирования" до тех пор, пока поток данных не будет закрыт. Все изменения данных отражаются в файловой системе только после того, как поток данных закрывается блоком CLOSE или библиотечной Plus-процедурой Close().

8.1.2. Блок CLOSE

Блок CLOSE предназначен для закрытия потока данных. Формат блока:

CLOSE             A,[B],[C]

Операнд А - номер или имя параметра транзакта, в который записывается код ошибки закрытия потока данных. Если такой параметр не существует, он создается.

Операнд В - номер закрываемого потока данных, по умолчанию равен 1, т. е. если операнд В не используется, закрывается поток номер один.

Операнд С - метка блока, в который направляется транзакт в случае ошибки закрытия потока данных. Коды ошибок:

  • 0 - нет ошибки;
  • 41 - запись файла на диск не произведена из-за ошибки ввода-вывода;
  • 42 - файл не был открыт.

Например:

CLOSE             Parm_Error,(P1+1)

В примере блок CLOSE закрывает поток данных, номер которого задан выражением в скобках. Это выражение вычисляется, округляется и используется в качестве номера потока данных (должен быть положительным целым числом).

Блок CLOSE для потоков ввода-вывода записывает данные из виртуальной памяти в дисковый файл.

8.1.3. Блок READ

Блок READ предназначен для считывания из потока данных текстовой строки. Формат блока:

READ   A,[B],[C]

Операнд А - номер или имя параметра транзакта, в который записывается считанная из потока ввода или потока в памяти строка, находящаяся на позиции текущей строки. После считывания позиция текущей строки увеличивается на единицу. Если такой параметр активного транзакта не существует, он создается.

Операнд В - номер потока данных, из которого производится считывание. По умолчанию равен 1, т. е. если операнд В не используется, считывание производится из потока номер один.

Операнд С - метка блока, в который направляется транзакт в случае ошибки считывания. Если операнд С не используется, код ошибки все равно сохраняется. Для его получения нужно использовать блок CLOSE. Коды ошибок:

  • 21 - во время попытки выполнить чтение был запрещен доступ к памяти;
  • 22 - файл не был открыт.

Например:

READ   Stroka_Text,4,Kon5

В примере блок READ считывает текстовую строку из потока данных номер 4 и записывает в параметр транзакта с именем Stro-ka_Text. Если текстовая строка считывается без ошибки, а параметр активного транзакта не существует, он создается. В случае ошибки строка не считывается и активный транзакт направляется к блоку с меткой Kon5.

8.1.4. Блок WRITE

Блок WRITE предназначен для передачи текстовой строки потоку данных. Формат блока:

WRITE             A,[B],[C],[D]

Операнд А - текстовая строка, которая должна быть передана потоку данных.

Операнд В - номер потока данных, по умолчанию равен 1.

Операнд С - метка блока, в который направляется транзакт в случае ошибки записи. Коды ошибок:

  • 0 - нет ошибки;
  • 31 - во время попытки выполнить запись был запрещен доступ к памяти;
  • 32 - файл не был открыт.

Операнд D - задает режим работы блока WRITE. Если операнд D не используется (по умолчанию) или равен ON, блок WRITE работает в режиме вставки. Если операнд D равен OFF - в режиме замены.

Режим вставки:

  • все текстовые строки, находящиеся на или за позицией текущей строки, сдвигаются на одну позицию;
  • если позиция текущей строки находится далеко за последней текстовой строкой, она устанавливается сразу после последней строки потока данных;
  • копия новой текстовой строки помещается на позицию текущей строки;
  • позиция текущей строки увеличивается на единицу. Режим замены:
  • если позиция текущей строки находится далеко за последней текстовой строкой, все промежуточные позиции заполняются нулевыми текстовыми строками;
  • текстовая строка, находящаяся на позиции текущей строки, удаляется;
  • копия новой текстовой строки помещается на позицию текущей строки;
  • позиция текущей строки увеличивается на единицу. Пример:
WRITE     "INITIAL    MX$TDon(1,1),420",5,Met3

В этом примере блок WRITE передает текстовую строку потоку данных с номером 5. Если происходит ошибка, активный транзакт переходит к блоку с меткой Met3. Иначе он переходит к следующему по порядку блоку. Если в данном случае поток данных является потоком вывода или потоком в памяти, запись производится в режиме вставки, так как операнд D не используется.

Замечание 1.Если операнды С блоков OPEN, CLOSE, READ и WRITE не используются, ошибка игнорируется. Обычно эти операнды используются для того, чтобы направить активный транзакт на блок CLOSE, который код ошибки помещает в параметр транзакта. Из параметра можно записать код ошибки в сохраняемую ячейку и завершить моделирование. Значение ячейки будет выведено в стандартном отчете.
Замечание 2.При построчном считывании данных из файла может оказаться, что на позиции текущей строки нет строки данных. Это происходит тогда, когда из файла считаны все текстовые строки. В данном случае активный транзакт входит в блок READ и далее направляется к блоку, метка которого указана операндом С. Код ошибки при этом не сохраняется.
Владислав Нагорный
Владислав Нагорный
Высшее образование
Лариса Парфенова
Лариса Парфенова
Экстерн
Кирилл Андреев
Кирилл Андреев
Россия, Г. Цивильск
Александр Белов
Александр Белов
Россия