Projekt Dokumentation - Übersicht Projekte
Projekt Dokumentation - Übersicht Projekte
Projekt Dokumentation - Übersicht Projekte
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