DIPLOMARBEIT Entwicklung von Softwarekomponenten zur vertikalen Integration von Maschinen und Anlagen im Produktionsumfeld der Fischer GmbH durchgeführt am Studiengang Telekommunikationstechnik und –systeme an der Fachhochschule Salzburg vorgelegt von Rainer Itzinger Leiter des Studiengangs: Betreuer: Prof. Dipl.-Ing. Dr. Gerhard Jöchtl Prof. Dipl.-Ing. Dr. Thomas J. Heistracher Salzburg, Juni 2006 Danksagung Seite - I - Danksagung Ich möchte mich herzlich bei allen Menschen bedanken, die zum Gelingen dieser Diplomarbeit beigetragen haben sowie den erfolgreichen Abschluss des Studiums ermöglichten. Allen voran danke ich meiner Freundin Gertraud für ihre Unterstützung und ihr Verständnis während der gesamten Studienzeit. Ihr Rückhalt und Ansporn gab mir stets die notwendige Kraft und Motivation. Herrn Prof. Dipl.-Ing. Dr. Thomas J. Heistracher danke ich für seine Bereitschaft die Diplomarbeitsbetreuung kurzfristig zu übernehmen. Abschließend möchte ich mich bei allen Mitarbeitern der FH Salzburg bedanken, ohne die ein Studiengang für Berufstätige erst gar nicht möglich wäre. Eidesstattliche Erklärung Seite - II - Eidesstattliche Erklärung Hiermit versichere ich, Rainer Itzinger, geboren am 07.02.1978 in Schärding, dass die vorliegende Diplomarbeit von mir selbstständig verfasst wurde. Zur Erstellung wurden von mir keine anderen, als die angegebenen Quellen und Hilfsmittel verwendet. ________________________ ________________________ Rainer Itzinger Matrikelnummer Informationen Seite - III - Informationen Vor- und Zuname: Rainer Itzinger Institution: FH-Salzburg Fachhochschulgesellschaft mbH Studiengang: Telekommunikationstechnik und –systeme Titel der Diplomarbeit: Entwicklung von Softwarekomponenten zur vertikalen Integration von Maschinen und Anlagen im Produktionsumfeld der Fischer GmbH Betreuer an der FH: Prof. Dipl.-Ing. Dr. Thomas J. Heistracher Betreuer in der Firma: Mag. Dr. Matthias Gruber Schlagwörter 1. Schlagwort: Vertikale Integration 2. Schlagwort: Softwarekomponenten 3. Schlagwort: OPC (Openess, Productivity and Collaboration) Abstract This diploma thesis describes the design and implementation of software components which are the basis for efficient application development in an industrial environment. The technical and economical requirements lead to the discussion of possible solutions. A comparison between J2EE (Java 2 Enterprise Edition) and Microsoft’s .NET component model results in the selection of an integrated development environment (IDE). The theoretical background deals with DCOM (distributed component object model) and the .NET framework as base technologies for software component development on a Microsoft Windows system. The term “vertical integration” and OPC (openess, productivity and collaboration), as standard technology for vendor independent PLC (programmable logic controller) communication, are introduced. The implementation part includes UML (unified modelling language) and the ER (entity relationship) schemes of the software components and the database. The development of a component-based real life application concludes the practical part of the thesis. The thesis closes with an outlook to possible extensions in the future. Inhaltsverzeichnis Seite - IV - Inhaltsverzeichnis Danksagung ............................................................................................................................I Eidesstattliche Erklärung.......................................................................................................II Informationen ...................................................................................................................... III Schlagwörter........................................................................................................................ III Abstract................................................................................................................................ III Inhaltsverzeichnis ................................................................................................................ IV Abbildungsverzeichnis ........................................................................................................ VI Tabellenverzeichnis .......................................................................................................... VIII Listings ................................................................................................................................ IX 1. 2. 3. 4. Einleitung ...................................................................................................................... 1 1.1 Projektziele ............................................................................................................ 1 1.2 Motivation zum Thema ......................................................................................... 2 1.3 Inhalte der Diplomarbeit........................................................................................ 2 Systemanforderungen .................................................................................................... 3 2.1 Wirtschaftliche Rahmenbedingungen ................................................................... 4 2.2 Technische Anforderungen.................................................................................... 4 Beschreibung möglicher Lösungswege ......................................................................... 8 3.1 Entwicklungsplattform .......................................................................................... 8 3.2 Entwicklungsumgebung ...................................................................................... 13 3.3 Datenbanksystem................................................................................................. 13 3.4 OPC-Client-Komponenten .................................................................................. 14 Theoretischer Hintergrund........................................................................................... 15 4.1 5. Softwarekomponenten ......................................................................................... 15 4.1.1 Distributed Component Object Model ........................................................ 17 4.1.2 Microsoft .NET-Framework........................................................................ 24 4.2 Datenbanksysteme ............................................................................................... 30 4.3 Vertikale Integration............................................................................................ 33 4.3.1 IT Infrastruktur der Fischer GmbH ............................................................. 35 4.3.2 Speicherprogrammierbare Steuerungen ...................................................... 35 4.3.3 Openess, Productivity and Collaboration .................................................... 39 Implementierung der Lösung....................................................................................... 45 Inhaltsverzeichnis Seite - V - 5.1 Eingesetzte Softwareprodukte ............................................................................. 45 5.2 Designaspekte...................................................................................................... 46 5.2.1 Trennung der Funktionalitäten in Komponenten ........................................ 47 5.2.2 Designpatterns ............................................................................................. 50 5.2.3 Unabhängigkeit vom Datenbanksystem ...................................................... 51 5.3 Lokale Anwendungsdatenbank............................................................................ 53 5.3.1 Verwaltung der Produktionsdaten ............................................................... 53 5.3.2 Konfigurations-Tabellen.............................................................................. 55 5.4 Komponente OpcManager................................................................................... 62 5.4.1 Initialisierung............................................................................................... 62 5.4.2 Öffentliche Methoden, Eigenschaften und Ereignisse ................................ 63 5.5 Komponente DataManager.................................................................................. 63 5.5.1 Initialisierung............................................................................................... 64 5.5.2 Öffentliche Methoden, Eigenschaften und Ereignisse ................................ 64 5.6 6. Komponente MachineManager ........................................................................... 64 5.6.1 Initialisierung............................................................................................... 65 5.6.2 Öffentliche Methoden, Eigenschaften und Ereignisse ................................ 66 Anwendung der Softwarekomponenten ...................................................................... 67 6.1 Aufbau der Demonstrationsanwendung .............................................................. 67 6.2 Test der Leitrechneranwendung .......................................................................... 68 6.3 Zusammenfassung ............................................................................................... 70 7. Ausblick....................................................................................................................... 71 Literaturverzeichnis ............................................................................................................. 73 Abkürzungsverzeichnis ....................................................................................................... 75 Anhang ................................................................................................................................ 77 A. Beschreibung der Daten- und Konfigurationstabellen ............................................ 77 B. Öffentliche Methoden, Eigenschaften und Ereignisse der Komponenten............... 81 C. Vollständige UML-Klassendiagramme................................................................... 90 D. Screenshots der Demonstrationsanwendung ........................................................... 93 Abbildungsverzeichnis Seite - VI - Abbildungsverzeichnis Abbildung 2.1: Systemumfeld der Softwarekomponenten ................................................... 3 Abbildung 2.2: Ablauf einer Datenanfrage ........................................................................... 5 Abbildung 4.1: Entwicklungswege von DCOM ................................................................. 17 Abbildung 4.2: Darstellungsarten einer COM Komponente ............................................... 19 Abbildung 4.3: CLSID-Eintrag in der Windows-Registry.................................................. 19 Abbildung 4.4: Schnittstelle IUnknown .............................................................................. 21 Abbildung 4.5: IID-Eintrag von IUnknown in der Windows-Registry............................... 22 Abbildung 4.6: Assemblies als Weitergabeeinheit [Löwy05]............................................. 27 Abbildung 4.7: Client und Server Assemblies [Löwy05] ................................................... 27 Abbildung 4.8: Verschiedene Assembly Kompositionen [Löwy05] .................................. 28 Abbildung 4.9: Datenbanksystem ....................................................................................... 30 Abbildung 4.10: ER-Modell einer Tabellenbeziehung ....................................................... 31 Abbildung 4.11: Data provider in .NET [Hami03] ............................................................ 32 Abbildung 4.12: Automatisierungsebenen in Produktionsbetrieben [Seit03]..................... 33 Abbildung 4.13: Beispielkonfiguration eines SPS-Systems [Bern06] ................................ 36 Abbildung 4.14: Verfügbare und in Arbeit befindliche OPC-Spezifikationen [Iwan05].... 40 Abbildung 4.15: OPC-DA-Server – Namensraum und Objekthierarchie [Iwan05] ........... 42 Abbildung 4.16: Zugriff auf OPC-DCOM-Server mit .NET-Komponenten [Iwan05]....... 44 Abbildung 5.1: Architekturübersicht einer komponentenbasierten Leitrechneranwendung47 Abbildung 5.2: Befüllung, Aktualisierung und Bereinigung der Tabelle MachineData..... 54 Abbildung 5.3: Konfigurationstabellen der Komponente OpcManager ............................. 56 Abbildung 5.4: Beispielkonfiguration der Komponente OpcManager ............................... 57 Abbildung 5.5: Konfigurationstabellen der Komponente DataManager............................. 58 Abbildung 5.6: Beispielkonfiguration der Komponente DataManager............................... 59 Abbildung 5.7: Konfigurationstabellen der Komponente MachineManager ...................... 60 Abbildung 5.8: Beispielkonfiguration der Komponente MachineManager ........................ 61 Abbildung 5.9: UML-Klassendiagramm OpcManager ....................................................... 62 Abbildung 5.10: UML-Klassendiagramm DataManager .................................................... 63 Abbildung 5.11: UML-Klassendiagramm MachineManager.............................................. 65 Abbildung 6.1: Umfeld der entwickelten Leitrechneranwendung ...................................... 67 Abbildung 6.2: Aufzeichnung des Speicherbedarfs der Leitrechneranwendung ................ 70 Abbildungsverzeichnis Seite - VII - Abbildung C.1: UML-Klassendiagramm OpcManager ...................................................... 90 Abbildung C.2: UML-Klassendiagramm DataManager ..................................................... 91 Abbildung C.3: UML-Klassendiagramm MachineManager ............................................... 92 Abbildung D.1: Demonstrationsanwendung – Anlagenübersicht ....................................... 93 Abbildung D.2: Demonstrationsanwendung – Übersicht Schwabbelmaschine .................. 94 Abbildung D.3: Demonstrationsanwendung – Übersicht Entgratmaschine........................ 95 Abbildung D.4: Demonstrationsanwendung – Übersicht Schleifmaschine ........................ 96 Abbildung D.5: Demonstrationsanwendung – Auftragsübersicht....................................... 97 Abbildung D.6: Demonstrationsanwendung – Auftragsdetails........................................... 98 Abbildung D.7: Demonstrationsanwendung – Aufträge in Maschinen .............................. 99 Tabellenverzeichnis Seite - VIII - Tabellenverzeichnis Tabelle 1.1: Produktionszahlen der Fischer GmbH............................................................... 1 Tabelle 3.1: Bewertungsmatrix J2EE vs. .NET................................................................... 12 Tabelle 4.1: OPC Spezifikationen – Bedeutung und Freigabestatus (02/2006) [Iwan05] .. 41 Tabelle 5.1: Eingesetzte Softwareprodukte ......................................................................... 46 Tabelle 6.1: Verwendete Hardware im Testaufbau ............................................................. 68 Tabelle A.1: Zwingend erforderliche Felder der Tabelle MachineData ............................. 77 Tabelle A.2: Felder der Tabelle Config_OpcConnections .................................................. 77 Tabelle A.3: Felder der Tabelle Config_OpcGroups .......................................................... 78 Tabelle A.4: Felder der Tabelle Config_OpcItems ............................................................. 78 Tabelle A.5: Felder der Tabelle Config_DataProcedureCalls............................................. 78 Tabelle A.6: Felder der Tabelle Config_DataFileTransfer ................................................. 78 Tabelle A.7: Felder der Tabelle Config_MachineInterfaceItems........................................ 79 Tabelle A.8: Felder der Tabelle Config_MachineDataItems .............................................. 80 Tabelle A.9: Felder der Tabelle Config_MachineFileDownload........................................ 80 Tabelle B.1: Öffentliche Methoden der Komponente OpcManager ................................... 81 Tabelle B.2: Öffentliche Eigenschaften der Komponente OpcManager............................. 82 Tabelle B.3: Öffentliche Ereignisse der Komponente OpcManager................................... 82 Tabelle B.4: Öffentliche Methoden der Komponente DataManager .................................. 84 Tabelle B.5: Öffentliche Eigenschaften der Komponente DataManager ............................ 84 Tabelle B.6: Öffentliche Ereignisse der Komponente DataManager .................................. 85 Tabelle B.7: Öffentliche Methoden der Komponente MachineManager ............................ 87 Tabelle B.8: Öffentliche Eigenschaften der Komponente MachineManager...................... 88 Tabelle B.9: Öffentliche Ereignisse der Komponente MachineManager............................ 89 Listings Seite - IX - Listings Listing 4.1: Beispielcode “Hello World” in C#................................................................... 25 Listing 4.2: Beispielcode “Hello World” in MSIL.............................................................. 25 Listing 4.3: SPS Programmierung im Kontaktplan ............................................................. 38 Listing 4.4: SPS Programmierung mit Automation Basic................................................... 38 Listing 5.1: Singleton Implementierung in C# .................................................................... 50 Listing 5.2: Observer-Pattern – DataManager Klasse ......................................................... 51 Listing 5.3: Observer-Pattern – Client Klasse ..................................................................... 51 Listing 5.4: Verwendung von Providerfactories in ADO.NET 2.0 ..................................... 52 Listing 5.5: Initialisierung der Komponente OpcManager.................................................. 63 Listing 5.6: Initialisierung der Komponente DataManager................................................. 64 Listing 5.7: Initialisierung der Komponente MachineManager .......................................... 66 1. Einleitung 1. Seite - 1 – Einleitung Die Produkte der Fischer GmbH1 unterliegen jährlich kollektionsbedingten Modifikationen und Variationen. Eine Massenproduktion der unterschiedlichen Artikel mit einer minimalen Losgröße von eins erfordert die Übergabe von produktbezogenen Produktionsparametern an die Maschinen und Anlagen im Fertigungsprozess. Für die konsistente Datenanbindung der heterogenen Produktionsebene an die Business ITSysteme, in denen die Daten erfasst werden, sind je nach Produktionsbereich eine oder mehrere Schnittstellenanwendungen erforderlich. Die Entwicklungskosten dieser Anwendungen sollen durch den Einsatz von Softwarekomponenten minimiert werden. Die Fischer GmbH mit ihrem Hauptsitz in Ried im Innkreis ist weltweit der größte Produzent von Alpin- und Langlaufskiern. An den Produktionsstandorten Ried und Mukachevo (Ukraine) wurden im Geschäftsjahr 2005/2006 insgesamt rund 1.800.000 Paar Alpin- und Langlaufski gefertigt. Geschäftsjahr 2005/2006 Ziel Geschäftsjahr 2006/2007 Umsatz Alpin 97.400.000 € 104.000.000 € Umsatz Nordisch 57.000.000 € 61.900.000 € Stückzahlen Gesamt 1.800.000 Paar 1.850.000 Paar Tabelle 1.1: Produktionszahlen der Fischer GmbH 1.1 Projektziele Ziel der Diplomarbeit „Entwicklung von Softwarekomponenten zur vertikalen Integration von Maschinen und Anlagen im Produktionsumfeld der Fischer GmbH“ ist die Entwicklung von Softwarebausteinen um Applikationen zur Datenanbindung von Maschinen und Anlagen effizient erstellen zu können. In weiterer Folge werden diese Applikationen als Leitrechneranwendungen bezeichnet. Im Rahmen des Projektes sollen abgeleitet aus den technischen und wirtschaftlichen Anforderungen der Fischer GmbH, die Basisfunktionalitäten einer Leitrechneranwendung in verschiedene Komponenten gekapselt werden. Die Plattform- sowie Designentscheidungen sind hierbei in Bezug auf die Anforderungen nachvollziehbar zu dokumentieren. Eine produktiv eingesetzte 1 http://www.fischer-ski.com 1. Einleitung Seite - 2 – Leitrechneranwendung soll bei Projektabschluss die Leistungsfähigkeit der entwickelten Komponenten zeigen. 1.2 Motivation zum Thema Die 3-Schicht Produktion der Fischer GmbH erfordert eine Verfügbarkeit der Leitrechneranwendungen bis zu 24 Stunden am Tag 365 Tage im Jahr. Die Entwicklung von Softwarekomponenten, welche als Basis für diese Anwendungen dienen, stellt eine große Herausforderung dar. Die Umsetzung der festgelegten Anforderungen erfordert das Einarbeiten in neue Technologien wie OPC (Openess, Productivity and Collaboration) sowie das Erlernen der .NET-Programmiersprache C#. Die Kombination der verschiedenen Technologien in einem produktiven System stellte den stärksten Motivationsfaktor für den Autor dar. 1.3 Inhalte der Diplomarbeit Die Arbeit beschreibt das Design und die Implementierung von Softwarebausteinen, welche als Basis für Leitrechneranwendungen zur Produktionsdatenanbindung von Maschinen oder Anlagen dienen. Die Anforderungen in wirtschaftlicher sowie technischer Hinsicht leiten zur Beschreibung der möglichen Lösungswege über. Ein Vergleich der Komponentenmodelle J2EE (Java 2 Enterprise Edition) und .NET resultiert in der Auswahl einer entsprechenden Entwicklungsumgebung. Das zu verwendende OPC-ClientToolkit sowie das Datenbanksystem wurden, auf Basis der getroffenen Technologieentscheidung, durch die Fischer GmbH vorgegeben. Der theoretische Hintergrund beschreibt DCOM (Distributed Component Object Model) und das .NETFramework als Basistechnologien der Komponentenentwicklung unter Microsoft Windows sowie den Begriff „Vertikale Integration“ und die Technologiestandards zu deren Umsetzung. Speziell OPC wird in diesem Rahmen als Satz von Spezifikationen zur herstellerunabhängigen Kommunikation mit verschiedensten Maschinensteuerungen genauer betrachtet. Im Teil der Implementierung wird das Software- und Datenbankdesign der einzelnen Komponenten mittels UML-Diagrammen (Unified Modeling Language) bzw. ER-Modellierung (Entity Relationship) beschrieben. Eine Übersicht über die Softwarekomponenten sowie deren Anwendung in einer in der Praxis eingesetzten Leitrechneranwendung schließen den praktischen Teil der Arbeit ab. Der Ausblick zeigt das Weiterentwicklungspotential der komponentenbasierten Leitrechneranwendungen auf. 2. Systemanforderungen 2. Seite - 3 – Systemanforderungen Zur erfolgreichen Abwicklung eines Softwareprojekts ist die konkrete Definition der Produktanforderungen erforderlich. Während der Projektstartphase wurden diese mit den Verantwortlichen der Fischer GmbH besprochen und fixiert. Abbildung 2.1 zeigt das Systemumfeld, in dem die Softwarekomponenten zum Einsatz kommen. Die Auftrags- und Artikelstammdaten sowie die Produktionsdaten werden in einem Oracle-Datenbanksystem verwaltet. Zur Datenerfassung wird überwiegend das ERP-System (Enterprise Ressource Planning) „JD Edwards EnterpriseOne“1 verwendet. Weitere Datenerfassungsmasken bzw. Systemschnittstellen ermöglichen die manuelle oder automatische Übergabe produktionsrelevanter Daten, welche nicht durch das ERP-System verwaltet werden. Als Beispiel können hier Konstruktionsdaten aus dem CAD-System (Computer Aided Design) genannt werden. Abbildung 2.1: Systemumfeld der Softwarekomponenten Aufgabe einer Leitrechneranwendung ist die Kopplung des Datenbestands der Business ITSysteme mit der heterogenen Hard- und Softwarewelt der Feldebene. Neben dem Datenaustausch mit den Steuerungssystemen, muss eine Leitrechneranwendung auch anwendungsspezifische ermöglichen. 1 Die Benutzerinteraktionen Erstellung der während Anwendungen http://www.oracle.com/applications/jdedwards-enterprise-one.html soll des durch Produktionsprozesses den Einsatz von 2. Systemanforderungen Seite - 4 – Softwarekomponenten vereinfacht und effizient gestaltet werden. Während der Definition der Anforderungen wurden neben den technischen Ablaufbeschreibungen und Kriterien auch wirtschaftliche Rahmenbedingungen seitens der Fischer GmbH vorgegeben. 2.1 Wirtschaftliche Rahmenbedingungen Um die Entwicklung der Softwarekomponenten zu ermöglichen, investiert die Fischer GmbH in neue Softwareprodukte. Im Rahmen der Diplomarbeit soll eine Technologieentscheidung zwischen Java 2 Enterprise Edition1 und Microsoft .NET2 getroffen werden. In wirtschaftlicher Hinsicht sind bei der Anschaffung von Softwareprodukten minimale Lizenzkosten bei maximaler Investitionssicherheit anzustreben. Bei der Auswahl des Komponentenmodells und der Entwicklungsumgebung sind diese Aspekte zu berücksichtigen. Abgesehen von den Anschaffungskosten und den laufenden Folgekosten der neuen Softwareprodukte sind auch die Aufwendungen für die interne bzw. externe Ausbildung der Mitarbeiter der Fischer GmbH zu berücksichtigen. Der Einsatz von Standardprodukten soll die Verfügbarkeit von Personen mit entsprechenden Basisqualifikationen am Arbeitsmarkt garantieren. 2.2 Technische Anforderungen Zur Erläuterung der einzelnen technischen Anforderungen an ein Leitrechnersystem müssen zuerst die Zielsetzungen der Gesamtanwendung besprochen werden. Grundlegende Funktion einer Leitrechneranwendung produktspezifischen Produktionsparametern Steuerungssysteme der angebundenen und ist Daten Maschinen und auf der die Transfer von verschiedenen Anlagen. An eine Leitrechneranwendung müssen eine oder mehrere Maschinen angebunden werden können. Der Datentransfer wird durch die Anfrage einer Maschinensteuerung initiiert. Die einzelnen Maschinen und Anlagen sind hierfür mit Sensoren zur Produkterkennung ausgestattet. Derzeit werden Barcodelesegeräte eingesetzt, welche über industrielle Bussysteme angebunden sind. Die Leitrechneranwendungen müssen vom Typ und dem Hersteller des Steuerungssystems unabhängig sein. Die Art der Anbindung der Sensoren an das Steuerungssystem darf ebenfalls keine Rolle spielen. 1 http://www.sun.com 2 http://www.microsoft.com 2. Systemanforderungen Seite - 5 – Die Leitrechneranwendung muss aus in verschiedenen Oracle-Tabellen verteilten Produktdaten einen Datensatz mit allen relevanten Produktionsdaten generieren können. Diese Datensätze sollen lokal am Leitrechner verwaltet werden. Eine Maschinensteuerung hält mehrere Parametersätze für entsprechende Produktkennungen lokal in einer Art Pufferspeicher. Das Flussdiagramm in Abbildung 2.2 zeigt symbolisch den Ablauf einer Datenanfrage. Im Diagramm steht die Abkürzung SPS für „Speicherprogrammierbare Steuerung“ und bezeichnet allgemein die Maschinensteuerungssysteme. Abbildung 2.2: Ablauf einer Datenanfrage 2. Systemanforderungen Seite - 6 – Nach der Übergabe des zu bearbeitenden Produkts erfasst die Maschine mit Hilfe der entsprechenden Sensorik die aufgebrachte Produktkennung. Anschließend wird überprüft, ob Daten für die Produktkennung bereits auf der Maschine verfügbar sind. Zu diesem Zweck wird auf der Maschinensteuerung der oben erwähnte Puffer für verschiedene Sätze von Produktionsparametern durchsucht. Sollte der passende Parametersatz bereits vorhanden sein, werden die Daten unmittelbar für die Bearbeitung übernommen. Ist dies nicht der Fall, stellt die Maschinensteuerung eine Anfrage an die Leitrechneranwendung. Die beschriebene lokale Speicherung mehrerer Parametersätze auf der Maschinensteuerung hat entscheidende Vorteile. Die Leitrechneranwendung wird entlastet, da nicht für jedes einzelne Produkt eines Loses die entsprechenden Daten gesucht und zur Steuerung übertragen werden müssen. Der Leitrechner kann somit auch während der laufenden Produktion für kurze Zeit, z.B. zur Durchführung von Wartungsarbeiten, deaktiviert werden. Erhält die Leitrechneranwendung eine Anfrage von einer Maschinensteuerung wird der lokale Datenspeicher auf dem Leitrechner nach den entsprechenden Parametersatz durchsucht. Werden Daten gefunden schreibt die Leitrechneranwendung diese in einen freien Pufferplatz auf der Maschinensteuerung und gibt eine entsprechende Rückmeldung an die SPS. Sollten keine Daten vorhanden sein, wird ein Fehler an die Steuerung gemeldet. In diesem Fall muss eine anlagenspezifische Fehlerbehandlung auf der Maschinensteuerung erfolgen. Durch die lokale Verwaltung der Produktionsparameter auf dem Leitrechner wird eine gewisse Unabhängigkeit vom Intranet der Fischer GmbH erreicht. Eine Verbindung zum Datenbankserver ist nur für das Laden und Aktualisieren der Daten notwendig. Dies geschieht in der Regel einmal täglich. Wartungsarbeiten am Oracle-Server beinträchtigen somit die Produktion nicht. Als weiterer Vorteil kann die erhöhte Flexibilität bei der Inbetriebnahme von Neumaschinen genannt werden. Der Leitrechner kann eigenständig im Haus des Maschinenbauers verwendet werden, sofern ein erstmaliges Laden der Daten bei bestehender Netzwerkverbindung im Hausnetz der Fischer GmbH erfolgt ist. Bei der Konzeption des lokalen Datenspeichers muss die einfache Erweiterbarkeit um zusätzliche Produktionsparameter berücksichtigt werden. 2. Systemanforderungen Seite - 7 – Zusammenfassend können folgende technische Kriterien für die Basiskomponenten einer Leitrechneranwendung hervorgehoben werden: Die • Unabhängigkeit von der Datenherkunft der Produktionsdaten • Lokale Datenspeicherung auf dem Leitrechner • Unabhängigkeit vom Hersteller und der Type der Maschinensteuerungssysteme genannten Kriterien komponentenbasierte untersteichen die Leitrechneranwendungen Zielsetzung in der verschiedensten Fischer GmbH Bereichen des Produktionsumfeldes einzusetzen. Neben der effektiveren Anwendungsentwicklung soll die Verwendung von einheitlichen, jedoch sehr flexibel gestalteten Softwarebausteinen zu einer gesteigerten Wartbarkeit der einzelnen Anwendungen führen. 3. Beschreibung möglicher Lösungswege 3. Seite - 8 – Beschreibung möglicher Lösungswege Dieser Abschnitt der Diplomarbeit erläutert die getroffenen Technologieentscheidungen hinsichtlich des Komponentenmodells und der verwendeten Entwicklungsumgebung. Bezüglich des Datenbanksystems und der zu verwendenden OPC-Client-Komponenten erfolgten feste Vorgaben durch die Fischer GmbH. Aus diesem Grund werden diese Punkte nur kurz kommentiert. 3.1 Entwicklungsplattform Der für die Automatisierungstechnik zuständige Bereich der Fischer GmbH hat bisher zur Entwicklung von Softwarelösungen vorwiegend die Entwicklungsumgebung Microsoft Visual Studio 6.0 und die Programmiersprache Microsoft Visual Basic 6.0 verwendet. Als Basis der komponentenorientierten Softwareentwicklung wurde DCOM eingesetzt. Im Rahmen der Diplomarbeit soll die Leistungsfähigkeit der modernen Entwicklungsplattformen Java 2 Enterprise Edition (J2EE) und Microsoft .NET in Hinblick auf die Anforderungen der Fischer GmbH kritisch betrachtet werden. Die Softwarebausteine sollen als erste Referenzentwicklung den Wechsel zu einer neuen Basistechnologie für die Softwareentwicklungen der Fischer GmbH unterstreichen. Zur Entscheidungsfindung wurden die Entwicklungsplattformen anhand verschiedener technischer und kaufmännischer Kriterien verglichen. Die allgemeine Diskussion und Einzelbewertung der Punkte Plattformunabhängigkeit, Entwicklungsumgebung(en), Programmiersprachen, Datenbankzugriff, OPC Verfügbarkeit, Produktkosten sowie Schulungskosten leitet zur Produktauswahl über. Die Argumentation der einzelnen Diskussionspunkte ergibt sich aus den spezifischen Anforderungen der Fischer GmbH. Plattformunabhängigkeit Im Desktop- und Automatisierungstechnikbereich setzt die Fischer GmbH auf eine homogene Microsoft-Umgebung mit Windows-Betriebssystemen in den Versionen 2000 und XP. Zur Anbindung der heterogenen Feldebene, mit Steuerungssystemen verschiedenster Hersteller, kommen auf OPC basierende Softwareprodukte zum Einsatz. Da OPC auf den Microsoft Technologien OLE (Object Linking and Embedding) und DCOM basiert, ist der Einsatz von Windows als Betriebssystem auf den Leitrechnern 3. Beschreibung möglicher Lösungswege Seite - 9 – nahezu unumgänglich. Der Gesichtspunkt der Plattformunabhängigkeit spielt somit für die Fischer GmbH nur eine untergeordnete Rolle. Objektiv ist Java durch die Virtual Machine (VM) Implementierungen auf unterschiedlichsten Betriebssystemplattformen der stark an Windows gebundenen .NETTechnologie überlegen. Die oben erwähnten Technologien OLE, DCOM und OPC werden in Kapitel 4 der Diplomarbeit eingehend behandelt. Entwicklungsumgebung(en) Zur Entwicklung von Java-Applikationen stehen eine Vielzahl von Entwicklungsumgebungen zur Auswahl. Neben den weit verbreiteten Open-Source Varianten Eclipse1 und NetBeans2 können auch kommerzielle Produkte wie das Sun Java Studio3 oder IBMs WebSphere Developer4 zum Einsatz kommen. Die Erweiterbarkeit und anwenderspezifische Abstimmung der einzelnen Umgebungen wird durch Plugins ermöglicht. Die Entwicklung grafischer Benutzeroberflächen basiert je nach Entwicklungsumgebung auf den unterschiedlichen Java GUI Bibliotheken (Graphical User Interface) Swing bzw. SWT (Standard Widget Toolkit). Eine Technologieentscheidung für eine Java-Entwicklungsumgebung ist gemäß den unterschiedlichen Funktionsumfängen sowie den Kriterien Handhabung und Kosten zu treffen. Für .NET bietet Microsoft mit Visual Studio .NET 2005 eine integrierte Entwicklungsumgebung zur Erstellung von Windows- und Webanwendungen. Als Weiterentwicklung von Visual Studio 6.0 ermöglicht die IDE (Integrated Development Enviroment) eine äußerst komfortable Entwicklung von .NET basierenden Komponenten und Programmen. Visual Studio .NET 2005 wird von Microsoft in verschiedenen Editionen vertrieben. Beginnend mit den kostenlosen Express Editionen der verschiedenen .NET-Programmiersprachen bis hin zum Visual Studio 2005 Team System, welches die teamorientierte Softwareentwicklung unterstützt, kann die Entwicklungsumgebung entsprechend den Anforderungen eines Unternehmens gewählt werden. Mit SharpDevelop5 steht neben den kommerziellen Microsoft-Produkten eine Open-Source-IDE für .NET zur Verfügung. Zur Erstellung grafischer Benutzeroberflächen 1 http://www.eclipse.org 2 http://www.netbeans.org 3 http://www.sun.com 4 http://www.ibm.com 5 http://www.icsharpcode.net 3. Beschreibung möglicher Lösungswege Seite - 10 – wird von beiden Produkten einheitlich die Windows.Forms Bibliothek des .NETFrameworks verwendet. Aus der Betrachtung der Entwicklungsumgebungen geht kein eindeutiger „Sieger“ hervor. Zusammenfassend kann bemerkt werden, dass sowohl für J2EE als auch für .NET ausgereifte und äußerst umfangreiche Umgebungen zur Unterstützung der Entwicklungsarbeit verfügbar sind. Programmiersprachen Die Programmiersprachen beider Plattformen ermöglichen die komponentenbasierte Softwareentwicklung und sind in vollem Umfang objektorientiert. Die J2EE-Plattform ist auf die Programmiersprache Java beschränkt. Microsoft bietet im Rahmen von Visual Studio .NET 2005 ab der Standard Edition die Möglichkeit in den Sprachen C#, C++.NET, Visual Basic.NET und J#, einem Java Dialekt, zu programmieren. Lediglich die kostenlosen Express Editionen sind speziell zur Verwendung einer der genannten Sprachen ausgerichtet. Für die Fischer GmbH ergeben sich durch die erhöhte Flexibilität von .NET selbst beim anfänglichen Einsatz einer Express Edition Vorteile in Bezug auf zukünftige Weiterentwicklungen. Das Kriterium Programmiersprachen entscheidet sich somit zu Gunsten von Microsoft. Datenbankzugriff Mit JDBC (Java Database Connectivity) steht dem Java-Entwickler eine umfangreiche, universelle Schnittstelle zu Datenbanksystemen verschiedenster Hersteller zur Verfügung. Über die JDBC API (Application Programming Interface) werden der Verbindungsaufbau, die Verbindungsverwaltung und das Absetzen von Kommandos an das Datenbanksystem sowie die Übermittlung von Abfrageergebnissen an die Applikation gesteuert. Als Pendant bietet das Microsoft .NET-Framework eine mit dem Überbegriff ADO.NET bezeichnete API. ADO.NET stellt verschiedene data provider für den Zugriff auf einen Großteil der gängigen Datenbanksysteme bereit. In den Punkt Funktionsumfang und Handhabung kann sich keine API entscheidend abheben. 3. Beschreibung möglicher Lösungswege Seite - 11 – Der Zugriff auf die von der Fischer GmbH eingesetzten Datenbanksysteme Oracle1 und Microsoft Access ist, bei entsprechender Kenntnis der Klassenbibliotheken, mit beiden Plattformen in gleichem Maß zufrieden stellend möglich. Wie bereits bei den Entwicklungsumgebungen kann keine Plattform favorisiert werden. OPC Verfügbarkeit Wie bereits bei der Betrachtung der Plattformunabhängigkeit bemerkt wurde, werden zur Anbindung der Maschinensteuerungssysteme auf OPC basierende Softwareprodukte verwendet. Die Client/Server Architektur von OPC erfordert die Implementierung von OPC-Client-Funktionalitäten in den, im Rahmen der Diplomarbeit, zu entwickelnden Softwarekomponenten. Die Verfügbarkeit von OPC-Client-Toolkits zur einfachen und effizienten Umsetzung dieser Aufgabenstellung ist für die Fischer GmbH entscheidend. Der Markt für derartige Client Komponenten ist durch die historische Verflechtung von OPC mit der Microsoft-Technologie DCOM eindeutig zu Gunsten der .NET-Plattform ausgerichtet. Produktkosten Die Produktkosten als Ganzes werden maßgeblich durch die Kosten der Entwicklungsumgebung bestimmt. Um den Anforderungen der Fischer GmbH gerecht zu werden, bestehen bei beiden Plattformen preislich attraktive Möglichkeiten. Java bietet mit den Open-Source-IDEs solide Entwicklungswerkzeuge. Eine Investition in zusätzliche Tools ist nicht notwendig. Laufende Kosten fallen nicht an. Mit den Express Editionen von Visual Studio .NET geht auch Microsoft den Weg kostenlose Entwicklungsumgebungen zur Verfügung zu stellen. Erst bei Verwendung einer Standard Edition fallen Produkt- und Lizenzkosten an. Für die Entwicklung der Softwarekomponenten und der darauf basierenden Leitrechneranwendungen ist der Funktionsumfang der Express Editionen vollkommen ausreichend. Die Einschränkung hinsichtlich nur einer verfügbaren Programmiersprache kann von der Fischer GmbH akzeptiert werden. In Anbetracht der genannten Argumente ergibt sich insgesamt ein Vorteil für die J2EEUmgebungen. Die Investitionssicherheit wurde aufgrund der hohen Marktdurchdringung beider Technologien als gleichwertig eingestuft. 1 http://www.oracle.com 3. Beschreibung möglicher Lösungswege Seite - 12 – Schulungskosten Wie schon in der Einleitung zu diesem Abschnitt erwähnt wurde sind die Softwareentwickler der Fischer GmbH mit der Microsoft-Entwicklungsumgebung Visual Studio 6.0 vertraut. Der Umstieg auf die .NET-Plattform, mit einer sehr ähnlichen IDE, wird daher tendenziell als einfacher gegenüber dem Wechsel zu J2EE beurteilt. Der Schulungsaufwand für die J2EE-Plattform ist diesem Grund entscheidend höher einzuschätzen. Durch die strukturelle Ähnlichkeit der Programmiersprachen Java und C# kann davon ausgegangen werden, dass ein Java-Entwickler einen Umstieg auf .NET relativ rasch meistern kann. Bei der Ausschreibung einer Stelle muss daher hinsichtlich der Qualifikationen keine Einschränkung auf eine bestimmte Entwicklungsplattform in Kauf genommen werden. Die .NET-Plattform ist durch die genannten Aspekte als klarer „Sieger“ des Punktes Schulungskosten zu sehen. Bewertungsmatrix Ausgehend von den besprochenen Bewertungskriterien wurde eine Matrix zum Vergleich der beiden Entwicklungsplattformen erstellt. Die Gewichtung erfolgte gemäß den Vorgaben der Fischer GmbH. Die Bandbreite für die Gewichtung wurde mit „1“ als „eher unwichtig“ bis 5 als „sehr wichtig“ festgelegt. Die Plattformen konnten in den einzelnen Kategorien maximal 5 Punkte erreichen. Zur Ermittlung des Endergebnisses wurden die Einzelbewertungen mit der entsprechenden Gewichtung multipliziert und aufsummiert. Kriterium Gewicht J2EE Plattformunabhängigkeit Entwicklungsumgebung Programmiersprachen Datenbankzugriff OPC Verfügbarkeit Produktkosten Schulungskosten Summe 1 4 4 5 5 3 3 5 4 4 4 3 5 3 J2EE gewichtet 5 16 16 20 15 15 9 96 .NET 1 4 5 4 5 3 4 .NET gewichtet 1 16 20 20 25 9 12 103 Tabelle 3.1: Bewertungsmatrix J2EE vs. .NET Wie in Tabelle 3.1 ersichtlich ist, wurde die .NET-Plattform in der Summe der gewichteten Kriterien höher als die Java 2 Enterprise Edition bewertet. Auf der Basis dieses Resultats 3. Beschreibung möglicher Lösungswege Seite - 13 – wurde die Technologieentscheidung zu Gunsten von Microsoft .NET getroffen. Die Grundlagen der .NET-Technologie werden in Kapitel 4 der Diplomarbeit besprochen. 3.2 Entwicklungsumgebung Nachdem die Grundsatzentscheidung für eine .NET basierende Komponentenentwicklung gefallen war wurde von Seiten der Fischer GmbH C# als neue StandardProgrammiersprache definiert. Die verschiedenen Editionen von Visual Studio .NET wurden in Abschnitt 3.1 im Rahmen der Bewertung der verfügbaren Entwicklungsumgebungen evaluiert. Mit Visual C# Express 2005 wurde die kostenlose Basisvariante gewählt. Lediglich zur Erstellung der UML-Klassendiagramme in Abschnitt 5 wurde eine 90 Tage Testversion der Professional Edition verwendet. 3.3 Datenbanksystem Im Rahmen der Systemanforderungen in Abschnitt 2 der Diplomarbeit wird die lokale Speicherung der Produktionsdaten am Leitrechner gefordert. Die Notwendigkeit eines Datenbanksystems anstatt einer auf Dateien basierenden Speicherung ergibt sich anhand der folgenden Kriterien laut [Balz01]. • Mehrere Benutzer und/oder mehrere Anwendungen müssen parallel mit dem Datenbestand arbeiten (mehrfachbenutzte Datenbank). Dieses Kriterium wird durch den parallelen Zugriff der verschiedenen Komponenten auf den Datenbestand sowie der Notwendigkeit des Entwicklerzugriffs auf die Daten bei laufender Anwendung erfüllt. • Die Datenstrukturen können während der Nutzungsphase aufgrund geänderter Anforderungen begrenzt angepasst werden (Hinzufügen neuer Spalten zu vorhandenen Tabellen) Zusätzliche Produktionsparameter für Maschinen müssen rasch in das bestehende System eingebunden werden können. Das Kriterium wird somit hinreichend erfüllt. Der Einsatz von Microsoft Access wurde durch die Fischer GmbH vorgegeben. Die Implementierung der Komponenten ist jedoch nicht an das vorgegebene Datenbanksystem gebunden. 3. Beschreibung möglicher Lösungswege 3.4 Seite - 14 – OPC-Client-Komponenten Die Auswahl der OPC-Client-Komponenten für die .NET-Plattform wurde durch die Fischer GmbH getroffen. Die OPC ClientX .NET Komponenten der Firma Metadynamics1 stellen ein .NET kompatibles Interface zum Zugriff auf OPC-Server gemäß dem OPCData-Access-Standard zur Verfügung. In Kapitel 4 werden die Basistechnologien OLE, COM und DCOM sowie OPC selbst näher erläutert. 1 http://www.metadynamics.com 4. Theoretischer Hintergrund 4. Seite - 15 – Theoretischer Hintergrund Dieses Kapitel vermittelt einen Überblick über die für die Diplomarbeit relevanten technischen Grundlagen. Zu Beginn werden Softwarekomponenten und die auf MicrosoftSystemen eingesetzten Basistechnologien DCOM sowie Microsoft .NET erläutert. Die Grundlagen von DCOM sind speziell im Hinblick auf den Einsatz von Openess, Productivity and Collaboration relevant. Anschließend werden die Grundlagen von Datenbanksystemen, welche zur Verwaltung der Produktionsdaten verwendet werden, besprochen. Nachfolgend wird auf den Begriff „Vertikale Integration“ eingegangen. In diesem Rahmen werden die IT Infrastruktur der Fischer GmbH sowie die Verwaltung der Produktionsdaten im zentralen Oracle-Datenbanksystem beschrieben. Zur Realisierung von Maschinensteuerungen gelten speicherprogrammierbare Steuerungen als Standard. Der theoretische Hintergrund wird mit einem Einblick in SPS-Systeme sowie dem Industrie-Standard zur herstellerunabhängigen Kommunikation mit diesen, Openess, Productivity and Collaboration abgeschlossen. 4.1 Softwarekomponenten Vorgefertigte Softwarekomponenten dienen in der komponentenbasierten SoftwareEntwicklung als Bausteine für eine effiziente Anwendungsentwicklung. Die komponentenbasierte Entwicklung von Softwareanwendungen zeichnet sich, bei häufiger Verwendung vorhandener und entsprechend ausführlich getesteter Softwarebausteine, durch erhöhte Flexibilität bei geringeren Kosten für Entwicklung und Wartung aus. Die Halbfabrikate werden vom Anwendungshersteller häufig von Drittanbietern zugekauft. Die Komponentenhersteller sind spezialisiert auf die Herstellung von Softwarebausteinen mit Funktionalitäten, welche von vielen Anwendungsherstellern in den Standardbibliotheken der Entwicklungsumgebungen vermisst werden. Als Beispiele können hier Oberflächensteuerelemente wie spezielle Eingabe- oder Ausgabefelder aber auch erweiterte Datensteuerelemente wie Datentabellen oder Datenanalysekomponenten genannt werden. [Balz01] definiert eine Softwarekomponente bzw. ein Halbfabrikat sehr abstrakt als abgeschlossenen, binären Software-Baustein, der eine anwendungsorientierte, semantisch zusammengehörende Funktionalität besitzt, die nach außen über Schnittstellen zur 4. Theoretischer Hintergrund Seite - 16 – Verfügung gestellt wird. Beim Entwurf solcher Halbfabrikate wird Wert auf eine maximale Wiederverwendbarkeit gelegt. Die gewünschten Funktionalitäten werden also in einem eigenständigen Baustein gekapselt. Durch den binären Charakter des Bausteins kann eine Sprachunabhängigkeit erreicht werden. Sprachunabhängigkeit bedeutet, dass die Softwarekomponente unabhängig von der ursprünglichen Entwicklungssprache weitergegeben und verwendet werden kann. Laut [Balz01] sind neben der Sprachunabhängigkeit auch die Plattformunabhängigkeit und die Verteilbarkeit wünschenswerte Voraussetzungen um eine Anwendungsentwicklung mit Halbfabrikaten zu ermöglichen. Zur Realisierung dieser Voraussetzungen werden Komponentenmodelle eingesetzt, welche das Design und die Zusammenarbeit von Software-Bausteinen regeln. Laut Definition stellen die Software-Bausteine ihre Funktionalität über Schnittstellen zur Verfügung. Je nach Komponenten-Modell müssen die Bausteine spezielle Schnittstellen implementieren, um als Komponenten innerhalb des Modells verwendet werden zu können. Die Schnittstellen oder auch Interfaces stellen eine Art „Vertrag“ über die Funktionalität und das Verhalten der Komponente nach außen hin dar. Komponenten können somit gegeneinander ausgetauscht werden, sofern die gleichen Schnittstellen implementiert werden. Die oben erwähnte Plattformunabhängigkeit erfordert eine Portierung des Komponentenmodells auf verschiedene Betriebssysteme. So wurde das von Microsoft entwickelte Component Object Model (COM) für HP-UX (Hewlett Packard Unix)1 bzw. für IBM-Mainframes2 verfügbar gemacht. Eine ernstzunehmende Implementierung für die Nachfolgetechnologie Microsoft .NET wird durch das MONO-Projekt3 von Novell4 auch auf Unix, Linux und MacOS entwickelt. Die Verteilbarkeit der Komponenten in einem heterogenen Netzwerk wurde bei COM durch die Weiterentwicklung Distributed Component Object Model ermöglicht. .NET bietet für die Verteilung Strategien wie beispielsweise .NET-Remoting an. 1 http://www.hp.com/go/hpux 2 http://www.ibm.com/systems/z/ 3 http://www.mono-project.com 4 http://www.novell.com 4. Theoretischer Hintergrund 4.1.1 Seite - 17 – Distributed Component Object Model DCOM ist das Ergebnis aus zwei Entwicklungswegen, welche von Microsoft im Jahr 1996 zusammengeführt wurden. Abbildung 4.1 zeigt die Meilensteine der beiden Entwicklungswege in Anlehnung an [Iwan05]. Abbildung 4.1: Entwicklungswege von DCOM Der linke Entwicklungsweg, den Microsoft im Jahr 1987 mit dem Windows-Clipboard und DDE (Dynamic Data Exchange) begründete, beruht auf dem Grundgedanken Informationen aus verschiedenen Anwendungen zusammenzuführen. Das WindowsClipboard ermöglichte ein Kopieren von Daten einer Anwendung in eine andere. Der Datentransfer war allerdings einmalig und statisch, das heißt es erfolgte keine automatische Aktualisierung der Daten bei Veränderung in der Quellanwendung. DDE löste diese Unzulänglichkeit durch die Kommunikation der beiden Anwendungen. Eine ClientAnwendung kommuniziert mit der Server-Anwendung über ein einfaches nachrichtenbasiertes Protokoll. Der Datenaustausch ist in beide Richtungen möglich. Typischer Anwendungsbereich für DDE ist die Verwendung von zeitlich veränderlichen Daten aus einer anderen Anwendung. Der Nachteil ist, dass beide Anwendungen aktiv sein müssen. Im Jahr 1992 wurde OLE 1 vorgestellt. Object Linking and Embedding ermöglicht das Verbinden und Einbetten von Objekten, welche mit verschiedensten Anwendungen erzeugt wurden, in einem zentralen Verbunddokument. Bestes Beispiel hierfür ist sicherlich das Word-Dokument, in dem eine Excel-Tabelle angezeigt wird. Beim Doppelklicken der Excel-Tabelle wird automatisch die mit dem Objekt verbundene Anwendung (Microsoft Excel) gestartet. OLE 1 war somit ein eingeschränktes Komponentenmodell, welches 4. Theoretischer Hintergrund Seite - 18 – speziell auf Verbunddokumente zugeschnitten war. Das Verbunddokument stellte den Container für verschiedene Teildokumente aus anderen Anwendungen dar. Die logische Erweiterung von OLE 1 war OLE 2, welches erstmals in [Micr94a] und [Micr94b] publiziert wurde. OLE 2 wurde wenig später in Component Object Model umbenannt. COM stellte die Verallgemeinerung von OLE 1 auf die Begriffswelt der Software-Komponenten dar. Der Container wurde nun selbst als Softwarekomponente betrachtet, der wiederum andere Komponenten einbetten und verlinken konnte. Mit OLE wurde zu dieser Zeit alles bezeichnet, was auf den COM-Konzepten aufbaute. Im Jahr 1996 wurden mit der Begriffsdefinition ActiveX alle Konzepte von OLE subsumiert und um zusätzliche Konzepte für so genannte ActiveX-Steuerelemente erweitert. OLE wurde wieder ausschließlich im Zusammenhang mit Verbunddokumenten verwendet [Balz01]. Die Erweiterung von COM um die Möglichkeit auf COM-Komponeten anderer Systeme zuzugreifen resultierte im Distributed Component Object Model. Die Basistechnologien für den Fernzugriff wurden über einen zweiten Entwicklungsweg erarbeitet. Die OSF (Open Software Foundation) entwickelte in den 80er Jahren einige unter der Bezeichnung DCE (Distributed Computing Enviroment) zusammengefasste Spezifikationen mit dem Ziel, verteilte Verarbeitung in heterogenen Umgebungen zu verwirklichen. In den Spezifikationen wurden Kommunikationsmechanismen zwischen Anwendungen auf verschiedenen Systemen beschrieben. Im Jahr 1992 wurde OSF DCE RPC (Remote Procedure Call) als Ergebnis vorgestellt. Microsoft erweiterte für die Entwicklung von DCOM die Spezifikation um die notwendige Objektorientierung. Es wird daher im Zusammenhang mit DCOM von ORPC (Object Remote Procedure Call) gesprochen [Iwan05]. COM und DCOM sind sehr umfangreiche und teilweise auch sehr komplexe Technologien. Wie [Loos01] bemerkt, setzte sich COM daher auch nicht unmittelbar, sondern erst durch die tiefe Verankerung in den Windows-Betriebssystemen und die Erweiterung zur verteilten Verarbeitung (DCOM) endgültig durch. 4. Theoretischer Hintergrund Seite - 19 – COM-Komponenten Der Begriff COM-Komponente bezeichnet einen binären Software-Baustein, welcher eine oder mehrere Schnittstellen implementieren kann [Balz01]. Abbildung 4.2: Darstellungsarten einer COM Komponente Die linke Darstellung in Abbildung 4.2 zeigt die in der Literatur übliche Darstellung einer COM-Komponente. Rechts wurde die UML-Komponentennotation verwendet. Jede COM-Komponente ist durch einen GUID (Global Unique Identifier) weltweit eindeutig gekennzeichnet. Die GUID einer Komponente wird als CLSID (Class Identifier) bezeichnet und ist in der Windows-Registry gemeinsam mit dem Namen der Komponente unter HKEY_CLASSES_ROOT/CLSID eingetragen. Abbildung 4.3 zeigt den CLSID-Eintrag einer COM-Komponente. Abbildung 4.3: CLSID-Eintrag in der Windows-Registry 4. Theoretischer Hintergrund Seite - 20 – COM-Server COM arbeitet nach dem Client/Server-Prinzip. Ein COM-Server erzeugt Objekte aus COM-Komponenten und stellt diese dem Client zur Verfügung. Client ist jedes Programm, welches die Funktionalitäten der COM-Objekte nutzt. Ein COM-Server kann auf drei verschiedene Arten implementiert werden: In-process Server Greift ein Client über ein COM-Interface auf eine COM-Komponente in einer DLL (Dynamic Link Library) zu, so wird die DLL und somit der entsprechende COM-Server direkt in den Prozessraum des Clients geladen. Die In-process Variante ist sehr schnell, da zwischen Client und Server nicht über Prozessgrenzen hinweg kommuniziert werden muss. Dynamic Link Libraries haben unter Windows meist die Dateiendungen .dll oder .ocx. Der Pfad zu dieser Datei ist in HKEY_CLASSES_ROOT/CLSID/{….}/InprocServer32 der Windows-Registry unter eingetragen. Local Server Werden COM-Objekte durch eine eigene Anwendung (.exe) zur Verfügung gestellt, spricht man von einem Local Server. Bei dieser Variante verfügt sowohl der Client als auch der Server über einen eigenständigen Prozessraum. Die Kommunikation zwischen Client und Server erfolgt über ein RPC-Protokoll mit verminderter Funktionalität. Der Zugriff auf die COM-Objekte wird durch das RPC-Protokoll jedoch verlangsamt. Vorteil gegenüber der In-process Variante ist der geringere Speicherbedarf bei der Bedienung vieler Clients, da der Server nur einmal gestartet werden muss. Der Pfad zur Anwendung ist in der WindowsRegistry unter HKEY_CLASSES_ROOT/CLSID/{….}/LocalServer32 eingetragen. Remote Server Greift der Client über seine eigenen Systemgrenzen hinweg auf den Server zu, kommt die volle Funktionalität von DCOM zum Einsatz. Die Geschwindigkeit der Zugriffe liegt unter jener des Local Servers, da zum Fernzugriff über ein Netwerk ein erweiterter Protokollstack sowie ein vollständig implementiertes RPC-Protokoll verwendet wird. 4. Theoretischer Hintergrund Seite - 21 – Bei den Varianten Local Server und Remote Server muss über Prozessgrenzen hinweg zwischen Client und Server kommuniziert werden. Dies ist auf direktem Weg nicht möglich. Die Kommunikation erfolgt daher über Stellvertreter (proxies) und Stummel (stubs). Der Stellvertreter vertritt die Komponente im Adressraum des Clients. Im Adressraum des Servers stellt der Stummel die Verbindung zur eigentlichen Komponente her. Für die Erzeugung von Stellvertreter und Stummel muss die Komponente und deren Schnittstellen mit der IDL (Interface Definition Language) beschrieben werden. Der Microsoft-IDL-Compiler (MIDL-Compiler) erzeugt aus der IDL-Beschreibung Stellvertreter und Stummel [Balz01]. COM-Interfaces Wie in Abbildung 4.2 ersichtlich implementiert die COM-Komponente mehrere Schnittstellen. Der Namenskonvention entsprechend wird dem Interfacenamen ein „I“ vorangestellt. Eine Sonderstellung wird dem Interface IUnknown einberaumt. Alle implementierten Schnittstellen sind zwingend von IUnknown abzuleiten. Abbildung 4.4: Schnittstelle IUnknown Aus der UML-Darstellung von IUnknown in Abbildung 4.4 ist ersichtlich, dass die Methoden QueryInterface, Release und AddRef zur Verfügung gestellt werden. Durch die Ableitung aller Schnittstellen von IUnknown müssen auch alle anderen Schnittstellen diese Methoden zur Verfügung stellen. Mit der Methode QueryInterface kann die Unterstützung eines bestimmten Interfaces an einem COM-Objekt abgefragt werden. Durch die Verfügbarkeit der Methode an jedem Interface kann somit am Interface ISchnittstelle1 die Unterstützung der Schnittstelle ISchnittstelle2 abgefragt werden. Die Methode liefert bei Erfolg einen Zeiger auf ISchnittstelle2 zurück. Falls die Komponente die Schnittstelle nicht unterstützt, wird ein Fehlerstatus retourniert. Die eindeutige Identifizierung einer Schnittstelle erfolgt jedoch 4. Theoretischer Hintergrund Seite - 22 – nicht über den Namen (z.B. „ISchnittstelle2“) sondern über eine GUID. Die weltweit eindeutige GUID wird als Interface Identifier (IID) bezeichnet und ist in der WindowsRegistry zusammen mit dem Schnittstellennamen unter HKEY_CLASSES_ROOT/Interface abgelegt. Abbildung 4.5 zeigt den IID-Eintrag der Schnittstelle IUnknown. Abbildung 4.5: IID-Eintrag von IUnknown in der Windows-Registry Die Methoden AddRef und Release werden verwendet um den Lebenszyklus von COMObjekten zu kontrollieren. Ein Objekt bleibt aktiv, solange ein Client eine Referenz auf das Objekt besitzt. Mit der Methode AddRef wird der Referenzzähler des Objektes erhöht, wenn ein Client eine Referenz auf die Schnittstelle anfordert. Mit der Methode Release signalisiert der Client, dass die Referenz auf das Objekt nicht mehr benötigt wird und der Referenzzähler wird dekrementiert. Erreicht der Referenzzähler den Wert Null, wird das COM-Objekt zerstört. Objekterzeugung Um die Funktionalitäten einer COM-Komponente verwenden zu können, muss zuerst ein COM-Objekt erzeugt CoCreateInstance werden. Dies geschieht durch Aufruf der Methode aus der COM-Bibliothek. CoCreateInstance wird die CLSID der gewünschten COM-Komponente und die IID der gewünschten Schnittstelle übergeben. Der Aufruf bewirkt, dass in der Windows-Registry über die CLSID der entsprechende COMServer lokalisiert und geladen wird. Anschließend wird ein Zeiger auf das gewünschte Interface zurückgegeben. Mit diesem Zeiger ist es dem Client nun möglich über die Methode QueryInterface eine Referenz auf jedes der implementierten Interfaces zu holen und dessen Methoden zu nutzen. Für die Erzeugung beliebig vieler Objekte einer COMKomponente wird im Hintergrund ein ClassFactory Object erzeugt, welches die eigentliche Instanzierung des COM-Objekts übernimmt. 4. Theoretischer Hintergrund Seite - 23 – DLL-Hell Die zentrale Verwaltung der CLSIDs und der IIDs in der Windows-Registry sowie die Verwendung von gemeinsam genutzten DLLs in verschiedensten Anwendungen hat einige unangenehme Nebeneffekte zur Folge. Die Probleme, die sich durch die Verwaltung der DLLs ergeben, werden mit dem Überbegriff DLL-Hell bzw. DLL-Hölle bezeichnet. Beispiel 1 Anwendung „A Version 1.0“ wird am System installiert und registriert die DLL „shared.dll Version 1.0“. Nun wird Anwendung „B Version 1.0“ installiert. Die DLL „shared.dll Version 1.0“ wird durch die DLL „shared.dll Version 2.0“ überschrieben. Die Version 2.0 wurde um zusätzliche Schnittstellen erweitert, welche von „B Version 1.0“ verwendet werden. Es sind somit noch beide Anwendungen lauffähig. Eine Neuinstallation der Anwendung „A Version 1.0“ führt nun zu Problemen. Die DLL „shared.dll Version 2.0“ wird wieder mit Version 1.0 überschrieben. Die Anwendung „B Version 1.0“ ist dadurch nicht mehr lauffähig. Beispiel 2 Da Anwendung „B Version 1.0“ nicht mehr lauffähig ist wird sie deinstalliert. Bei der Deinstallation wird auch die gemeinsam verwendete DLL „shared.dll Version 1.0“ gelöscht. Nun ist auch Anwendung „A Version 1.0“ nicht mehr lauffähig. Beispiel 3 Der Benutzer hat aus Beispiel B „gelernt“ und verneint bei der Deinstallation von Programmen generell das Löschen von eventuell gemeinsam genützten Dateien. Im Laufe der Zeit wird dadurch die Windows-Registry sehr viele, eigentlich nicht mehr notwendige, Einträge beinhalten. Dies wirkt sich negativ auf die Systemleistung aus, da die Registry zum Beispiel bei der Objekterzeugung von COM-Komponenten nach der CLSID durchsucht werden muss. Bei der Entwicklung des Microsoft .NET-Frameworks wurden diese Aspekte von gemeinsam genutzten Bibliotheken von Beginn an berücksichtigt. 4. Theoretischer Hintergrund 4.1.2 Seite - 24 – Microsoft .NET-Framework Das .NET-Framework stellt die Weiterentwicklung der COM/DCOM-Technologien von Microsoft dar. Ursprünglich wurde laut [Schw05] COM Version 3.0 als Bezeichnung verwendet. Durch die gravierenden Änderungen zu den COM-Technologien verwendet Microsoft seit dem Jahr 2000 die Bezeichnung .NET-Framework. .NET ist auch nicht als reines Komponentenmodell sondern als komplette Softwareentwicklungsplattform mit Unterstützung von Objekt-, Komponenten- und Serviceorientierung zu verstehen. Die Version 1.0 des Frameworks wurde im Jänner 2002 vorgestellt. Bereits im April des folgenden Jahres wurden mit der Version 1.1 einige Erweiterungen und Fehlerbehebungen präsentiert. Seither arbeitete Microsoft an der Nachfolgeversion. Im November 2005 wurde im Rahmen des in Wien veranstalteten „Microsoft Launch Event“ die Version 2.0 des .NET-Frameworks und die Entwicklungsumgebung Visual Studio .NET 2005 der österreichischen Entwicklergemeinde vorgestellt. Die Entwicklungsumgebungen zur Version 1.0 und 1.1 des Frameworks trugen die Bezeichnungen Visual Studio .NET 2002 und 2003. .NET Übersicht Durch die Verwendung einer Laufzeitumgebung, welche als CLR (Common Language Runtime) bezeichnet wird, und der Zwischensprache MSIL (Microsoft Intermediate Language) wird eine Plattformunabhängigkeit erreicht. Dieses Konzept ist jenem von Java und dessen JRE (Java Runtime Enviroment) sehr ähnlich. Von Microsoft selbst wird das .NET-Framework allerdings nur für Windows-Systeme mit 32 oder 64 Bit angeboten. Es existiert jedoch mit dem bereits in der Einleitung zum Kapitel erwähnten MONO-Projekt von Novell eine Implementierung der .NET-Runtime für Unix, Linux und MacOS Systeme. Laut [Schw05] wird mittels der MSIL und dem sprachunabhängigen Typkonzept CTS (Common Type System) und dessen Spezialisierung CLS (Common Language Specification) die Sprachunabhängigkeit der .NET-Technologie erreicht. So sind neben den Microsoft Programmiersprachen C#, C++.NET, Visual Basic.NET und J# bereits Sprachen wie beispielsweise Fortran von Drittanbietern an das .NET-Framework angepasst worden. Mit der .NET-Framework-Class-Library (FCL) werden leistungsfähige StandardKlassenbibliotheken zur Verfügung gestellt. Zur einfachen Gestaltung von Benutzeroberflächen können sowohl die Windows Forms Steuerelemente für Windows- 4. Theoretischer Hintergrund Seite - 25 – Anwendungen als auch die Web Forms Steuerelemente zur Erstellung von WebAnwendungen genutzt werden. Datenzugriffe erfolgen über die Klassen der ADO.NET Library. Als Technologien für Fernzugriffe werden .NET-Remoting und XML-Webservices (Extensible Markup Language) angeboten. Microsoft Intermediate Language (MSIL) Beim Kompilieren eines .NET-Programms wird kein prozessorspezifischer Maschinencode sondern ein von der Zielplattform unabhängiger Zwischencode erzeugt. Der Zwischencode kann mit dem Tool „ildasm.exe“, welches dem .NET-Framework-SDK (Self Development Kit) beiliegt, betrachtet werden. Mittels einer „HelloWorld“ werden in Listing 4.1 und Listing 4.2 die Unterschiede zwischen C#-Code und MSIL-Code demonstriert. using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello World"); } } } Listing 4.1: Beispielcode “Hello World” in C# method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello World" IL_0005: call void [mscorlib]System.Console::WriteLine(string) IL_000a: ret } // end of method Program::Main Listing 4.2: Beispielcode “Hello World” in MSIL 4. Theoretischer Hintergrund Seite - 26 – Just in Time (JIT) Compiler Die CLR als Laufzeitumgebung für .NET-Anwendungen übernimmt die Speicherverwaltung, Sicherheitsfunktionen sowie das Management des Zugriffs auf Betriebssystemfunktionen und der Hardware. Auch die Umwandlung des MSIL-Codes in einen prozessorspezifischen Maschinencode (Native Code) erfolgt erst zur Laufzeit. Der Just-in-Time (JIT) Compiler, als Teil der Common Language Runtime übernimmt bei der ersten Verwendung eines Codesegments (also Just-in-Time) diese Aufgabe. Negative Auswirkungen auf die Performance der Anwendungen sind laut [Löwy05] in der Regel nicht zu erwarten, weil der JIT-Compiler den erzeugten Maschinencode speziell auf den verwendeten Prozessor optimieren kann. Im Gegensatz dazu kann eine bereits in Maschinencode ausgelieferte Anwendung nur den kleinsten gemeinsamen Nenner der Funktionalitäten aller zu unterstützenden Prozessoren verwenden. Wird die Verwendung des JIT-Compilers nicht gewünscht, kann mit dem Tool „ngen.exe“, welches ebenfalls dem .NET-Framework-SDK beiliegt, aus der MSIL direkt Native Code generiert werden. Softwarekomponenten im .NET-Framework Für den Begriff .NET-Softwarekomponente existieren leider mehrere widersprüchliche Definitionen. Während [Löwy05] jede .NET-Klasse als Komponente bezeichnet, wird in [Schw05] auf die unterschiedlichen Interpretationen innerhalb der Microsoft Dokumentation hingewiesen. So verwendet Microsoft in [Micr06], Absatz 1 folgende Definition: ”While the term component has many meanings, In the .NET Framework a component is a class that implements the System.ComponentModel.IComponent interface or one that derives directly or indirectly from a class that implements this interface.” In [Prat01] hingegen wird eine .NET-Komponente mit einem Assembly gleichgesetzt. Assemblies Ein Assembly ist die physikalische Weitergabeeinheit für Anwendungen (Application Assembly) oder Libraries (Library Assembly). Die Gleichsetzung einer Komponente mit einem Assembly ist somit nachzuvollziehen, da ein Assembly die Einheit der Weitergabe und Wiederverwendung darstellt. Nun kann ein Assembly jedoch verschiedenste Klassen 4. Theoretischer Hintergrund Seite - 27 – beinhalten, die sowohl intern im Assembly als auch extern verwendet werden können. Die Erweiterung des Komponentenbegriffs auf einzelne Klassen ist somit ebenfalls sinnvoll. Die Einschränkung auf Klassen, die das Interface IComponent implementieren ist jedoch nicht nachvollziehbar [Schw05]. In weiterer Folge wird der erweiterte Komponentenbegriff aus [Löwy05] verwendet. Abbildung 4.6: Assemblies als Weitergabeeinheit [Löwy05] Wie aus Abbildung 4.6 ersichtlich ist, existieren verschiedene Ausprägungen von Assemblies. Während Assembly A und C sogenannte Single Module Assemblies (SMA) darstellen, ist Assembly B ein Multi Module Assembly (MMA). Ein MMA kann mehrere eigenständige DLLs beinhalten, stellt sich jedoch dem Benutzer gegenüber als einzelne DLL dar. MMAs können nur mit Kommandozeilentools aus dem .NET-SDK erstellt werden und haben somit nur eine untergeordnete Bedeutung. Abbildung 4.7: Client und Server Assemblies [Löwy05] 4. Theoretischer Hintergrund Seite - 28 – Abbildung 4.7 zeigt den typischen Aufbau einer komponentenbasierten Anwendung. Das ausführbare Programm im Application Assembly nutzt Funktionen aus verschiedenen Library Assemblies. Das Application Assembly ist somit ein Client der Library Assemblies und aus diesem Grund in Abbildung 4.7 mit Client Assembly bezeichnet. Die Methoden und Attribute der Komponente A können innerhalb des Application Assembly direkt angesprochen werden. Zur Nutzung der Komponenten in den Library Assemblies muss eine Referenz auf das Assembly im Application Assembly gesetzt werden. Der Umweg über die Windows-Registry wie bei COM ist nicht notwendig. Seit Visual Studio 2005 ist es .NET-Entwicklern möglich auch Application Assemblies zu referenzieren. Damit ein Client Assembly durch einfaches Referenzieren die Typen und Methoden eines anderen Assemblies nutzen kann muss jedes Assembly die Möglichkeit der Selbstbeschreibung besitzen. Zu diesem Zweck werden beim Kompilieren durch den MSIL-Compiler Metadaten sowie ein Manifest zusätzlich zum MSIL-Code im Assembly hinterlegt. In den Metadaten werden die verfügbaren Typen und Methoden des Assemblies beschrieben. Das Manifest hingegen beschreibt den Inhalt eines Assemblies. Neben Name, Version und Herstellerinformationen enthält das Manifest eine Auflistung der Typen, Ressourcen, Module und wiederum referenzierten Assemblies. Abbildung 4.8: Verschiedene Assembly Kompositionen [Löwy05] Wie aus Abbildung 4.8 hervorgeht können Assemblies verschieden aufgebaut sein. Die linke Darstellung ist ein Standard Library Assembly mit MSIL-Code, dem Manifest und den Metadaten. Im Application Assembly in der Mitte sind zusätzlich Ressourcen wie zum Beispiel Bilder oder Texte eingebettet. Das Multi Module Assembly rechts besteht aus drei 4. Theoretischer Hintergrund Seite - 29 – DLLs, wobei letztere eine reine Resourcen-DLL darstellt. Die beiden andern DLLs mit MSIL-Code besitzen eigene Metadaten. Beim Erstellen des MMA wurden die Manifeste der verschiedenen DLLs in ein einziges Manifest zusammengefasst. Laut [Löwy05] ist es auch durchaus üblich für eine erleichterte Internationalisierung von Anwendungen so genannte Satelliten-Assemblies zu erzeugen, die nur Ressourcen beinhalten. Private und Shared Assemblies Private Assemblies dienen zur Verwendung in einer Anwendung und werden deshalb auch im Anwendungsverzeichnis abgelegt. Ein Überschreiben durch andere Anwendungen wird dadurch kategorisch ausgeschlossen. Für die gemeinsame Verwendung von Assemblies in mehreren Applikationen bietet das .NET-Framework die Möglichkeit an, Shared Assemblies dem Global Assembly Cache (GAC) hinzuzufügen. Der GAC verfügt über Mechanismen, die es erlauben verschiedene Versionen eines Assemblies gleichzeitig zu verwalten. Die beiden genannten Strategien sind ein entscheidender Schritt der DLL-Hell ein Ende zu setzen. 4. Theoretischer Hintergrund 4.2 Seite - 30 – Datenbanksysteme Datenbanksysteme (DBS) sorgen laut [Balz01] für die dauerhafte, zuverlässige und unabhängige Verwaltung sowie für die komfortable, flexible und geschützte Verwendung von großen, integrierten und mehrfachbenutzten Datenbanken. Die Datenbestände der Datenbanken werden durch ein Datenbank-Managementsystem (DBMS) verwaltet, welches auch die Schnittstelle für Programm- bzw. Benutzerinteraktionen zu den Daten bildet. Das DBMS koordiniert die Zugriffe und generiert die Rückmeldungen auf die Abfragen der Benutzer. Die Informationen über den Aufbau und die Strukturierung der Daten in den Datenbanken werden vom DBMS im Data Dictionary (DD) abgelegt. Ein DBS ist somit die Gesamtheit aus den Datenbanken, dem Data Dictionary und dem Datenbank Managementsystem [Balz01]. Abbildung 4.9 stellt die genannten Zusammenhänge in Anlehnung an [Balz01] anschaulich dar. Abbildung 4.9: Datenbanksystem Datenbanksysteme werden nach ihrem zugrunde liegenden Datenbankmodell kategorisiert. Neben den dominierenden relationalen DBS (RDBS) [Kemp01] finden objektorientierte (ODBS) bzw. Mischformen wie objektrelationale DBS (ORDBS) Anwendung. Im Weiteren werden die für die Diplomarbeit relevanten RDBS näher betrachtet. Bei relationalen Datenbanksystemen werden die Daten in Form von Zeilen und Spalten in Tabellenform gespeichert. Beziehungen zwischen verschiedenen Tabellen ergeben sich aus bestimmten Spaltenwerten. Abbildung 4.10 zeigt anhand eines Beispiels aus der 4. Theoretischer Hintergrund Seite - 31 – Konfigurationsdatenbank der Softwarekomponenten die Beziehung zwischen zwei Tabellen mittels eines Entity-Relationship-Modells. Abbildung 4.10: ER-Modell einer Tabellenbeziehung Das Attribut MachineId stellt den so genannten Primärschlüssel (Primary Key, PK) der Tabelle Config_OpcConnections dar. Der PK identifiziert jede Zeile in der Tabelle eindeutig. Analog hierzu bildet das Feld GroupId den Primärschlüssel der Tabelle Config_OpcGroups. Die Beziehung der beiden Tabellen wird durch den Fremdschlüssel (Foreign Key, FK) MachineId in der Tabelle Config_OpcGroups hergestellt. Der Fremdschlüssel ist im Gegensatz zum Primärschlüssel nicht eindeutig. Die Beziehung kann daher in Worten wie folgt beschrieben werden: „Eine OPC-Connection hat keine, eine oder mehrere OPC-Gruppen“. Umgekehrt gilt: „Eine OPC-Gruppe gehört zu genau einer OPC-Connection“. Die Mengenangaben „keine, eine oder mehrere“ bzw. „genau eine“ ergeben sich aus der Krähenfussdarstellung der Tabellenbeziehung. Eine Einführung in die ER-Modellierung ist in [Balz01] zu finden. Zur Definition der Tabellen sowie zur Manipulation der Datenbestände hat sich SQL (Structured Query Language) als Datendefinitionssprache (Data Definition Language, DDL) und Datenmanipulationssprache (Data Manipulation Language, DML) durchgesetzt [Balz01]. Die Unterstützung von SQL ist heute der Standard in nahezu jedem Datenbankmanagementsystem. 4. Theoretischer Hintergrund Seite - 32 – Zugriff auf Datenbanksysteme mit .NET Den Anwendungsentwicklern stehen innerhalb eines Entwicklungssystems spezielle Standard-Libraries für den Datenbank(system)zugriff zur Verfügung. Im Microsoft .NETFramework werden diese Klassen mit dem Überbegriff ADO.NET bezeichnet. ADO.NET stellt verschiedene data provider für den Zugriff auf Standard-Datenbanksysteme bereit. Abbildung 4.11: Data provider in .NET [Hami03] Wie in Abbildung 4.11 erkennbar ist, existieren spezielle Provider für den Microsofteigenen SQL-Server sowie für Oracle. Andere Datenbanksysteme, wie zum Beispiel Microsoft Access Datenquellen, können über die Standardschnittstellen ODBC (Open Database Connectivity) bzw. OLEDB (Object Linking and Embedding - DB) verbunden werden. Die verschiedenen data provider bereiten die Daten aus den unterschiedlichen Datenbanken für die Weiterverarbeitung mit übergeordneten Klassen auf bzw. übertragen modifizierte Daten zurück in die Datenbanken. Im .NET-Framework 2.0 wurde durch so genannte Providerfactory-Klassen die Abstraktion zusätzlich erhöht. Eine Providerfactory liefert auf Anforderung das jeweils richtige data provider Objekt zurück und ermöglicht somit eine vom zugrunde liegenden Datenbanksystem unabhängige Programmierung. 4. Theoretischer Hintergrund 4.3 Seite - 33 – Vertikale Integration Die System- und Softwareinfrastruktur moderner Produktionsbetriebe lässt sich laut [Seit03] in verschiedene Ebenen unterteilen. Abbildung 4.12 zeigt die Ebenenhierarchie in anschaulicher Form. Abbildung 4.12: Automatisierungsebenen in Produktionsbetrieben [Seit03] Die oberste Ebene der Hierarchie wird als Produktionsleitebene bezeichnet. Die Produktionsleitebene ist geprägt durch den Einsatz von Enterprise Ressource Planning bzw. Produktionsplanungssystemen wie zum Beispiel SAP1 oder im konkreten Fall der Fischer GmbH JD Edwards EnterpriseOne. Ein ERP-System unterstützt die betrieblichen Abläufe einer Unternehmung. Die Kernfunktionalitäten der meisten am Markt etablierten Systeme liegen in den Bereichen Materialwirtschaft, Einkauf, Vertrieb, Finanz- und Rechnungswesen, Controlling sowie der Fertigung und der Artikelstammdatenverwaltung. Vereinfacht könnte der Ablauf in der Fertigung wie folgt aussehen: Das Produktionsplanungssystem generiert entsprechend den eingegangenen Kundenaufträgen interne Produktionsaufträge. Sollten die in den Artikelstammdaten und Stücklisten definierten Materialen nicht im Lager vorhanden sein, werden diese automatisch nachbestellt. Die Fertigungsaufträge werden letztendlich in Abhängigkeit von den gewünschten Lieferterminen und den verfügbaren Produktionsressourcen zur Produktion eingeplant. 1 http://www.sap.de 4. Theoretischer Hintergrund Seite - 34 – Das eigentliche Produktionsumfeld und der Maschinenpark wird in die Prozessleitebene und die Feldebene unterteilt. In die Feldebene fallen die Sensoren und Aktoren der Maschinen und Anlagen. Als Verbindung mit den übergeordneten Steuerungsrechnern kommen industrielle Bussysteme oder konventionelle Verdrahtungstechnologien zum Einsatz. Als horizontale Integration wird hierbei die Vernetzung von Geräten auf gleicher Ebene mittels der erwähnten industriellen Bustechnologien bezeichnet. Die Steuerung der Maschinenabläufe übernehmen Steuerungsrechner in der Prozessleitebene. Als Steuerungsrechner kommen zumeist speicherprogrammierbare Steuerungen zum Einsatz. Zunehmend werden allerdings auch Industrie-PCs mit Echtzeitbetriebssystemen als SPS-Ersatz eingesetzt. Eine generelle Trennung von Bedienund Beobachtungssystem und dem eigentlichen Maschinensteuerungssystem ist in vielen Fällen nicht möglich, da speziell bei kleineren Maschinen die Kosten einer getrennten Ausführung nicht argumentierbar wären. Oftmals wird jedoch mehreren Maschinen ein einzelnes Beobachtungssystem übergeordnet. Die im Rahmen dieser Diplomarbeit entwickelten Softwarekomponenten dienen als Basis für Anwendungen, welche der Prozessleitebene im Bereich „Bedienen und Beobachten“ sowie der Betriebsleitebene im Bereich „Rezeptsteuerung“ zuzuordnen sind. Die Betriebsleitebene bildet die Schnittstelle zwischen der Produktionsleitebene und den Maschinensteuerungen in der Prozessleitebene. Viele der für die Produktion relevanten Stammdaten werden beispielsweise Produktionsplanungssystem erfasst. durch Die die direkte Produktentwicklung Nutzung dieser bereits im Daten im Produktionsprozess ist erstrebenswert, um die fehlerbehaftete Mehrfacherfassung der Daten zu vermeiden. Das Schaffen eines konsistenten Datenflusses über die Ebenenhierarchie hinweg wird als vertikale Integration bezeichnet. Neben Kosteneinsparungen bei der Datenerfassung ermöglicht die vertikale Integration die Flexibilisierung der Produktionsprozesse sowie die Aussicht in kleineren Losgrößen produzieren zu können. Neben der Übergabe von produktspezifischen Parametersätzen, welche in der Automatisierungstechnik oftmals als Rezepte bezeichnet werden, an die Steuerungsrechner kann in umgekehrter Richtung die Erfassung von Betriebsdaten zur Qualitätssicherung einen hohen Zusatznutzen für eine Unternehmung darstellen. Das Betriebsdatenmanagement wird allerdings im Rahmen der 4. Theoretischer Hintergrund Seite - 35 – Diplomarbeit nicht behandelt. Mit einer zukünftigen Erweiterung der erstellten Softwarekomponenten bzw. der Entwicklung zusätzlicher Komponenten könnte jedoch auch die Behandlung von Betriebsdaten realisiert werden. 4.3.1 IT Infrastruktur der Fischer GmbH Das konkrete Projektumfeld der Fischer GmbH entspricht der in Abschnitt 4.3 erläuterten Ebenenhierarchie. Das ERP-System JD Edwards EnterpriseOne verwaltet die Auftragsund Artikelstammdaten. Weitere produktionsspezifische Daten werden mit Hilfe vom ERP-System unabhängigen Eingabemasken erfasst. Eine zukünftige Integration dieser meist mit Microsoft Access realisierten Eingabemasken in EnterpriseOne steht zur Diskussion. Sämtliche in der Produktionsleitebene erfassten Daten werden in einem Oracle-Datenbanksystem verwaltet. Die Prozessleitebene ist ein heterogenes Umfeld aus Steuerungen und Industrie-PCs verschiedenster Hersteller. Die am häufigsten eingesetzten Geräte kommen von den führenden Herstellern Bernecker&Rainer1 und Siemens2. Die während der Diplomarbeit entwickelten Softwarekomponenten dienen zur vereinfachten Erweiterung der Betriebsleitebene. Die Komponenten kapseln Zugriff auf die Produktionsdaten sowie die Kommunikation zu den Steuerungssystemen. 4.3.2 Speicherprogrammierbare Steuerungen In Maschinen und Anlagen kommen Aktoren wie Pneumatikzylinder oder verschiedenste Arten von elektrischen Antriebssystemen zum Einsatz. Zur Erfassung von aktuellen Prozesszuständen dienen Sensoren wie Initiatoren, Lichtschranken oder Wegmesssysteme. Die Logik für die Ansteuerung der Aktoren in Abhängigkeit von den Signalzuständen der Sensoren ist durch den gewünschten Maschinenablauf definiert und kann durch den Einsatz von fest verdrahteten Hardwarekomponenten realisiert werden. In diesem Fall werden meist Relais und Zeitrelais durch die Verdrahtung fest verbunden. Aus diesem Grund spricht man bei dieser Art des Steuerungsaufbaus von einer verbindungsprogrammierten Steuerung (VPS). Die Hauptnachteile der VPS sind die fehlende Flexibilität gegenüber Ablaufänderungen sowie die sehr hohen Kosten bei steigender Komplexität der Steuerungsaufgabe. Die vertikale Integration einer VPS ist in 1 http://www.br-automation.com 2 http://www.siemens.de 4. Theoretischer Hintergrund den meisten Fällen nicht Seite - 36 – möglich. Aus diesen Gründen haben sich speicherprogrammierbare Steuerungen in der Automatisierungstechnik durchgesetzt. Aufbau SPS-Systeme sind in der Regel modular aufgebaut. Neben einem CPU- oder Prozessormodul auf dem die Logik des Maschinenablaufs programmiert wird, werden verschiedenste Arten von Ein- und Ausgangsmodulen verwendet um die Sensoren und Aktoren einer Maschine anzubinden. Displaymodule ermöglichen die Visualisierung der aktuellen Prozesszustände und die gewünschten Benutzerinteraktionen laut dem Bedienkonzept. Zur Kommunikation mit Fremdgeräten kann eine Steuerung mit RS232, RS422/485 oder Feldbusschnittstellen erweitert werden. Auch eine Ethernet Schnittstelle zur Anbindung der Steuerung an das Firmennetzwerk zählt vielfach bereits zum Standard. Abbildung 4.13: Beispielkonfiguration eines SPS-Systems [Bern06] Obige Darstellung (Abbildung 4.13) zeigt eine Beispielkonfiguration der Fa. Bernecker&Rainer. Wie ersichtlich ist, können Displaymodule aber auch Ein- und Ausgangsmodule abgesetzt von der zentralen Steuerungseinheit verbaut werden. Die 4. Theoretischer Hintergrund Seite - 37 – Kopplung erfolgt in diesem Fall über genormte Feldbussysteme wie CAN1 oder Profibus2. Antriebstechnische Komponenten werden in der Regel ebenfalls über ein Feldbussystem an die Steuerung angebunden. Ein dezentraler Aufbau der Steuerungskomponenten kann in vielen Fällen Kosten für die Verdrahtung und Installation einsparen. Programmierung Die Mikroprozessor-Architektur aktueller Steuerungssysteme entspricht in weiten Zügen jener von Standard Computern. Bei den Steuerungssystemen der Systemgeneration 4 (SG4) von Bernecker&Rainer werden beispielsweise Intel3 Pentium Prozessoren eingesetzt. Um deterministisch auf die Änderung eines Eingangssignals reagieren zu können, kommen Echtzeitbetriebssysteme zum Einsatz. Die erstellten Programme werden zyklisch abgearbeitet. Das Intervall der Abarbeitung kann meist durch den Programmierer festgelegt werden. Die maximale Verzögerungszeit, nach der ein Eingangssignal sicher verarbeitet wird, ist somit eindeutig vorhersagbar. Der Programmierer einer SPS hat bei der Programmerstellung die Auswahl zwischen mehreren unterschiedlichen Programmiersprachen. Während komplexe Programmteile vorzugsweise in einer Hochsprache implementiert werden, können einfache logische Verknüpfungen sehr übersichtlich im so genannten Kontaktplan realisiert werden. Die verwendete Programmiersprache hat keinen Einfluss auf den Determinismus. Folgende Programmausschnitte wurden für eine Bernecker&Rainer Steuerung erstellt und weichen daher von der Darstellung anderer Hersteller ab. 1 http://www.can-cia.org 2 http://www.profibus.com 3 http://www.intel.com 4. Theoretischer Hintergrund Seite - 38 – Listing 4.3: SPS Programmierung im Kontaktplan Das einfache Kontaktplanbeispiel in Listing 4.3 zeigt wie Eingänge und Ausgänge mit der Hilfe von lokalen Merkervariablen verknüpft werden können. Die Verwendung von Funktionsblöcken erweitert die Leistungsfähigkeit der Kontaktplanprogrammierung. Funktionsblöcke werden in Libraries verwaltet und können in einer beliebigen Sprache erstellt werden. if (g_R364.HomeAxis.Senden=TRUE)then case l_sk_HomeAxis of (*** Befehle Senden ***) action 0: memset(adr(sende_daten),0,sizeof(sende_daten)) strcpy(adr(sende_daten),"#AHA") port_schreiben=1 port_lesen=0 l_sk_HomeAxis=10 endaction (*** Auf Antwort warten ***) action 10: .. Listing 4.4: SPS Programmierung mit Automation Basic 4. Theoretischer Hintergrund Seite - 39 – Das Programmfragment in Listing 4.4 wurde in der Bernecker&Rainer-eigenen Sprache Automation Basic erstellt. Schrittschaltwerke für Ablaufketten lassen sich wie gezeigt sehr elegant verwirklichen. String- und Speichermanipulationsfunktionen ermöglichen eine sehr flexible und effiziente Programmerstellung. Kommunikation mit SPS-Systemen Um von der Programmierumgebung oder weiterführend von übergeordneten Systemen auf die aktuellen Prozesszustände und Variablen einer SPS zugreifen zu können, wurden von den Herstellern proprietäre Kommunikationsprotokolle entwickelt. Die physikalische Verbindung kann seriell oder wiederum über unterschiedlichste Bussysteme realisiert werden. Die Fischer GmbH koppelt SPS-Systeme überwiegend mittels Ethernet an Betriebsdatenerfassungs- oder Rezeptsteuerungssysteme. Damit in den Leitsystemen nicht alle herstellerspezifischen Kommunikationsprotokolle implementiert werden müssen, kommt Openess, Productivity and Collaboration als Abstraktionsschicht zum Einsatz. OPC wird von allen namhaften Steuerungsherstellern unterstützt. Das Leitsystem kann somit transparent mit den Steuerungssystemen unterschiedlicher Hersteller kommunizieren. 4.3.3 Openess, Productivity and Collaboration In den 90er Jahren stellte die zeit- und somit auch kostenintensive Implementierung und Wartung von Kommunikationstreibern zur Unterstützung möglichst vieler Hardwarekomponenten ein großes Problem für die Softwarehersteller von HMI (Human Machine Interface) Produkten dar. Aus diesem Grund wurde 1995 die OPC Task Force ins Leben gerufen. Neben führenden Automatisierungstechnikfirmen aus dem Soft- und Hardwarebereich beteiligte sich auch Microsoft. Ziel der Task Force war es, einen Standard zum Zugriff auf Echtzeitdaten unter Windows-Betriebssystemen, welcher auf Microsofts (OLE/)DCOM-Technologie basiert, zu erarbeiten [Iwan05]. So stand die Abkürzung OPC ursprünglich für OLE for Process Control. Die Bezeichnung wurde allerdings mit der Verwendung von DCOM als Basis für OPC in Openess, Productivity and Collaboration geändert. Nichts desto trotz ist OLE for Process Control auch heute noch überaus gebräuchlich. Bereits im August 1996 lag die OPC Specification Version 1.0 4. Theoretischer Hintergrund Seite - 40 – vor. Nahezu zeitgleich wurde die OPC Foundation1 zur Koordinierung der Spezifikationsund Marketingarbeiten gegründet. Ein Jahr später erfolgte die erste Aktualisierung der OPC Specification unter der Bezeichnung Data Access Specification (OPC-DA). Seither erarbeitete die OPC Foundation eine Reihe von Spezifikationen, die als Basis für aktuelle OPC-Implementierungen dienen. Abbildung 4.14 zeigt eine Aufstellung der verschiedenen Spezifikationen. Abbildung 4.14: Verfügbare und in Arbeit befindliche OPC-Spezifikationen [Iwan05] Bei der Entwicklung wurde großer Wert auf die Kompatibilität der einzelnen Standards gelegt. Aus diesem Grund wurden allgemein gültige Teile in eigene Dokumente ausgelagert. Die Spezifikationen sind frei verfügbar und stehen auf der Internetseite der OPC Foundation zum Download bereit. Tabelle 4.1 beschreibt stichwortartig die Bedeutung der verschiedenen Standards. Spezifikation OPC Overview OPC Common Definitions and Interfaces OPC Data Access Specification 1 http://www.opcfoundation.org Bedeutung Allgemeine Beschreibung der Einsatzgebiete von OPC Spezifikationen Festlegung von Sachverhalten, die eine große Anzahl von Spezifikationen betreffen Definition einer Schnittstelle für das Lesen und Schreiben von Echtzeitdaten Freigabestatus Release 1.00 Release 1.10 Release 3.00 4. Theoretischer Hintergrund OPC Alarms and Events Specification OPC Historical Data Access Specification OPC Batch Specification OPC Security Specification OPC XML-DA OPC Data eXchange (DX) OPC Commands OPC Complex Data OPC Unified Architecture Seite - 41 – Definition einer Schnittstelle zur Überwachung von Ereignissen Definition einer Schnittstelle zum Zugriff auf historische Daten Definition einer Schnittstelle zum Zugriff auf Daten, die bei der Batchverarbeitung benötigt werden. Diese Spezifikation erweitert die Data Access Specification Definition einer Schnittstelle für das Erstellen und Nutzen von Sicherheitsaspekten Integration von OPC und XML zur Erstellung von Webanwendungen Kommunikation zwischen Server und Server Definition einer Schnittstelle für das Übergeben von Kommandos und das Überwachen ihrer Abarbeitung Definition einer Schnittstelle zum Beschreiben der Struktur komplexer Daten und zum Zugriff auf solche Daten Definition einer Interoperabilitätsplattform, die basierend auf Web Services einen einheitlichen Zugriff auf Daten in DA-, AE-, HDA-Servern ermöglichte. Release 1.10 Release 1.20 Release 2.00 Release 1.00 Release 1.01 Release 1.00 Release 1.00 Release 1.00 Draft Tabelle 4.1: OPC Spezifikationen – Bedeutung und Freigabestatus (02/2006) [Iwan05] Wie aus der Auflistung der verfügbaren Spezifikationen hervorgeht, folgt auch die OPC Foundation dem allgemeinen Trend Web Services und XML als Basistechnologien für ihre Standards zu verwenden. Die enge Kopplung mit Microsofts DCOM wird somit in naher Zukunft stark gelockert werden. Eine Portierung der OPC-Funktionalitäten auf verschiedenste Betriebssysteme ist somit vorstellbar. Für die im Rahmen dieser Diplomarbeit entwickelten Softwarekomponenten ist die Data Access Specification in der Version 2.05 relevant, da die Version 3.00 derzeit nur in wenigen Produkten implementiert ist. Ein möglichst breiter Einsatzbereich der Softwarekomponenten kann somit gewährleistet werden. Es folgt eine kurze Einführung in die Grundkonzepte dieser Spezifikation. 4. Theoretischer Hintergrund Seite - 42 – OPC Data Access Specification OPC basiert auf einer Client/Server-Architektur. Ein OPC Data Access Server stellt Schnittstellen für den Lese- und Schreibzugriff auf Echtzeitdaten von einem oder mehreren Geräten der Prozessleit- oder Feldebene zur Verfügung. Ein oder mehrere OPC-Clients greifen auf den OPC-Server zu und können dessen Funktionalitäten nutzen. Der Zugriff auf den Server erfolgt dabei gemäß der OPC Data Access Specification immer in der gleichen Art und Weise. Der Server übernimmt die proprietäre Kommunikation mit den Geräten der Prozessleit- oder Feldebene. Die Data Access Specification definiert zwei unterschiedliche Konzepte, die ein Data Access Server implementieren und ein Data Access Client nutzen kann – den Namensraum (Namespace) und die OPCObjekthierarchie [Iwan05]. Abbildung 4.15: OPC-DA-Server – Namensraum und Objekthierarchie [Iwan05] Ein Namensraum enthält alle Prozessgrößen, auf die der Client zugreifen kann. In einem hierarchischen Namensraum werden zur Gliederung der Prozessgrößen Baumstrukturen verwendet. Eine Wurzel besitzt, wie im Beispiel von Abbildung 4.15 mehrere Knoten, welche wiederum mehrere Knoten oder Items besitzen können. In einem flachen Namensraum sind alle Items in einer Ebene angeordnet. Ein Client kann zur Ermittlung der vorhandenen Prozessgrößen diesen Namensraum durchsuchen. 4. Theoretischer Hintergrund Seite - 43 – Mittels der OPC-Objekthierarchie kann der Client seine eigene Sicht auf den Prozess festlegen. Der Client erzeugt hierfür innerhalb der Server-Komponente verschiedene Objekte. Das OPC-Server-Objekt stellt hierbei das am höchsten in der Hierarchie angesiedelte Objekt dar. Das Server-Objekt verwaltet die OPC-Group-Objekte. Den Gruppen-Objekten sind wiederum ein oder mehrere Item-Objekte zugeordnet. Die Anzahl und Zuordnung der Gruppen- sowie Item-Objekte ist dabei unabhängig vom Aufbau des Namensraums im Server. Die Objekte innerhalb der Server-Komponente stellen über Schnittstellen ihre Funktionalitäten zur Verfügung. Ein Item-Objekt muss laut Spezifikation beispielsweise Methoden zum Lesen und Schreiben der Prozessgröße implementieren. Über das OPCGroup-Objekt können alle untergeordneten Item-Objekte gelesen oder geschrieben werden. Beim Lesen muss jeweils festgelegt werden, ob der Wert direkt vom Gerät (Device) oder vom internen Speicher der Server-Komponente (Cache) gelesen werden soll. Neben dem Wert der Prozessgröße liefern Leseoperationen immer einen Zeitstempel und Informationen zur Verbindungsqualität. Schreiboperationen werden immer direkt am Gerät ausgeführt. Lese- und Schreiboperationen können synchron oder asynchron erfolgen. Bei der asynchronen Variante wird der Client über Callback-Mechanismen über die Fertigstellung der Anfrage benachrichtigt. Um ein zyklisches Lesen der Prozessgrößen vermeiden zu können, werden Callbacks häufig zur Benachrichtigung bei Wertänderungen verwendet. Mit Refresh-Operationen können die Werte aller Prozessgrößen einer Gruppe aktualisiert werden. Es gibt beim Refresh ebenfalls die Wahlmöglichkeit zwischen einer synchronen und asynchronen Variante. 4. Theoretischer Hintergrund Seite - 44 – OPC und .NET Die für die Fischer GmbH entwickelten Softwarekomponenten basieren auf Microsofts .NET-Technologie. Zum Zugriff auf DCOM-OPC-Server wurden zur Implementierung der Softwarekomponenten OPC-Client-Komponenten der Firma Metadynamics verwendet. Abbildung 4.16: Zugriff auf OPC-DCOM-Server mit .NET-Komponenten [Iwan05] Die Komponenten stellen ein .NET kompatibles Interface zur Verfügung und kapseln den DCOM-Zugriff auf den Server. Die Anwendungsentwicklung wird dadurch maßgeblich vereinfacht, da detaillierte Kenntnisse der teilweise sehr komplexen DCOM-Mechanismen nicht notwendig sind. Abbildung 4.16 zeigt, wie der Zugriff auf einen DCOM-Server aus .NET abläuft. 5. Implementierung der Lösung 5. Dieses Seite - 45 – Implementierung der Lösung Kapitel dokumentiert die im Rahmen der Diplomarbeit erstellten Softwarekomponenten. Beginnend mit einer Übersicht über die im Zuge der Implementierung eingesetzten Softwarepakete und den zu Grunde liegenden Designaspekten werden die lokale Anwendungsdatenbank am Leitrechner und die Softwarekomponenten detailliert beschrieben. Zur Erläuterung des Aufbaus der Datenbank werden Entity-Relationship-Diagramme verwendet. UML-Klassendiagramme dienen als Basis für die Beschreibung der öffentlichen Methoden und Attribute der Komponenten. Der Umfang des Kapitels orientiert sich an der Zielsetzung einem Anwendungsentwickler den Einsatz der Softwarekomponenten und deren Konfiguration zu ermöglichen. 5.1 Eingesetzte Softwareprodukte Mit der in Kapitel 3 der Diplomarbeit getroffenen Technologieentscheidung zu Gunsten der Microsoft .NET-Plattform und der Auswahl der Microsoft-eigenen Entwicklungsumgebung Visual C# 2005 Express waren die Rahmenbedingungen für die Implementierung zum überwiegenden Teil definiert. Seitens der Fischer GmbH wurde Microsoft Access als lokales Datenbanksystem am Leitrechner festgelegt. Eine zukünftige Umstellung auf die Express Edition des Microsoft SQL Servers wird derzeit von der Fischer GmbH angedacht. Durch die offen gehaltene Datenbankschnittstelle der Komponenten sind in diesem Fall jedoch keine Softwareänderungen notwendig. Die Verwendung der OPC-Client-Komponenten für .NET von Metadynamics wurde ebenfalls durch die Fischer GmbH vorgegeben. Die Softwarekomponenten wurden mit verschiedenen Maschinensteuerungssystemen der Firma Bernecker&Rainer getestet. Die entsprechenden Versionen der Kommunikationstreiber und SPS-Betriebssysteme sind in Tabelle 5.1 zusammen mit den restlichen Softwarepaketen aufgelistet. Einsatzbereich Betriebssystem Framework Entwicklungsumgebung Applikationstest ERP-System Business Datenbank Applikationsdatenbank Hersteller/Produkt Microsoft Windows 2000 Professional Microsoft Windows XP Professional Microsoft .NET-Framework Microsoft Visual C# Express Edition SciTech .NET Memory Profiler JD Edwards EnterpriseOne Oracle Microsoft Access 2002 Version(en) SP4 SP2 2.0.50727 8.0.50727.42 2.6 8.11 9.2.0.1 10.6771.6735 5. Implementierung der Lösung OPC-Client-Komponenten OPC-Server/SPS- Anbindung SPS Betriebssysteme Seite - 46 – Metadynamics OPC ClientX.NET Bernecker & Rainer PVI OPC-Server Bernecker & Rainer 1.5.0.39 2.5.2.3003 SG3 ab 2.24 SG4 ab 2.82 Tabelle 5.1: Eingesetzte Softwareprodukte 5.2 Designaspekte Abgeleitet aus den Systemanforderungen der Fischer GmbH wurde das Design der Softwarekomponenten und des entsprechenden Umfeldes einer Leitrechneranwendung entwickelt. Am Leitrechner laufen neben der komponentenbasierten Leitrechneranwendung die herstellerspezifischen OPC Data Access Server der angebundenen Maschinensteuerungssysteme. Der Zugriff auf die verschiedenen OPCServer erfolgt unabhängig von diesen mittels den OPC ClientX .NET Komponenten der Firma Metadynamics. Die OPC-Server bilden somit eine Abstraktionsschicht für die proprietären Kommunikationsprotokolle der Steuerungshersteller. Zur Anbindung an das Oracle-Datenbanksystem der Fischer GmbH wird eine Microsoft Access Datenbank verwendet. In der lokalen Datenbank sind die relevanten Tabellen des Oracle-Datenbanksystems der Fischer GmbH verknüpft. Der Datenbankzugriff der Anwendung beschränkt sich daher auf die lokale Datenbank und die Notwendigkeit eines direkten Zugriffs auf die Tabellen der Oracle-Datenbank wird vermieden. Die Produktionsdaten werden in einer speziellen Tabelle innerhalb der Access-Datenbank gehalten. Zur Aktualisierung der Produktionsdatentabelle werden in der Datenbank hinterlegte Stored Procedures von der Leitrechneranwendung aufgerufen. Besonderes Augenmerk wurde auf die Kapselung der einzelnen Funktionalitäten einer Leitrechneranwendung in eigenständig verwendbare Softwarekomponenten gelegt. Das Laufzeitverhalten der Instanzen der einzelnen Komponenten wird über spezielle Tabellen der lokalen Access-Datenbank konfiguriert. Durch die Gestaltung des Umfeldes in der beschriebenen Art und Weise wurde ein Maximum an Flexibilität für die Leitrechneranwendungen erreicht. Erweiterungen können in einer Vielzahl der Fälle konfiguriert anstatt programmiert werden. 5. Implementierung der Lösung 5.2.1 Seite - 47 – Trennung der Funktionalitäten in Komponenten Zur effizienten Erstellung von Leitrechneranwendungen wurden im Rahmen der Diplomarbeit die Hauptaufgaben der Applikationen in drei Softwarekomponenten gekapselt. Abbildung 5.1 zeigt den Aufbau einer komponentenbasierten Leitrechneranwendung und deren Umfeld. Die drei Komponenten OpcManager, DataManager und MachineManager bilden den Kern der Applikation. Mit der Kommunikation zu den Steuerungssystemen, der Datenbankanbindung und der Logik für den Datenaustausch mit den Steuerungen werden die Anforderungen an ein Leitrechnersystem zum Großteil erfüllt. Das grafische User Interface wird vom Programmierer anwendungsspezifisch erstellt. Abbildung 5.1: Architekturübersicht einer komponentenbasierten Leitrechneranwendung 5. Implementierung der Lösung Seite - 48 – Komponente „OpcManager“ Die Komponente OpcManager ist für die Initialisierung der Kommunikation mit den Maschinensteuerungssystemen zuständig. Der OpcManager stellt den Zugriff auf ein OPC-Server-Objekt je angebundener Maschine zur Verfügung. Die OPC-Server, deren Gruppen und Items, werden in den Konfigurationstabellen der Komponente definiert. Mit der Komponente OpcManager können Applikationen, welche ausschließlich zur Visualisierung von Prozess- bzw. Maschinenzuständen dienen, sehr einfach erstellt werden. Die Darstellung der einzelnen Variablenwerte sowie die Gestaltung der grafischen Benutzeroberfläche bleiben in diesem Fall wiederum dem Anwendungsentwickler überlassen. Ein einzelnes Objekt der Komponente initialisiert die Kommunikation mit allen angebundenen Maschinensteuerungssystemen. Eine mehrfache Instanzierung der Klasse ist somit nicht notwendig und wird unter zu Hilfenahme des Singleton-Designpatterns gemäß [Gamm97] verhindert. Das Singleton-Pattern wird in Abschnitt 5.2.2 näher betrachtet. Komponente „DataManager“ Als zweite Komponente wurde der so genannte DataManager implementiert. Der DataManager übernimmt die Datenbankanbindung und die Aktualisierung der Produktionsdaten in der lokalen Anwendungsdatenbank am Leitrechner. Die aktuellen Produktionsdaten werden in einem DataTable-Objekt für die Verwendung durch die Applikation zur Verfügung gestellt. Die Aktualisierung der Daten erfolgt durch den Aufruf von Stored Procedures. In einer der Konfigurationstabellen werden hierfür die Namen der aufzurufenden Prozeduren eingetragen. Neben der reinen Datenaktualisierung kann das Kopieren von Dateien von einem Netzlaufwerk, in Abhängigkeit von den Werten einer Spalte der Produktionsdatentabelle, konfiguriert werden. Dies kann notwendig sein, um beispielsweise NC-Programme (Numeric Control), welche direkt durch das CAD-System erstellt werden, auf den Leitrechner zu kopieren. Die Komponente DataManager kann eigenständig verwendet werden. Als Beispiel ist eine Anwendung zum Drucken von artikelspezifischen Produktetiketten denkbar. Die Komponente dient zur Anbindung an die übergeordnete Datenbank und stellt die 5. Implementierung der Lösung Seite - 49 – Artikeldaten zur weiteren Verwendung zur Verfügung. Das Etikett mit den entsprechenden Produktdaten kann dann durch die Anwendung auf einem Tischdrucker gedruckt werden. Wie die Komponente OpcManager ist auch der DataManager als Singleton implementiert, um eine mehrfache Instanzierung zu verhindern. Ein Objekt der Komponente verwaltet den gesamten Datenbestand für die gesamte Leitrechneranwendung. Komponente „MachineManager“ Mit dem Einsatz der beiden oben erwähnten Komponenten stehen sowohl die aktuellen Variablenwerte der einzelnen Maschinensteuerungssysteme als auch die aktuellen Produktionsdaten zur Verfügung. Die Logik zur Anfragebehandlung gemäß dem Flussdiagramm aus den Systemanforderungen in Kapitel 2 wurde in der Komponente MachineManager implementiert. Um die Komponente möglichst flexibel zu halten, wurden umfangreiche Konfigurationsmöglichkeiten vorgesehen. So wird in den Konfigurationstabellen die Bedeutung der einzelnen OPC-Gruppen und Items definiert. Für das Schreiben der Produktionsdaten auf die Maschinensteuerungen werden die Querverbindungen zwischen den OPC-Items bzw. den Variablen auf den Steuerungen und den entsprechenden Spaltennamen der Produktionsdatentabelle festgelegt. Downloads von Dateien und deren Konvertierung in ein für das Steuerungssystem verständliches Format werden ebenfalls in einer eigenständigen Konfigurationstabelle eingetragen. Der MachineManager basiert auf Objekten, welche durch die beiden zuvor vorgestellten Komponenten zur Verfügung gestellt werden. Eine Verwendung im Zusammenspiel mit dem OpcManager und dem DataManager ist daher zielführend. Der MachineManager ist im Gegensatz zu den beiden anderen Komponenten nicht als Singleton implementiert. Für jede angebundene Maschine wird ein eigenständiges Objekt instanziert. 5. Implementierung der Lösung 5.2.2 Seite - 50 – Designpatterns Bei der Erstellung der Komponenten wurden wie bereits erwähnt Designpatterns berücksichtigt. Im Folgenden werden das Singleton- und das Observer-Pattern vorgestellt und die entsprechenden Implementierungen in C# beschrieben. Singleton - Pattern Das Singleton ist laut [Klei03] ein objektbasiertes Erzeugungsmuster mit dem Zweck, dass eine Klasse mit genau einer Instanz existiert und genau ein Zugriffspunkt auf das Kreieren der Instanz ermöglicht wird. Die Implementierung in C# kann wie folgt sehr einfach realisiert werden public sealed class OpcManager : IDisposable { public static readonly OpcManager Instance = new OpcManager(); private OpcManager() { } } Listing 5.1: Singleton Implementierung in C# Das Schlüsselwort sealed in der Deklaration der Klasse verhindert die Ableitung der Klasse. Das public Attribut Instance ist als static readonly gekennzeichnet. Mit dem Zugriff auf das Attribut wird eine Instanz der Klasse erzeugt. Bei jedem weiteren Zugriff wird wiederum die Referenz auf das nur einmal erzeugte Objekt geliefert. Die private Kennzeichnung des Konstruktors verhindert eine Instanzierung über diesen. Observer - Pattern Das Observer-Pattern definiert eine Abhängigkeit von 1:n zwischen Objekten, sodass bei einer Zustandsänderung alle registrierten Objekte benachrichtigt werden und sich dann automatisch oder zu gegebener Zeit aktualisieren können [Klei03]. Die Programmiersprache C# bietet mit Events eine Möglichkeit zur Realisierung. In den im Rahmen der Diplomarbeit erstellten Softwarekomponenten wurde die EventsHelper Klasse aus [Löwy05] eingesetzt. Die Klasse bietet Methoden zum typsicheren Absetzen synchroner und asynchroner Events. Folgendes Beispiel in Listing 5.2 und Listing 5.3 zeigt 5. Implementierung der Lösung Seite - 51 – anhand des Events DataUpdateComplete das Absetzen des Events in der DataManager Klasse sowie die Registrierung des Empfangs in einer Client Klasse. Auszug aus der Klasse DataManager: public sealed class DataManager { .. public event GenericEventHandler EventDataUpdateComplete; private void LoadMachineData() { .. EventsHelper.Fire(EventDataUpdateComplete); } } Listing 5.2: Observer-Pattern – DataManager Klasse public class ClientClass { .. private void Init() { // Initialisierung des DataHandlers über Singleton dataMgr = DataManager.Instance; dataMgr.EventDataUpdateComplete += new GenericEventHandler(dataMgr_DataUpdateComplete); } void dataMgr_DataUpdateComplete() { .. } } Listing 5.3: Observer-Pattern – Client Klasse Die Client-Klasse registriert sich mit dem += Operator für die Benachrichtigung. Tritt das Ereignis EventDataUpdateComplete dataMgr_DataUpdateComplete 5.2.3 Die ein, so wird die Methode der Client Klasse aufgerufen. Unabhängigkeit vom Datenbanksystem Anforderung, die Komponenten unabhängig von der Datenherkunft der Produktionsdaten zu gestalten, ergibt die Notwendigkeit bereits den Code für den Datenzugriff unabhängig von der Datenquelle zu gestalten. ADO.NET 2.0 und dessen Providerfactories erleichtern die Umsetzung der Anforderung deutlich. Das folgende Listing 5.4 zeigt die Methoden Init, OpenDbConnection und CloseDbConnection, wie sie in ähnlicher Form in allen Komponenten zum Einsatz kommen. Aus Gründen der 5. Implementierung der Lösung Seite - 52 – Anschaulichkeit wurden die try und catch Anweisungen der Ausnahmebehandlung entfernt. // Private private string m_ProviderName; private string m_ConnectionString; private DbProviderFactory m_DataProvider; private DbConnection m_DataConnection; public void Init(string dbProviderName, string dbConnectionString) { // Setzen der lokalen Membervariablen m_ProviderName = dbProviderName; m_ConnectionString = dbConnectionString; OpenDbConnection(); // Klassenspezifische Initialisierung .. CloseDbConnection(); } private void OpenDbConnection() { // Instanz der DbProviderFactory mit dem Providernamen erzeugen m_DataProvider= DbProviderFactories.GetFactory(m_ProviderName); // Erzeugen eines Connection Objekts über die DbProviderFactory m_DataConnection = m_DataProvider.CreateConnection(); // Setzen des ConnectionStrings der Verbindung m_DataConnection.ConnectionString = m_ConnectionString; if (m_DataConnection.State==System.Data.ConnectionState.Closed) { m_DataConnection.Open(); // Öffnen der Datenbankverbindung } } private void CloseDbConnection() { if (m_DataConnection.State==System.Data.ConnectionState.Open) { m_DataConnection.Close(); // Schließen der Datenbankverb. } } Listing 5.4: Verwendung von Providerfactories in ADO.NET 2.0 Die public verfügbare anwendungsspezifischen Methode Init Providernamen erhält und als Übergabeparameter Connection-String den der Konfigurationsdatenbank. Mit Hilfe des dem Providernamens wird durch einen vom data provider unabhängigen Methodenaufruf ein DbProviderFactory Objekt erstellt. Zum Zugriff auf Microsoft Access Datenbanken wird als Providername System.Data.OleDb verwendet. Microsoft SQL Server werden mit System.Data.SqlClient verbunden. Mit dem providerspezifischen DbProviderFactory Objekt lässt sich anschließend ein 5. Implementierung der Lösung DbConnection Seite - 53 – Objekt erzeugen. Mit der Eigenschaft ConnectionString wird die Verbindungszeichenfolge zur Datenbank definiert. 5.3 Lokale Anwendungsdatenbank In der Access-Datenbank am Leitrechner erfolgt die Verwaltung der Produktionsdaten sowie die Konfiguration der einzelnen Softwarekomponenten. Für beide Aufgaben müssen verschiedene Tabellen in definierter Form zwingend vorhanden sein. In Abschnitt 5.3.1 werden Aufbau und Aktualisierung der Produktionsdatentabelle beschrieben. Abschnitt 5.3.2 zeigt die Anforderungen an die Konfigurationstabellen der verschiedenen Softwarekomponenten. 5.3.1 Verwaltung der Produktionsdaten Die Produktions- bzw. Maschinendaten werden in einer Tabelle mit dem fest vorgegebenen Namen MachineData gehalten. Der Aufbau der Tabelle unterscheidet sich je nach dem Einsatzgebiet des Leitrechnersystems. In gewissen Produktionsbereichen kann eine Unterscheidung hinsichtlich des zu produzierenden Artikels mit der Artikelnummer als Primärschlüssel ausreichend sein. In anderen Bereichen müssen hingegen die einzelnen Kundenaufträge mit der Auftragsnummer als Schlüsselfeld unterschieden werden. Aus diesem Grund gibt es nur wenige Vorschriften beim Anlegen der Tabelle zu beachten. Einige Spalten sind zwingend erforderlich. Die Tabelle A.1 im Anhang A des Dokuments gibt eine Übersicht über diese „Muss-Felder“. Die Anzahl der effektiven Felder für Produktionsparameter ist ebenso unerheblich wie die Namen der entsprechenden Felder. In der Praxis wird es sich als Ziel führend erweisen, eine vorhandene Anwendungsdatenbank an die Gegebenheiten einer neuen Applikation anzupassen. Befüllung, Aktualisierung und Bereinigung der Tabelle Aufgrund der hohen Flexibilitätsanforderungen an die Tabelle wird das Befüllen, die Aktualisierung und die Bereinigung der Datensätze über in der Datenbank hinterlegte Stored Procedures vorgenommen. Zu diesem Zweck werden die Oracle-Tabellen mit den benötigten Quelldaten in der Access-Datenbank verknüpft. Für die im Sprachgebrauch von Microsoft Access als Abfragen bezeichneten Stored Procedures besteht kein Unterschied hinsichtlich des Zugriffs auf lokale und verknüpfte Tabellen. Die Abfragen können nach 5. Implementierung der Lösung Seite - 54 – der Erstellung direkt in Access ausgeführt und getestet werden. In der Regel sind für eine konsistente Datenverwaltung mindestens drei Abfragen notwendig. Die erste Abfrage befüllt die Tabelle. Eine zweite Abfrage aktualisiert bereits vorhandene Datensätze. Die dritte Abfrage entfernt Datensätze, welche über längere Zeit nicht mehr aktualisiert wurden und somit nicht mehr relevant sind. Als Zeitspanne hierfür werden derzeit 30 Tage verwendet. Je nach Anzahl der Quelltabellen können wie aus Abbildung 5.2 hervorgeht mehrere Aktualisierungsabfragen erforderlich sein. Abbildung 5.2: Befüllung, Aktualisierung und Bereinigung der Tabelle MachineData Der eindeutige Wert des Feldes MACHINEKEY wird beim Eintragen des Datensatzes in die Tabelle MachineData generiert. Die Inhalte der Felder CODE1, CODE2 und DATAVALID ergeben sich entweder direkt aus anderen Feldwerten oder aus einer bedingten Kombination der Inhalte verschiedener Datenfelder. Die Felder werden im Zuge einer Aktualisierungsanfrage befüllt. Das Ausführen aller notwendigen Abfragen wird im weiteren Dokument kurz als „Daten laden“ bezeichnet. Die Komponente DataManager bietet Methoden um das Laden der Daten unmittelbar bzw. in einem täglichen Intervall zu starten. 5. Implementierung der Lösung 5.3.2 Seite - 55 – Konfigurations-Tabellen Um ein möglichst breites Anwendungsspektrum mit den Softwarekomponenten abdecken zu können, wurden umfangreiche Konfigurationsmöglichkeiten vorgesehen. Die Konfigurationstabellen ermöglichen die Definition folgender Einstellungen für die einzelnen Komponenten: OpcManager • Welche Maschinen müssen über welche OPC-Server angebunden werden • Welche OPC-Gruppen müssen für welche Maschinen angelegt werden • Welche OPC-Items gehören zu welcher OPC-Gruppe DataManager • Welche Abfragen müssen zum Laden der Daten ausgeführt werden • Welche Dateien MachineData müssen in Abhängigkeit welcher Felder der Tabelle von welchem Speicherort zu welchem Speicherort kopiert werden MachineManager • Welche OPC-Gruppe stellt die Schnittstellengruppe zur Anfrageverwaltung dar • Welche OPC-Items der Schnittstellengruppe erfüllen welchen Zweck • Welche OPC-Gruppen werden für die verschiedenen Aufträge auf der Maschine verwendet • Welche Felder der Tabelle MachineData müssen beim Übertragen der Daten auf die Steuerung auf welche OPC-Items geschrieben werden • Welche Dateien von welchem Speicherort müssen vor der Übertragung zur Steuerung wie konvertiert werden 5. Implementierung der Lösung Seite - 56 – Konfiguration der Komponente OpcManager Die Komponente OpcManager wird mittels drei, zueinander in Beziehung stehenden, Tabellen konfiguriert. Die Config_OpcConnections, Tabellen haben Config_OpcGroups die und fest vorgegebenen Config_OpcItems. Namen Das ER- Diagramm in Abbildung 5.3 zeigt den Aufbau der Tabellen und deren Relationen zueinander. Abbildung 5.3: Konfigurationstabellen der Komponente OpcManager Tabelle Config_OpcConnections Die Tabelle Config_OpcConnections definiert die OPC-Server-Verbindungen für die einzelnen Maschinen. Als Primärschlüssel wird eine eindeutige MachineId verwendet, der auch bei der Konfiguration der Komponente MachineManager große Bedeutung zukommt. Die Tabelle A.2 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_OpcConnections. Tabelle Config_OpcGroups Für jede MachineId werden in der Tabelle Config_OpcGroups die zugehörigen OPCGruppen mit entsprechenden Verbindungsparametern eingetragen. Als Primärschlüssel dient eine eindeutige GroupId. Die Tabelle A.3 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_OpcGroups. Tabelle Config_OpcItems Die Tabelle Config_OpcItems enthält die OPC-Items, welche durch den OpcManager verbunden werden sollen. Die OPC-Items können durch die GroupId eindeutig einer Maschine zugeordnet werden. Die GroupId bildet zusammen mit der ItemId den 5. Implementierung der Lösung Seite - 57 – Primärschlüssel der Tabelle. Die Tabelle A.4 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_OpcItems. Zur anschaulichen Erklärung der Konfigurationstabellen zeigt Abbildung 5.4 eine Beispielkonfiguration für eine Leitrechneranwendung zur Anbindung von drei Maschinen mit jeweils fünf Datenbereichen. Die Relationen werden von Microsoft Access als erweiterbare Unterdatenblätter dargestellt. Abbildung 5.4: Beispielkonfiguration der Komponente OpcManager 5. Implementierung der Lösung Seite - 58 – Konfiguration der Komponente DataManager Die Komponente DataManager wird über zwei, voneinander unabhängige Tabellen konfiguriert. Die Tabellen Config_DataProcedureCalls haben die fest vorgegebenen Namen und Config_DataFileTransfer. Da alle Maschinen aus dem gleichen Datenbestand bedient werden, hat die MachineId keine Bedeutung. Das ERDiagramm in Abbildung 5.5 zeigt den Aufbau der Tabellen. Abbildung 5.5: Konfigurationstabellen der Komponente DataManager Tabelle Config_DataProcedureCalls In der Tabelle Config_DataProcedureCalls werden die Namen der Abfragen eingetragen, die beim Laden der Daten von der Komponente DataManager aufgerufen werden sollen. Die Tabelle A.5 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_DataProcedureCalls. Tabelle Config_DataFileTransfer Sollen neben den Daten aus der Produktionsdatentabelle MachineData auch Dateien auf die Maschinensteuerungen übertragen werden, so müssen diese zuerst auf den Leitrechner kopiert werden. In der Tabelle Config_DataFileTransfer werden die Vorgaben für das Kopieren der Dateien eingetragen. Ist kein Dateitransfer erwünscht, müssen alle Einträge in der Tabelle entfernt werden. Die Tabelle A.6 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_DataFileTransfer. Abbildung 5.6 zeigt eine Beispielkonfiguration für eine Leitrechneranwendung mit sechs Abfragen zur Datenaktualisierung und einem Dateitransfer von Laufwerk W: nach Laufwerk C:. Die Namen der zu kopierenden Dateien setzen sich bei gezeigter Konfiguration aus den Werten des Feldes NC_FILE_SWS und der Dateinamenerweiterung .nc zusammen. 5. Implementierung der Lösung Abbildung 5.6: Beispielkonfiguration der Komponente DataManager Seite - 59 – 5. Implementierung der Lösung Seite - 60 – Konfiguration der Komponente MachineManager Für die Logik der Anfragebehandlung ist die Komponente MachineManager zuständig. Die Konfiguration erfolgt mittels drei, voneinander unabhängige Tabellen. Die MachineId aus der Konfiguration der Komponente OpcManager wird in allen Tabellen zur Zuordnung zu einer bestimmten Maschinenverbindung verwendet. Die Tabellennamen sind fest vorgegeben und lauten Config_MachineInterfaceItems, Config_MachineDataItems sowie Config_MachineFileDownload. Das ER-Diagramm in Abbildung 5.7 zeigt den Aufbau der Tabellen. Abbildung 5.7: Konfigurationstabellen der Komponente MachineManager Tabelle Config_MachineInterfaceItems In der Tabelle Config_MachineInterfaceItems werden die Querverweise zwischen den einzelnen Funktionen der Anfrageschnittstelle und den OPC-Items der bereits in der Konfigurationstabelle Config_OpcGroups der Komponente OpcManager definierten Interfacegruppe festgelegt. Die Funktionstexte müssen für jede angebundene Maschine eingetragen werden. Die Tabelle A.7 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_MachineInterfaceItems. Tabelle Config_MachineDataItems In der Tabelle Config_MachineDataItems werden die Querverweise zwischen den einzelnen OPC-Items der Datengruppen und den Feldnamen der Tabelle MachineData festgelegt. Die Querverweise müssen durch den identischen Aufbau aller Datengruppen einer Maschine je MachineId nur einmalig eingetragen werden. Die Tabelle A.8 im Anhang A des Dokuments Config_MachineDataItems. beschreibt die Felder der Konfigurationstabelle 5. Implementierung der Lösung Seite - 61 – Tabelle Config_MachineFileDownload Zur Übertragung einer oder mehrerer Dateien zum Maschinensteuerungssystem müssen diese zuerst in ein für die Steuerung lesbares Format konvertiert werden. Über die Tabelle Config_MachineFileDownload können die Auswahl der Datei und die entsprechende Konvertierung parametriert werden. Wenn keine Dateiübertragungen notwendig sind, bleibt die Tabelle leer. Die Tabelle A.9 im Anhang A des Dokuments beschreibt die Felder der Konfigurationstabelle Config_MachineFileDownload. Die Beispielkonfiguration in Abbildung 5.8 zeigt die oben beschrieben Tabellen in der Darstellung von Microsoft Access. Es wurde die Anbindung von drei Maschinen konfiguriert. Für die Maschine mit der MachineId 3 ist ein Dateidownload in der Tabelle Config_MachineFileDownload eingetragen. Abbildung 5.8: Beispielkonfiguration der Komponente MachineManager 5. Implementierung der Lösung 5.4 Seite - 62 – Komponente OpcManager Das UML-Klassendiagramm in Abbildung 5.9 gibt einen Überblick über die Komponente OpcManager. Leider bietet die Express Edition von Microsoft Visual C# 2005 keine Möglichkeit zur Generierung von UML-Klassendiagrammen. Aus diesem Grund wurden die UML-Diagramme der einzelnen Komponenten während der 90-tägigen Evaluierungsphase von Microsoft Visual Studio 2005 Professional erstellt. Die Darstellung der mittels Visual Studio generierten Klassendiagramme ist nicht konform zur UMLSpezifikation wie sie in [Pilo04] verwendet wird. Es werden für die Beschreibung der einzelnen Komponenten in den Abschnitten 5.4, 5.5 und 5.6 nur die öffentlichen Methoden, Attribute, Eigenschaften und Ereignisse dargestellt. Die Abbildungen Abbildung C.1, Abbildung C.2 und Abbildung C.3 in Anhang C des Dokuments zeigen die vollständigen Klassendiagramme der Komponenten. Abbildung 5.9: UML-Klassendiagramm OpcManager Wie aus dem Klassendiagramm hervorgeht implementiert die Komponente OpcManager, wie auch alle weiteren Komponenten, das Interface IDisposable mit dessen public Methode Dispose(). Die Funktionalität der Methode wird im Rahmen der allgemeinen Beschreibung der öffentlichen Methoden in Anhang B, Tabelle B.1 erläutert. 5.4.1 Initialisierung Listing 5.5 zeigt die Initialisierung der Komponente durch die Anwendung. Die Komponente wurde wie bereits in Abschnitt 5.2.2 gezeigt mit Hilfe des Entwurfsmusters Singleton implementiert. Das Attribut Instance liefert die Referenz auf die einzige Instanz der Klasse zurück. Mit der öffentlichen Methode Init() wird die eigentliche Initialisierung über die zugrunde liegenden Konfigurationstabellen gestartet. Der 5. Implementierung der Lösung Seite - 63 – Providername und die Verbindungszeichenfolge werden in diesem Beispiel mit der Klasse ConfigurationManager aus dem XML-Konfigurationsfile der Anwendung gelesen. Die Vorteile der Unabhängigkeit vom Datenbanksystem der Konfigurationsdatenbank wurden bereits in Abschnitt 5.2.3 anhand der Methode Init() demonstriert. string dbProviderName = ConfigurationManager.ConnectionStrings ["Leitrechner"].ProviderName; string dbConnectionString = ConfigurationManager.ConnectionStrings ["Leitrechner"].ConnectionString; // Initialisierung des OpcManagers für alle Maschinen OpcManager opcMgr = OpcManager.Instance; opcMgr.Init(dbProviderName, dbConnectionString); Listing 5.5: Initialisierung der Komponente OpcManager 5.4.2 Öffentliche Methoden, Eigenschaften und Ereignisse Die detaillierte Beschreibung der öffentlichen Methoden, Eigenschaften und Ereignisse der Komponente OpcManager kann den Tabellen Tabelle B.1, Tabelle B.2 und Tabelle B.3 in Anhang B des Dokuments entnommen werden. 5.5 Komponente DataManager Die Komponente DataManager ist in ihrer Grundkonzeption dem OpcManager sehr ähnlich. In Abbildung 5.10 ist die bereits bekannte Implementierung des Interface IDisposable und die Ausführung als Singleton durch das Attribut Instance ersichtlich. Abbildung 5.10: UML-Klassendiagramm DataManager 5. Implementierung der Lösung 5.5.1 Seite - 64 – Initialisierung Durch die identische Konzeption der Komponente unterscheidet sich die Initialisierung in Listing 5.6 nicht von jener der Komponente OpcManager in Listing 5.5. Zum Abschluss wird der Client zur Benachrichtigung über das Ereignis EventDataUpdateComplete, wie schon in Abschnitt 5.2.2 gezeigt, registriert. string dbProviderName = ConfigurationManager.ConnectionStrings ["Leitrechner"].ProviderName; string dbConnectionString = ConfigurationManager.ConnectionStrings ["Leitrechner"].ConnectionString; // Initialisierung des DataManagers für alle Maschinen DataManager dataMgr = DataManager.Instance; dataMgr.Init(dbProviderName, dbConnectionString); dataMgr.StartDailyUpdate(10, 00); // Tägliches Laden um 10:00 Uhr dataMgr.EventDataUpdateComplete += new GenericEventHandler(dataMgr_DataUpdateComplete); Listing 5.6: Initialisierung der Komponente DataManager 5.5.2 Öffentliche Methoden, Eigenschaften und Ereignisse Die detaillierte Beschreibung der öffentlichen Methoden, Eigenschaften und Ereignisse der Komponente DataManager kann den Tabellen Tabelle B.4, Tabelle B.5 und Tabelle B.6 in Anhang B des Dokuments entnommen werden. 5.6 Komponente MachineManager Die Komponente MachineManager wurde im Gegensatz zu den anderen Komponenten nicht als Singleton implementiert. Das UML-Klassendiagramm in Abbildung 5.11 gibt einen Überblick über die öffentlichen Methoden, Eigenschaften und Ereignisse der Komponente. Wie erkennbar ist, verfügt die Komponente nicht über das Attribut Instance. Die Instanzierung erfolgt über den Konstruktor MachineManager(). Für jede der angebundenen Maschinen übernimmt eine eigene Instanz der Komponente die Logik der Anfragebehandlung. 5. Implementierung der Lösung Seite - 65 – Abbildung 5.11: UML-Klassendiagramm MachineManager 5.6.1 Initialisierung Die Komponente MachineManager baut auf den Komponenten OpcManager und DataManager auf. In Listing 5.7 werden zuerst die Basiskomponenten initialisiert. Anschließend wird das über die Eigenschaft MachineData verfügbare Abbild der Produktionsdatentabelle MachineData in zwei unterschiedlichen BindingSource Objekten gekapselt. Die Klasse BindingSource ist eine Neuheit von ADO.NET 2.0 und ermöglicht das Binden der über die Eigenschaft DataSource verbundenen Datenquelle an Steuerelemente der grafischen Benutzeroberfläche. Das Durchsuchen, Filtern und Sortieren der Datenquelle ist durch bereitgestellte Methoden sehr einfach möglich. Mit dem Objekt machineDataBindingManuell kann die manuelle Auswahl eines Datensatzes über ein Steuerelement erfolgen. Der gewählte Datensatz kann anschließend mit der Methode FixData() fest auf der Steuerung vorgegeben werden. Die feste Vorgabe wird im Rahmen dieses Dokumentes auch als „Fixierung“ bezeichnet. Die Maschinensteuerung wird dann unabhängig von der Produktkennung die fixierten Daten verwenden. Das Objekt machineDataBindingAuto ermöglicht es dem MachineManager unabhängig von einer möglichen manuellen Vorwahl die Tabelle nach dem Kriterium der Anfrage zu durchsuchen. Über den Konstruktor werden am Ende des Codebeispiels die einzelnen Objekte der Komponente MachineManager erzeugt und mit der Eigenschaft Enabled aktiviert. 5. Implementierung der Lösung string dbProviderName Seite - 66 – = ConfigurationManager.ConnectionStrings ["Leitrechner"].ProviderName; string dbConnectionString = ConfigurationManager.ConnectionStrings ["Leitrechner"].ConnectionString; // Initialisierung des OpcManagers für alle Maschinen OpcManager opcMgr = OpcManager.Instance; opcMgr.Init(dbProviderName, dbConnectionString); // Initialisierung des DataManagers für alle Maschinen DataManager dataMgr = DataManager.Instance; dataMgr.Init(dbProviderName, dbConnectionString); dataMgr.EventDataUpdateComplete += new GenericEventHandler(dataMgr_DataUpdateComplete); dataMgr.StartDailyUpdate(10, 00); // Tägliches Laden um 10:00 Uhr // BindingSource für die manuelle Auswahl der Daten machineDataBindingManuell = new BindingSource(); machineDataBindingManuell.DataSource = dataMgr.MachineData; machineDataBindingManuell.MoveFirst(); // BindingSource für die automatische Auswahl der Daten durch den // MachineManager selbst machineDataBindingAuto = new BindingSource(); machineDataBindingAuto.DataSource = dataMgr.MachineData; machineDataBindingAuto.MoveFirst(); // Initialisierung des MachineManager für Maschine 1 machineMgr[1] = new MachineManager( dbProviderName, dbConnectionString, 1, opcMgr, machineDataBindingManuell, machineDataBindingAuto ); machineMgr[1].Enabled = true; // Aktivierung der Automatikfunktion // Initialisierung des MachineManager für Maschine 2 .. Listing 5.7: Initialisierung der Komponente MachineManager 5.6.2 Öffentliche Methoden, Eigenschaften und Ereignisse Die detaillierte Beschreibung der öffentlichen Methoden, Eigenschaften und Ereignisse der Komponente MachineManager kann den Tabellen Tabelle B.7, Tabelle B.8 und Tabelle B.9 in Anhang B des Dokuments entnommen werden. 6. Anwendung der Softwarekomponenten 6. Seite - 67 – Anwendung der Softwarekomponenten Zur Demonstration der Leistungsfähigkeit der im Rahmen der Diplomarbeit entwickelten Softwarekomponenten wurde eine Leitrechneranwendung für den Einsatz im Produktionsumfeld der Fischer GmbH erstellt. Die Anwendung nutzt sämtliche Funktionalitäten der Komponenten und wurde hinsichtlich ihrer Zuverlässigkeit eingehend getestet. 6.1 Aufbau der Demonstrationsanwendung Die Leitrechneranwendung wurde für die Anbindung von drei Produktionsmaschinen konzipiert. Wie aus Abbildung 6.1 hervorgeht erfolgt die Kommunikation mit den Maschinensteuerungssystemen bei zwei Maschinen über eine serielle RS232 Verbindung. Eine Maschine ist via Ethernet an den Leitrechner angebunden. Die Anlagen sind mit Steuerungssystemen der Familie 2003 und 2005 der Firma Bernecker&Rainer ausgestattet. Der verwendete OPC-Server stammt ebenfalls von Bernecker&Rainer. Abbildung 6.1: Umfeld der entwickelten Leitrechneranwendung Die Leitrechneranwendung überträgt je Maschine unterschiedliche Produktionsdaten. Die Schwabbelmaschine und die Entgratmaschine erhalten ausschließlich Parameter aus der lokalen Anwendungsdatenbank. Für die Seitenwangenschleifmaschine werden durch die Komponente DataManager beim Laden der Daten NC-Programme von einem 6. Anwendung der Softwarekomponenten Seite - 68 – Netzlaufwerk auf den Leitrechner kopiert. Die Dateien werden bei einer Anfrage durch die Maschine konvertiert und zusätzlich zu den Produktionsparametern aus der Datenbank zur Steuerung übertragen. Für jede Maschine wurde die Möglichkeit der Fixierung eines bestimmten Parametersatzes realisiert. Weiters können die Daten jeder Maschine ausgelesen und gelöscht werden. Anhang D des Dokuments enthält Screenshots der aktiven Anwendung. 6.2 Test der Leitrechneranwendung Um die Anwendung hinsichtlich ihrer Leistungsfähigkeit und Zuverlässigkeit testen zu können, wurde eine Testkonfiguration mit dem Leitrechner und den drei Steuerungssystemen aufgebaut. Während eines Stresstests wurde mit dem .NET Memory Profiler der Firma SciTech der Speicherbedarf der Anwendung aufgezeichnet. Im Testaufbau verwendete Hardwarekomponenten Industrie PC Bernecker&Rainer Provit 5000 Schwabbelmaschine Prozessor: Pentium III – 850 Mhz Arbeitsspeicher: 512 MB Betriebssystem: Windows 2000 Professional SP4 Bernecker&Rainer System 2003 Entgratmaschine CPU: CP476.60-1 Bernecker&Rainer System 2003 Seitenwangenschleifmaschine CPU: CP476.60-1 Bernecker&Rainer System 2003 CPU: CP260.60-1 Tabelle 6.1: Verwendete Hardware im Testaufbau Ergebnisse des Stresstests Die Software der Steuerungssysteme wurde derart modifiziert, dass jede Steuerung in einem Intervall von 3 Sekunden eine Anfrage an den Leitrechner generiert. Die unterschiedlichen Zeiten der Datenübertragung sind in diesem Intervall nicht enthalten. Aus diesem Grund ergeben sich Verschiebungen der Anfragezeitpunkte der einzelnen Steuerungen zueinander. Die theoretische Gleichzeitigkeit von zwei oder mehreren Anfragen wurde somit durch die Testkonfiguration berücksichtigt. Während des Stresstests wurden in einem Zeitraum von ca. 23 Stunden insgesamt 55372 Anfragen erfolgreich 6. Anwendung der Softwarekomponenten Seite - 69 – abgearbeitet. Dies entspricht mehr als der kalkulierten Jahresleistung von ca. 55000 Anfragen1. Parallel zur Bedienung der Anfragen wurden alle 10 Minuten die Produktionsdaten durch die Anwendung neu geladen. Provozierte Fehlersituationen Zur Bewertung der Zuverlässigkeit der Leitrechneranwendung wurden während des Stresstests einige Fehlersituationen provoziert. Das Unterbrechen der Netzwerkverbindung hatte den Ausfall der Kommunikation mit der über Ethernet angebundenen Maschine zur Folge. Ein Zugriff auf den Datenbankserver sowie auf das Netzlaufwerk mit den NCProgrammen war ebenfalls nicht mehr möglich. Die Anwendung bediente in diesem Zustand die Anfragen der beiden seriell angebundenen Maschinen erfolgreich weiter. Das Fehlschlagen des Ladens der Daten beeinträchtigte die Anwendung nicht. Nach dem Wiederherstellen der Netzwerkverbindung wurde die Kommunikation zur Seitenwangenschleifmaschine wieder aufgebaut und die Anfragebearbeitung fortgesetzt. In Einzeltests wurden spezielle Datenfehler simuliert. Es wurden beispielsweise Anfragen nach nicht vorhandenen Datensätzen abgesetzt. Zusätzlich wurden Null-Werte in die Datenfelder der Datensätze eingetragen. Die Anwendung zeigte auch in diesen Tests die geforderte Fehlertoleranz. 1 365 Tage x 50 Lose/Tag x 3 Maschinen = 54750 Anfragen / Jahr 6. Anwendung der Softwarekomponenten Seite - 70 – Aufzeichnung der Speichernutzung Aus der Aufzeichnung des Speicherbedarfs der Anwendung ist ersichtlich, dass die Speichernutzung während des Testlaufs konstant blieb. Temporäre Spitzen, die durch das Laden der Auftragsdaten bedingt sind, werden beim Lauf des .NET-Garbage-Collectors wieder freigegeben. Abbildung 6.2 zeigt den Speicherverbrauch in der Darstellungsweise des SciTech .NET Memory Profiler. Abbildung 6.2: Aufzeichnung des Speicherbedarfs der Leitrechneranwendung 6.3 Zusammenfassung Die Leitrechneranwendung und ihre Basiskomponenten haben in den Punkten Zuverlässigkeit und Performance die Anforderungen der Fischer GmbH zur vollsten Zufriedenheit erfüllt. Die Komponenten wurden durch die Fischer GmbH zur Verwendung in zukünftigen Projekten freigegeben und vorgeschrieben. 7. Ausblick 7. Seite - 71 – Ausblick Mit der Anwendung der Softwarekomponenten als Basis einer produktiv eingesetzten Leitrechneranwendung wurden die von der Fischer GmbH gesetzten Projektziele in vollen Umfang erreicht. Während der Erstellung der Demonstrationsanwendung hatten die Softwareentwickler der Fischer GmbH Gelegenheit die erstellten Komponenten und deren Handhabung kennen zu lernen. In einer kritischen Diskussion wurden das Weiterentwicklungspotential der bestehenden Komponenten sowie die Erstellung neuer Softwarebausteine besprochen. Zusammenfassend können folgende Punkte aus der Ergebnisbesprechung als konkrete Ansatzpunkte für gezielte Verbesserungen und Erweiterungen genannt werden. Reduzierung des Konfigurationsaufwandes durch (Teil-)Automatisierung Der Arbeitsaufwand für die Konfigurationserstellung kann bei mehreren angebundenen Maschinen nicht mehr unerheblich sein. Ein Großteil der Arbeitsleistung ist hierbei für die Konfiguration der Komponente OpcManager zu erbringen. Aus diesem Grund wurden Möglichkeiten zur weitgehend automatisierten Config_OpcConnections, Config_OpcGroups Befüllung der Tabellen und Config_OpcItems besprochen. Die angestrebte Lösung sieht vor, ausgehend von der Konfiguration des OPC-Servers, die Konfigurationstabellen mit Daten zu füllen. Eine weitere Detaillierung der Aufgabenstellung ist noch nicht erfolgt. Leider verfügen OPC-Server verschiedener Hersteller in der Regel über kein einheitliches Exportformat. Somit ist eine Anpassung der Applikation oder Routine zur Konfigurationsunterstützung an jeden der häufig verwendeten Server notwendig. Durch die überwiegende Nutzung des OPC-Servers der Firma Bernecker&Rainer stellt diese Gegebenheit kein Problem für die Fischer GmbH dar. In Einzelfällen kann die Konfiguration der Anbindung der vom Standard abweichenden Server auch in Zukunft manuell erfolgen. Erstellung von GUI Komponenten Trotz der spezifischen Ausrichtung der Leitrechneranwendungen auf eine bestimmte Anlagenkombination werden in den grafischen Benutzeroberflächen häufig sehr ähnliche Elemente verwendet. Als Beispiel können verschiedenste Statusanzeigen genannt werden. 7. Ausblick Seite - 72 – Die zukünftige Entwicklung von standardisierten grafischen Komponenten stellt einen weiteren Schritt zur Effizienzsteigerung der Anwendungsentwicklung dar. Internationalisierung Die Fischer GmbH verfügt über einen zweiten Produktionsstandort in der Ukraine. Eine Leitrechneranwendung muss für den Einsatz an diesem Standort die Möglichkeit zur Sprachumschaltung besitzen. Derzeit steht noch nicht fest, ob zu diesem Zweck eine neue Komponente entwickelt werden muss. Die Thematik wird im Rahmen des ersten, konkreten Anwendungsfalles näher betrachtet. Schlussbemerkung Es kann festgestellt werden, dass an den im Rahmen der Diplomarbeit entwickelten Softwarekomponenten mit dem Auftreten bisher noch unbekannter Anforderungen Modifikationen notwendig sein können. Durch die Akzeptanz der entwickelten Komponenten auf Seiten der Fischer GmbH wird der Fokus für weiterführende Optimierungen auf das Umfeld der Komponenten bzw. die Leitrechneranwendungen selbst gelegt. Literaturverzeichnis Seite - 73 – Literaturverzeichnis [Balz01] Helmut Balzert (2001), Lehrbuch der Software-Technik, 2. Auflage, Spektrum Akademischer Verlag, Heidelberg-Berlin [Bern06] Bernecker & Rainer GmbH (2006), Produktkatalog 2006, Eggelsberg [Gamm97] Erich Gamma et al. (1997), Design Patterns. Elements of Reusable ObjectOriented Software, Addison-Wesley Professional, Boston [Hami03] Bill Hamilton, Matthew MacDonald (2003), ADO.NET in a NutShell, First Edition, O’Reilly Media, Sebastopol [Iwan05] Frank Iwanitz (2005), OPC, 3. Auflage, Hüthig Verlag, Heidelberg [Kemp01] Alfons Kemper, André Eickler (2001), Datenbanksysteme – Eine Einführung, 4. Auflage, Oldenbourg Verlag, München [Klei03] Max Kleiner et al. (2003), Patterns Konkret, Software & Support Verlag, Frankfurt [Loos01] Peter Loos (2001), Go to COM, 1. Auflage, Addison-Wesley Verlag, München [Löwy05] Juval Löwy (2005), Programming .NET Components, Second Edition, O’Reilly Media, Sebastopol [Micr94a] Microsoft Corporation (1994), OLE 2 Programmer’s Reference, Volume 1, Microsoft Press International, Redmond [Micr94b] Microsoft Corporation (1994), OLE 2 Programmer’s Reference, Volume 2, Microsoft Press International, Redmond [Micr06] Microsoft Corporation (2006), .NET Framework Developer’s Guide Developing Components, http://msdn.microsoft.com/library/default.asp?url=/library/enus/cpguide/html/cpconcomponentprogrammingessentials.asp (08.05.2006) [Pilo04] Dan Pilone (2004), UML kurz & gut, 1. Auflage, O’Reilly Verlag, Köln [Prat01] Steven Pratschner (2001), Simplifying Deployment and Solving DLL Hell with the .NET Framework, http://msdn.microsoft.com/library/default.asp?url=/library/enus/dndotnet/html/dplywithnet.asp (08.05.2006) [Schw05] Holger Schwichtenberg (2005), Microsoft .NET 2.0 Crashkurs, Microsoft Press Deutschland, Unterschleissheim Literaturverzeichnis [Seit03] Seite - 74 – Matthias Seitz (2003), Speicherprogrammierbare Steuerungen, Hanser Fachbuchverlag, München Abkürzungsverzeichnis Abkürzungsverzeichnis API Application Programming Interface CAD Computer Aided Design CLR Common Language Runtime CLS Common Language Specification CLSID Class Identifier COM Component Object Model CTS Common Type System DB Datenbank DBMS Datenbankmanagement DBS Datenbanksysteme DCE Distributed Computing Enviroment DCOM Distributed Component Object Model DD Data Dictionary DDE Dynamic Data Exchange DDL Data Definition Language DLL Dynamic Link Library DML Data Manipulation Language ER Entity Relationship ERP Enterprise Ressource Planning FCL .NET Framework Class Library FK Foreign Key (Fremdschlüssel) GUI Graphical User Interface GUID Global Unique Identifier HMI Human Machine Interface HP-UX Hewlett Packard UNIX IDE Integrated Development Enviroment IDL Interface Definition Language IID Interface Identifier J2EE Java 2 Enterprise Edition JDBC Java Database Connectivity JIT Just-in-Time Compiler Seite - 75 – Abkürzungsverzeichnis JRE Java Runtime Enviroment MMA Multi Module Assembly (.NET) MSIL Microsoft Intermediate Language NC Numeric Control ODBS Objektorientierte Datenbanksysteme OLE Object Linking and Embedding OPC Openess, Productivity and Collaboration OLE for Process Control ORDBS Objektrelationale Datenbanksysteme ORPC Object Remote Procedure Call OSF Open Software Foundation PK Primary Key (Primärschlüssel) PLC Programmable Logic Controller RDBS Relationale Datenbanksysteme RPC Remote Procedure Call SMA Single Module Assembly (.NET) SPS Speicherprogrammierbare Steuerung SQL Structured Query Language SWT Standard Widget Toolkit UML Unified Modeling Language VM Virtual Machine (Java) VPS Verbindungsprogrammierte Steuerung XML eXtensible Markup Language Seite - 76 – Anhang Seite - 77 – Anhang A. Beschreibung der Daten- und Konfigurationstabellen Datentabelle MachineData Feldname CODE1 Typ Text Bedeutung Erstes Suchfeld für die Produktkennung nach der Datenanfrage eines Maschinensteuerungssystems CODE2 Text Zweites Suchfeld für die Produktkennung nach der Datenanfrage eines Maschinensteuerungssystems MACHINEKEY Zahl Eindeutige ID des Datensatzes innerhalb der Tabelle (Autowert) DATAVALID Ja/Nein Kennzeichnung eines vollständigen und gültigen Datensatzes LAST_UPDATE Datum/Zeit Zeitpunkt der letzten Aktualisierung. (Löschkriterium für die Bereinigung der Tabelle) Tabelle A.1: Zwingend erforderliche Felder der Tabelle MachineData Konfigurationstabellen der Komponente OpcManager Feldname MachineId OpcProgId Typ Zahl Text Remark Text Bedeutung Eindeutiger Identifier der Maschinenverbindung Program Identifier des zu verwendenden OPC-Servers. Die OpcProgId ist für jeden Server eindeutig und kann aus der Dokumentation des Herstellers entnommen werden. Beispiel für B&R PVI OPC-Server: „B&R.PviOPC.2“ Kommentar (Für die Komponente nicht relevant) Tabelle A.2: Felder der Tabelle Config_OpcConnections Feldname GroupId MachineId Typ Zahl Zahl Name UpdateRate Text Zahl DeadBand Zahl InterfaceGroup Ja/Nein Bedeutung Eindeutiger Identifier der OPC-Gruppe Fremdschlüssel für die eindeutige Zuordnung der Gruppe zu einer Maschine Beliebiger Text als Name der Gruppe Interner Aktualisierungsintervall der Gruppe im OPCServer in Millisekunden Mindestabweichung vom aktuellen Wert in Prozent, damit eine Wertänderung vom OPC-Server gemeldet wird. Legt fest, ob die Gruppe von der Komponente MachineManager als Schnittstellengruppe der Maschine verwendet werden soll. Es kann je Maschine nur eine Schnittstellengruppe definiert werden Anhang Seite - 78 – DataGroup Ja/Nein DataGroupIx Remark Zahl Text Legt fest, ob die Gruppe von der Komponente MachineManager als Datengruppe der Maschine verwendet werden soll. Es können je Maschine beliebig viele Datengruppen definiert werden Eindeutiger Index der Datengruppe Kommentar (Für die Komponente nicht relevant) Tabelle A.3: Felder der Tabelle Config_OpcGroups Feldname ItemId Typ Zahl GroupId Name Text Text Remark Text Bedeutung Eindeutiger Identifier des OPC-Items innerhalb der OPCGruppe. Innerhalb der verschiedenen Datengruppen müssen die Item-Identifier für gleichwertige Datenvariablen identisch sein. Identifier der OPC-Gruppe Name der Steuerungsvariable im Namensraum des OPCServers Kommentar (Für die Komponente nicht relevant) Tabelle A.4: Felder der Tabelle Config_OpcItems Konfigurationstabellen der Komponente DataManager Feldname ProcedureId ProcedureName Typ Zahl Bedeutung Eindeutiger Identifier der Stored Procedure Text Die Abfragen werden in aufsteigender Reihenfolge der ID verarbeitet. Name der Abfrage Tabelle A.5: Felder der Tabelle Config_DataProcedureCalls Feldname TransferId FileDataField Typ Zahl Text Extension SourceDir TargetDir Remark Text Text Text Text Bedeutung Eindeutiger Identifier des Filetransfers Feldname der Produktionstabelle MachineData in dem die Namen der zu kopierenden Dateien eingetragen sind. Dateinamenerweiterung der Dateien Quellverzeichnis der Dateien Zielverzeichnis für die Kopien der Dateien Kommentar (Für die Komponente nicht relevant) Tabelle A.6: Felder der Tabelle Config_DataFileTransfer Anhang Seite - 79 – Konfigurationstabellen der Komponente MachineManager Feldname MachineId Function Typ Zahl Text Bedeutung Eindeutiger Identifier der Maschine Funktion der Schnittstellenvariablen für die Anfragebehandlung. Die Namen der einzelnen Funktionen sind vorgegeben. PLC_REQUEST (SPS->PC) Variable zur Signalisierung der Anfrage von der Steuerung PLC_CODE (SPS->PC) Suchkriterium der Anfrage PLC_USED_DATA_INDEX (SPS->PC) Aktuell belegte und somit nicht Datengruppenindizes. verfügbare IPC_LOCK_DATA (PC->SPS) Variable zum Sperren der Daten auf der Steuerung während des Schreibvorganges der Daten IPC_NO_DATA (PC->SPS) Meldevariable an die Steuerung, dass keine Daten für das Suchkriterium am Leitrechner verfügbar sind. IPC_FIX_DATA (PC->SPS) Variable zur festen Vorgabe einer Datengruppe auf der Steuerung. Die Maschine verwendet bei einer Fixierung immer die vorgegeben Daten und stellt keine Anfragen an die Leitrechneranwendung. IPC_FIX_DATA_INDEX (PC->SPS) Index der fixierten Datengruppe OPC_DOWNLOAD OPC-Server internes Item zur Übertragung von Dateien auf die Steuerung. Ein Eintrag ist nur notwendig, wenn in der Tabelle Config_MachineFileDownload ein Dateidownload konfiguriert ist. ItemId Zahl Remark Text Item-Identifier des zugeordneten OPC-Items innerhalb der Schnittstellengruppe der Maschine Kommentar (Für die Komponente nicht relevant) Tabelle A.7: Felder der Tabelle Config_MachineInterfaceItems Anhang Seite - 80 – Feldname MachineId ItemId Typ Zahl Zahl DataField Text Remark Text Bedeutung Eindeutiger Identifier der Maschine. Item-Identifier des entsprechenden OPC-Items innerhalb der Datengruppe Name des Datenfeldes der Tabelle MachineData, deren Wert übertragen werden soll Kommentar (Für die Komponente nicht relevant) Tabelle A.8: Felder der Tabelle Config_MachineDataItems Feldname MachineId FileDataField Typ Zahl Text SourceDir ConversionTool FileExtension PlcExtension Remark Text Text Text Text Text Bedeutung Eindeutiger Identifier der Maschine. Name des Datenfeldes der Tabelle MachineData, deren Wert den Dateinamen enthält Quellverzeichnis der ursprünglichen Datei Kommando zum Aufruf des Konvertierungstools Dateinamenerweiterung der ursprünglichen Datei Dateinamenerweiterung der konvertierten Datei Kommentar (Für die Komponente nicht relevant) Tabelle A.9: Felder der Tabelle Config_MachineFileDownload Anhang B. Seite - 81 – Öffentliche Methoden, Eigenschaften und Ereignisse der Komponenten Komponente OpcManager Init() Funktion Mit der Methode Init() werden die Konfigurationstabellen der Komponente ausgelesen und die entsprechenden OPC-Server, OPC-Gruppen und OPC-Item-Objekte erzeugt. Übergabeparameter string dbProviderName Providername der Konfigurationsdatenbank string dbConnectionString Verbindungszeichenfolge der Konfigurationsdatenbank Rückgabewert GetOPCServer() Funktion Die Methode GetOPCServer() liefert das OPC-Server-Objekt für eine bestimmte MachineId zurück. Über das Server-Objekt kann in der Anwendung auf alle Gruppen und Item-Objekte zugegriffen werden. Übergabeparameter int machineIndex Identifier der gewüschten Maschinenverbindung Rückgabetyp Metadynamics OPCServer Dispose() Funktion Da durch die OPC-Client-Komponenten im Hintergrund COM zum Zugriff auf den OPC-Server verwendet wird, kann der .NET-Garbage-Collector die Verwaltung sämtlicher Speicherressourcen nicht übernehmen. Die Methode Dispose() gibt den Speicher aller verwendeten Ressourcen explizit frei. Die Methode sollte vor dem Beenden der Anwendung aufgerufen werden. Übergabeparameter Rückgabewert Tabelle B.1: Öffentliche Methoden der Komponente OpcManager Anhang Seite - 82 – IsInitialized Funktion Nachdem mit der Methode Init() die Initialisierung der Komponente durchgeführt wurde, wird die Eigenschaft IsInitialized auf true gesetzt. Eine neuerliche Initialisierung über die Init() Methode wird durch IsInitialized==true verhindert. Datentyp bool Zugriff Lesezugriff Tabelle B.2: Öffentliche Eigenschaften der Komponente OpcManager EventInitComplete Funktion Zusätzlich zum Setzen der IsInitialized Eigenschaft wird nach der Initialisierung der Komponente mit der Methode Init() das Ereignis EventInitComplete abgesetzt. Die Methode Init() kann somit auch asynchron aufgerufen werden. Rückgabewerte bool IsInitalized Tabelle B.3: Öffentliche Ereignisse der Komponente OpcManager Anhang Seite - 83 – Komponente DataManager Init() Funktion Mit der Methode Init() wird der Inhalt der Tabelle MachineData in ein DataTable Objekt eingelesen. Die Daten sind über die Eigenschaft MachineData verfügbar. Übergabeparameter string dbProviderName Providername der Konfigurationsdatenbank string dbConnectionString Verbindungszeichenfolge der Konfigurationsdatenbank Rückgabetyp LoadData() Funktion Mit dem Aufruf der Methode LoadData() wird das Laden der Daten gestartet. Es werden zuerst die Abfragen aus der Tabelle Config_DataProcedureCalls gestartet. Nachdem alle Prozeduren ausgeführt wurden, sind die Einträge der Tabelle MachineData aktuell und das Kopieren von Dateien laut der Konfiguration in der Tabelle Config_DataFileTransfer wird gestartet. Je nach Komplexität der Abfragen und der Anzahl der zu kopierenden Dateien kann das Laden der Daten längere Zeit in Anspruch nehmen. Aus diesem Grund wird beim Aufruf der Methode ein eigener Thread für die Abarbeitung gestartet. Nach Abschluss der Operation wird das Ereignis EventDataUpdateComplete abgesetzt. Übergabeparameter Rückgabetyp StartDailyUpdate() Funktion In manchen Anwendungsfällen soll das Laden der Daten täglich zu einer bestimmten Zeit automatisch erfolgen. Mit der Methode StartDailyUpdate() wird diese Funktion aktiviert. Intern wird die Methode LoadData() zum definierten Zeitpunkt aufgerufen. Übergabeparameter int hour Stunde für automatisches Laden der Daten int minute Minute für automatisches Laden der Daten Rückgabetyp - Anhang Seite - 84 – StopDailyUpdate() Funktion Die Methode StopDailyUpdate() deaktiviert das automatische Laden der Daten. Übergabeparameter Rückgabetyp Dispose() Funktion Die Methode Dispose() gibt den Speicher aller verwendeten Ressourcen explizit frei. Die Methode sollte vor dem Beenden der Anwendung aufgerufen werden. Übergabeparameter Rückgabetyp Tabelle B.4: Öffentliche Methoden der Komponente DataManager IsInitialized Funktion Nachdem mit der Methode Init() die Initialisierung der Komponente durchgeführt wurde, wird die Eigenschaft IsInitialized auf true gesetzt. Eine neuerliche Initialisierung über die Init() Methode wird durch IsInitialized==true verhindert. Datentyp bool Zugriff Lesezugriff MachineData Funktion Über die Eigenschaft MachineData wird ein DataTable Objekt, welches den Inhalt der Tabelle MachineData der Anwendungsdatenbank darstellt zur Verfügung gestellt. Datentyp Datatable Zugriff Lesezugriff Tabelle B.5: Öffentliche Eigenschaften der Komponente DataManager Anhang Seite - 85 – EventInitComplete Funktion Zusätzlich zum Setzen der IsInitialized Eigenschaft wird nach der Initialisierung der Komponente mit der Methode Init() das Ereignis EventInitComplete abgesetzt. Die Methode Init() kann somit auch asynchron aufgerufen werden. Rückgabewerte bool IsInitalized EventDataUpdateComplete Funktion Das Laden der Daten wird in einem eigenen Thread durchgeführt. Das Ereignis EventDataUpdateComplete benachrichtigt die Anwendung über den Abschluss der LoadData() Methode. Rückgabewerte Tabelle B.6: Öffentliche Ereignisse der Komponente DataManager Anhang Seite - 86 – Komponente MachineManager MachineManager() Funktion Der Konstruktor der Komponente MachineManager instanziert ein Objekt der Klasse und übernimmt die Initialisierung gemäß den Konfigurationstabellen. Übergabeparameter string dbProviderName Providername der Konfigurationsdatenbank string dbConnectionString Verbindungszeichenfolge der Konfigurationsdatenbank int machineId Eindeutiger Identifier der Maschine OpcManager opcMgr Objekt der Komponente OpcManager BindingSource bindingManual Gekapselte Produktionsdatentabelle für die Weitergabe einer manuellen Datenauswahl an das Objekt. BindingSource bindingAuto Gekapselte Produktionsdatentabelle zur automatischen Suche nach den Anfragekriterien. FixData() Funktion Mit der Methode FixData() kann der über bindingManual gewählte Datensatz auf der Steuerung fixiert werden. Die Daten werden zur Steuerung geschrieben und mittels den Interfacevariablen IPC_FIX_DATA und IPC_FIX_DATA_INDEX fest vorgegeben. Übergabeparameter string infoDataField Nach dem Aufruf der Methode FixData() wird ein Bestätigungsdialog angezeigt. Mit dem Parameter infoDataField kann das Feld der Tabelle MachineData, welches im Dialog angezeigt werden soll, vorgegeben werden. Rückgabetyp - Anhang Seite - 87 – UnFixData() Funktion Die Methode UnFixData() hebt die Fixierung auf Übergabeparameter string infoDataField Nach dem Aufruf der Methode UnFixData() wird ein Bestätigungsdialog angezeigt. Mit dem Parameter infoDataField kann das Feld der Tabelle MachineData, welches im Dialog angezeigt werden soll, vorgegeben werden. Rückgabetyp GetPlcData() Funktion Auf der Maschinensteuerung werden mehrere Sätze von Produktionsdaten gehalten. Die Methode GetPlcData() liest diese von der Steuerung und trägt die entsprechenden Datensätze in die Tabelle der Eigenschaft DataInMachine ein. Übergabeparameter Rückgabetyp ClearPlcData() Funktion Die Methode ClearPlcData() löscht die Datensätze auf der Steuerung. Übergabeparameter Rückgabetyp Dispose() Funktion Die Methode Dispose() gibt den Speicher aller verwendeten Ressourcen explizit frei. Die Methode sollte vor dem Beenden der Anwendung aufgerufen werden. Übergabeparameter Rückgabetyp Tabelle B.7: Öffentliche Methoden der Komponente MachineManager Anhang Seite - 88 – Enabled Funktion Die automatische Anfragebehandlung des MachineManager kann über die Eigenschaft Enabled aktiviert bzw. deaktiviert werden. Datentyp bool Zugriff Lese- und Schreibzugriff FixedData Funktion Sollte ein Datensatz fixiert worden sein, steht dieser über die Eigenschaft FixedData zur Verfügung. Datentyp DataRow Zugriff Lesezugriff DataInMachine Funktion Nach dem Aufruf der Methode GetPlcData() sind die Datensätze, für welche Daten auf der Steuerung vorhanden sind, über diese Eigenschaft verfügbar. Datentyp DataTable Zugriff Lesezugriff Tabelle B.8: Öffentliche Eigenschaften der Komponente MachineManager Anhang Seite - 89 – EventBeforeWrite Funktion Das Event EventBeforeWrite wird abgesetzt, bevor die Daten zur Steuerung geschrieben werden. Rückgabewerte int MachineId Eindeutiger Identifier der Maschine DataRow Datensatz Datensatz, der für das Schreiben der Daten verwendet wird EventAfterWrite Funktion Das Event EventAfterWrite wird abgesetzt, nachdem die Daten zur Steuerung geschrieben wurden. Rückgabewerte int MachineId Eindeutiger Identifier der Maschine DataRow Datensatz Datensatz, der für das Schreiben der Daten verwendet wurde Tabelle B.9: Öffentliche Ereignisse der Komponente MachineManager Anhang C. Seite - 90 – Vollständige UML-Klassendiagramme OpcManager Abbildung C.1: UML-Klassendiagramm OpcManager Anhang Seite - 91 – DataManager Abbildung C.2: UML-Klassendiagramm DataManager Anhang Seite - 92 – MachineManager Abbildung C.3: UML-Klassendiagramm MachineManager Anhang D. Seite - 93 – Screenshots der Demonstrationsanwendung Anlagenübersicht Abbildung D.1: Demonstrationsanwendung – Anlagenübersicht In der Anlagenübersicht werden die aktuellen Betriebszustände der angebundenen Maschinen anschaulich dargestellt. Der aktuelle Barcode sowie die Auftragsnummer des aktuell bearbeiteten Auftrages sind im unteren Teil des Dialogs ersichtlich. Anhang Seite - 94 – Übersicht Schwabbelmaschine Abbildung D.2: Demonstrationsanwendung – Übersicht Schwabbelmaschine In den Übersichtsdialogen der einzelnen Maschinen werden die aus der Anlagenübersicht bekannten Maschinenzustände nochmals dargestellt. Zusätzlich werden detaillierte Informationen zum aktuell von der Maschine verwendeten Auftrag angezeigt. Die Fixierung eines Auftrags ist über Buttons in den entsprechenden Maschinenübersichten möglich. Anhang Seite - 95 – Maschinenübersicht „Entgraten“ Abbildung D.3: Demonstrationsanwendung – Übersicht Entgratmaschine Die Maschinenübersicht der Entgratmaschine ist analog zu jener der Schwabbelmaschine aufgebaut. Anhang Seite - 96 – Maschinenübersicht „Seitenwangenschleifen“ Abbildung D.4: Demonstrationsanwendung – Übersicht Schleifmaschine Die Maschinenübersicht der Schleifmaschine ist analog zu jener der Schwabbelmaschine aufgebaut. Anhang Seite - 97 – Auftragsübersicht Abbildung D.5: Demonstrationsanwendung – Auftragsübersicht Die Auftragsübersicht ermöglicht die Vorwahl eines Auftrages zur Fixierung auf den Maschinen. Mittels Filterfunktionen kann der Bediener die Auswahl einschränken und rasch zum gewünschten Auftrag gelangen. Anhang Seite - 98 – Auftragsdetails Abbildung D.6: Demonstrationsanwendung – Auftragsdetails Im Dialog Auftragsdetails werden die für die Maschinen relevanten Daten, des in der Auftragsübersicht selektierten Datensatzes, angezeigt. Die Anschaulichkeit wird gegenüber der Tabellendarstellung deutlich gesteigert. Anhang Seite - 99 – Aufträge in Maschinen Abbildung D.7: Demonstrationsanwendung – Aufträge in Maschinen Im oben gezeigten Dialog können die aktuell auf den Maschinen vorhandenen Aufträge ausgelesen und angezeigt werden. Zusätzlich besteht die Möglichkeit die Datenbereiche der einzelnen Steuerungssysteme zu initialisieren.