Verbessern der Leistung des Planungsmoduls

Note

Community-Interessensgruppen sind inzwischen von Yammer auf Microsoft Viva Engage umgestiegen. Um an einer Viva Engage-Community teilzunehmen und an den neuesten Diskussionen teilzunehmen, füllen Sie das Formular "Anfordern des Zugriffs auf Finance and Operations Viva Engage Community" aus , und wählen Sie die Community aus, der Sie beitreten möchten.

Das Ressourcenplanungsmodul plant Routen für geplante und freigegebene Produktionsaufträge.

Das Feinterminierungsproblem ist ein äußerst komplexes kombinatorisches Problem, bei dem die Lösungszeit exponential mit der Anzahl der Entscheidungsvariablen wächst. Kunden richten häufig Produktionsrouten und zugehörige Daten so ein, dass Planungsprobleme entstehen, die nicht in angemessener Zeit gelöst werden können, auch auf moderner Hardware. In diesem Artikel wird die Planungs-Engine erläutert und wie ein spezifisches Setup die Leistung beeinflusst.

Verbessern Sie die Planungsleistung, indem Sie die Komplexität des Problems verringern, das das Modul löst. Einige der Hauptfaktoren, die die Leistung beeinflussen können, sind:

  • Arbeitspläne mit vielen Arbeitsgängen
  • Arbeitspläne mit parallelen Arbeitsgängen
  • Vorgänge mit mehr als einer Ressource
  • Arbeitsgänge mit vielen anwendbaren Ressourcen
  • Verwendung von festen Links
  • Nutzung begrenzter Kapazität
  • Anzahl der verschiedenen verwendeten Kalender
  • Anzahl der Arbeitszeitfenster pro Tag im Kalender
  • Gesamtdauer des Arbeitsplans
  • Paralleles Ausführen mehrerer Planungsmodule

Übersicht über den grundlegenden Planungsflow

Um zu verstehen, wie sich ein bestimmtes Setup auf die Leistung auswirkt, müssen Sie wissen, wie der Prozess innerhalb des Moduls und im X++-Code fließt, der ihn umgibt.

Der grundlegende Prozess zum Planen eines Auftrags besteht aus drei Hauptschritten:

  • Laden von Daten – X++-Datenmodelle transformieren sich als Aufträge und Einschränkungen in das interne Datenmodell des Moduls.
  • Planung – Das Modul verarbeitet das angegebene Modell und einschränkungen, um ein Ergebnis zu generieren. Sie fordert bei Bedarf Arbeitszeitinformationen und vorhandene Kapazitätsreservierungen von X++ an.
  • Speichern von Daten – X++-Code verarbeitet das Modulergebnis in Form von Auftragskapazitätsreservierungen, um Kapazitätsreservierungen zu sparen und die Start- und Endzeiten der Aufträge, des Vorgangs oder der Bestellung zu aktualisieren.

Laden der Daten in das Modul

Das Planungsmodul verwendet ein abstrakteres Datenmodell als die Supply Chain Management-Datenbank, da es sich um ein generisches Modul ist, das mehrere Datenquellen verarbeitet. Die Konzepte von Route, sekundären Vorgängen und Laufzeit werden in das generische Auftrags- und Einschränkungsmodell übersetzt, das von der Engine bereitgestellt wird. Die Logik für die Erstellung des Modells enthält erhebliche Geschäftslogik und variiert je nach Quelldaten. Die verantwortliche X++-Klasse umfasst WrkCtrSchedulerabgeleitete Klassen für geplante Produktionsaufträge, veröffentlichte Produktionsaufträge und Projektprognosen.

Betrachten Sie beispielsweise eine route, die in der folgenden Tabelle und in der folgenden Abbildung dargestellt ist, was relativ einfach ist.

Arbeitsgang- No. Priorität Rüstzeit Bearbeitungszeit Wartezeit danach Ressourcenmenge Weiter
10 Primär 1.00 2.00 1 20
10 Sekundär 1 1 20
20 Primär 3.00 1.00 3 0

Beispiel-Routingdiagramm.

Wenn Sie diese Route an die Engine senden, teilt diese die Route in acht Aufträge auf, wie in der folgenden Abbildung dargestellt (wählen Sie das Bild aus, um es zu vergrößern).

Planungs-Engine-Aufträge

Die Standardverbindung zwischen zwei Aufträgen ist FinishStart, was bedeutet, dass die Endzeit eines Auftrags vor der Startzeit eines anderen liegen muss. Die Einrichtung muss von derselben Ressource erfolgen, die später den Prozess behandelt, sodass es Einschränkungen zwischen ihnen gibt OnSameResource . Zwischen den Aufträgen für den primären und sekundären Vorgang bei 10 gibt es Verknüpfungen StartStart und FinishFinish, was bedeutet, dass die Aufträge zur gleichen Zeit beginnen und enden müssen. Darüber hinaus gibt NotOnSameResource es Einschränkungen, die verhindern, dass dieselbe Ressource sowohl für primäre als auch für sekundäre Vorgänge verwendet wird.

Bei Vorgang 20, bei dem die Menge der Ressourcen auf 3 festgelegt ist, wird der Prozessauftrag in drei unterschiedliche Aufträge aufgeteilt, bei denen alle Aufträge gleichzeitig ausgeführt werden müssen. In diesem Fall ist die Routengruppe so eingerichtet, dass die Kapazität für die Warteschlange nach Zeitpunkten nicht reserviert wird. Deshalb gibt es nur einen einzigen Auftrag für die nachgelagerte Warteschlange.

Das Planungsmodul versteht nur die Konzepte von Aufträgen und erkennt keine Vorgänge. Diese Einschränkung bedeutet, dass das System während der Vorgangsplanung Vorgänge in Aufträge aufteilt, obwohl diese Aufträge nicht in der Datenbank beibehalten werden.

Für jeden Auftrag definieren Sie, was die Anforderung an die Auftragskapazität ist (die Anzahl der erforderlichen Sekunden). Je nachdem, wie die Ressourcenanforderungen definiert sind, können Sie für jeden Auftrag auch eine Liste aller potenziellen anwendbaren Ressourcen senden, auf denen der Auftrag ausgeführt werden kann, und welche Kapazitätsanforderung für diese bestimmte Ressource erforderlich ist. Obwohl Sie beim Erstellen des Modells die Liste der anwendbaren Ressourcen senden, stellt das Modul sicher, dass die Ressourcenzuordnung für die gesamte Auftragsdauer gültig bleibt.

Interne Komponenten des Planungsmoduls

Schnittstelle des Planungsmoduls

Um zu verstehen, wie das Modul intern funktioniert, überprüfen Sie die Funktionalität, die es extern verfügbar macht. In X++ ist die Hauptschnittstelle WrkCtrSchedulerEngineInterface. Sie verfügt über die in den folgenden Unterabschnitten beschriebenen Methoden.

Allgemeines Modul

Methode Purpose
run Plant alle geladenen Einzelvorgänge und gibt den Fehlercode zurück.
getJobSchedulingSequenceResult Ruft das Planungsergebnis und den ersten Einzelvorgang mit Fehler für die von einem bestimmten Einzelvorgang identifizierte Sequenz ab.
validateJobCapacityReservations Überprüft die Kapazitätsreservierungen für alle vom Modul gespeicherten Einzelvorgänge.
setReservationsTimeStamp Sendet einen Zeitstempel an das Modul, der für alle neuen Kapazitätsreservierungen für die geplanten Einzelvorgänge im Cache des Moduls festgelegt wurde.
addPropertyToGroupAggregation Fügt dem Satz von Eigenschaften, die beim Aggregieren der Kapazität verwendet werden, ein Eigenschaftspräfix hinzu.
addResource Fügt dem Ressourcenpool des Planungsmoduls eine Ressource hinzu.
addResourceGroup Fügt dem Ressourcengruppenpool des Planungsmoduls eine Ressourcengruppe hinzu.
addResourceGroupMembership Fügt einer Ressourcengruppe eine Ressource als Mitglied hinzu.
addOptimizationGoal Fügt ein Planungsoptimierungsziel hinzu (Dauer oder Priorität).

Einzelne Einzelvorgänge

Methode Purpose
addJobInfo Fügt einen Datensatz mit Einzelvorgangsinformationen hinzu, der das Modul über einen Einzelvorgang informiert, der geplant werden soll.
addConstraintJobEndsAt Fügt eine Einschränkung hinzu, dass ein Einzelvorgang zu einem bestimmten Datum und einer bestimmten Uhrzeit enden soll.
addConstraintJobStartsAt Fügt eine Einschränkung hinzu, dass ein Einzelvorgang zu einem bestimmten Datum und einer bestimmten Uhrzeit starten soll.
addConstraintMaxJobDays Definiert die Einschränkung, dass sich ein Einzelvorgang über eine bestimmte maximale Anzahl von Tagen erstrecken kann.
addConstraintResourceRequirement Fügt die Einschränkung hinzu, dass der Einzelvorgang für eine bestimmte Ressource geplant werden muss.
addJobBindPriority Fügt eine Einzelvorgangs-Bindungspriorität für ein Paar (Einzelvorgang, Einschränkungsebene) hinzu. Ein höherer Prioritätswert bedeutet, dass die Jobvariablen früher gebunden werden. Der Auftrag wird vor Aufträgen mit niedrigerer Priorität in derselben Sequenz verarbeitet.
addJobCapacity Fügt Kapazitätsauslastungsinformationen für einen Einzelvorgang hinzu (z. B. die erforderliche Einzelvorgangs-Laufzeit), unabhängig davon, mit welcher Ressource der Einzelvorgang ausgeführt wird.
addJobResourceCapacity Fügt der Gruppe von Ressourcen eine Ressource hinzu, die zum Ausführen eines Auftrags verwendet werden kann, und gibt die erforderliche Kapazität an, wenn sie auf dieser Ressource ausgeführt wird.
addJobGoal Fügt Einzelvorgangsziel-Informationen für eine bestimmte Einschränkungsebene hinzu (früheste Endzeit oder späteste Startzeit).
addJobResourcePriority Fügt die Priorität hinzu, die verwendet werden soll, wenn ein Einzelvorgang für eine Ressource geplant ist.
addJobResourceRuntime Gibt eine Auftragszeit an, die von der Ressource abhängig ist, für die der Auftrag geplant ist.
addJobRuntime Gibt eine Auftragszeit an, die unabhängig von der Ressource ist, für die der Auftrag geplant ist.
scheduleJobOnResourceGroup Markiert einen Einzelvorgang für die Planung auf Ressourcengruppenebene.
setJobResourcePreemptionAllowed Legt fest, ob für einen Einzelvorgang einer Ressource eine Vorwegnahme zulässig ist (wenn das Modul den Einzelvorgang nicht in zusammenhängenden Kapazitätsslots planen darf).
setRequiredNumberOfResources Legt die Anzahl der Ressourcen fest, die zum Planen eines Einzelvorgangs erforderlich sind (nur für die Planung von Arbeitsgängen).

Einschränkungen zwischen Einzelvorgängen

Methode Purpose
addJobLink Fügt einen Link (z. B. Ende>Start) zwischen zwei Einzelvorgängen hinzu.
addConstraintEndsDelayed Definiert die Einschränkung, dass eine Aufgabe nicht abgeschlossen werden kann, bevor eine andere Aufgabe abgeschlossen wird, plus einer gewissen Verzögerungszeit.
addConstraintJobListWorkingTimeIntersect Fügt eine Einschränkung hinzu, dass sich die für die Einzelvorgänge reservierten Kapazitätsslots in den sich überschneidenden Arbeitszeiten für die beiden von den Einzelvorgängen verwendeten Ressourcen befinden müssen.
addConstraintJobOverlap Fügt eine Einschränkung hinzu, die definiert, wie Aufträge sequenziert werden, wenn eine bestimmte Menge eines Elements zwischen zwei Ressourcen verschoben werden kann, während die erste Ressource die Verarbeitung noch nicht abgeschlossen ist, sodass die zweite Ressource mit der Verarbeitung beginnen kann.
addConstraintNotOnSameResource Fügt eine Einschränkung hinzu, dass zwei Aufträge nicht für dieselbe Ressource geplant werden sollen.
addConstraintOnSameResource Fügt eine Einschränkung hinzu, dass zwei Einzelvorgänge dieselbe Ressource verwenden müssen.
addJobSameReservations Fügt eine Einschränkung hinzu, dass ein Einzelvorgang am Ende Kapazitätsreservierungen für dieselben Zeitfenster wie der primäre Einzelvorgang haben muss.
setPrimaryParallelJob Fügt Informationen darüber hinzu, welcher Einzelvorgang der primäre Einzelvorgang in einer Reihe von parallelen Einzelvorgängen ist.

Solver

Der Motor ist ein spezialisierter Constraint Solver mit benutzerdefinierten Heuristiken. Der Solver basiert auf zwei Hauptelementen: Variablen und Einschränkungen.

Variable

Eine Variable repräsentiert eine Domäne möglicher Werte. Das Planungsmodul verfügt über zwei Arten von Variablen:

  • DateTime-Variable – Verfügt über eine Domäne aller Datums- und Uhrzeitangaben. Sie können die Domäne einschränken, indem Sie die unteren und oberen Begrenzungen für die Zeit der Variablen näher aneinander verschieben.
  • Ressourcenvariable – Verfügt über eine Domäne anwendbarer Ressourcen. Sie können die Domäne einschränken, indem Sie Ressourcen aus der Liste entfernen.

Constraint

Eine Einschränkung wirkt auf Variablen, indem sie ihre Domänen einschränken. Es hängt auch von Variablen ab, sodass sie aktiviert wird, wenn Variablen sich ändern. Der Prozess der „Einschränkungsweitergabe“ ist, wenn eine Einschränkung ihre Hauptfunktion ausführt und bei Erfolg an die Hauptlogik zurückmeldet.

Eine Variable wird als gebunden betrachtet, wenn sie nicht weiter eingeschränkt werden kann. Bei einer DateTime-Variablen bedeutet diese Bedingung, dass die oberen und unteren Begrenzungen identisch sind. Für die Variable "Ressource" bedeutet dies, dass sie nur über eine einzige anwendbare Ressource verfügt. Wenn alle Variablen gebunden sind, wird eine Lösung gefunden.

Einschränkungsebenen

Wenn die Terminierung Teil der MRP-Abdeckungsphase (Material Requirements Planning) ist, plant das System Bestellungen rückwärts ab dem Anforderungsdatum. Wenn das System jedoch keinen Zeitplan finden kann, der heute oder später beginnt und vor dem Anforderungsdatum endet, ändert es die Terminplanungsrichtung von heute an vorwärts.

Das System organisiert die Einschränkungen in Ebenen, um diese Hauptgeschäftsregel zu behandeln. Wenn das System bei Verwendung der Einschränkungen auf der höchsten Ebene keine Lösung findet, fallen alle Einschränkungen auf dieser Ebene ab und versucht die untere Ebene. In der Praxis bedeutet dieser Prozess, dass das Modell für die Rückwärtsplanung eine Ebene 1 mit Auftragszielen in Bezug auf den spätesten Startzeitpunkt unter Berücksichtigung einer maximalen Endzeiteinschränkung (dem Anforderungsdatum) und eine Ebene 0 mit Auftragszielen für den frühesten Endzeitpunkt unter Berücksichtigung einer minimalen Startzeiteinschränkung von heute enthält.

Algorithmus

Die Hauptschritte des Modulalgorithmus sind:

  1. Suchen Sie Sequenzen (Auftragsketten), die separat gelöst werden können.
  2. Versuchen Sie, eine erste Lösung für die Sequenz auf der höchsten Einschränkungsebene zu finden.
    1. Sortieren Sie die Aufträge in der Reihenfolge basierend auf Jobziel und Prioritäten, damit das System einen Startauftrag finden kann.
    2. Durchlaufen Sie die Aufträge in der folgenden Reihenfolge:
      1. Finden Sie alle Einschränkungen, die weitergegeben werden müssen, und die Weitergabe ausführen.
      2. Wenn alle Variablen für den Auftrag gebunden sind, wird eine Lösung für diesen Auftrag gefunden.
      3. Wenn eine der Variablen nicht gebunden werden kann, ohne die Einschränkungen zu verletzen, führen Sie ein Rollback der Variablenbindung aus, versuchen Sie einen anderen Wert in der Domäne (für Ressourcenvariable), und führen Sie die Einschränkungsverteilung erneut aus.
  3. Wenn keine Lösung gefunden wird, entfernen Sie alle Einschränkungen auf der aktuellen Einschränkungsebene, verringern Sie die Einschränkungsstufe (wenn niedrigere Ebenen verfügbar sind), und wiederholen Sie die Lösungssuche mit der neuen Einschränkungsgruppe.
  4. Wenn eine machbare Lösung gefunden wird, starten Sie die Optimierungsphase, die versucht, eine bessere Lösung zu finden, bis das Optimierungszeitlimit erreicht ist oder alle Ressourcenkombinationen erschöpft sind.

Der Einschränkungslöser berücksichtigt nicht die Besonderheiten des Terminplanungsalgorithmus. Die "Magie" geschieht in der Definition und Kombination der verschiedenen Einschränkungen.

Arbeitszeiten bestimmen

Ein großer Teil der (internen) Einschränkungen im Modul steuert die Arbeitszeit und Kapazität einer Ressource. Im Wesentlichen besteht der Vorgang darin, die Arbeitszeitfenster für eine Ressource von einem bestimmten Punkt in einer bestimmten Richtung zu durchlaufen und ein langes Intervall zu finden, in das die erforderliche Kapazität (Zeit) des Auftrags passen kann.

Dazu muss da Modul die Arbeitszeiten einer Ressource kennen. Im Gegensatz zu den Hauptmodelldaten werden die Arbeitszeiten lazy loaded, was bedeutet, dass sie bei Bedarf in die Engine geladen werden. Der Grund für diesen Ansatz ist, dass es häufig Arbeitszeiten in Supply Chain Management für einen Kalender für einen sehr langen Zeitraum gibt und in der Regel viele Kalender vorhanden sind, sodass die Daten zum Vorabladen ziemlich groß wären.

Das Modul fordert Kalenderinformationen in Blöcken durch Aufrufen der X++-Klassenmethode WrkCtrSchedulingInteropDataProvider.getWorkingTimesan. Die Anforderung betrifft eine bestimmte Kalender-ID in einem bestimmten Zeitintervall. Abhängig vom Status des Servercaches in Supply Chain Management kann jede dieser Anforderungen zu mehreren Datenbankaufrufen führen, was lange dauert (relativ zur reinen Rechenzeit). Wenn der Kalender auch sehr aufwändige Arbeitszeitdefinitionen mit vielen Arbeitszeitintervallen pro Tag enthält, fügt diese Komplexität der Ladezeit hinzu.

Wenn das Planungsmodul die Arbeitszeitdaten lädt, speichert es diese Daten im internen Cache für den jeweiligen Kalender. Diese Aufbewahrung bedeutet, dass die nächsten Nachschlagevorgänge schnell aus dem Arbeitsspeicher ausgeführt werden können, wenn andere Aufträge oder Ressourcen denselben Kalender verwenden. Eine häufige Ursache für eine schlechte Leistung ist, wenn für jede Ressource eine separate Kalender-ID verwendet wird, da dann Daten für jeden Kalender angefordert werden, auch wenn der Inhalt der Kalender möglicherweise identisch ist.

Begrenzte Kapazität

Wenn Sie endliche Kapazität verwenden, teilt und reduziert das System die Arbeitszeitfenster im Kalender basierend auf den vorhandenen Kapazitätsreservierungen. Die gleiche WrkCtrSchedulingInteropDataProvider Klasse ruft diese Reservierungen zusammen mit den Kalendern ab, verwendet jedoch die getCapacityReservations Methode. Bei der Planung während der Masterplanung berücksichtigt das System die Reservierungen für den jeweiligen Masterplan. Wenn Sie die Einstellung auf der Seite " Masterplanungsparameter " aktivieren, enthält das System auch Reservierungen von festen Produktionsaufträgen. Ebenso können Sie bei der Planung eines Produktionsauftrags Reservierungen aus vorhandenen geplanten Aufträgen einbeziehen, obwohl diese Reihenfolge nicht so häufig vorkommt wie die umgekehrte.

Die Planung dauert länger, wenn Sie aus mehreren Gründen endliche Kapazität verwenden:

  • Das Abrufen der Kapazitätsinformationen aus der Datenbank ist ein langsamer Vorgang. Die serverseitige Zwischenspeicherung von Kapazitätsinformationen ist in der Regel nicht so gut wie für Arbeitszeiten, da sie nicht von Ressourcen wie Kalendern gemeinsam genutzt werden.
  • Die Anzahl der Arbeitszeitfenster, die durchlaufen werden, nimmt aufgrund der Aufteilungen zu. Das System muss in der Regel Slots für einen längeren Zeitraum untersuchen, bevor es eine Lösung finden kann.
  • Nach Abschluss der Planung muss das System nach widersprüchlichen Reservierungen suchen (einzelheiten hierzu finden Sie im Abschnitt "Ausführen von Planungsmodulen parallel").

Untersuchen der Ressourcenkombinationen

Wenn die Auftragssequenz nur die Standardverbindungen FinishStart enthält, d. h., sie bildet eine einfache Kette ohne Verzweigungen, kann das System ein optimales Ergebnis erzielen (gesehen von der Einzelreihenfolge, nicht über Aufträge hinweg), indem er die beste Lösung für den ersten Auftrag findet und sich dann fortbewegt, um die beste Lösung für den nächsten Auftrag zu finden. Die beste Lösung für einen Auftrag besteht darin, die Ressource zu finden, die das Start- und Enddatum des Auftrags so nah wie möglich am Auftragsziel bestimmen kann (in der Vorwärtsplanung bedeutet dies, das Enddatum des Auftrags so früh wie möglich zu erreichen), während die Einschränkungen eingehalten werden.

Wenn parallele Aufträge vorhanden sind, kann das Auffinden einer Lösung dazu führen, verschiedene Kombinationen von Ressourcen zu untersuchen. Die Anzahl der möglichen Ressourcenkombinationen ergibt sich aus der Anzahl der anwendbaren Ressourcen für die verbundenen parallelen Einzelvorgänge. Insbesondere bei der Rückwärtsplanung einer Bestellung ab einem Anforderungsdatum kann es eine Weile dauern, bis die Logik erkennt, dass es keine Lösung für das Problem gibt, die die parallel laufenden Aufgaben noch vor dem heutigen Datum passend macht. Die Logik muss alle Kombinationen überprüfen, da es möglicherweise Ressourcen mit einer höheren Effizienz oder einem anderen Kalender gibt, der ein Ergebnis ergeben könnte. Diese Bedingung bedeutet, dass, wenn Sie kein Timeoutlimit festlegen, der Vorgang lange ausgeführt wird, bevor die Richtung auf vorwärts geändert wird.

Diese Kombinationslogik bedeutet auch, dass das Hinzufügen von weiteren anwendbaren Ressourcen dazu führen kann, dass das Modul langsamer ausgeführt wird. Wenn Leistungsprobleme auftreten, bei parallelen Vorgängen und der Planung mit unendlicher Kapazität, können Sie das Problem teilweise beheben, indem der Routendesigner entscheidet, welche Ressource verwendet werden soll, und dann die Ressource direkt auf den Vorgang zuweisen (weil das System in den meisten Fällen dieselbe Ressource auswählt, sodass das Endergebnis gleich bleibt).

Wenn Sie den Verknüpfungstyp zwischen zwei Aufträgen auf "hart" festlegen, stellen Sie sicher, dass es keine Zeitlücke zwischen dem Ende eines Auftrags und dem Anfang des nächsten Vorgangs gibt. Diese Bedingung ist nützlich in Szenarien, in denen Metall in einem Auftrag beheizt und im nächsten verarbeitet wird, und die Kühlung zwischen Aufträgen ist nicht wünschenswert.

Wenn die Route eine einfache Kette ohne Verzweigungen bildet, können Sie mithilfe standardmäßiger Softlinks und Vorwärtsplanung ein Ergebnis erzielen, indem Sie eine Lösung für den ersten Auftrag finden, der ihre eigenen Einschränkungen erfüllt, und dann durch die Kette navigieren, die die Endzeit vom vorherigen Auftrag bis zum nächsten Auftrag verteilt. Wenn der aktuelle Auftrag keine Kapazität finden kann, verschiebt das System das Startzeitlimit weiter, ohne dass sich dies auf die vorherigen Aufträge auswirkt. Diese Aktion schafft potenziell Lücken zwischen den Aufträgen. Durch die Verwendung harter Verbindungen (insbesondere in Verbindung mit endlicher Kapazität) für dasselbe Szenario bedeutet jedoch, dass ein Auftrag später in der Kette keine Kapazität finden kann, bedeutet, dass alle vorherigen geplanten Aufträge nacheinander "gezogen" werden müssen und dadurch mehrmals neu geplant werden. Insbesondere in Szenarien mit hoher Auslastung für mehrere Ressourcen können die harten Verknüpfungen zu einer Kettenreaktion führen, bei der sich die Aufträge gegenseitig beeinflussen und mehrere Iterationen durchgeführt werden müssen, bevor das Ergebnis in einem machbaren Zeitplan stabilisiert wird.

Paralleles Ausführen von Planungsmodulen

Wenn Sie die Planung als Teil einer Masterplanung ausführen, bei der Sie Hilfsprogramme verwenden, können alle Masterplanungs-Hilfsthreads auch Aufgaben zur Planung von Produktionsreihenfolgen aufnehmen. Dieser Ansatz bedeutet, dass mehrere Planungsmodule gleichzeitig ausgeführt werden können. Während Multithreading einen erheblichen Leistungsvorteil bietet, führt es auch einige funktionale Nachteile für die Planung ein.

Im MRP plant das System alle Produktionsaufträge für eine bestimmte Stücklistenebene (BOM) in der Anforderungsterminsequenz. Diese Sequenz bedeutet, dass das System diese Bestellungen mit dem frühesten Anforderungsdatum zuerst plant, sodass sie die höchste Chance haben, die verfügbare Ressourcenkapazität zu erhalten. Wenn jedoch mehrere Motoren aus der Liste ungeplanter Aufträge auswählen, wird die Sequenz nicht sichergestellt, da ein Modul schneller als das andere abgeschlossen werden kann.

Wenn Sie mit endlicher Kapazität und mehreren Engine-Instanzen planen, kann eine Race Condition auftreten, wenn Sie versuchen, Aufträge zu planen, die gleichzeitig dieselben Ressourcen verwenden. Das Feld "Terminplanungskonflikte " auf der Seite "Verlauf der Masterpläne" zeichnet die Anzahl der Rennbedingungen auf. Die Konfliktlösungslogik folgt den folgenden Schritten:

  1. Planen Sie einen Auftrag (sperrenfrei) und erhalten Sie Kapazitätsreservierungen.
  2. Setzen Sie die Sperre.
  3. Überprüfen Sie, ob neuere Kapazitätsreservierungen für die geplanten Ressourcen in der Zeitspanne vorhanden sind.
    • Wenn nein, schreiben Sie die Kapazität und heben Sie die Sperre auf.
    • Wenn ja, heben Sie die Sperre auf und planen Sie den Auftrag ganz neu.

Bei der Planung mit mehreren Instanzen der Engine ist das Ergebnis nicht vollständig deterministisch, da es von der exakten Zeitsteuerung jedes Threads abhängt.

Leistung der Grobterminierung

Die Betriebsplanung, auch als grobe Kapazitätsplanung bezeichnet, kann schwieriger zu lösen sein, wenn endliche Kapazität verwendet wird, da mehr Daten erforderlich sind, um die Machbarkeit zu ermitteln.

Die Kapazität einer Ressourcengruppe hängt davon ab, welche und wie viele Ressourcen Mitglieder der Ressourcengruppe sind. Eine Ressourcengruppe selbst hat keine Kapazität – nur wenn Ressourcen Mitglieder der Gruppe sind, verfügt sie über Kapazität. Da die Mitgliedschaft in Ressourcengruppen im Laufe der Zeit variieren kann, muss die Kapazität pro Tag bewertet werden.

Bei der Grobterminierung wird der Kalender der Ressourcengruppe verwendet, um die Start- und Endzeiten für jeden Arbeitsgang zu bestimmen. In diesem Kalender wird festgelegt, wie viel Zeit Sie für einen Vorgang in einer Ressourcengruppe an einem einzigen Tag einplanen können. Im Gegensatz zum Kalender für bestimmte Ressourcen werden die Effizienzdaten des Kalenders der Ressourcengruppe ignoriert, da sie nur die Öffnungszeiten und nicht die tatsächliche Kapazität angibt.

Wenn z. B. die Arbeitszeit für eine Ressourcengruppe an einem bestimmten Datum von 8:00 bis 16:00 liegt, kann ein Vorgang nicht mehr Last auf die Ressourcengruppe setzen als das, was in 8 Stunden passen kann, unabhängig davon, wie viel Kapazität die Ressourcengruppe an diesem Tag insgesamt zur Verfügung hat. Die verfügbare Kapazität kann die Last jedoch weiter einschränken.

Die Auftragsplanungslast für alle Ressourcen in der Ressourcengruppe für einen bestimmten Tag wird bei der Berechnung der verfügbaren Kapazität für diesen Tag berücksichtigt. Für jedes Datum lautet die Berechnung:

Verfügbare Kapazität der Ressourcengruppe = Kapazität für Ressourcen in der Gruppe basierend auf ihrem Kalender − geplante Auftragsauslastung der Ressourcen in der Gruppe − geplante Vorgangsbelastung der Ressourcen in der Gruppe − geplante Auslastung der Ressourcengruppe

Auf der Registerkarte " Ressourcenanforderungen " im Routenvorgang können Sie die Ressourcenanforderungen entweder mithilfe einer bestimmten Ressource (in diesem Fall wird der Vorgang mithilfe dieser Ressource geplant), einer Ressourcengruppe, einem Ressourcentyp oder einer oder mehreren Funktionen, Fähigkeiten, Kursen oder Zertifikaten angeben. Die Verwendung all dieser Optionen bietet Flexibilität im Routenentwurf, erschwert jedoch die Planung für die Engine, da die Kapazität pro 'Eigenschaft' berücksichtigt werden muss (ein abstrakter Name, der in der Engine für Fähigkeiten, Kompetenzen usw. verwendet wird).

Die Kapazität der Ressourcengruppe für eine Funktion ist die Summe der Kapazität für alle Ressourcen in der Ressourcengruppe, die über die betreffende Funktion verfügen. Wenn eine Ressource in der Gruppe über eine Funktion verfügt, berücksichtigt das Modul sie unabhängig davon, welche Kapazitätsstufe erforderlich ist.

Bei der Vorgangsplanung wird die verfügbare Kapazität für eine bestimmte Funktion für eine Ressourcengruppe reduziert, wenn sie mit einem Vorgang geladen wird, der die betreffende Funktion erfordert. Wenn der Vorgang mehr als eine Funktion erfordert, wird die Kapazität für alle erforderlichen Funktionen reduziert.

Für jedes Datum lautet die erforderliche Berechnung:

Verfügbare Kapazität für eine Fähigkeit = Kapazität für die Fähigkeit – Geplante Auslastung der Ressourcen mit der spezifischen Fähigkeit, die in der Ressourcengruppe enthalten ist – Geplante Auslastung der Vorgänge der Ressourcen mit der spezifischen Fähigkeit, die in der Ressourcengruppe enthalten ist – Geplante Auslastung der Vorgänge für die Ressourcengruppe selbst, die die spezifische Fähigkeit erfordern

Wenn eine bestimmte Ressource über eine Last verfügt, berücksichtigt das Modul sie bei der Berechnung der verfügbaren Kapazität der Ressourcengruppe pro Funktion, da die Last ihren Beitrag zur Kapazität der Gruppe reduziert, unabhängig davon, ob die Last für diese spezifische Funktion vorgesehen ist. Wenn die Ressourcengruppenebene geladen wird, berücksichtigt das Modul sie in der Berechnung der verfügbaren Kapazität der Ressourcengruppe pro Funktion nur, wenn die Last aus einem Vorgang stammt, der die spezifische Funktion erfordert.

Diese Logik gilt für jeden Eigenschaftstyp. Die Verwendung der Vorgangsplanung mit endlicher Kapazität erfordert also das Laden einer erheblichen Menge an Daten.

MRP-Leistung verbessern

Das folgende Tech-Konferenzvideo bietet Tipps zur Verbesserung der Masterplanungsleistung, wenn Sie MRP mit dem veralteten Masterplanungsmodul verwenden: Hilfe! MRP ist langsam!

Anzeigen der Ein- und Ausgabe des Planungsmoduls

Um spezifische Details über die Eingabe und Ausgabe des Planungsprozesses zu erhalten, aktivieren Sie die Protokollierung, indem Sie zu Organisationsverwaltung>Einstellungen>Planung>Cockpit der Nachverfolgung gehen.

Wählen Sie auf dieser Seite im Aktionsbereich die Option Protokollierung aktivieren aus, und führen Sie dann die Planung für den Produktionsauftrag aus. Wenn Sie fertig sind, kehren Sie zur Seite Planungsverfolgungs-Cockpit zurück und wählen Protokollierung deaktivieren im Aktivitätsbereich aus. Aktualisieren Sie die Seite, und im Raster wird eine neue Zeile angezeigt. Wählen Sie die neue Zeile aus, und wählen Sie dann im Aktionsbereich "Herunterladen " aus. Mit dieser Aktion erhalten Sie einen .zip komprimierten Ordner mit den folgenden Dateien:

  • Log.txt – Diese Protokolldatei beschreibt die Schritte, die das Modul durchläuft. Es ist detailliert und kann überwältigend sein, aber wenn Sie mit dem Routensetup experimentieren, um Leistungsprobleme zu beheben, suchen Sie nach dem Zeitunterschied zwischen der ersten und der letzten Zeile. Dieser Unterschied zeigt die genaue Zeit, die der Zeitplaner aufgewendet hat.
  • XmlModel.xml – Diese Datei enthält das Modell, das in X++ integriert ist und auf dem das Modul ausgeführt wird. Die in der Datei verwendete JobId korreliert mit der RecId aus der Quelltabelle mit den Einzelvorgängen (ReqRouteJob oder ProdRouteJob). Überprüfen Sie in dieser Datei, ob die Datumsangaben in ConstraintJobStartsAt und ConstraintJobEndsAt wie erwartet festgelegt werden, die JobGoal Eigenschaft richtig festgelegt wird, und die Aufträge werden über die JobLink Einschränkungen verknüpft.
  • XmlSlots.xml – Diese Datei enthält alle Arbeitszeiten und Kapazitätsreservierungen, die das Modul anfordert. Die Arbeitszeiten und Reservierungen im Kalender werden nur vom Engine für die Zeiträume angefragt, in denen versucht wird, die Aufträge zu platzieren (einschließlich eines zusätzlichen Puffers). Wenn die Datei also Zeiten enthält, die weit in der Zukunft liegen, könnte dies ein Hinweis auf ein Problem mit der Einrichtung sein. Die ResourceProperty Knoten zeigen die Ressourcengruppe und -funktionen an, die den einzelnen Ressourcen zugeordnet sind, sowie die relevanten Zeiträume.
  • Result.xml – Diese Datei enthält das Ergebnis der Planungsausführung.

Die Ablaufverfolgungsfunktion erhöht erheblichen Leistungsaufwand. Verwenden Sie sie daher nur, um die Planung bestimmter Aufträge kontrolliert zu untersuchen. Wenn Sie ihn während eines Masterplanungslaufs aktivieren, erreicht er schnell seine Größenbeschränkung und stoppt.

Problembehandlung bei der Leistung

Wie Sie aus den vorherigen Abschnitten sehen können, können einige Fallstricke in der Einrichtung und Verwendung des Planungsmoduls zu Leistungsproblemen führen. Die folgende Checkliste kann Ihnen dabei helfen, diese Probleme zu beheben. Betrachten Sie alle Punkte, da es oft eine Kombination aus mehreren Faktoren ist, die zu Problemen führen.

Tip

In der folgenden Tabelle sind die häufigsten Leistungsprobleme bei der Auftragsplanung und deren empfohlene Lösungen zusammengefasst. Verwenden Sie die Links, um zu den detaillierten Anleitungen für jeden Bereich zu springen.

Problem Empfehlung Details
Planung während mrP nicht erforderlich Festlegen des Kapazitätszeitzauns auf Null oder Verwenden einer Standardproduktionsvorlaufzeit Planung als Teil von MRP
Zu viele anwendbare Ressourcen Weisen Sie beim Entwerfen der Route einem bestimmten Vorgang eine Ressource zu. Viele anwendbare Ressourcen
Langsame Planung paralleler Vorgänge Modellpaare als "virtuelle" Ressourcen oder Ausschließen von Vorgängen ohne Engpass Parallele Vorgänge
Ressourcenanzahl größer als eins Überprüfen, ob für den Vorgang mehrere Ressourcen wirklich erforderlich sind Ressourcenmenge
Begrenzter Kapazitätsaufwand Verwenden Sie die Engpassoption und trennen Sie die Kapazitätszeitgrenze für Engpassressourcen. Begrenzte Kapazität
Feste Verknüpfungen erschweren die Planung Verwenden Sie hard links nur dann, wenn sie unbedingt erforderlich sind. Hard Links
Separater Kalender pro Ressource Nutzen Sie Kalender zwischen Ressourcen so oft wie möglich wieder Kalender
Viele Zeitfenster pro Kalendertag Minimieren von Arbeitszeitfenstern (z. B. Überspringen der Fünf-Minuten-Unterbrechungsmodellierung) Zeitfenster
Fehlende oder große Zeitplan-Timeouts Beide Timeouteinstellungen aktivieren; Maximale Zeitplanung auf ca. 30 Sekunden festlegen Timeouts

Durchführen der Terminplanung als Teil der MRP, wenn diese nicht notwendig ist

Obwohl Routen für Produktionskontrollzwecke wie Kosten und Berichterstellung verwendet werden, müssen sie möglicherweise während des MRP nicht berücksichtigt werden. In einigen Fällen reicht es für die Planung aus, eine für den Artikel festgelegte standardmäßige Produktionsdurchlaufzeit zu haben. Legen Sie den Kapazitätszeitzaun auf Null fest, um die Routenplanung zu deaktivieren. Wenn die Planung erforderlich ist, legen Sie den Kapazitätszeitzaun sorgfältig fest, da Routen möglicherweise nicht für den vollen Umfang des Abdeckungszeitzauns des MRP berücksichtigt werden müssen.

Wenn der Auftrag während der MRP nicht geplant ist, muss er stattdessen geplant werden, wenn der geplante Auftrag festgesetzt wird. Dies bedeutet, dass der Umwandlungsvorgang länger dauert. Je nachdem, wie viele der vorgeschlagenen geplanten Aufträge umgewandelt werden, kann der Leistungsgewinn aus der Materialbedarfsplanung beim Umwandeln verloren gehen.

Arbeitsplan mit unnötigen Arbeitsgängen

Wenn Sie die Route entwerfen, vermeiden Sie, die reale Welt mit allen Schritten, die der Produktionsprozess durchläuft, genau zu modellieren. Obwohl dieser Ansatz in einigen Fällen nützlich sein kann, ist es nicht gut für die Leistung, da das Modell des Moduls größer wird (in Bezug auf Aufträge und Einschränkungen), und mehr SQL-Anweisungen zum Einfügen und Aktualisieren von Aufträgen und Kapazitätsreservierungen ausgeführt werden. Außerdem gibt es den nachgelagerten Effekt, den Fortschritt bei den Aufgaben melden zu müssen, was durch automatische Buchungen abgemildert werden kann. Wenn die Daten nicht für etwas verwendet werden, wird unnötiges Laden erzeugt.

Erstellen Sie nur die Vorgänge, die streng für die Planung (in der Regel Engpassressourcen) oder Kalkulationszwecke erforderlich sind. Gruppieren Sie stattdessen viele kleinere unterschiedliche Vorgänge in einen größeren Vorgang, der einen größeren Teil des Prozesses darstellt.

Viele anwendbare Ressourcen für einen Arbeitsgang

Die für die Vorgangsbeziehung festgelegten Ressourcenanforderungen bestimmen die Anzahl der anwendbaren Ressourcen für einen Vorgang. Die Anforderung kann entweder für eine bestimmte Ressource oder auf der Mitgliedschaft der Ressource in einer Ressourcengruppe oder -funktion basieren.

Wenn Sie keine endliche Kapazität für die Planung verwenden und alle anwendbaren Ressourcen denselben Kalender und die gleiche Effizienz aufweisen, wählt das Planungsmodul immer dieselbe Ressource für einen Vorgang aus, aber erst nachdem alle anwendbaren Ressourcen versucht wurden, zu überprüfen, ob eine besser ist als die anderen. In diesem Fall können Sie den Aufwand bei der Planung erheblich reduzieren, indem Sie dem Vorgang immer eine bestimmte Ressource zur Routenentwurfszeit zuweisen.

Arbeitsplan mit parallelen Arbeitsgängen

Während parallele Vorgänge (primär/sekundär) ein leistungsfähiges Tool zum Modellieren von Szenarien sind, z. B. wenn ein Computer und ein Operator zum Ausführen einer bestimmten Aufgabe erforderlich sind, sind sie auch die Quelle vieler Leistungsprobleme. Wenn Sie eine Anforderung für eine bestimmte einzelne Ressource sowohl dem primären als auch dem sekundären Vorgang zuweisen, ist dies in der Regel kein Problem. Wenn jedoch für jeden der Arbeitsgänge viele mögliche Ressourcen vorhanden sind, erhöht dies die Planungskomplexität erheblich.

Eine Alternative zur Verwendung paralleler Vorgänge ist entweder das Modellieren der Paare als "virtuelle" Ressourcen (die dann das Team darstellen, das immer für den Vorgang zusammengeht) oder einfach keinen der Vorgänge modellieren, wenn er keinen Engpass darstellt.

Route mit einer Ressourcenmenge höher als eins

Wenn die für einen Vorgang erforderliche Menge an Ressourcen größer als eins ist, entspricht das Ergebnis effektiv der Verwendung von primären/sekundären Vorgängen, da mehrere parallele Aufträge an das Modul gesendet werden. In diesem Fall können Sie jedoch keine spezifischen Ressourcenzuordnungen verwenden, da eine Menge größer als eins für die Ausführung mehr als eine Ressource erfordert.

Ein sekundärer Arbeitsgang mit einer Ressourcenbelastungsmenge größer als eins bedeutet, dass die angegebene Menge an sekundären Ressourcen für jede Ressource des primären Arbeitsgangs benötigt wird. Wenn beispielsweise die Ressourcenmenge eines primären Arbeitsgangs auf zwei und die Ressourcenmenge seines sekundären Arbeitsgangs auf drei gesetzt ist, werden für den sekundären Arbeitsgang insgesamt sechs Ressourcen benötigt.

Übermäßige Nutzung begrenzter Kapazität

Die Verwendung der endlichen Kapazität erfordert, dass das Modul Kapazitätsinformationen aus einer Datenbank lädt, wodurch rechenintensiver Aufwand hinzugefügt werden kann, insbesondere in Umgebungen, in denen Ressourcen in der Nähe der maximalen Kapazität gebucht werden. Daher ist es wichtig, sorgfältig zu bewerten, ob eine Ressource wirklich endliche Kapazität verwenden muss oder ob sie überbucht werden können. Da es bei endlichen Kapazitätsressourcen Unterschiede in ihrer Bedeutung bezüglich der Vermeidung von Überbuchungen geben kann, verwenden Sie die Engpassoption für eine Ressource in Kombination mit einem separaten Planwert für "Kapazitätszeitzaun für Engpassressourcen". Durch die Verwendung des Engpasskonzepts kann der allgemeine Kapazitätszeitzaun gesenkt werden.

Der Standardverbindungstyp der Route ist weich, was eine Zeitlücke zwischen der Endzeit eines Vorgangs und dem Start des nächsten vorgangs ermöglicht. Wenn Sie diese Lücke zulassen, kann dies dazu führen, dass die Produktion leer ist, wenn Material oder Kapazität für einen der Vorgänge nicht verfügbar sind. Diese Situation kann zu einer Zunahme der laufenden Arbeit führen. Dieses Problem tritt mit harten Verknüpfungen nicht auf, da das Ende und der Anfang perfekt übereinstimmen müssen. Das Festlegen harter Verknüpfungen erschwert jedoch das Planungsproblem, da das System Arbeitszeit- und Kapazitäts-Schnittmengen für die beiden Ressourcen der Vorgänge berechnen muss. Wenn der Zeitplan auch parallele Vorgänge umfasst, fügt diese Anforderung erhebliche Rechenzeit hinzu. Wenn die Ressourcen der beiden Arbeitsgänge unterschiedliche Kalender haben, die sich überhaupt nicht überschneiden, ist das Problem nicht lösbar.

Verwenden Sie harte Links nur, wenn dies unbedingt erforderlich ist, und überlegen Sie sorgfältig, ob sie für jeden Vorgang der Route notwendig sind.

Um die arbeit in Bearbeitung zu reduzieren, ohne feste Verknüpfungen anzuwenden, planen Sie die Reihenfolge zweimal, indem Sie in die entgegengesetzte Richtung für den zweiten Durchgang wechseln. Wenn der erste Zeitplan rückwärts vom Lieferdatum abgeschlossen wurde, sollte der zweite Zeitplan vom geplanten Startdatum vorwärts geplant werden. Durch diesen Ansatz werden die Aufträge so weit wie möglich komprimiert, sodass die laufende Arbeit minimiert wird.

Separater Kalender für jede Ressource

Eine der Hauptdatenquellen für das Planungsmodul sind Kalenderinformationen, deren Laden aus der Datenbank teuer sein kann. Da Kalender basierend auf Vorlagen generiert werden, kann es verlockend erscheinen, einen Kalender für jede Ressource zu generieren und dann die Informationen in diesem Kalender anzupassen, wenn die Ressource Ausfallzeiten und andere Probleme aufweist. Dieser Ansatz beschränkt jedoch die Fähigkeit des Moduls, die Kalenderdaten zwischenzuspeichern, da es neue Daten für jede Ressource anfordern muss. Dieser Ansatz kann Leistungsprobleme verursachen. Nutzen Sie Kalender so häufig wie möglich zwischen den Ressourcen, und kontrollieren Sie Ausfallzeitenänderungen, indem Sie für einen Zeitraum eine andere Kalender-ID zuweisen.

Hohe Anzahl der Arbeitszeitfenster pro Kalendertag

Da das Modul arbeitet, indem Zeitfenster einzeln auf Kapazität untersucht werden, ist es vorteilhaft, die Anzahl der Zeitfenster pro Kalendertag zu minimieren. Überlegen Sie beispielsweise, ob es für den resultierenden Zeitplan wichtig ist, dass die Mitarbeiter jede Stunde eine fünfminütige Pause nehmen.

Große (oder keine) Planungszeitüberschreitungen

Sie können die Leistung des Planungsmoduls optimieren, indem Sie Parameter auf der Seite „Terminplanungsparameter“ verwenden. Legen Sie die Einstellungen Planungszeitlimit aktiviert und Planungsoptimierungszeitlimit aktiviert immer auf Ja fest. Wenn Sie sie auf "Nein" festlegen, kann die Planung potenziell unendlich ausgeführt werden, wenn eine nicht zu verwendbare Route mit vielen Optionen erstellt wird.

Der Wert für Maximale Planungszeit pro Sequenz steuert, wie viele Sekunden höchstens für die Suche nach einer Lösung für eine einzelne Sequenz aufgewendet werden können (in den meisten Fällen entspricht eine Sequenz einem einzelnen Auftrag). Der hier zu verwendende Wert hängt von der Komplexität der Route und Einstellungen wie der endlichen Kapazität ab, aber maximal 30 Sekunden ist ein guter Ausgangspunkt.

Der Wert für Zeitlimit für Optimierungsversuche steuert, wie viele Sekunden höchstens verwendet werden können, um eine bessere Lösung als die ursprünglich gefundene zu finden. Dieser Wert wirkt sich nur auf Routen aus, die parallele Vorgänge verwenden, da es notwendig ist, verschiedene Kombinationen zu testen.

Note

Die Werte, die Sie für die Timeouts festlegen, gelten sowohl für die Planung freigegebener Produktionsaufträge als auch für geplante Aufträge als Teil von MRP. Das Festlegen sehr hoher Werte kann daher bei der Ausführung eines Plans mit vielen geplanten Produktionsaufträgen die Laufzeit der Materialbedarfsplanung (MRP) erheblich verlängern.

Häufige Fehler bei der Auftragsplanung

In der folgenden Tabelle sind bekannte Auftragsplanungsfehler mit Links zu Informationen aufgeführt, mit denen Sie diese beheben können.

Fehlermeldung Resolution
Der geplante Produktionsauftrag muss geplant werden, bevor er festigt werden kann. Der geplante Produktionsauftrag muss geplant werden, bevor er festigt werden kann.
Die Produktionsplanung berücksichtigt nicht die Sicherheitsspannen. Die Produktionsplanung berücksichtigt nicht die Sicherheitsspannen.
Die Masterplanung plant mehr als die verfügbare Kapazität. Die Masterplanung plant mehr als die verfügbare Kapazität.
Nicht genügend Kapazität wurde gefunden. Nicht genügend Kapazität wurde gefunden.

Den Fehler "Nicht genügend Kapazität gefunden" im Planungsmodul beheben
Der Verzögerungswert wird nicht aktualisiert, wenn Sie einen geplanten Auftrag neu planen. Der Verzögerungswert wird nicht aktualisiert, wenn Sie einen geplanten Auftrag neu planen.