Verfassen von anwenderdefinierten Reihenfolgeregeln
Logik von Reihenfolgeregeln
Bevor Sie eigene Funktionen zur Bestimmung der Ladungsrangfolge erstellen, sollten Sie sich vergegenwärtigen, wie Anforderungen durch die Reihenfolgeregel verarbeitet werden. Wenn eine Ladung eine Anforderung in die Warteschlange stellt, weist die Funktion zur Bestimmung der Ladungsrangfolge dieser Anforderung einen Rangfolgenwert zu. Der Rangfolgenwert ändert sich nie.
Beispiel: Eine Reihenfolgeregel bestimmt die Rangfolge von Anforderungen auf der Basis der bis zum Fälligkeitstermin verbleibenden Zeit. Eine Ladung mit einem Fälligkeitstermin heute 16:00 Uhr erstellt heute um 13:00 Uhr eine Anforderung und erhält den Rangfolgewert 3. Eine Ladung mit einem Fälligkeitstermin heute 17:00 Uhr erstellt heute um 15:00 Uhr eine Anforderung und erhält den Rangfolgewert 2. Nehmen Sie an, dass dies die einzigen Anforderungen in der Warteschlange sind. Eine dieser Anforderungen wird um 15:30 erfüllt. Erfüllt wurde die Anforderung mit dem Rangfolgenwert 2, obwohl sie erst in 1,5 Stunden und die Anforderung mit dem Rangfolgenwert 3 bereits in 0,5 Stunden fällig ist.
Anforderungen werden in der internen Liste geordnet, die die Warteschlange mit nach aufsteigenden Rangfolgenwerten geordneten Anforderungen darstellt. Sie können diese Reihenfolge in der anwenderdefinierten Logik umkehren, indem Sie den Rangfolgenwert mit -1 multiplizieren. Um z. B. Ladungen ausgehend von der längsten Verarbeitungszeit für einen aktuellen Arbeitsgang zu ordnen, würde eine Rangfolgenfunktion den negativen Wert der Verarbeitungszeit für die Ladung im aktuellen Arbeitsgang zurückgeben.
Benennen der Funktion
Sie können einer anwenderdefinierten Funktion zur Bestimmung der Ladungsrangfolge jeden Namen zuweisen, der nicht mit dem Namen einer Standardfunktion, die von Anwendern aufgerufen werden kann, identisch ist.
Argumente
#include "factor.h"
double myrule(ldp, atrib)
LOAD *ldp; /* pointer to the load. */
ATTRIBUTE *atr; /* pointer to attribute, if any, to base ranking on. */
Die Funktion muss zwei Argumente in der folgenden Reihenfolge akzeptieren:
- Eine Ladung (Typ: LOAD*).
- Ein Attribut (Typ: ATTRIBUT).
Rückgabewert
Die Funktion muss einen Wert zurückgeben (Typ: double), bei dem es sich um den Rangfolgewert der Ladungsanforderung handelt.
Das folgende Beispiel stellt eine Funktion zur Bestimmung der Ladungsrangfolge dar, mit der Ladungen auf der Grundlage des kleinsten dynamischen Schlupfes (d. h. der kürzesten verbleibenden Zeit bis zum Fälligkeitstermin abzüglich der verbleibenden Verarbeitungszeit) geordnet werden:
double sqrl (LOAD *ldp, ATTRIBUTE *atr)
/*-----------------------------------------------------------------
Ranking function to cause loads to be ranked on a least dynamic
slack basis.
ARGS:
ldp - pointer to load for which to evaluate the ranking code
RETURNS: load ranking value
-----------------------------------------------------------------*/
{
double rt, lt;
int rn;
rt = sermot(ldp, &rn, <);
return(ldp->loordp->ordudt - DATENOW - rt);
}
Installieren der anwenderdefinierten Funktion
Damit die anwenderdefinierte Funktion von der Reihenfolgeplanung verwendet werden kann, müssen Sie sie von der Initialisierungsfunktion ucini1 aus "installieren", indem Sie die Funktion sedfrk aufrufen. Sedfrk verwendet zwei Argumente in der folgenden Reihenfolge:
- Die Nummer der Reihenfolgeregel, für die anwenderdefinierte Logik von der Rangfolgenfunktion bereitgestellt wird.
- Die Adresse der Funktion zur Bestimmung der Ladungsrangfolge.
So geben Sie beispielsweise zum Installieren der o. a. Beispielregel "sqrl" an der Regelposition 39 Folgendes ein:
sedfrk (39, sqrl);