05.11.2013 Aufrufe

Projekt Dokumentation - Übersicht Projekte

Projekt Dokumentation - Übersicht Projekte

Projekt Dokumentation - Übersicht Projekte

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Fachhochschule Kaiserslautern<br />

Fachbereich Informatik und Mikrosystemtechnik<br />

Studiengang „Angewandte Informatik“<br />

<strong>Dokumentation</strong> Prozesssteuerungs- und<br />

Automatisierungssysteme<br />

von<br />

Buchholz Matthias (854859)<br />

Federau Benjamin (854627)<br />

Molter Christian (854436)<br />

Platz Thorsten (853143)<br />

25.01.2007<br />

Betreuer: Prof. Dr. Uwe Tronnier


Seite 2 von 49


Seite 4 von 49


Inhaltsverzeichnis<br />

1 Einleitung.......................................................................................................................... 9<br />

1.1 Motivation.................................................................................................................. 9<br />

1.2 Aufgabenstellung im Detail........................................................................................ 9<br />

1.3 Produktivumgebung.................................................................................................. 9<br />

1.3.1 Das Modell......................................................................................................... 9<br />

1.3.2 Zielsystem........................................................................................................ 11<br />

1.3.3 Materialtypen.................................................................................................. 11<br />

1.3.3.1 Holzblöcke................................................................................................ 11<br />

1.3.3.2 Container.................................................................................................. 11<br />

1.3.4 Lagerplätze...................................................................................................... 11<br />

1.3.4.1 Hochregallager......................................................................................... 12<br />

1.3.4.2 Paletten..................................................................................................... 12<br />

1.3.4.3 Kettenförderer........................................................................................... 13<br />

1.3.4.4 Blocklager................................................................................................. 13<br />

1.3.4.5 Förderbänder............................................................................................ 13<br />

1.4 Gliederung der Arbeit.............................................................................................. 14<br />

1.5 Zeitlicher Ablauf...................................................................................................... 14<br />

2 Grob-Design der gewählten Lösung............................................................................... 16<br />

3 Modellierung und Realisierung....................................................................................... 18<br />

3.1 Datenbank............................................................................................................... 18<br />

3.1.1 ER-Diagramm.................................................................................................. 19<br />

3.2 Klassendiagramm................................................................................................... 20<br />

3.3 Lagerverwaltung...................................................................................................... 20<br />

3.3.1 Klasse CLagerverwaltung................................................................................ 20<br />

3.3.2 Klasse CLager................................................................................................. 21<br />

3.3.3 Klasse CLHM_Palette...................................................................................... 21<br />

3.3.4 Klasse CLHM_Container.................................................................................. 22<br />

3.3.5 Klasse CMaterial.............................................................................................. 22<br />

3.3.6 Lagerschnittstellen........................................................................................... 22<br />

3.3.6.1 Jobmanager.............................................................................................. 22<br />

3.3.6.2 Auftragsverwaltung................................................................................... 23<br />

3.4 Auftragsverwaltung................................................................................................. 23<br />

3.4.1 Auftragsklassen............................................................................................... 24<br />

3.4.1.1 CProduktionsAuftrag, CKommisionierauftrag, CAuslagerungsauftrag......24<br />

3.4.1.2 CFertigungsauftrag................................................................................... 24<br />

3.5 Jobverwaltung und Generierung............................................................................. 24<br />

3.5.1 CJobManager.................................................................................................. 25<br />

3.5.1.1 Shared Resources.................................................................................... 27<br />

3.5.1.2 ManageJobs............................................................................................. 27<br />

3.5.1.3 RequestJob............................................................................................... 28<br />

3.5.1.4 ReportJob................................................................................................. 29<br />

3.5.2 Job Beschreibung............................................................................................ 30<br />

3.5.3 CJobFactory..................................................................................................... 32<br />

3.5.3.1 CreateJobs............................................................................................... 32<br />

3.5.3.2 CreateProductionJobs.............................................................................. 32<br />

3.5.3.3 CreateRejectionJobs................................................................................ 33<br />

Seite 5 von 49


3.5.3.4 CreatePickingJobs.................................................................................... 33<br />

3.6 SPS Kommunikation............................................................................................... 36<br />

3.6.1 Kommunikation über den Feldbus via Handshakeprotokoll............................. 36<br />

3.6.2 Kapselung des Feldbus durch CAktor und CSensor........................................ 37<br />

3.6.3 Die SPS-Klassen............................................................................................. 37<br />

3.6.3.1 SPS-Basisklasse (ASPSBase)................................................................. 37<br />

3.6.3.1.1 Handshakeimplementierung.............................................................. 38<br />

3.6.3.1.2 Bus-Polling........................................................................................ 39<br />

3.6.3.2 CSPS1 - Die Klasse für das Regalbediengerät........................................ 39<br />

3.6.3.3 ASPS2, CSPS2PK1 und CSPS2PK2 - Die Klassen für die Portalkräne...40<br />

3.6.3.4 ASPS3, CSPS3Prod und CSPS3Kom - Die Klassen zur Produktion und<br />

Kommisionierung................................................................................................... 40<br />

3.6.3.5 CSPS4 - Einlagerung und Auslagerung.................................................... 41<br />

4 Portierung auf das Zielsystem........................................................................................ 43<br />

5 Testdurchführung........................................................................................................... 44<br />

6 Zusammenfassung/Ausblick........................................................................................... 45<br />

7 Literaturverzeichnis........................................................................................................ 46<br />

8 Anhänge......................................................................................................................... 47<br />

Seite 6 von 49


Abbildungsverzeichnis<br />

Abbildung 1: Das Modell..................................................................................................... 10<br />

Abbildung 2: Die SPS Anlage............................................................................................. 10<br />

Abbildung 3: Holzblock....................................................................................................... 11<br />

Abbildung 4: Container mit Brause..................................................................................... 11<br />

Abbildung 5: Das Hochregallager....................................................................................... 12<br />

Abbildung 6: Eine Palette................................................................................................... 12<br />

Abbildung 7: Kettenförderer................................................................................................ 13<br />

Abbildung 8: Das Blocklager.............................................................................................. 13<br />

Abbildung 9: Die Förderbänder.......................................................................................... 13<br />

Abbildung 10: Threadmodell............................................................................................... 17<br />

Abbildung 11: ER-Diagramm.............................................................................................. 19<br />

Abbildung 12: JobManagement Klassenausschnitt............................................................ 25<br />

Abbildung 13: RequestJob................................................................................................. 28<br />

Abbildung 14: CJobReport................................................................................................. 29<br />

Abbildung 15: CreateProductionJobs()............................................................................... 35<br />

Abbildung 16: Handshake PC -> SPS................................................................................ 38<br />

Abbildung 17: Handshake SPS -> PC................................................................................ 38<br />

Abbildung 18: Aktivitätsdiagramm zu CSPS1..................................................................... 39<br />

Abbildung 19: Aktivitätsdiagramm zu CSPS2PK1.............................................................. 40<br />

Abbildung 20: Aktivitätsdiagramm zu CSPS3Prod............................................................. 41<br />

Abbildung 21: Aktivitätsdiagramm zu CSPS3Kom............................................................. 41<br />

Abbildung 22: Aktivitätsdiagramm zu CSPS4..................................................................... 42<br />

Abbildung 23: Drei Wege Handshake-Protokoll................................................................. 49<br />

Seite 7 von 49


Seite 8 von 49


1 Einleitung<br />

1 Einleitung<br />

1.1 Motivation<br />

Es galt eine Prozesssteuerung für das Fischertechnikmodell zu entwickeln, welche mit den vier<br />

Speicherprogrammierbaren Steuerungen kommuniziert. Die SPS wurden dabei von vier weiteren Gruppen<br />

realisiert. Dies hatte zur Folge, dass genaue Schnittstellendefinitionen mit den einzelnen Gruppen<br />

ausgearbeitet wurden, um die Synchronisation untereinander zu gewährleisten.<br />

Des weiteren hat die Prozesssteuerung eine Datenbankanbindung, die in der Lage ist über Formulare das<br />

Lager, Materialien, Produktions-, Kommisionierungs- und Auslagerungsaufträge zu verwalten.<br />

1.2 Aufgabenstellung im Detail<br />

Die Aufgabenstellung bestand in der „Prozessüberwachung“. Da es keine genauere Aufgabenbeschreibung<br />

gab, standen wir zuerst einmal vor dem Problem herauszufinden, was eigentlich von uns und unserem<br />

System verlangt wird. Dazu war ein Dialog mit den anderen beteiligten Gruppen, welche für die SPS-<br />

Steuerungen zuständig waren, notwendig. Zuerst mussten wir deren Aufgabenstellung verstehen, danach<br />

erst konnten wir uns Gedanken zur Integration der einzelnen Module und Sub-Module in ein Gesamtsystem<br />

machen. Schließlich mussten unsere Überlegungen zu einem Modell zusammengetragen werden, das wir<br />

dann implementieren konnten.<br />

Aufgabe unseres Software-Systems ist es eine Reihe von Aufträgen (Produktions-, Kommisionier-,<br />

Auslagerungsaufträge) zu bearbeiten. Dazu ist es notwendig benötigte Materialien und deren Stellplätze im<br />

Lager zu verwalten. Die Materialien müssen durch das gesamte Fischertechnikmodell zu den<br />

entsprechenden Positionen, wie etwa Produktionsstraße oder Auslagerungsband geschleust werden. Dabei<br />

hatten wir keine Entscheidungsfreiheit im Vorgehen, sondern mussten uns an die Vorgaben die die<br />

einzelnen SPS-Gruppen hatten, halten.<br />

1.3 Produktivumgebung<br />

1.3.1 Das Modell<br />

Das gesamte Modell (siehe Abbildung 1) wird durch vier Speicherprogrammierbare Steuerungen (siehe<br />

Abbildung 2) betrieben. Jede SPS hat für sich ein eigenes Aufgabengebiet mit festen definierten<br />

Schnittstellen zu den anderen SPS sowie zu dem Zielsystem, auf dem später die Anwendung installiert wird.<br />

Dort werden die Aufträge angenommen, verarbeitet und koordiniert.<br />

Seite 9 von 49


1 Einleitung<br />

Abbildung 1: Das Modell<br />

Abbildung 2: Die SPS Anlage<br />

Seite 10 von 49


1 Einleitung<br />

1.3.2 Zielsystem<br />

Das Zielsystem auf dem die Prozesssteuerung später betrieben wird, ist ein PC mit einer eingebauten<br />

Controller-Karte die an den Phoenix Contact Interbus-S angeschlossen ist. Dieser Interbus verbindet die vier<br />

Siemens Simatic S5-100U Speicherprogrammierbaren Steuerungen miteinander. Das eingesetzt<br />

Betriebssystem ist Windows 2000 Professional.<br />

1.3.3 Materialtypen<br />

In der ganzen Produktivumgebung kommen insgesamt 2 Materialtypen vor:<br />

●<br />

kleine quadratförmige Holzblöcke, die symbolisch große, schwere Materialien darstellen (siehe<br />

Abbildung 3)<br />

● Container, die symbolisch kleine, handhabbare Materialien darstellen (siehe Abbildung 4).<br />

1.3.3.1 Holzblöcke<br />

Holzblöcke haben verschiedene Materialarten und unterscheiden sich<br />

an den silbern farbigen Markierungen an der Seite eines Blocks.<br />

Insgesamt gibt es 5 verschiedene Materialarten. In Abbildung 3<br />

handelt es sich z.B. um die Materialart 2.<br />

Alle Materialarten werden über die Produktionsstraße be- und<br />

verarbeitet, vorher wird dazu über die Formulare in der Datenbank ein<br />

Produktionsauftrag erstellt.<br />

Abbildung 3: Holzblock<br />

1.3.3.2 Container<br />

Die Container (siehe Abbildung 4) können sozusagen verschiedene<br />

„kleine“ Materialien enthalten. Im Versuch kommen hier verschiedene<br />

Sorten von Brause zum Einsatz (falls diese nicht durch die Studenten<br />

vernichtet wurde ;-) ).<br />

Über Kommisionierungsaufträge können die Container be- und<br />

verarbeitet werden.<br />

Abbildung 4: Container mit<br />

Brause<br />

1.3.4 Lagerplätze<br />

Die Orientierung und Positionierung aller Lagerplätze ist durch die Achsen X, Y und Z realisiert. Die X-Achse<br />

zeigt im ganzen Modell in die Tiefe, die Y-Achse zeigt Richtung Modell und die Z-Achse zeigt in die Höhe.<br />

Einzelne Lagerplätze, wie das Hochregallager, die Kettenförderer, das Blocklager und die Förderbänder<br />

Seite 11 von 49


1 Einleitung<br />

können über die X-Achse angesprochen und unterschieden werden.<br />

1.3.4.1 Hochregallager<br />

Das Hochregallager (siehe Abbildung 5) setzt sich aus 21 Stellplätzen zusammen und teilt sich in 7<br />

horizontale Stellplätze und 3 vertikal Reihen auf. Die rechte Spalte bleibt im Initial-Zustand leer. Jeder<br />

einzelne Stellplatz kann eine Palette enthalten.<br />

Abbildung 5: Das Hochregallager<br />

1.3.4.2 Paletten<br />

Eine Palette (siehe Abbildung 6) hat zwei Stellplätze, einen linken und einen rechten Stellplatz. In einem<br />

Stellplatz muss immer Material der selben Materialart gelagert werden.<br />

Z.B. kann in einem linken Stellplatz in einer Palette ein Holzblock des<br />

Materialtyps 2 maximal dreimal übereinander gestapelt werden. Eine<br />

Mischung verschiedener Materialarten, so dass Materialart 2 und<br />

Materialart 3 in einem Stellplatz vorhanden ist, ist nicht vorgesehen.<br />

Ebenso muss der Materialtyp immer der gleiche sein. In einem<br />

Stellplatz kann nicht gleichzeitig, z.B. ein Holzblock und ein Container<br />

sein. Diese können aber nebeneinander auf einer Palette angeordnet<br />

werden.<br />

Abbildung 6: Eine Palette<br />

Holzblöcke können 3-fach in einem Palettenstellplatz gestapelt werden. Container können nicht gestapelt<br />

werden.<br />

Seite 12 von 49


1 Einleitung<br />

1.3.4.3 Kettenförderer<br />

Die Kettenförderer (siehe Abbildung 7) dienen zum<br />

Abstellen der Paletten, wenn diese aus dem<br />

Hochregallager entnommen wurden. Insgesamt gibt es vier<br />

Kettenförderer im Modell. Zwei befinden sich im<br />

Produktions- und Kommisionierungsabschnitt, die anderen<br />

zwei Kettenförderer sind bei der Einlagerung vorzufinden.<br />

1.3.4.4 Blocklager<br />

Abbildung 7: Kettenförderer<br />

Das Blocklager (siehe Abbildung 8) dient zur Zwischenlagerung der Holzblöcke.<br />

Abbildung 8: Das Blocklager<br />

1.3.4.5 Förderbänder<br />

Im Modell gibt es insgesamt sechs Förderbänder. Ein Förderband wird zum Anliefern der Container für die<br />

Kommisionierungsstrecke das zweite wird zum Materialtransport für die Produktionsstraße verwendet . Die<br />

restlichen vier Förderbänder (siehe Abbildung 9) werden bei der Einlagerung genutzt.<br />

Abbildung 9: Die Förderbänder<br />

Seite 13 von 49


1 Einleitung<br />

1.4 Gliederung der Arbeit<br />

Diese <strong>Dokumentation</strong> ist in sechs Kapitel eingeteilt, die die <strong>Projekt</strong>arbeit beschreiben und dokumentieren<br />

sollen.<br />

1. Einleitung<br />

Die Einleitung gibt einen kurzen Überblick über das <strong>Projekt</strong> und die Produktivumgebung.<br />

2. Grob-Design der gewählten Lösung<br />

Dieses Kapitel gibt eine groben Überblick über den Aufbau der Software und deren Grundkonzept.<br />

3. Modellierung und Realisierung<br />

Das wichtigste Kapitel dieser <strong>Dokumentation</strong>, denn hier wird die Modellierung und die Realisierung<br />

der Software erläutert.<br />

4. Portierung auf das Zielsystem<br />

Es wird kurz auf die Portierung auf das Zielsystem eingegangen.<br />

5. Testdurchführung<br />

Da die Software auch getestet werden muss, wird in diesem Kapitel die Durchführung von Tests<br />

beschrieben.<br />

6. Zusammenfassung/Ausblick<br />

Das letzte Kapitel liefert noch einmal eine Zusammenfassung der erledigten Arbeiten an diesem<br />

<strong>Projekt</strong>.<br />

1.5 Zeitlicher Ablauf<br />

Die ersten Wochen wurde eine theoretische Vorlesung gehalten, um das benötigte Wissen an die Studenten<br />

zu vermitteln. Das eigentliche <strong>Projekt</strong> begann mit der Einteilung der Gruppen, die durch Herrn Prof. Dr. Uwe<br />

Tronnier und die Studenten erfolgte.<br />

Innerhalb der ersten Wochen fanden immer wieder treffen mit den einzelnen Gruppen und mit Herrn Prof.<br />

Dr. Tronnier statt, um Schnittstellen zu definieren und bei bestehenden Fragen in der Thematik und im<br />

ganzen Zusammenhang der einzelnen Teilbereiche Klarheit zu verschaffen. Danach wurden die Aufgaben<br />

der Entwicklung in einzelne Bereiche unterteilt, interne Schnittstellen definiert und die Bereiche an einzelne<br />

Gruppenmitglieder zugeordnet.<br />

In der Anfangszeit wurde ausgiebig über das Vorhandene Datenbankmodell diskutiert, Verbesserungen<br />

vorgeschlagen und Ansätze der Entwicklung entworfen. Schnell kristallisierten sich die Schwerpunkte der<br />

Anwendung heraus. Bereiche wurden zusammengefasst und intern unter den Gruppenmitgliedern verteilt.<br />

Die Hauptphase des <strong>Projekt</strong>es bestand in der Entwicklung der einzelnen Bereiche und der Koordination<br />

untereinander in der Gruppe.<br />

In den Endphase des <strong>Projekt</strong>es wurde die Portierung auf das Zielsystem sowie die <strong>Dokumentation</strong><br />

vorgenommen. Hier wurden natürlich auch ausgiebige Tests mit den anderen Gruppe durchgeführt.<br />

Seite 14 von 49


1 Einleitung<br />

Die Übergänge zwischen den einzelnen Phasen des <strong>Projekt</strong>es fanden natürlich nicht von heute auf morgen<br />

statt. Vielmehr war es ein kontinuierlicher Übergang, so dass auch während der Phase Testphase auch an<br />

der Entwicklungsphase eventuelle Anpassungen vorgenommen wurden.<br />

Seite 15 von 49


2 Grob-Design der gewählten Lösung<br />

2 Grob-Design der gewählten Lösung<br />

Das Prozesssteuerungs- und Überwachungssystem wurde in mehrere Komponenten zerlegt, welche<br />

untereinander miteinander kommunizieren.<br />

Die einzelnen identifizierten Komponenten sind:<br />

– SPS Kommunikation<br />

– Lagerverwaltung<br />

– Auftragsverwaltung<br />

– Jobverwaltung<br />

Im Folgenden werden kurz die einzelnen Komponenten vorgestellt. Genaueres zu ihrer Funktionsweise kann<br />

in den jeweiligen Kapiteln nachgelesen werden.<br />

Die SPS Kommunikation abstrahiert die von den Gruppen 1-4 realisierten Speicherprogrammierbaren<br />

Steuerungen und übernimmt alle Kommunikationsaufgaben über den Feldbus.<br />

Die Lagerverwaltung verwaltet alle Lagerhilfsmittel, Positionen sowie Materialien, welche im Produktivsystem<br />

vorkommen.<br />

Die Auftragsverwaltung generiert aus Auftragsdaten Fertigungsaufträge, welche dann automatisiert<br />

weiterverarbeitet werden.<br />

Die Jobverwaltung plant und generiert die einzelnen Jobs, welche an die SPS Kommunikation<br />

weitergegeben werden.<br />

Um eine parallele Ausführung der einzelnen Komponenten zu gewährleisten, wurde das System in mehrere<br />

Threads aufgeteilt. Die Verwaltung der Prozesssteuerung läuft in dem Hauptthread, während die einzelnen<br />

SPS Abstraktionen in eigenen Aktivitätsträgern laufen (siehe Abbildung 10).<br />

Die Kommunikation der einzelnen Threads untereinander geschieht über eine Zentrale Klasse, den<br />

CJobManager (siehe Kapitel 4.6). Diese Klasse ist Threadsave, sodass mehrere Aktivitäts-träger gleichzeitig<br />

auf diese Einheit zugreifen kann ohne zu einem inkonsistenten Zustand zu führen. Als<br />

Synchronisationsmittel wurden MFC – Selektionsmechanismen genutzt.<br />

Ausschließlich die Klassen CLagerverwaltung und CAuftragsverwaltung haben Zugriff auf die<br />

Datenbankschnittstelle.<br />

Seite 16 von 49


2 Grob-Design der gewählten Lösung<br />

Die Datenbankschnittstellen wurden mittels MFC – Datenbankklassen realisiert, da man diese mittels Visual<br />

Studio Wizards erstellen lassen kann.<br />

Mainthread<br />

Jobverwaltung<br />

Lagerverwaltung<br />

Auftragsverwaltung<br />

RGB - Steuerung<br />

Portalkran 1 -<br />

Steuerung<br />

Produktion -<br />

Steuerung<br />

Kommisionier -<br />

Steuerung<br />

Portalkran 2 -<br />

Steuerung<br />

Auslagerung -<br />

Steuerung<br />

Einlagerung -<br />

Steuerung<br />

Abbildung 10: Threadmodell<br />

Seite 17 von 49


3 Modellierung und Realisierung<br />

3 Modellierung und Realisierung<br />

3.1 Datenbank<br />

Das benutze Datenbank Management System, Microsoft Access 2003, wurde ausgewählt wegen der<br />

leichten Handhabung und der Möglichkeit schnell Formulare zur Eingabe von Lager- und<br />

Auftragsinformationen zu erstellen. Außerdem besitzt MS Access standardmäßig eine ODBC (Open<br />

DataBase Connectivity zu deutsch „Offene Datenbank -Verbindungsfähigkeit“) Schnittstelle. ODBC bietet<br />

eine standardisierte Datenbankschnittstelle, die es ermöglichte relativ unabhängig vom DBMS (Datenbank-<br />

Management-System) die Anwendung zu entwickeln.<br />

Eine eigene Modellierung des Datenbankentwurfs war nicht nötig, da schon ein adäquater Datenbankentwurf<br />

von Prof. Tronnier vorgeschlagen wurde. Es wurden nur kleine Änderungen an der Tabelle LHMft<br />

vorgenommen und zwar wurde die Speicherung der Holzblöcke von der Tabelle LHMft in die Tabelle<br />

LHMContainer verschoben. Dies vereinfachte das Updaten der Lageriiformationen in Bezug auf die<br />

Materialien. (siehe Abbildung 11)<br />

Um programmiertechnisch eine Datenbankverbindung herzustellen, wurde keine eigene<br />

Datenbankschnittstelle geschrieben. Dazu wurde die MFC ODBC Datenbankschnittstelle von Visual Studio<br />

verwendet. Visual Studio generiert zu einer oder mehreren Tabellen eine Datenabstraktionsklasse. Das<br />

bedeutet, für jedes Attribut einer ausgewählten Tabelle werden dazugehörige Membervariablen angelegt, in<br />

denen jeweils ein Datensatz abgelegt wird. Diese sogenannten RecordSet Klassen bieten dann<br />

verschiedene Methoden, um entweder Daten aus der Datenbank auszulesen, sie zu bearbeiten, sie zu<br />

suchen oder sie in die Datenbank zu schreiben. So ist es möglich auf SQL Statements zu verzichten. Es<br />

wurden RecordSet Klassen für die Lagerverwaltung (LagerSet, LHMSet, ContainerSet, MaterialSet) und für<br />

die Auftragsverwaltung (ProduktionsauftragSet, KommisionierauftragSet, EinlagerungsauftragSet,<br />

AuslagerungsauftragSet, FertigungsauftragSet, ArbeitsgangSet) generiert.<br />

Seite 18 von 49


3 Modellierung und Realisierung<br />

3.1.1 ER-Diagramm<br />

Material<br />

PK,I1<br />

matId<br />

bez<br />

Arbeitsgang<br />

LHMContainer<br />

PK,I1<br />

arbgId<br />

PK,I1<br />

lhmContainerId<br />

FK1,I2<br />

I3<br />

beschreibung<br />

maschParam<br />

quellMatId<br />

zielMatId<br />

FK1,I2<br />

matId<br />

mengeMat<br />

mischContainer<br />

virtuell<br />

Auslagerungsauftrag<br />

PK,I1<br />

ausAufId<br />

Produktionsauftrag<br />

PK,I2<br />

prodAufId<br />

Einlagerungsauftrag<br />

PK,I1<br />

einAufId<br />

FK2,I3<br />

FK1,I2<br />

zielTermin<br />

matId<br />

menge<br />

lhmContainerId<br />

erfasst<br />

FK1,I1<br />

arbgId<br />

anzTeile<br />

anzGefTeile<br />

zieltermin<br />

erfasst<br />

I2<br />

FK1,I3<br />

FK2,I4<br />

lhmId<br />

lhmContainerId<br />

matId<br />

Kommisionierauftrag<br />

PK,I1<br />

FK2<br />

FK1,I2<br />

kommAuftrId<br />

mat1Id<br />

mengeMat 1<br />

tatMengeMat 1<br />

mat2Id<br />

mengeMat 2<br />

tatMengeMat 2<br />

lhmContainerId<br />

zielTermin<br />

erfasst<br />

Lager<br />

PK,I2<br />

Fertigungsauftrag<br />

fertAufId<br />

PK,I1<br />

I2<br />

lagerId<br />

yposition<br />

zposition<br />

xposition<br />

lhmId<br />

MaterialAbfrage<br />

matId<br />

bez<br />

Abbildung 11: ER-Diagramm<br />

termin<br />

FK4,I6 prodAufId<br />

I5 lhmId<br />

sollAnzQuelleTeile<br />

FK2,I3 kommAuftrId<br />

FK3 lhmContainerIdMat 1<br />

lhmContainerIdMat 2<br />

lhmContainerIdLeer<br />

lhmIdMat1<br />

lhmIdMat2<br />

lhmIdLeer<br />

FK1,I1 ausAufId<br />

I4 lhmContainerId<br />

LHM_ft<br />

FK1,FK2,FK2,FK2,FK2,FK3,I1<br />

FK4<br />

lhmId<br />

lhmContainerIdL<br />

lhmContainerIdR<br />

Seite 19 von 49


3 Modellierung und Realisierung<br />

3.2 Klassendiagramm<br />

siehe Anhang.<br />

3.3 Lagerverwaltung<br />

Die Lagerverwaltung beinhaltet ein komplettes Abbild des Fischertechnik-Hochregallagers bzw. den Inhalt,<br />

der in der Datenbank dafür gespeichert wurde. Das Abbild besteht aus Lager-, Paletten-, Container- und<br />

Material-Objekten, die durch die einzelnen Klassendefinitionen gekapselt, in einem Array in der<br />

Lagerverwaltung hinterlegt werden.<br />

Die Lagerverwaltung stellt Schnittstellen für das Lager, dem Jobmanager und der Auftragsverwaltung zur<br />

Verfügung, wobei die Auftragsverwaltung lediglich Informationen über die vorhandenen Paletten, Container<br />

und Materialien von der Lagerverwaltung benötigt. Der Jobmanager hingegen, verändert die Inhalte der<br />

Objekte, die ihm über die Schnittstellen der Lagerverwaltung bereit gestellt werden. Das bedeutet, dass nach<br />

dem Objekte vom Jobmanager verändert wurden und somit sich der Lagerinhalt nach einem Auftrag<br />

geändert hat, die Lagerverwaltung die Lager-Datenbank auf den neusten Stand bringen muss.<br />

Im folgenden wird auf die Erstellung des Lagerabbildes und auf die Schnittstellen für Jobmanager und<br />

Auftragsverwaltung näher eingegangen.<br />

Das Hochregallager wurde auf Programmierebene mit den folgenden Klassen abgebildet.<br />

3.3.1 Klasse CLagerverwaltung<br />

Das ist die Klasse in der in einem CArray die einzelnen Lagerplätze vom Typ CLager und deren Inhalt<br />

abgelegt werden. Von dieser Klasse kann auch nur eine Instanz erzeugt werden. So ist gewährleistet, dass<br />

auch nur einmal das Lager erzeugt werden kann und zwar beim ersten Aufruf der Klasseninstanz. Dieses<br />

Pattern nennt man Singleton. Sobald über die Singleton-Methode getInstance() ein zweites Mal diese Klasse<br />

erzeugt werden soll, wird nicht eine neue, sondern die zuvor erzeugt Instanz zurückgeliefert. So kann<br />

sichergestellt werden, dass die benutzten Objekte immer noch die sind, die zuvor benutzt worden sind.<br />

Des weitern beinhaltet die Klasse die Schnittstellen/Methoden, für den Jobmanager und die<br />

Auftragsverwaltung. Die Schnittstellen werden im weiteren Verlauf der <strong>Dokumentation</strong> noch etwas näher<br />

erläutert.<br />

Außerdem werden beim Erzeugen der Instanz die Positionen für die Kettenförder und die Förderbänder<br />

initialisiert und in einem Array hinterlegt, so können die Positionen über die definierten Makros (z.B.:<br />

POS_KOM_FB, POS_PROD_FB, POS_SORT1_FB, ...) recht schnell ausgewählt werden.<br />

Um nun das Lagerabbild aufzubauen, wird beim Instanzieren der Klassen die private Methode<br />

getLagerFromDB() aufgerufen. Damit werden alle, in der Datenbanktabelle Lager, vorhanden Lagerplätze<br />

ausgelesen und für jeden Eintrag ein neues Objekt vom Typ CLager erzeugt. Zu den Konstruktorparametern<br />

der Klasse CLager gehören, die Lager-Id, die x,y,z Koordinaten des Stellplatzes und die Paletten-Id. Diese<br />

Objekte werden dann in dem CArray cLagerArray als Zeiger hinterlegt.<br />

Seite 20 von 49


3 Modellierung und Realisierung<br />

3.3.2 Klasse CLager<br />

Wenn ein neues Objekt vom Typ CLager erzeugt wird, werden zuerst die übergebenen Parameter in den<br />

Membervariablen gespeichert. Nur die Paletten-Id wird nicht gespeichert, weil die wird geprüft, ob sie größer<br />

Null ist, denn ist das nicht der Fall wird auch kein neues Objekt vom Typ CLHM_Palette angelegt. Das heißt<br />

es steht keine Palette in diesem Stellplatz. Falls die Paletten-Id doch größer Null ist, also eine Palette<br />

vorhanden ist wird ein neues CLHM_Paletten Objekt erzeugt mit den Parametern der x,y,z Koordinaten und<br />

der Paletten-Id. Nachdem das Objekt erzeugt worden ist, wird es in der dafür vorgesehenen Membervariable<br />

hinterlegt.<br />

Als Methoden stehen die standardmäßigen Getter- und Setter-Methoden zur Verfügung, eine Methode<br />

isEmpty() und eine Methode updateLager(). Die Methode isEmpty() prüft lediglich nach, ob der Stellplatz leer<br />

ist oder nicht. Die Methode updateLager() schreibt die Änderungen an einem Stellplatz zurück in die<br />

Datenbank.<br />

3.3.3 Klasse CLHM_Palette<br />

Sobald eine neue Palette angelegt wird, werden wie auch schon in der Klasse CLager die übergebenen<br />

Parameter in den Membervariablen gespeichert und zwar werden die x,y,z Koordinaten dafür benutzt die<br />

momentane Position der Palette zu initialisieren. Die Klasse CLHM_Palette besitzt nämlich ein Attribut<br />

currentPosition vom Typ Position, die die momentane Position beinhaltet, so kann herausgefunden werden,<br />

wo sich die Palette befindet. Diese Koordinaten werden durch ein Struct vom Typ Position angegeben. Auch<br />

die Klasse CLager und CLagerverwaltung benutzen dieses Struct um die Positionen bzw. Koordinaten zu<br />

händeln. Die Paletten-Id hingegen wird nicht nur gespeichert, sondern noch an die private Methode<br />

getLHMFromDB(UINT) übergeben, die im Konstruktor aufgerufen wird. Die Methode getLHMFromDB(UINT)<br />

stellt eine Verbindung zur Datenbank her und filtert an Hand der Paletten-Id den zugehörigen Datensatz aus<br />

der Tabelle LHMft. Diese Daten, nämlich die Container-Id für den linken, sowie für den rechten Container auf<br />

der Palette, werden benötigt um ein neues Objekt bzw. zwei neue Objekte vom Typ CLHM_Container zu<br />

erstellen. Auch hier wird zuvor noch geprüft, ob die Container-Ids größer Null sind, um dann neue Container<br />

Objekte anzulegen. Ist die Container-Id kleiner oder gleich Null, ist kein Container auf der Palette links oder<br />

rechts vorhanden. Als Übergabeparameter an den Konstruktor der Klasse CLHM_Container wird die<br />

jeweilige Container-Id benutzt. Auch hier werden nach der Erzeugung des linken und rechten Containers, die<br />

Objekte in den passenden Membervariablen gesichert.<br />

Die Klasse enthält Getter- und Setter-Methoden, eine isEmpty(BOOL links, BOOL rechts) Methode und eine<br />

updateLHM() Methode. Ebenfalls, wie in der Klasse CLager, wird die isEmpty(...) Methode benutzt, um zu<br />

prüfen, ob die Palette entweder links oder rechts oder auf beiden Seiten leer ist. Die update Methode, die<br />

auch in den folgenden Klassen vorhanden ist und deren Funktion im Prinzip jedes mal die selbe ist, schreibt<br />

die Änderungen, die an der Palette vorgenommen wurden in die Datenbank.<br />

Seite 21 von 49


3 Modellierung und Realisierung<br />

3.3.4 Klasse CLHM_Container<br />

Ein neues Container Objekt bekommt die Container-Id übermittelt, die wird in der Membervariable<br />

gespeichert und danach an die private Methode getContainerFromDB(UINT) übergeben. Die private<br />

Methode getContainerFromDB(UINT) liest mit Hilfe der Container-Id den passenden Datensatz aus und<br />

speichert die Daten in den passenden Membervariablen. Die Klasse hat zwei Flags, die aus der Datenbank<br />

gelesen werden. Das Flag mischContainer wird gesetzt, wenn ein Plastikcontainer mit Brause wieder<br />

eingelagert wird, denn nach dem Kommisionieren kann nicht mehr nachvollzogen werden, was und wieviel in<br />

einem Plastikcontainer enthalten ist. Das Flag virtuell gibt nur an, ob es sich um einen Containerplatz mit<br />

Blöcken oder mit einem Plastikcontainer handelt. Nur die Material-Id wird nicht gespeichert, sondern auf<br />

größer Null geprüft und je nachdem ein Objekt vom Typ CMaterial erzeugt und in der Membervariable<br />

gespeichert.<br />

Auch diese Klasse besitzt wieder ihre Getter- und Setter-Methoden, sowie die isEmpty() und<br />

updateContainer Methoden. Die beiden zuletzt genannten Methoden erfüllen den selben Zweck, wie die der<br />

Methoden in den vorangegangenen Klassen und zwar eine Überprüfung, ob Material vorhanden ist oder<br />

nicht, sowie die Datenbank mit den veränderten Werten der Klasse auf den neusten Stand bringen.<br />

3.3.5 Klasse CMaterial<br />

Wird ein neues Material Objekt erzeugt, wird die übergebene Material-Id in der Membervariable gespeichert.<br />

Als nächstes wird die private Methode getMaterialFromDB(UINT) und ihr die Material-Id übergeben. Mit der<br />

Material-Id kann dann die Materialbezeichnung aus Tabelle Material geholt werden und in der passenden<br />

Membervariable gespeichert werden.<br />

Die Getter- und Setter-Methoden sind vorhanden, wie auch die updateMaterial() Methode. Nur die isEmpty()<br />

Methode wird an dieser Stelle nicht mehr gebraucht.<br />

Die Klasse CMaterial steht sozusagen am Ende dieser Kette. So wird für jeden Lagerplatz, der in der<br />

Datenbank hinterlegt worden ist, die einzelnen Objekte angelegt bis hin zu der Klasse CMaterial und immer<br />

in den dazugehörigen Membervariablen der Klassen gespeichert.<br />

3.3.6 Lagerschnittstellen<br />

Die Lagerschnittstellen sind Methoden, die die Klasse CLagerverwaltung bereit stellt. Diese Schnittstellen<br />

nutzen der Jobmanager und die Auftragsverwaltung. Die wichtigsten Schnittstellen werden hier kurz<br />

erläutert.<br />

3.3.6.1 Jobmanager<br />

●<br />

getMaterial(materialID, menge)<br />

Sucht angegebenes Material mit einer gewissen Menge im Lager und gibt die Palette zurück auf der<br />

das Material zu finden ist. Bei Material mit der Id und einer Menge gleich Null, wird eine Palette mit<br />

einem leeren Plastikcontainer zurückgegeben. Wird kein passendes Material mit der angegebenen<br />

Menge gefunden liefert die Methode NULL zurück.<br />

Seite 22 von 49


3 Modellierung und Realisierung<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

getFreeContainer(materialId, freeContainer)<br />

Sucht eine Palette zum Einlagern eines Blocks oder eines Plastikcontainers und gibt diese zurück,<br />

wenn eine passende gefunden worden ist, ansonsten NULL. Für einen Plastikcontainer muss explizit<br />

ein komplett leerer Platz auf der Palette gesucht werden deshalb das Flag freeContainer.<br />

updateAll()<br />

Schreibt alle Änderungen in den Lagerobjekten (Lagerplatz, Palette, Container, Material) in die<br />

Datenbank.<br />

update(Palette)<br />

Schreibt die Änderungen einer bestimmten Palette zurück in die Datenbank. Wird eine Palette per<br />

update in die Datenbank geschrieben, so werden auch die Änderungen an Container und Material<br />

der jeweiligen Palette in die Datenbank geschrieben.<br />

getFreePortalPosition()<br />

Liefert eine freie Kettenfördererposition zurück. Ist keine frei, wird NULL zurückgegeben.<br />

getSavePosition()<br />

Liefert einen freien, temporären Lagerplatz. Dies wird benötigt, falls beim Einlagern der eigentliche<br />

Lagerplatz belegt ist.<br />

getKFPosition(positionsnummer)<br />

Liefert eine bestimmte Kettenfördererposition zurück.<br />

getFBPosition(positionsnummer)<br />

Liefert eine bestimmte Förderbandposition zurück.<br />

releasePortalPosition(Position)<br />

Gibt eine belegten Kettenförderer wieder frei.<br />

checkIn(Palette)<br />

Signalisiert, dass die angegebene Palette wieder im Lager verfügbar ist.<br />

isLagerPosition(Palette)<br />

Prüft, ob sich die Palette momentan im Lager befindet oder nicht.<br />

isKF(Position)<br />

Prüft, ob die angegebene Position einer Palette eine Kettenfördererposition ist oder nicht.<br />

3.3.6.2 Auftragsverwaltung<br />

●<br />

getMaterialPalett(materialID, menge)<br />

Sucht eine Palette, die ein bestimmtes Material mit einer bestimmten Menge besitzt. Zurückgegeben<br />

wird eine Palette. Die Auftragsverwaltung braucht diese Palette, um die Paletten-Id und die<br />

Container-Id für einen Auftrag zu bekommen.<br />

●<br />

getEmptyContainer()<br />

Sucht einen leeren Plastikconatiner für die Kommisionierung. Auch hier braucht die<br />

Auftragsverwaltung die Palette, um die Ids für einen Auftrag zu bekommen.<br />

3.4 Auftragsverwaltung<br />

Die Auftragsverwaltung wird in der Klasse CFertigungsauftragsverwaltung realisiert und ist gleichzeitig die<br />

Schnittstelle zum Jobmanager. Von der Klasse kann nur eine Instanz erzeugt werden, die gleichzeitig eine<br />

leere Auftragsliste für neue Aufträge initialisiert.<br />

Seite 23 von 49


3 Modellierung und Realisierung<br />

Der Jobmanager kann über die Funktion NewJobs, bisher unerfasste Aufträge anfordern. Hierbei werden<br />

nacheinander die einzelnen Auftragsarten (Produktionsauftrag, Kommisionierauftrag, Auslagerungsauftrag)<br />

aus der Datenbank ausgelesen und in die Auftragsliste übernommen. Außerdem kann der Jobmanager über<br />

die Funktion UpdateJob einen Auftrag aktualisieren, die Änderungen werden dann abgespeichert.<br />

3.4.1 Auftragsklassen<br />

Alle Aufträge sind von der abstrakten Klasse CAuftrag abgeleitet. Diese beinhaltet die gemeinsamen<br />

Attribute, die in jedem Auftrag vorhanden sind.<br />

3.4.1.1 CProduktionsAuftrag, CKommisionierauftrag, CAuslagerungsauftrag<br />

Die einzelnen Klassen sind nur für Ihre jeweiligen genannten Aufträge zuständig. Jeder, nicht erfasste<br />

Auftrag wird beim Aufruf der Funktion NewJobs aus der Datenbank ausgelesen, diese können an einem Flag<br />

„erfasst“ identifiziert werden, und sofort ein neues Objekt je Auftrag erstellt werden. Die Daten aus der<br />

Datenbank werden in das Objekt übernommen. Die neuen Aufträge werden nun von der Auftragsverwaltung<br />

der Auftragsliste hinzugefügt.<br />

3.4.1.2 CFertigungsauftrag<br />

Die Klasse CFertigungsauftrag generiert aus jedem neuen Auftrag einen Fertigungsauftrag und speichert<br />

diesen in der Datenbank ab.<br />

3.5 Jobverwaltung und Generierung<br />

Dieser Abschnitt befasst sich mit der Realisierung der Jobgenerierung und deren Verwaltung. Die zentralen<br />

Klassen dieses Moduls sind CJobManager und CJobFactory. Wobei der JobManager die Verwaltung und die<br />

JobFactory die Generierung übernimmt. Folgender Ausschnitt aus dem Klassendiagramm liefert einen<br />

Überblick über die benötigten Klassen sowie deren Vererbungsstruktur.<br />

Seite 24 von 49


3 Modellierung und Realisierung<br />

IJobService<br />

CJobManager<br />

«uses»<br />

AJob<br />

CJobFactory<br />

CSPS1Job<br />

CSPS3KomJob<br />

CSPS4Job<br />

CClearJob<br />

CSPS2Job<br />

CSPS3ProdJob<br />

Abbildung 12: JobManagement Klassenausschnitt<br />

CSPS4RejJob<br />

Im Weiteren wird auf die einzelnen Bestandteile genauer eingegangen.<br />

3.5.1 CJobManager<br />

Die Klasse CJobManager, im folgenden JobManager genannt, befasst sich mit der Logistik der einzelnen<br />

Jobs sowie der Auswertung von abgearbeiteten Jobs. Außerdem bietet diese Klasse die Schnittstellen zu<br />

den SPS Kommunikationsklassen ( im folgenden SPS genannt ).<br />

Der JobManager ist das Zentralste Element des ganzen Systems. Deshalb darf auch zu jeder Zeit nur eine<br />

Instanz der Klasse existieren. Aus diesem Grund wurde die der JobManager als Singelton implementiert mit<br />

einem privaten Konstruktor. Mittels der statischen Methode CJobManager::Instance() wird eine Referenz auf<br />

den einzigen existierenden JobManager zurückgegeben. Existiert zu diesem Zeitpunkt noch keine Instanz<br />

der Klasse wird eine Instanz angelegt und die Referenz darauf zurückgegeben.<br />

Bei dem Programmstart wird eine Instanz des<br />

JobManagers angelegt. Der folgende Aufruf von der<br />

Membermethode Control() startet dann alle Komponenten<br />

und die Verarbeitung der Aufträge beginnt. Der Aufruf<br />

kehrt erst nach Beenden des Programms zurück, dar der<br />

JobManager in einer Endlosschleife auf Jobs und<br />

Aufträge wartet.<br />

Sobald der Konstruktor aufgerufen wird werden alle<br />

weiteren benötigten Objekte erzeugt, darunter alle SPS<br />

Klassen, die Lagerverwaltung, die Auftragsverwaltung<br />

main() Aufruf<br />

JobManager<br />

Instance()<br />

&CJobManager<br />

Control()<br />

Seite 25 von 49


3 Modellierung und Realisierung<br />

sowie mehrere Loggerinstanzen. Des weiteren werden die MFC Objekte vom Typ CEvent initialisiert. Kehrt<br />

der Konstruktor erfolgreich zurück, kann das System anlaufen.<br />

Nachdem Control() aufgerufen wurde. Werden die bereits erzeugten SPS Instanzen in jeweils eigenen<br />

Threads gestartet. Dies wurde abermals mit MFC – Mitteln realisiert. Die entsprechende Funktionssignatur<br />

lautet (entnommen aus [MSDN]):<br />

CWinThread* AfxBeginThread(<br />

AFX_THREADPROC pfnThreadProc,<br />

LPVOID pParam,<br />

int nPriority = THREAD_PRIORITY_NORMAL,<br />

UINT nStackSize = 0,<br />

DWORD dwCreateFlags = 0,<br />

LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL<br />

);<br />

Wobei der Parameter pParam in diesem Fall ein Pointer auf ein Objekt einer SPS Klasse darstellt und der<br />

Parameter pfnThreadProc als Wert die Klassenmethode StartSPSThread beinhaltet. In der<br />

StartSPSThread-Methode wird dann der Void Pointer auf das Markerinterface ASPSMarker gecastet und<br />

deren Methode run() aufgerufen, welche in einer Endlosschleife laufen und nie zurückkehren sollten.<br />

Sind alle Threads am laufen beginnt der JobManager seine eigentliche Aufgabe. Dem Verwalten von Jobs<br />

für die unterschiedlichen SPS Klassen.<br />

Um die Kommunikation zwischen JobManager und den SPS Threads sehr schlank zu halten, wird in dem<br />

Interface IJobService lediglich 2 Methoden zum Datenaustausch definiert.<br />

Der JobManager implementiert seinerseits diese rein virtuellen Methoden und stellt sich gegenüber den SPS<br />

lediglich als IJobService dar. Dies ermöglicht ein einfaches Austauschen der eigentlichen Verteilungslogik<br />

durch eine neue Klasse die nur das Interface zu implementieren hat.<br />

IJobService<br />

+RequestJob(ein Parameter1 : ASPSMarker &) : AJob &<br />

+ReportJob(ein Parameter1 : CJobReport &) : bool<br />

Um herauszufinden was bei einem RequestJob oder ReportJob verarbeitet werden muss , wird eine<br />

Typprüfung der Parameter zur Laufzeit vorgenommen. Dies wird mittels der MFC – Makros<br />

DECLARE_DYNAMIC im Header sowie IMPLEMENT_DYNAMIC in der Implementationsdatei erreicht. Um<br />

die Makros nutzen zu können muss allerdings die Klasse direkt oder indirekt von CObject erben. Sind die<br />

Makros korrekt in die Klasse eingefügt steht die Methode isKindOf() zur Verfügung. Mittels dieser Methode<br />

kann man auf die Laufzeitklasse eines Objektes prüfen und somit kann der JobManager unterscheiden<br />

welche SPS anfragt oder was für ein Job in einem CJobReport steckt.<br />

MFC bietet Steigerungen des Makros, welche weitere Methoden zur Verfügung stellen, allerdings wurden<br />

diese im Rahmen des <strong>Projekt</strong>es nicht benötigt. Folgende Tabelle [MSDN] zeigt die Mächtigkeit der<br />

Seite 26 von 49


3 Modellierung und Realisierung<br />

verfügbaren Makros.<br />

Macro used<br />

CObject::IsKindOf<br />

CRuntimeClass::<br />

CreateObject<br />

CArchive::operator>><br />

CArchive::operator


3 Modellierung und Realisierung<br />

die noch nicht angefangen worden sind werden keine neuen Aufträge beantragt. Sollte die Auftragsliste leer<br />

sein, wird über die Auftragsverwaltung nach neuen Aufträgen gefragt. Diese werden dann in die Auftragsliste<br />

übernommen. Die Auftragsliste selbst ist vom Typ std::deque und hat als Elemente Zeiger auf Objekte vom<br />

Typ CAuftrag, weshalb auch Spezialisierte Objekte vom Typ CAuslagerungsauftrag, CProduktionsauftrag,<br />

CEinlagerungsauftrag und CPendingAuftrag an diesem Pointer hängen können.<br />

Für jeden Auftrag in der Liste wird nun an die JobFactory übergeben, diese prüft ob der Auftrag momentan<br />

verarbeitet werden kann, falls ja liefert diese eine Verkettung von AJob Objekte zurück. Darauf untersucht<br />

der JobManager den ersten Job der Verkettung und sortiert diesen in die jeweilige Queue der SPS ein,<br />

vorausgesetzt der Auftrag kann durchgeführt werden. Konnte der Auftrag zum momentanen Zeitpunkt nicht<br />

bearbeitet werden (in der Regel liegen Ressourcen Defizite vor), wird der Auftrag an das hintere Ende der<br />

Queue gestellt, und an einem späteren Zeitpunkt geprüft ob er nun abgearbeitet werden kann.<br />

Sobald ein Job in eine Queue gesetzt wird, wird das korrespondierende Event gesetzt, um der<br />

entsprechenden SPS zu signalisieren dass ein neuer Job für sie bereit steht.<br />

3.5.1.3 RequestJob<br />

Diese Methode wird von den SPS' aufgerufen falls sie sich in dem Zustand befinden, einen neuen Job<br />

entgegen nehmen zu können.<br />

Anhand des aufrufenden Objektes wird entschieden welche Spezialisierte Methode von RequestJob<br />

verwendet werden muss. Der Ablauf in den spezialisierten Methoden hingegen ist immer der selbe, nur die<br />

korrespondierende Liste ist eine andere.<br />

Abbildung 13 sollte dies näher erläutern.<br />

[Event signalisiert ]<br />

KA verlassen<br />

blockieren<br />

[Liste leer]<br />

Nächsten Job aus Liste entnehmen<br />

[Event nicht signalisiert ]<br />

[Liste hat Elemente]<br />

[KA frei]<br />

KA betreten<br />

[KA vergeben]<br />

blockieren<br />

[KA frei]<br />

Abbildung 13: RequestJob<br />

Seite 28 von 49


3 Modellierung und Realisierung<br />

3.5.1.4 ReportJob<br />

Diese Methode wird von den SPS' verwendet um einen abgearbeiteten oder fehlerhaften Job zu berichten.<br />

Ein JobReport hat folgenden Aufbau:<br />

CJobReport<br />

Errorcode<br />

Message<br />

AJob<br />

Konkreter Job<br />

Abbildung 14: CJobReport<br />

Zuerst wird ermittelt welche konkrete Ausprägung von ReportJob die Weiterverarbeitung übernimmt. Für<br />

jede Art Job existiert eine eigene Methode welche diesen Job verarbeitet. Anhand der Laufzeitklasse des<br />

Jobs welcher an den Report gebunden ist wird die entsprechende Methode in einer Case Anweisung<br />

aufgerufen.<br />

Im Gegensatz zu den RequestJob Methoden ist der Workflow der Reportklassen von Job zu Job<br />

unterschiedlich, da diese auch die Fehlerbehandlung übernehmen und die von Job zu Job unterschiedlich<br />

sind.<br />

Die nächsten Abschnitte befassen sich mit dem genaueren Reporting und haben die Struktur:<br />

Fehlersituation - Reaktion<br />

ReportSPS1Job<br />

Kein Fehler:<br />

Den folgenden Job in die entsprechende Liste einsortieren.<br />

Falls die Palette, welche befördert wurde, sich im Lager befindet wird<br />

sie wieder eingecheckt.<br />

Quelle ist leer:<br />

Ziel ist belegt:<br />

Den Auftrag löschen und belegte Resourcen löschen.<br />

Die Palette auf der Gabel wird zu einer speziellen Lager Position<br />

gefahren, und der Auftrag gelöscht.<br />

ReportSPS2Job<br />

Kein Fehler:<br />

Kran2 geparkt:<br />

Den folgenden Job in die entsprechende Liste einsortieren.<br />

Es werden alle Jobs die für den Portalkran 2 bestimmt waren in die<br />

JobListe für den Portalkran 1 umgelagert, weiterhin werden keine<br />

weiteren Jobs in die Liste des Portalkrans 2 einsortiert.<br />

Seite 29 von 49


3 Modellierung und Realisierung<br />

Kran2 bereit:<br />

Palette voll:<br />

Es werden Jobs für den Portalkran 2 in die entsprechende Liste<br />

einsortiert.<br />

Gruppe 2 legt Material im Blocklager ab.<br />

ReportSPS3ProdJob<br />

Die Palette auf der Gabel wird zu einer speziellen Lager Position<br />

gefahren, und der Auftrag gelöscht.<br />

Kein Fehler:<br />

Den folgenden Job in die entsprechende Liste einsortieren<br />

ReportSPS3KomJob<br />

Kein Fehler:<br />

Paket verloren:<br />

Den folgenden Job in die entsprechende Liste einsortieren.<br />

Den Auftrag löschen. Falls das Paket bei Gruppe 4 auftauchen sollte<br />

wird dieses Eingelagert solange kein Auslagerungsauftrag für dieses<br />

Paket vorhanden ist.<br />

ReportSPS4Job<br />

Kein Fehler:<br />

Analhand der Information auf welchem Band das Material liegt werden<br />

alle nötigen Jobs zur Einlagerung geplant. Sollte die Einlagerung<br />

momentan nicht durchgeführt werden können wird ein<br />

CPendingAuftrag generiert welcher in die Auftragsliste eingefügt wird<br />

und eine Referenz auf die zu generierende Methode beinhaltet.<br />

In dem nächsten Release wäre geplant gewesen das Löschen der Aufträge durch Neugenerierung der Jobs<br />

aus dem Auftrag zu ersetzten.<br />

Diese Methoden könnte man beliebig komplizieren, jedoch mussten wir uns aus zeitlichen Gründen auf<br />

simplere Lösungen konzentrieren.<br />

Job Beschreibung<br />

3.5.2 Job Beschreibung<br />

Ein Job ist eine Businessobjekt welches lediglich Daten enthält, welche eine SPS zur Durchführung eines<br />

Auftrages benötigt. Weiterhin besitzt jeder Job einen Zeiger auf einen Job welcher nach der Abarbeitung des<br />

momentan Jobs durchgeführt werden soll. Der folgende Job kann sich jedoch von dem momentan<br />

unterscheiden.<br />

Seite 30 von 49


3 Modellierung und Realisierung<br />

Die Basisklasse AJob dient als Oberklasse aller Jobs und implementiert die Methoden zur Verkettung.<br />

Die nun folgenden Unterklassen von AJob ergänzen die Klasse lediglich um weiter Attribute.<br />

CSPS1Job<br />

+m_Palette : CLHM_Palette &<br />

+m_TargetPos : Position<br />

Dieser Job beinhaltet die Informationen für zur Steuerung des<br />

Regalbediengerätes. Dar ein Objekt vom Typ CLHM_Palette zu jeder Zeit<br />

seine Position weiß,<br />

AJob<br />

+m_ErrorCode : int<br />

+m_Auftrag : CAuftrag &<br />

-m_NextJob : AJob *<br />

+classAJob : CRuntimeClass<br />

+AJob(ein aAuftrag : CAuftrag &)<br />

+AJob(ein aJob : const AJob &)<br />

+~AJob()<br />

+operator =(ein aJob : const AJob &)<br />

+DeleteFollowingJobs()<br />

+Next() : AJob *<br />

+Next(ein aJob : AJob*)<br />

+Last() : AJob *<br />

+Last(ein aJob : AJob*)<br />

+Auftrag() : CAuftrag &<br />

+Print(ein out : ostream &) : ostream &<br />

genügen als Attribute eine Referenz auf die zu<br />

befördernde Palette sowie eine Positionsangabe zu welcher das Lagerhilfsmittel befördert werden soll.<br />

Ein CSPS2Job Objekt, wird benötigt um einen Portalkran zu steuern.<br />

Dieses beinhaltet zum einen die Palette in welche etwas hinzugefügt oder<br />

entfernt werden soll sowie eine Richtungskodierung in Form eines Flags.<br />

CSPS2Job<br />

+CAuftrag : CSPS2Job<br />

+m_Palette : CLHM_Palette &<br />

+m_TargetPos : Position<br />

+m_MatIsLeft : bool<br />

+m_FromPaletteToPos : bool<br />

CSPS3KomJob Für die Kommisionierung steht links stehendes Klassenkonstrukt zur<br />

+m_bIsKommAuftrag3 : bool Verfügung. Es beinhaltet lediglich ein Attribut welches kodiert ob es sich um<br />

eine Kommisionierung mit zwei oder drei Containern handelt.<br />

Ein CSPS3Objekt dient zur Bohrmusteränderung an der SPS3 Steuerung. Jedes<br />

Bohrmuster entspricht einer Integer Zahl.<br />

CSPS3ProdJob<br />

+m_iPattern : int<br />

CSPS4RejJob<br />

+m_iId : int<br />

+m_bIsContainer : bool<br />

+m_bIsStorno : bool<br />

Mittels des CSPS4RejJobs werden Auslagerungsaufträge an die SPS4 Steuerung<br />

weitergegeben, bzw. Auslagerungsaufträge können damit storniert werden.<br />

Der rechts stehende Job dient Ausschließlich dem Reporting eines<br />

Einlagerungsauftrag. Er wird in einer SPS Klasse generiert und dem JobManager<br />

berichtet, aus der Id und der Band Nummer kann darauf hin die Einlagerung<br />

geplant werden.<br />

CSPS4Job<br />

+m_iMaterialID : int<br />

+m_iContainerID : int<br />

+m_bIsStorno : bool<br />

+m_iBandNr : int<br />

Seite 31 von 49


3 Modellierung und Realisierung<br />

3.5.3 CJobFactory<br />

Die JobFactory übernimmt die Aufgabe aus einem Auftrag eine Verkettung von Jobs zu generieren welche<br />

den SPS Klassen übermittelt werden können. Weiterhin bietet sie Methoden zur Erzeugung von einzelnen<br />

Jobs. Zu jedem Zeitpunkt kann in dem System nur eine Instanz dieser Klasse existieren weshalb diese als<br />

Singelton implementiert wurde. Ausschließlich der JobManager kommuniziert mit dieser Klasse.<br />

CJobFactory<br />

+~CJobFactory()<br />

+Instance()<br />

+CreateJobs()<br />

+CreateStocking()<br />

+CreateSPS1Job()<br />

+CreateSPS2Job()<br />

+CreateSPS3KomJob()<br />

+CreateSPS3ProdJob()<br />

+CreateSPS4Job()<br />

+CreateSPS4RejJob()<br />

+CreateClearJob()<br />

+CreateStocking()<br />

+CreateSPS1JobToSavePos()<br />

-CJobFactory()<br />

-CreateProductionJobs()<br />

-CreateRejectionJobs()<br />

-CreatePickingJobs()<br />

Durch die Auslagerung der Job Generierung in eine separate Klasse ist es möglich diese Geschäftslogistik<br />

an einer zentralen Stelle zu pflegen oder sogar auszutauschen. In dem nächsten Release wäre auch noch<br />

eine Auslagerung der einzelnen Algorithmen zur Erzeugung der Jobs in eigene Klassen sinnvoll gewesen.<br />

Im Folgenden werden kurz die wichtigstes Schnittstellen besprochen.<br />

3.5.3.1 CreateJobs<br />

Dieser Methode wird eine Referenz auf einen Auftrag übergeben. An Hand des Auftrages wird dann<br />

entschieden welche der gelisteten Methoden die Weiterverarbeitung übernimmt.<br />

– CreateProductionJobs()<br />

– CreateRejectionJobs()<br />

– CreatePickingJobs()<br />

Die Differenzierung wird abermals über die Laufzeitklasse des Objektes ermittelt.<br />

3.5.3.2 CreateProductionJobs<br />

Soll ein Produktionsauftrag durchgeführt werden generiert diese Methode alle benötigten Jobs und verkettet<br />

diese miteinander. Folgendes Aktivitätsdiagramm beschreibt die Generierung genauer.<br />

Das Sequenzdiagramm (siehe Abbildung 15) zeigt den strukturellen Ablauf bei der Generierung der<br />

Seite 32 von 49


3 Modellierung und Realisierung<br />

benötigten Jobs. Die Anzahl der benötigten Objekte kann natürlich in Abhängigkeit von der Menge des zu<br />

produzierenden Materials variieren.<br />

3.5.3.3 CreateRejectionJobs<br />

Diese Methode generiert die benötigten Jobs zur Auslagerung. Eine Auslagerung entspricht in etwa einer<br />

Produktion mit dem Unterschied dass das spezielle Bohrmuster 0 an die SPS3 übergeben wird.<br />

Nach erfolgreicher Generierung könnte folgende Objektverkettung auf dem Heap vorliegen:<br />

CSPS 1Job CSPS3ProdJob CSPS2Job CSPS1Job CClearJob<br />

«bind»<br />

«bind»<br />

Die Einzelnen Schritte wären demzufolge:<br />

1. Palette mit dem RGB aus dem Lager auf einen Kettenförderer stellen.<br />

2. Der Produktionsstraße das Bohrmuster 0 übermitteln.<br />

3. Mit dem Portalkran das Material aus der Palette auf das Förderband der Produktion ablegen.<br />

4. Palette wieder zurück in das Lager zu ihrer Ausgangsposition.<br />

5. Den genutzten Kettenförderer für weitere Jobs freigeben.<br />

3.5.3.4 CreatePickingJobs<br />

CreatePickingJobs generiert aus einem Kommisionierauftrag die benötigten Jobs, und liefert diese als<br />

verkettete Objekte zurück.<br />

Nach der erfolgreichen Generierung eines Kommisionierauftrags mit 3 Containern, könnte die mögliche<br />

Objektverkettung wie folgt aussehen.<br />

Seite 33 von 49


3 Modellierung und Realisierung<br />

CSPS 1Job CSPS3KomJob CSPS2Job CSPS1Job<br />

«bind» «bind» «bind»<br />

«bind»<br />

CSPS1Job<br />

CSPS1Job<br />

CSPS2Job<br />

CSPS1Job<br />

CSPS2Job CSPS1Job CClearJob<br />

Die Einzelnen Schritte wären demzufolge:<br />

1. Palette mit einem Container aus dem Lager auf einen Kettenförderer befördern.<br />

2. Der Kommisionierstraße einen 3er Kommisionierauftrag erteilen.<br />

3. Den entsprechenden Container aus der Palette auf das Förderband stellen.<br />

4. Die Palette zurück in das Lager stellen.<br />

5. Palette mit einem leeren Container aus dem Lager holen.<br />

6. Mit dem Portalkran den Container auf das Förderband stellen.<br />

7. Die Palette zurück in das Lager räumen.<br />

8. Palette mit dem Container für das 3. Material besorgen und auf den Kettenförderer stellen.<br />

9. Den letzten Container auf das Kommisionierband abstellen.<br />

10. Die Palette zurück in das Lager befördern.<br />

11. Den genutzten Kettenförderer freigeben.<br />

Die JobFactory bietet noch eine Menge Potenzial an Optimierungen, die leider aus Zeitgründen nicht näher<br />

betrachtet wurden.<br />

Seite 34 von 49


3 Modellierung und Realisierung<br />

Abbildung 15: CreateProductionJobs()<br />

Seite 35 von 49


3 Modellierung und Realisierung<br />

3.6 SPS Kommunikation<br />

Als Schnittstelle zwischen den einzelnen Speicherprogrammierbaren Steuergeräten (nachfolgend SPSG<br />

genannt) und der Steuersoftware auf dem PC dienen die SPS-Klassen (nachfolgend SPSK bezeichnet). Auf<br />

PC-Seite wurde die Schnittstelle sehr schmal gehalten. Lediglich der JobManager ist über das IJobService-<br />

Interface mit der ASPSBase-Klasse gekoppelt.<br />

Die SPSK kapseln die komplette Kommunikation über den Feldbus. Des weiteren repräsentieren sie als<br />

Zustandsautomaten die jeweiligen Zustände der SPSG. Die SPSK überwachen die SPSG und reagieren<br />

entsprechend auf jede Zustandsänderung.<br />

Im wesentlichen besteht die Aufgabe der SPSK darin, einen Job vom Jobmanager abzuholen, diesen Job<br />

über den Feldbus an das entsprechende SPSG zu senden, sodann die Arbeit der SPSG zu überwachen und<br />

schließlich dem Jobmanager das Ergebnis des Jobs zurückzumelden. Während der Lebensdauer einer<br />

SPSK wiederholt sich dieser Zyklus immer wieder.<br />

Um einen Job vom Jobmanager abzuholen muss sich die SPS (wird als zusammenfassender Begriff für<br />

SPSG und die korrespondierende SPSK verwendet) im Zustand BEREIT befinden. Nun muss unterschieden<br />

werden, ob der Zustand BEREIT nach der Initialisierung folgt, oder ob zuvor gerade ein Job bearbeitet<br />

wurde. Ist dies der Fall, so muss zuerst der zuletzt bearbeitete Job an den Jobmanager zurückgemeldet<br />

werden. Sofort nachdem der Job zurückgemeldet wurde, kann vom Jobmanager ein neuer Job abgeholt<br />

werden. Sollte der Jobmanager gerade keinen Job für die entsprechende SPS in seiner Queue haben,<br />

blockiert die SPSK solange bis ein Job vorhanden ist. Erst danach kehrt der Job-Request vom Jobmanager<br />

zurück.<br />

Da sich das SPSG zwangsläufig immer noch im Zustand BEREIT befindet (von Fehlersituationen einmal<br />

abgesehen) wartet es auf einen neuen Job der von der SPSK nun gesendet werden kann. Je nach Aufgabe<br />

der SPS wird nun ein entsprechender Job über den Feldbus gesendet. Das SPSG beginnt sofort nach Erhalt<br />

des Jobs diesen zu bearbeiten. Ggf. werden weitere Zustände vom SPSG gemeldet. Im Regelfall kehrt das<br />

SPSG in den Zustand BEREIT zurück, was mit einer erfolgreichen Bearbeitung des Jobs einhergeht. Sollte<br />

ein Fehler während der Bearbeitung aufgetreten sein, so wird dieser von der SPSK entsprechend im Job-<br />

Report vermerkt. Der Job-Report dient dazu einen Job als bearbeitet an den Jobmanager zurückzumelden.<br />

Der Jobreport besteht aus dem bearbeiteten Job selbst, einem definierten Fehlercode, sowie einem<br />

Container für zusätzliche (beliebige) Daten. Nachdem der Job-Report an den Jobmanager gemeldet wurde<br />

beginnt der Zyklus erneut. Dieses Verhalten läuft in einer Endlosschleife während der gesamten Laufzeit des<br />

Steuer-Programms.<br />

3.6.1 Kommunikation über den Feldbus via Handshakeprotokoll<br />

Um die Kommunikation zwischen SPSG und SPSK (PC) über den Feldbus zu regeln wird ein einfaches<br />

Handshakeprotokoll verwendet. Das Protokoll war vorgegeben und wird hier nur der Vollständigkeit wegen<br />

kurz erläutert. Benutzt werden zusätzlich zu den eigentlichen Datensignalen noch zwei weitere Signale: DS<br />

Seite 36 von 49


3 Modellierung und Realisierung<br />

und ACK.<br />

Um dem Empfänger zu signalisieren dass momentan gültige Daten anliegen wird vom Sender das DS<br />

aktiviert. Der Empfänger lässt solange DS und die Daten anliegen, bis vom Empfänger nach erfolgreichem<br />

Lesen der Daten das ACK kommt. Nun setzt der Sender das DS zurück, der Empfänger weiß dass jetzt<br />

keine gültigen Daten mehr anliegen und nimmt sein ACK ebenfalls zurück. Beide befinden sich schließlich<br />

wieder in der Ausgangssituation. Die Sender, Empfänger-Rollen können nun getauscht oder beibehalten<br />

werden.<br />

3.6.2 Kapselung des Feldbus durch CAktor und CSensor<br />

Für die Kommunikation über den Feldbus wurde von der Firma PHOENIX CONTACT diverse Funktionen zur<br />

Verfügung gestellt. Darüber hinaus standen zwei Klassen zum Lesen (CSensor) bzw. Schreiben (CAktor)<br />

eines einzelnen Bits zur Verfügung.<br />

CSensor wurde um eine Methode erweitert die es ermöglicht ein komplettes Byte mit Hilfe der PHOENIX<br />

CONTACT-Funktionen zu lesen, CAktor wurde ebenfalls um eine Methode erweitert und kann nun ein<br />

komplettes Byte schreiben. Dies vereinfacht das Handling des Buses erheblich. Prinzipiell können die<br />

Methoden auch benutzt werden um Wörter, Doppel-Wörter oder beliebig viele Bits in einem Rutsch zu<br />

verwalten.<br />

3.6.3 Die SPS-Klassen<br />

Insgesamt existieren zur Laufzeit sechs SPSK-Instanzen in je einem eigenen Thread. Die SPSK werden<br />

beim Programmstart vom Jobmanager erzeugt und dieser startet dann auch die Threads.<br />

Die SPSK lassen sich in 5 Kategorien unterteilen. Zum einen die Basis-Klasse, zum anderen die Klassen für<br />

die vier zu steuernden SPSG.<br />

Die einzelnen Abläufe innerhalb der SPSK werden nur kurz erläutert und sind den Aktivitätsdiagrammen zu<br />

entnehmen.<br />

3.6.3.1 SPS-Basisklasse (ASPSBase)<br />

Die abstrakte Vaterklasse aller weiteren SPS-Klassen stellt die Schnittstelle nach außen zur Verfügung.<br />

Sowohl für die restlichen PC-Steuerprogramm-Komponenten, als auch über den Feldbus zu den SPSG. Die<br />

Schnittstelle zum PC-Steuerprogramm, beschränkt sich auf die Erzeugung der SPSK durch den<br />

Jobmanager, sowie das Erbitten (request) und das Zurückmelden (report) eines Jobs.<br />

Für die Kommunikation mit den SPSG steht eine virtuelle Methode bereit, die einen Job an das SPSG<br />

sendet. Diese wird von den von ASPSBase abgeleiteten Klassen implementiert, da für jedes SPSG<br />

entsprechend unterschiedliche Jobs gesendet werden.<br />

Seite 37 von 49


3 Modellierung und Realisierung<br />

3.6.3.1.1 Handshakeimplementierung<br />

Die Kommunikation zwischen PC und SPSG wird über das weiter oben erwähnte Handshakeprotokoll<br />

geregelt. Dazu bietet die ASPSBase für jede Kommunikationsrichtung (von PC zu SPS und umgekehrt) je<br />

drei Methoden.<br />

Vom PC zur SPS, also zum Senden sind das: hsPC2SPSInit(), hsPC2SPSTransferBegin()<br />

hsPC2SPSTransferComplete()<br />

●<br />

●<br />

●<br />

hsPC2SPSInit() wartet solange bis das SPSG<br />

empfangsbereit ist, d.h. bis SPS.DS == SPS.ACK<br />

== false.<br />

hsPC2SPSTransferBegin() signalisiert dem<br />

SPSG dass Daten anliegen, d.h. PC.DS = true<br />

hsPC2SPSTransferComplete) wartet solange bis<br />

das SPSG das Lesen der Daten bestätigt, d.h. bis<br />

SPS.ACK == true danach PC.DS = false<br />

Für die umgekehrte Richtung, also zum Empfang<br />

existieren die drei Methoden:<br />

●<br />

hsSPS2PCInit() wartet bis vom SPSG Daten<br />

gesendet werden, d.h. bis SPS.DS == true<br />

Abbildung 16: Handshake PC -> SPS<br />

●<br />

●<br />

hsSPS2PCTransferBegin() macht nichts, wird nur wegen Konsistenz zum Senden verwendet<br />

hsSPS2PCTransferComplete() signalisiert dem SPSG, dass die Daten gelesen wurden und wartet<br />

schließlich darauf, dass das SPSG sein DS zurücknimmt um wieder im Ausgangszustand zu sein,<br />

d.h. bis PC.ACK = true, warten bis SPS.DS == false, danach PC.ACK = false.<br />

Abbildung 17: Handshake SPS -> PC<br />

Seite 38 von 49


3 Modellierung und Realisierung<br />

3.6.3.1.2 Bus-Polling<br />

Da es keine Callback-Mechanismen gibt die dem PC mitteilen dass sich etwas auf dem Bus geändert hat,<br />

muss der Feldbus ständig gepollt werden. Das Polling findet in jedem der SPSK-Threads unabhängig<br />

voneinander statt, so dass die eigentlichen Bus-Zugriffe als sichere Bereiche behandelt werden müssen.<br />

Dazu wurde das die Klasse CCriticalSection, die von der Microsoft Foundation Classes zur Verfügung<br />

gestellt wird, benutzt.<br />

Aufgrund dessen dass ein SPSG eine gewisse Zeit benötigt um ihre Aufgaben auszuführen ist es unsinnig<br />

den Bus beliebig schnell (quasi nur durch die CPU-Geschwindigkeit begrenzt) zu pollen. Daher wurde eine<br />

wait()-Methode implementiert, die den Thread nach einem Poll-Vorgang einige Zeit inaktiv setzt, so dass<br />

Rechenzeit freigegeben wird. Momentan ist diese Zeit auf 100ms gesetzt. Kann aber leicht geändert werden,<br />

sofern sich diese Zeit als unpassend erweist.<br />

3.6.3.2 CSPS1 - Die Klasse für das Regalbediengerät<br />

CSPS1 ist für das Regalbediengerät (RBG) zuständig. Dazu holt sie vom Jobmanager einen CSPS1Job ab.<br />

Darin stehen Quelle und Ziel für das RBG. Diese Daten werden in der sendJob2SPS()-Methode so zerlegt<br />

dass sie entsprechend der Schnittstellendefinition über den Bus an das SPSG geschickt werden können.<br />

Sollte während der<br />

Bearbeitung des Jobs<br />

ein Fehler vom RBG<br />

gemeldet werden, wird<br />

dieser durch einen<br />

entsprechenden<br />

Fehlercode im<br />

JobReport vermerkt. Da<br />

die lose Kopplung der<br />

SPSK zum restlichen<br />

System zur Folge hat,<br />

dass die SPSK keine<br />

Kenntnis über den<br />

momentanen Zustand<br />

der Datenbank, also des<br />

Lagers besitzt, kann<br />

innerhalb der CSPS1-<br />

Klasse nicht sinnvoll auf<br />

Fehler die vom RBG<br />

Abbildung 18: Aktivitätsdiagramm zu CSPS1<br />

gemeldet werden<br />

reagiert werden. Daher werden alle Fehler an den Jobmanager gemeldet, der dann weitere Entscheidungen<br />

trifft um auf den jeweiligen Fehler angemessen zu reagieren.<br />

Seite 39 von 49


3 Modellierung und Realisierung<br />

3.6.3.3 ASPS2, CSPS2PK1 und CSPS2PK2 - Die Klassen für die Portalkräne<br />

Für die beiden vorhandenen Portalkräne wurden je eine eigene Klasse geschrieben. Deren<br />

Gemeinsamkeiten wurden in deren Vaterklasse ASPS2 zusammengefasst. Im wesentlichen unterscheidet<br />

sich CSPS2PK1 dadurch von CSPS2PK2, dass der Portalkran1 zusätzlich noch geparkt werden kann.<br />

Dadurch sind zusätzliche Automatenzustände hinzugekommen die überwacht werden müssen.<br />

Auch hier werden auftretende Fehler direkt an den Jobmanager weitergeleitet, da dieser die <strong>Übersicht</strong> über<br />

das System besitzt.<br />

Sollte der Portalkran1 geparkt werden,<br />

wird dies sofort an den Jobmanager<br />

gemeldet. Dazu wird ein leerer Job, mit<br />

dem Park-Flag, zurückgemeldet.<br />

Sobald der Portalkran wieder<br />

vollständig einsatzbereit ist, wird dies<br />

dem Jobmanager auf die gleiche Weise<br />

mitgeteilt. Dieses Verhalten hat zur<br />

Folge, dass die Entscheidung welcher<br />

Portalkran einen Job bearbeitet vom<br />

Jobmanager getroffen werden kann,<br />

wodurch Optimierungspotential in<br />

Hinsicht auf die Gesamtsystemgeschwindigkeit<br />

besteht. Zusätzlich hat<br />

dieses zentrale Design rund um den<br />

Jobmanager eine asynchrone<br />

Kommunikation, der in getrennten<br />

Threads laufenden SPSK, erübrigt.<br />

Da das SPSG, welches die beiden<br />

Portalkräne steuert, die Koordinaten<br />

Abbildung 19: Aktivitätsdiagramm zu CSPS2PK1<br />

der Kettenförderer anders interpretiert<br />

als die Lagerverwaltung und das RBG-SPSG, muss vor dem Senden des Jobs noch ein Mapping der<br />

Koordinaten durchgeführt werden.<br />

3.6.3.4 ASPS3, CSPS3Prod und CSPS3Kom - Die Klassen zur Produktion und<br />

Kommisionierung<br />

Ebenso wie bei den beiden Portalkränen wurden für die Produktion und die Kommisionierung jeweils eine<br />

eigene Klasse spendiert. Gemeinsamkeiten wurden in der abstrakten Vaterklasse ASPS3 gebündelt.<br />

CSPS3Prod ist für die Produktion zuständig. Sie nimmt einen CSPS3ProdJob der im wesentlichen ein<br />

Bohrmuster enthält und reicht dies an das SPSG weiter.<br />

Seite 40 von 49


3 Modellierung und Realisierung<br />

Fehlersituationen sind nicht vorgesehen, evtl. auftretende Fehler werden direkt vom SPSG behandelt und<br />

nicht an den PC weitergemeldet.<br />

CSPS3Kom steuert die Kommisionierung. Hierbei muss dem SPSG lediglich mitgeteilt werden, ob es sich<br />

um eine Kommisionierung mit zwei oder drei beteiligten Containern handelt.<br />

Abbildung 21: Aktivitätsdiagramm zu CSPS3Kom<br />

Abbildung 20: Aktivitätsdiagramm zu<br />

CSPS3Prod<br />

Die Übergabe der Container vom Portalkran zur Kommisionierstrecke bzw. Produktionsstrecke handeln die<br />

SPSG autonom untereinander aus, so dass hier keine Notwendigkeit der Intervenierung für die CSPS3Kom<br />

besteht.<br />

Als Fehlersituation kann es vorkommen, dass ein Container verloren geht. Dies wird dem Jobmanager<br />

gemeldet, der daraufhin adäquat reagiert.<br />

3.6.3.5 CSPS4 - Einlagerung und Auslagerung<br />

Da das Design des SPS4G und somit auch die Schnittstelle dort hin etwas unglücklich ist, was leider durch<br />

mangelnde Spezifikation erst spät bekannt wurde musste hier ein etwas abweichendes Design verfolgt<br />

werden. Das SPS4G ist zum einen für das Einsortieren der Materialien in die vier Warteschlangen vor dem<br />

Portalkran auf der Einlagerungsseite verantwortlich, zum anderen auch für das Auslagern bestimmter<br />

Materialien aus dem System heraus.<br />

Die Vorgabe sieht es so vor, dass ein Material zur Auslagerung an das SPSG gemeldet wird. Daraufhin<br />

schleust das SPSG alle Materialien zur Einlagerung durch bis irgendwann das gesuchte Zielmaterial<br />

ausgeschleust wird. Dieses Ausschleusen wird vom SPSG gemeldet. Gleichzeitig werden alle Materialien<br />

die an den vier Einschleusebändern ankommen ebenfalls gemeldet.<br />

Seite 41 von 49


3 Modellierung und Realisierung<br />

Dadurch musste ein Satelliten-Thread zur Überwachung der asynchronen Rückmeldungen die von den<br />

Einlagerungsbändern kommen hinzugefügt werden, während der normale SPSK-Ablauf das Ausschleusen<br />

überwacht.<br />

Leider ist es nicht möglich, dem SPSG mehrere auszuschleusende Materialien zu übermitteln. Besser wäre<br />

in diesem Falle - aus PC-Steuerungssicht - entweder eine Queue-Verwaltung im SPSG oder ein Callback<br />

sobald ein Material am Ausschleuse-Sensor vorbeikommt, so dass für jedes Material mitgeteilt werden kann<br />

ob es ausgeschleust oder eingelagert werden soll. Dadurch könnte die Entscheidung dynamisch getroffen<br />

werden, in Abhängigkeit der Auslagerungsqueue die sowieso vom Jobmanager verwaltet wird. Der<br />

zusätzliche Satelliten-Thread hätte sich dadurch ebenfalls erübrigt.<br />

Abbildung 22: Aktivitätsdiagramm zu CSPS4<br />

Seite 42 von 49


4 Portierung auf das Zielsystem<br />

4 Portierung auf das Zielsystem<br />

Die Entwicklung der Anwendung fand unter Microsoft Windows XP mit Microsoft Visual Studio 2005 statt.<br />

Die erste Portierung auf das Zielsystem schlug nach vielen Versuchen fehl. Unter anderem ist auf dem<br />

Zielsystem ein anderes Betriebssystem installiert, als auf den Entwicklungsplattformen. Des Weiteren ist auf<br />

der Zielplattform nur Microsoft Visual Studio 6 verfügbar, was zu weiteren Portierungsproblemen, wegen<br />

diversen verschiedenen Versionen der einzelnen Komponenten (MFC, andere Libraries), führte.<br />

Mit einem Assistenten von Microsoft Visual Studio 2005 wurde ein Installationsassistent geschrieben, der<br />

automatisch, alle benötigten Ressourcen bereitstellt und auf der Zielsystem mitnimmt.<br />

Nach der Portierung wurden Tests durchgeführt, um die Kompatibilität der einzelnen Gruppen zu<br />

gewährleisten.<br />

Seite 43 von 49


5 Testdurchführung<br />

5 Testdurchführung<br />

Durch den nötigen umständlichen Installationsvorgang auf der Zielplatform entfiel die Möglichkeit unseren<br />

Code direkt zu debuggen. Unser Logging jedoch erlaubte es uns trotzdem Fehler zu lokalisieren. Diese<br />

Fehlersuche ist allerdings zur klassischen Variante extrem Zeit intensiv. Der Code musste auf einer<br />

Entwicklungsmaschine geändert, neu kompiliert, gelinkt und zuletzt wieder auf dem Zielsystem installiert<br />

werden, was eine Deinstallation voraussetzte.<br />

Weiterhin mussten auch die SPS – Gruppen anwesend sein um das ganze System zu testen.<br />

Aus diesem Grund wurden die Abstrakten Test SPS Klassen geschrieben. Diese ermöglichen das System<br />

ganz ohne IBS Steuerung zu betreiben. So konnten bereits etliche Speicherzugriffsfehler im vorab behoben<br />

werden. Sobald das Flag NOIBS in der stdafx.h definiert wird stellt das System auf Testbetrieb um, und es<br />

wird keine SPS mehr benötigt.<br />

ASPSMarker<br />

CSPS1NoIBS CSPS2PK1NoIBS CSPS2PK2NoIBS CSPS3KomNoIBS CSPS3ProdNoIBS CSPS4NoIBS<br />

«uses» «uses» «uses»<br />

SharedResourceManager<br />

Das Verhalten der einzelnen Test SPS Klassen bietet für dieses Release nur die Möglichkeit den fehlerfreien<br />

Fall zu simulieren. Weiterhin ist eine Auslagerung noch nicht möglich.<br />

Um eine Einlagerung zu simulieren mussten die SPS2 mit der SPS4 Daten austauschen, weshalb ein<br />

SharedResourceManager implementiert wurde. Dieser synchronisiert den Zugriff auf eine Liste in welche<br />

MaterialIDs eingefügt werden können. Die SPS4 entnimmt diese und meldet dem JobManager ein Material<br />

auf einem Band.<br />

In dem nächsten Release sollte das Verhalten der einzelnen Test SPS durch zufällige Fehlermeldungen<br />

erweitert werden.<br />

Seite 44 von 49


6 Zusammenfassung/Ausblick<br />

6 Zusammenfassung/Ausblick<br />

Unser Softwaresystem ist in der Lage Kommisionieraufträge und Produktionsaufträge zu bearbeiten. Dies<br />

schließt eine erfolgreiches Zusammenspiel mit dem RBG und dem Portalkran mit ein. Zum Testen der<br />

Einlagerung / Auslagerung fehlte uns die Zeit, so dass wir hier noch mit erheblichen Bugs rechnen müssen,<br />

die eine erfolgreiche Kooperation mit der SPS4 möglicherweise verhindern.<br />

Alles in allem war das <strong>Projekt</strong> sehr interessant und durchaus anspruchsvoll. Leider war es frustrierend, dass<br />

es kaum verwertbaren Vorgaben oder Spezifikationen für unsere Gruppe gab. Dies führte dazu, dass wir erst<br />

sehr spät - nachdem alle SPS-Gruppen ihre Automatenmodelle fertig gestellt hatten - unsere<br />

Aufgabenstellung erfassen konnten. Bei der Vorstellung der Automatenmodelle kam es zudem immer wieder<br />

zu Verzögerungen, so dass sich alleine dieser Prozess über drei Wochen hinzog. Durch diese Verspätung<br />

hatten wir gegen Ende zu wenig Zeit zum Implementieren und Testen. Während man die Implementierung,<br />

durch geschicktes Aufteilen in einzelne Aufgabenbereiche, größten Teils unabhängig von den anderen<br />

Teammitgliedern, mit Überstunden voran bringen konnte, war dies beim Testen am Modell nicht möglich, da<br />

hier stets alle SPS-Gruppen anwesend sein mussten, was verständlicherweise nur zum regulären Termin<br />

organisatorisch machbar war.<br />

Aufgrund dessen, dass wir erst sehr spät mit der Entwicklung anfangen konnten, blieb nicht genug Zeit eine<br />

brauchbare Testumgebung aufzubauen, so dass große Teile des Codes erst am Modell direkt getestet<br />

werden konnten. Dies erwies sich als sehr unpraktisch, da der betagte Zielrechner sowohl Hardware als<br />

auch softwareseitig für heute Verhältnisse sehr schlecht ausgestattet ist. Daher mussten wir bei jeder<br />

Änderung am Quellcode auf unseren Entwicklungsrechnern neu kompilieren und linken, eine Setup-Datei<br />

erstellen und diese dann über den Umweg eines Netzlaufwerks installieren, wobei der sehr knappe freie<br />

Speicherplatz auf der Festplatte zu einem Problem wurde.<br />

Ähnlich umständlich erwies sich das Handling mit der Datenbank, da auf dem Zielrechner kein Access<br />

verfügbar ist, musste auch hier jede Änderung durch Umkopieren über ein Netzlaufwerk auf den Ziel-PC<br />

übertragen werden.<br />

Zusammenfassend lässt sich sagen, dass das <strong>Projekt</strong> sehr interessant und anspruchsvoll war. Mit etwas<br />

mehr Zeit bzw. einer gründlichen Einführung und ggf. Vorführung des Modells hätten wir nicht so sehr unter<br />

Zeitdruck gestanden und auch einige Variationen und Optimierungen ausprobieren können.<br />

Seite 45 von 49


7 Literaturverzeichnis<br />

7 Literaturverzeichnis<br />

[MSDN] – Microsoft Developer Network Library<br />

[MFC] – MFC mit Visual C++ 6.0; Verlag: mitp; Autoren: Schmidberger(Hrsg.), Schippert,<br />

Kölle, Urban, Haberbosch, Thülly<br />

[VC6] – Visual C++ 6 in 21 Tagen; Verlag: Markt und Technik; Autoren: Davis, Chapman<br />

[ACC00] – Access 2000; Verlag: Markt und Technik; Autoren: Swillus, Rex-Vogel<br />

[ACC03] – Das Access 2003 Entwicklerbuch; Verlag: Addison-Wesley; Autor: Minhorst<br />

Seite 46 von 49


8 Anhänge<br />

8 Anhänge<br />

Tabelle 1: Schnittstelle SPS-1 / PC<br />

Schnittstelle SPS-1 / PC<br />

Binärstelle<br />

Zustand 64 32 16 8 4 2 1<br />

Name Nummer online bereit gabel qFehler zFehler initFehler autftragsFehler Binäräquvalent<br />

init 1 0 0 X 0 0 0 0 0; 16<br />

bereit 2 1 1 0 0 0 0 0 96<br />

paletteHolen 3 1 0 0 0 0 0 0 64<br />

paletteBringen 4 1 0 1 0 0 0 0 80<br />

rbgStoerungsStop 5 0 0 X 0 0 1 0 18; 2<br />

fehlerQuellplatzLeer 6 1 0 0 1 0 0 0 72<br />

fehlerZielplatzVoll 7 1 0 1 0 1 0 0 84<br />

bereitFuerEntladung 8 1 1 1 0 1 0 0 116<br />

auftragsdatenFehlerhaft1 10 1 0 0 0 0 0 1 65<br />

auftragsdatenFehlerhaft2 11 1 0 1 0 1 0 1 85<br />

Tabelle 2: Schnittstelle SPS-2 / PC<br />

Schnittstelle SPS-2 / PC<br />

LK 1<br />

Binärstelle<br />

Zustand 4 2 1<br />

Name Nummer lk1Online lk1Bereit lk1Fehler Binäräquvalent<br />

lk1Init 1 0 0 0 0<br />

lk1Bereit 2 1 1 0 6<br />

lk1AuftragBearbeiten 3 1 0 0 4<br />

lk1MaterialVerlohren 4 1 0 1 5<br />

LK 2<br />

Binärstelle<br />

Zustand 16 8 4 2 1<br />

Name Nummer lk1Online lk1Bereit lk2MFehler lk2Wechsel lk2Geparkt Binäräquvalent<br />

lk2Init 5 0 0 0 0 0 0<br />

lk2Bereit 6 1 1 0 0 0 24<br />

lk2AuftragBearbeiten 7 1 0 0 0 0 16<br />

lk2Parken 8 0 0 0 1 0 2<br />

lk2Geparkt 9 0 0 0 0 1 1<br />

lk2Starten 10 0 0 0 1 1 3<br />

lk2MaterialVerlohren 11 1 0 1 0 0 20<br />

Seite 47 von 49


8 Anhänge<br />

Tabelle 3: Schnittstelle SPS-3 / PC<br />

Schnittstelle SPS-3 / PC<br />

Kommissionierung<br />

Binärstelle<br />

Zustand 4 2 1<br />

Name Nummer lk1Online lk1Bereit lk1Fehler Binäräquvalent<br />

komInit 1 0 0 0 0<br />

komBereit 2 1 1 0 6<br />

kom3Bearbeten 3 1 0 0 4*<br />

kom2Bearbeten 4 1 0 0 4*<br />

komCaseLost 5 1 0 1 5<br />

*Zustände nach aussen identisch<br />

Fertigung<br />

Binärstelle<br />

Zustand 2 1<br />

Name Nummer lk2Online lk2Bereit Binäräquvalent<br />

fertInit 6 0 0 0<br />

fertBereit 7 1 1 3<br />

fertAuftragBearbeiten 8 1 0 2<br />

Tabelle 4: Schnittstelle SPS-4 / PC<br />

Schnittstelle SPS-4 / PC<br />

Auslagerung<br />

Binärstelle<br />

Zustand 4 2 1<br />

Name Nummer online bereit storno Binäräquvalent<br />

auslagerInit 1 0 0 0 0<br />

auslagerBereit 2 1 1 0 6<br />

auslagerAuftragBearbeiten 3 1 0 0 4<br />

auslagerStornoMelden 4 1 0 1 5<br />

Sorter Rückmeldungen<br />

Binärstelle<br />

Zustand 1<br />

Name Nummer dataValid Binäräquvalent<br />

sorterWait 5 0 0<br />

sorterSignal 6 1 1<br />

Seite 48 von 49


8 Anhänge<br />

Drei Wege Handshake-Protokol zur Absicherung der<br />

Kommando- und Meldungsübertragung<br />

Data<br />

Data Strobe<br />

Vom Sender<br />

zum<br />

Empfänger<br />

ACK<br />

Vom<br />

Empfänger<br />

zum Sender<br />

DS ACK Beschreibung<br />

0 0 Sender darf senden<br />

1 0 Daten valide vom Sender angelegt<br />

1 1 Empfänger hat Daten gelesen: Sender darf Reset einleiten<br />

0 1 Reset-Bedingung: Empfänger muss ACK auf 0 setzen<br />

Abbildung 23: Drei Wege Handshake-Protokoll<br />

Seite 49 von 49

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!