Die Basis für jede Fabrikplanung bilden die herzustellenden Produkte. Welche Produkte werden montiert, welche Einzelteile werden gefertigt. Deswegen ist ein grundlegender Überblick über die Produktstruktur sehr sinnvoll.
Die Erzeugnisstruktur oder einfacher Weise die Produktstruktur wird über Stücklisten abgebildet. Wird als Stücklistenart eine Strukturstückliste oder Baukastenstückliste verwendet, liefert sie wichtige Hinweise zur Fertigungstiefe.
Für das Planungsumfeld lässt sich so berücksichtigen, wo beispielsweise konvergierende Einzelteile in eine Baugruppe fließen. Dort können beispielsweise eine Zwischenlagerung sinnvoll sein. Treten divergierenden Strukturen auf, ist das ggf. ein Hinweis auf zusätzliche Ablieferorte.
Informationen dafür werden im ERP-System bereitstellt. Aufgrund der Datenmenge stehen sie meistens nur als Datenbanktabellen für Analysen zur Verfügung. Auch wenn Tabellen verdichtet und aufbereitet werden, ist das Erkennen von Strukturen so schwierig. Gerade bei Planungsvorhaben ist es aber elementar, die Erzeugnisstruktur von Beginn an zu erkennen.
Verbessern würde das eine visuelle Darstellung der Stückliste. Baukastenstücklisten bieten sich perfekt dafür an, die einzelnen Teile als Baumstruktur zu visualisieren.
ERP-System machen das auch. Wie im Windows Explorer lassen sich interaktive (aufklickbare) Stücklisten anzeigen.
Das ist schon ein guter erster Schritt, um sich die Erzeugnisstruktur anzusehen. Problematisch bleibt, dass nur die jeweils dargestellte Struktur angezeigt wird. Der für das Planungsumfeld wichtige Gesamtzusammenhang fehlt auch hier noch.
Gozintograph
In der Materialbedarfsplanung wird zur Visualisierung ein Gozintograph verwendet.
Gozintograph ist ein Kunstwort, dass von Andrew Vázsonyi 1962 geprägt wurde und steht für „the part that goes into“. Es handelt sich um einen gerichteten, bewerteten Graph. Er stellt die Verbindungen von Einzelteilen, Baugruppen zu Produkten her. Im Unterschied zur Erzeugnisstruktur ist der Gozintograph aber komprimiert. Jedes Element wird nur einmal dargestellt. Einzelteile oder Baugruppen mit Mehrfachverwendung haben daher mehrere ausgehende Verbindungen. Bei der Strukturtiefe eines Elements vom obersten Element spricht man nicht mehr von Fertigungsstrukturstufen, sondern von Dispositionsstufen. Der Gozintograph verwendet immer den weitesten Weg eines Elements bei Mehrfachverwendung als Dispositionsstufe.
Durch das ist der Gozintograph besonders für visuelle Darstellungen interessant.
Am wertvollsten ist der Gozintograph für die Fabrikplanung, wenn möglichst viele Produkte gemeinsam dargestellt werden. Bei einer komplexen Stücklistenstruktur entstehen so aber riesige Datenmengen und unübersichtliche Gozintographen.
Stücklistenvisualisierung mit dem Gozintograph
Lösen lässt sich das mit einem dafür angepassten Tool. Welches darauf spezialisiert ist, Stücklistendaten auszulesen, Verbindungen zusammenzufassen und diese grafisch zu visualisieren. Die erste Version dieser Software ist das Ergebnis dieses Artikels.
Zur Programmierung verwende ich Lazarus in der aktuellen Version 2.0.12. Die notwendigen Funktionen zur Darstellung des Gozintograph kapsle ich in einer eigenen Komponente, die auch unabhängig für andere Baumstrukturen verwendet werden kann.
Die im Artikel verwendeten Quellcode-Beispiele sind nicht vollständig. Der gesamte Quellcode steht aber, unter „Links“ am Ende des Artikels, als Download zur Verfügung.
Die Funktionsweise des Programms gleicht einem klassischer File-Viewer: Datei öffnen und Inhalt anzeigen.
Der Grundablauf basiert damit auf dem klassischen EVA-Prinzip.
Eingabe – Verarbeitung – Ausgabe
Eingabe
Stücklistendaten
Um einen Gozintograph darzustellen, braucht es in erster Linie Stücklistendaten. Diese liegen in erster Linie im ERP-System. Dort gibt es eine Vielzahl von Datenbankoptionen. Eine Live-Anbindung kommt damit nicht wirklich in Betracht. Ein brauchbarer Zwischenweg bietet das CSV-Format: comma-separates-values. Alle Daten werden als ein Textfile mit Trennzeichen zeilenweise abgelegt.
In diesem Fall bedeutet das: die CSV-Datei hat einen recht einfachen Aufbau. Im Grunde reichen dafür 2 Felder:
- Zielknoten: bedeutet Sachnummer der Stückliste (String)
- Quellknoten: bedeutet Sachnummer einer Stücklistenposition (String)
Ist die Menge interessant ist das der dritte Wert:
- Menge der Verbindung: Quellknoten zum Zielknoten (Integer)
Die CSV-Datei des obigen Gozintograph wurde demnach so aussehen:
Produkt-1;Einzelteil-1;1 Produkt-1;Einzelteil-2;1 Produkt-1;Baugruppe-1;1 Baugruppe-1;Einzelteil-2;1 Baugruppe-1;Einzelteil-3;1
Primärbedarfe
Der Dateiaufbau ist damit zwar simpel, das Erstellen dessen aus den Stücklisten aber aufwändig. Um die planungsrelevanten Daten zusammenzustellen, wird eine übergeordnete Liste benötigt. Diese Liste liegt normalerweise nicht als Stückliste vor. Dort sind die zu betrachteten Produkte hinterlegt. Sollen auch Dispositionsmengen visualisiert werden, benötigen die Produkte auch deren Primärbedarf.
Anschließend müssen ausgehend von den Produkten, die jeweiligen Stücklisten rekursiv über die gesamte Struktur durchlaufen werden. Daraus wird dann das CSV-File erstellt.
Auch das ist noch gut machbar, kompliziert wird es durch die Möglichkeiten, die Stücklisten heute bieten. Ein Fallstrick kann beispielsweise die Menge bedeuten. Bei jedem Baugruppenübergang, kann sich die Einheit von Einzelteil zu Baugruppe ändern. Ein Rohmaterial ist in der ungeordneten Stufe mit Meter bewertet, wie bei einem Rundmaterial D50x200 mm. In der nächsthöheren Stufe kann die Baugruppe wieder in Stück angegeben sein.
Eine korrekte Mengenvisualisierung benötigt also etwas Zeit bei der Datenvorbereitung.
Import der CSV-Datei
Die Logik zur Bereitstellung der CSV-Datei muss sich also (noch) außerhalb des Gozintograph-Viewers befinden. Was aber ausgeführt werden muss, ist das Einlesen der CSV-Datei.
Im Programm erledigt diese Aufgabe die Funktion ImportFromCsvFile. Sie braucht als Parameter neben dem Dateinamen Informationen zum Inhalt der CSV-Datei. Das können Spalten-Überschriften als erste Zeile sein oder welches Trennzeichen verwendet wird. Genauso muss bekannt sein an welcher Stelle im CSV-File sich die entsprechenden Felder befinden. Das wird über die Parameter PosSource, PosDestination und PosQuantity angegeben.
function TGozIntoGraph.ImportFromCsvFile(AFilename: string; Delimiter: string; HasHeaders: boolean; PosSource, PosDestination, PosQuantity: integer ): boolean; var sl : TStringList; sr : TStringArray; i,j,k : integer; source,destination : string; quantity : double; begin result:=false; sl:=TStringList.Create; sl.LoadFromFile(AFilename); Clear; try if HasHeaders then j:=1 else j:=0; for i:=j to sl.Count-1 do begin sr:=sl[i].Split(Delimiter); source:=sr[PosSource-1]; destination:=sr[PosDestination-1]; if PosQuantity=-1 then quantity:=1 else Val(sr[PosQuantity-1],quantity,j); if (source<>'') and (destination<>'') then AddLink(source,destination,quantity); end; Autolayout; result:=true; except end; sl.Free; end;
Diese Informationen sind aber meistens beim Öffnen der CSV-Datei noch unbekannt. Damit es für den Benutzer möglich wird Anpassungen vorzunehmen, ist es besser einen Import-Dialog zu programmieren und alle Einstelloptionen dort anzubieten.
Keine zyklische Struktur
Der vorgestellte Weg eignet sich nur für eine Zyklen-freie Darstellung. Zyklische Produktionsformen, wie in der chemischen Industrie können nicht dargestellt werden. Es deswegen keine Verknüpfung zwischen einem Endprodukt oder Baugruppe und einem untergeordneten Element geben.
Verarbeitung
Klassen
Verarbeitung bedeutet hier aber etwas mehr Interaktivität als im klassischen Prozess. Zu Beginn passiert aber genau das. Bereits beim Einlesen der CSV-Datei werden TGozGraphItems erzeugt. Die Items repräsentieren die Elemente im Gozintographen. Die haben Verbindungen zu anderen Elementen, den TGozGraphLinks. Dargestellt werden sie über die TGozintograph Komponente. Sie kümmert sich um die Verwaltung der Items und Links und berechnet den hierarchischen Aufbau und die Positionskoordinaten der einzelnen Elemente.
Struktur generieren
Die Struktur generiert sich mit der Methode AddLink. Sie wird während dem Importieren der CSV-Datei mit jeder eingelesenen Zeile aufgerufen. Damit steuert die CSV-Datei auch die Reihenfolge der Elemente nebeneinander.
In AddItem wird zuerst geprüft, ob es bereits ein vorhandenes TGozGraphItem mit dem Namen gibt. Falls ja wird dieses verwendet, falls ein wird ein neues Objekt erzeugt. Das wird für den Zielknoten (ParentItem) und den Startknoten (ChildItem) durchgeführt.
Am Ende wird die Verbindung zum Zielknoten hinzugefügt.
procedure TGozIntoGraph.AddLink(ParentItem, ChildItem: string; Quantity: double); var item : TGozGraphItem; begin AddItem(ParentItem); AddItem(ChildItem); item:=GetItem(ParentItem); if item<>nil then begin item.AddLink(ChildItem,Quantity); UpdateItem(item); item:=GetItem(ChildItem); if item<>nil then UpdateItem(item); end; end;
Ausgabe
Automatisches Layout mit Autolayout
TGozIntoGraph ist demnach auch der richtige Ort, den Gozintograph zu zeichnen. In der Paint-Prozedur passiert genau das. Vorher müssen aber die Koordinaten jedes TGozGraphItem’s berechnet werden. Die Methode wird deswegen nach jedem Import aufgerufen.
procedure TGozIntoGraph.Autolayout; var i : integer; x,y : longint; item : TGozGraphItem; begin ClearConnections; xmax:=0; ymax:=0; x:=FDistanceX; y:=Canvas.TextHeight('Ag'); for i:=0 to FItems.Count-1 do begin item:=TGozGraphItem(FItems[i]); item.Painted:=false; item.Level:=-1; end; for i:=0 to FItems.Count-1 do begin item:=TGozGraphItem(FItems[i]); if item.ItemType=gitProduct then begin CalcLinks(item,x,y,0); if xmax>x then x:=xmax; if i<FItems.Count-1 then x:=x+(item.Width+FDistanceX); end; end; Width:=Scale(xmax+(FDistanceX+FDefaultItemWidth)); Height:=Scale(ymax+FDefaultItemHeight); UpdateConnections; Invalidate; end;
Im wesentlichen Teil wird eine Schleife über alle Items durchlaufen. Handelt es sich bei dem Schleifen-Element um ein Produkt, d. h. gibt es keine ausgehenden Verbindungen, wird die rekursive Prozedur CalcLinks für dieses Produkt aufgerufen.
procedure TGozIntoGraph.CalcLinks(item : TGozGraphItem; x,y : longint; level : integer); var j,k : integer; x0,y0 : longint; link : TGozGraphLink; linkitem : TGozGraphItem; begin item.Painted:=true; if item.Level=-1 then item.Level:=level else if item.Level<level then item.Level:=level; x0:=x; y0:=y+(item.Height+FDistanceY); for j:=0 to item.Links.Count-1 do begin link:=TGozGraphLink(item.Links[j]); linkitem:=GetItem(link.Destination); if (linkitem<>nil) then begin if (linkitem.Painted=false) then begin CalcLinks(linkitem,x0,y0,level+1); x0:=xmax; if j<item.Links.Count-1 then x0:=x0+(linkitem.Width+FDistanceX); end else begin //bei Mehrfachverwendung immer höchste Stufe if linkitem.y<y0 then begin linkitem.y:=y0; linkitem.Level:=level; end; end; end; end; if x0>xmax then xmax:=x0; if y0>ymax then ymax:=y0; item.x:=x; item.y:=y; end;
Damit Elemente mit Mehrfachverwendung nicht mehrfach untersucht werden, gibt es die Eigenschaft Painted. Sie wird am Beginn gleich auf true gesetzt. Danach wird eine Schleife über die enthaltenen TGozGraphLink-Elemente ausgeführt. Für jedes Element wird wieder CalcLinks ausgerufen, wenn Painted=false ist. So wird rekursiv die ganze Elemente-Struktur durchlaufen.
Schnellere Verbindungen mit TGozGraphConnection
Das rekursive Durchlaufen der Struktur benötigt, aber etwas Rechenzeit. Bei größeren Strukturen könnte das beim Neuzeichnen Performance-Probleme verursachen. Deswegen verwende ich eine Hilfsstruktur TGozGraphConnection. Die Klasse speichert alle Informationen, um die Verbindungen einfacher darzustellen. TGozIntoGraph fasst alle diese Elemente in einer Liste zusammen und ist so etwas schneller. Die Liste wird bei jedem Aufruf von Autolayout aktualisiert, direkt nach dem Importieren einer CSV-Datei.
Analyse-Hilfen
In TGozIntoGraph sind auch die interaktiven Funktionen platziert, die bei der Analyse der Struktur helfen. Das sind für mich in erster Linie Funktionen zum Selektieren von Elementen. Um die Struktur eines Elements und dessen Verbindungen zu erkennen, lässt sich der Selektionsgrad einstellen. Es ist möglich alle untergeordneten Elemente automatisch mit auszuwählen. Genauso ist es auch möglich die übergeordneten Elemente hervorzuheben.
Durch diese Art ist es möglich, in einer Ansicht sowohl die Stücklistenstruktur nach unten zu erkennen, wie auch die Teileverwendung nach oben zu untersuchen.
Zusammenbau zur Anwendung
Was jetzt noch fehlt ist das Aufrufen dieser drei Teile des Gozintograph. Das passiert im MainForm des Programms. Es kümmert sich um den Import Dialog und ein paar Visualisierungseinstellmöglichkeiten.
Es stellt dem User alle Bedienelemente für die Steuerung der Anzeige zur Verfügung. Das sind Scroll Leisten und Buttons für den Zoom.
Untersuchung im Getriebe
Wenn Sie schon andere Artikel von mir gelesen haben, wissen Sie, dass ich das Fabrikplanungsbeispiel von Prof. Dr.-Ing. Uwe Prêt sehr schätze. Den Link zu seinem Getriebebeispiel finden Sie am Ende des Artikels. Deswegen verwende ich hier auch die Daten seines Beispiels.
Damit etwas mehr Elemente vorhanden sind, habe ich aber die Struktur noch etwas erweitert. Die Daten liegen als CSV-Datei vor, die Sie sich zusammen mit dem GozIntoGraph Viewer am Ende des Artikels für Ihre Tests downloaden können.
Erste Untersuchungen
Durch die Farbgebung lassen sich schnell Produkte (grün), Baugruppen (hellblau) und Einzelteile (dunkelblau) ausmachen. Es gibt 4 Produkte.
Man kann auf den ersten Blick erkennen, dass 5 Strukturebenen vorhanden sind.
Mit Anklicken eines Elementes werden in der Detailansicht Information zum Element angezeigt: Welche Dispositionsstufe hat das Element? Wie viele ausgehende und eingehende Verbindungen sind vorhanden?
Große Strukturen
Man kann hier auch sehen, wo die Grenzen der Visualisierung liegen. Ist die Datenmenge zu groß lässt sich nur schwer ein Zusammenhang erkennen. Ein erster Schritt geht dann in Richtung Datenreduzierung. Das könnte z. B. durch das Herauslösen von Produktlinien erreicht werden. Danach wird jede Produktlinie einzeln voneinander betrachtet.
Die Anwendungsmöglichkeiten und der Erkenntnisgewinn der Visualisierung im Gozintograph ist aber nicht zu unterschätzen.
Spannend sind für mich aber die zukünftigen Möglichkeiten, die sich aus der erzeugten Struktur ergeben.
So ist es möglich, ganz neue Dateninformationen im Gozintograph grafisch zu visualisieren. Das könnten beispielsweise hervorgehobene Dummy-Baugruppen oder die Unterscheidung von Kauf- oder Fertigungsteilen sein. Zusätzlich ließen sich auch Eigenschaften einzelner Elemente, wie Abmessungen, Gewichte oder Kosten grafisch darstellen.
Schreiben Sie mir gerne, welche Informationen für Sie wichtig wären: info@techpluscode.de.
Oder schauen Sie einfach wieder einmal vorbei, wenn Sie sehen möchten, welche Möglichkeiten ich noch integriert habe.
Die aktuelle Version gibt es auf Github.
Download
Download unter Github unter:
https://github.com/tangielsky/gozintograph
Links
Andrew Vázsonyi auf Wikipedia: https://en.wikipedia.org/wiki/Andrew_V%C3%A1zsonyi
Erzeugnisstruktur auf Wikipedia: https://de.wikipedia.org/wiki/Erzeugnisstruktur
Stücklisten auf Wikipedia: https://de.wikipedia.org/wiki/St%C3%BCckliste#Strukturst.C3.BCckliste
Erklärung Materialbedarfsplanung und Gozintograph: https://studyflix.de/wirtschaft/materialbedarfsplanung-334
Prof. Dr.-Ing. Prêt, 2018, Fabrikplanung: Teilefertigungs- und Montageprojekt „Schneckengetriebeproduktion“, http://www.uwe-pret.de/getriebe.pdf
Weitere Komponenten von mir zu Lazarus: https://techpluscode.de/lazarus/meine-komponenten-fuer-lazarus/
Pingback: Gozintographen einfach darstellen - Tech+Code
Pingback: Produktstruktur analysieren mit Gozintograph Viewer - Tech+Code