Peter Lorenz English smaller fonts Simulation und Animation

5.1. GPSS/H Makros und Subroutinen

Makros haben im GPSS/H dieselbe Funktion wie in anderen Programmiersprachen: Man kann sie zur Generierung einander ähnlicher Quelltextabschnitte benutzen. Sie erlauben es, größere Modelle kürzer, einfacher und übersichtlicher zu schreiben, als das ohne sie bisher getan werden konnte. Als Beispiele werden Animationsmakros eingeführt und erläutert, die zur Erzeugung von Animationstracefiles nützlich sind.
Subroutinen haben einen Vorteil gegenüber den Makros: Sie führen nicht zur Expansion des Quelltextes. Sie sind Folgen von Blöcken, die von Transaktionen verschiedener Herkunft genutzt werden. Nach deren Durchlauf können die Transaktionen zu ihrem Ausgangsort zurückkehren.

GPSS/H-MakrosTop

Makros dienen der automatischen Generierung wiederholt auftretender, nur geringfügig verschiedener Anweisungsfolgen. Makros generieren Quelltext. Natürlich kann man sie auch benutzen, um ATF-Anweisungen oder -Anweisungsfolgen zu generieren.

Makrodefinition

Makrodefinitionen dürfen an beliebiger Stelle eines Programms erfolgen. Sie müssen nur vor ihrem ersten Aufruf definiert sein.
STARTMACRO
leitet eine Makrodefinition ein. Der Name, der diesem Operationsbezeichner vorausgeht, ist der Makroname, unter dem auch der Aufruf erfolgt.
ENDMACRO
schließt die Makrodefinition ab.
Zwischen diesen beiden Anweisungen steht eine beliebig große Anzahl von Anweisungen, die formale Parameter enthalten. Diese haben die festen Bezeichner #A, #B, ..., #J. Formale Parameter können an der Stelle eines Anweisungsnamens, als Operationsbezeichnung, als Operand oder als Teil eines Operanden auftreten.
Beim Aufruf oder der Expansion eines Makros werden die formalen Parameter durch aktuelle Parameter ersetzt. Auch Makroaufrufe sind als Anweisungen zulässig.

Makroaufruf

Der Makroaufruf erfolgt in der Form
makroname MACRO liste_aktueller_parameter
Ein aktueller Parameter ist eine beliebige Zeichenkette, in der einzeln stehende Leerzeichen auftreten dürfen. Deshalb muß Kommentar von den Operanden der MACRO-Anweisung durch mindestens zwei Leerzeichen getrennt sein. Der Makroaufruf bewirkt die Erweiterung des Programmtextes um alle in der Makrodefinition enthaltenen Anweisungen. Dabei werden alle formalen Parameter durch die aktuellen Parameter ersetzt.
Beispiel 1
Wenn an einer Kreuzung vier Fahrzeugströme nachzubilden sind, die aus verschiedenen Richtungen kommen, ähneln die abgebildeten Prozesse einander so, dass man das Makrokonzept in sinnvoller Weise anwenden kann.

Beispiel 2
Makros können mit beliebiger Tiefe verschachtelt werden. Als Beispiel seien hier zwei Proof-Makros angeführt:

Das ist ein ausführbares Programm. Der Aufruf zeigt das Resultat der Makroexpansion oder -auflösung und man kann das erzeugt ATF-File betrachten.

SLX

Makrosammlung zur Animation

Zur Erzeugung von Animationstracefiles sind Makros besonders nützlich. Das folgende Textfeld enthält eine Auswahl, die man bei Bedarf selektieren und in GPSS/H-Programme einfügen kann.




SLX

Makros bewirken die Quelltextexpansion: An der Stelle, wo ein Makroaufruf auftritt, wird er durch die in seiner Definition enthaltene Anweisungsfolge ersetzt. Das verlängert den Quelltext und ärgert die Nutzer der Studentenversion von GPSS: Die Maximalzahl der Zeilen und Blöcke ist schneller erreicht und überschritten. In vielen Fällen bieten Subroutinen eine Alternative. Sie werden im folgenden Abschnitt vorgestellt.

Subroutinen Top

Subroutinen sind bei der Behandlung aller Modifikationen des TRANSFER-Blockes bereits erwähnt worden.

Wenn der erste Operand von TRANSFER mit dem Schlüsselwort SBR belegt ist, springt jede eintreffende Transaktion zu einer Subroutine. Diese beginnt bei einem durch den Operand B spezifizierten Block.
Die Nummer des aktuellen TRANSFER-Blockes wird in dem Parameter gespeichert, der im Operand C spezifiziert ist. Dieser Parameterwert kann nun nach Durchlaufen einer Blockfolge als Rücksprungadresse benutzt werden. Das geschieht mittels TRANSFER PH.

Beispiel

TRANSFER SBR,MYSUB,2PH

organisiert den Sprung zum Block MYSUB und speichert seine eigene Blocknummer im zweiten Halbwortparameter.
TRANSFER PH,2,1

steht dann am Ende der Subroutine oder des Unterprogramm s und veranlaßt den Rücksprung zu dem ersten Block nach TRANSFER SBR.

Weshalb lassen sich Unterprogrammkonzepte anderer Programmiersprachen nicht einfach übernehmen? Gewöhnlich wird dort die Rücksprungadresse in einem Stack gespeichert und jedes return bewirkt den Rücksprung zu der Stelle, wo das Unterprogramm zuletzt gerufen wurde. Das geht nicht in einem Simulationssystem: In einem Unterprogramm können gleichzeitig mehrere Transaktionen liegen, die es nicht in derselben Reihenfolge verlassen, wie sie es betreten haben.

Programmbeispiel

SBR Example
Zwei unterschiedliche Auftragsströme werden zuerst auf getrennten Fertigungslinien bearbeitet, teilen sich danach eine gemeinsame Fertigungslinie und werden anschließend wieder getrennt.


SLX
Wie könnte man den obigen Programmtext durch Definition eines Makros verkürzen? Es liegt nahe, ein Makro zu definieren, das durch Spezifikation seiner formalen Parameter sowohl die Anweisungen für den ersten als auch den zweiten Jobstrom erzeugt:


SLX

Kontrollfragen Top

  1. Wie definiert man ein GPSS/H-Makro?
  2. Wie werden formale Parameter eines Makros bezeichnet?
  3. Wie wird ein Makro aufgerufen?
  4. Darf innerhalb einer Makrodefinition ein Makro gerufen werden?
  5. Was versteht man unter Makroexpansion?
  6. Vergleichen Sie Makro- und Subroutinenkonzept im GPSS/H!
  7. Welcher grundlegende Unterschied besteht zwischen Unterprogrammtechniken im Allgemeinen und in Simulationssystemen?
  8. Schreiben Sie eine Subroutine, welche das Makro PUTTIME aus Beispiel 2 im Abschnitt über Makros ersetzen kann!
  9. Was muß man bezüglich des Rücksprungs beachten, wenn innerhalb eines Unterprogramms in ein anderes Unterprogramm gesprungen werden soll?
  10. Erkennen Sie im Programmbeispiel für Subroutinen einen Engpass im Auftragsdurchlauf?

SAHome previous next up Englishsmaller fonts Top Line
Last Modified Fri 05-27-11 06:53 GMT Valid CSS!

Comments please to:pelosim@yahoo.com