Erzeugnisstruktur visualisieren als Gozintograph

Gozintograph Viewer

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 mit Mehrfachverwendung von "Einzelteil-2"
Gozintograph mit Mehrfachverwendung von „Einzelteil-2“

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.

Import-Dialog für den Gozintograph über CSV-Datei aus der Unit importcsv.pas
Import-Dialog für die CSV-Datei aus der Unit importcsv.pas

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.

Klassen im Gozintograph
Klassen im Gozintograph

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.

Gozintograph zu 2 Getrieben
Gozintograph zu 2 Getrieben

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.

Gozintograph einer größeren Struktur mit 1000 Elementen
Gozintograph einer größeren Struktur mit 1000 Elementen

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/

Dieser Beitrag hat 2 Kommentare

Kommentar verfassen