mehr als nur software KNOW-HOW 22 Datenbank im technischen Umfeld Noser Engineering AG CH-8404 Winterthur CH-3048 Worblaufen CH-6036 Dierikon CH-1003 Lausanne D-81369 München www.noser.com Talackerstrasse 99 Arastrasse 6 Industriestrasse 9 Rue du Petit-Chêne 22 Engelhardstrasse 10 Tel. 052 234 56 11 Tel. 031 917 52 11 Tel. 041 450 08 11 Tel. 021 318 82 11 Tel. 089 76 70 43 11 Fax 052 234 56 22 Fax 031 917 52 22 Fax 041 450 08 22 Fax 021 318 82 12 Fax 089 76 70 43 12 E-Mail [email protected] E-Mail [email protected] E-Mail [email protected] E-Mail [email protected] E-Mail [email protected] m e h r a l s n u r s o f t w a r e Einleitung Heute werden auch in technischen Systemen zunehmend Standardwerkzeuge wie Browser und Datenbanken eingesetzt. Dies ist vor allem auf die immer grösser werdende Leistungsfähigkeit und die zunehmende Standardisierung von technischen Hardwareplattformen und Betriebssystemen im industriellen Umfeld zurückzuführen. Im vorliegenden KNOW-HOW wird ein Beispiel für die Integration einer Datenbank zur dynamischen Steuerung eines Verkaufsprozesses in einem Fahrkartenautomaten für den öffentlichen Verkehr beschrieben. auch für andere Services verwendet werden. Der «Generic Control Process» (GCP) ist für die Bedienerführung und den Verkaufsprozess zuständig. Alle Abfragen auf die Datenbank erfolgen zentral über den Tarifprozess, der alle Daten zur kmBerechnung, Preisermittlung und zum Programmablauf liefert: Folgende Vorteile sprechen für den Einsatz einer Datenbank im technischen Umfeld: • Datensicherheit • Datenverwaltung, Backup • Umfangreiche Funktionalität für die Datenauswertung • Flexibler Ausbau Die Nachteile sind: • Geschwindigkeit • Lizenzkosten • Ressourcenbedarf Systemkonzept Die Architektur der Betriebssoftware der Fahrkartenautomaten basiert auf einem Komponenten-Framework. Es definiert die Basisinterfaces für auf CORBA aufgesetzte ClientServer-Komponenten und enthält vorgefertigte Implementationen wie: • Naming Service • Alarm Handler • Process Manager • Watch Dog etc. Abb. 1: Übersicht Komponentenframework Abb. 1 zeigt vereinfacht die Funktionsweise des Komponentenframeworks für eine einfache Applikation. Die Pfeile illustrieren den Kontrollfluss bei einer typischen Aufstartsequenz für zwei Komponenten X und Y, die in derselben Reihenfolge gestartet werden, wie sie in der Komponentenliste aufgeführt sind. Einzelne Komponenten können entweder direkt zur Ansteuerung eines Gerätes (Display, Printer etc.) oder aber Abb. 2: Tarifprozess Der Tarifprozess ist, wie Abb. 2 zeigt, in drei hierarchische Ebenen aufgeteilt. 1. In der untersten Ebene befindet sich TIS/P, das bestehende Transportinformationssystem des Kunden. In diesem Programmteil werden die Wegentfernungen und Preise berechnet. 2. Das Kundeninformationssystem (KIS) bildet die zweite Ebene. Dort werden primär aufgrund der vom Kunden gewählten Relation die zulässigen Tarifebenen (Verbünde) und Tarife bestimmt. Aus den möglichen Angeboten wird das günstigste ausgewählt. Zusätzlich dazu liefert das KIS aus der Datenbank die Informationen für den Bildschirmaufbau, die Maskenfolge und die Event-Behandlung. 3. SWBKIS übernimmt die Anbindung des Tarifprozesses an den CORBA-Softwarebus des Automatenframeworks. Dieser Teil des Prozesses ist, im Gegensatz zu den darunterliegenden Ebenen, nicht mehr multiuserfähig, sondern speichert gewisse Zustände aus den letzten Abfragen, damit nicht bei jedem Aufruf alle Informationen über den CORBA-Softwarebus an den ‚Generic Control Process’ (GCP) weitergeleitet werden müssen. Datenbank Der Einsatz von Oracle als Datenbank war für die hier vorgestellte Realisierung gegeben, da das vom Kunden gelieferte TIS/P-Modul über Pro*C/C++ mit Oracle kommuniziert. Es zeigte sich zudem, dass auch Oracle lite nicht eingesetzt werden konnte, da dazu kein Pro*C/C++ -Interface existiert. Bei der Implementation der übrigen Teile des Tarifprozesses wurde auf eine grösstmögliche Portierbarkeit des Codes geachtet. Die Datenbanktabellen sind, abhängig von der Aufgabe, in mehrere unabhängige oder nur lose gekoppelte Bereiche unterteilt: • Bereich für die eigentliche Entfernungs- und Preisberechnung: Dieser Bereich wurde ohne Änderung aus der bestehenden Kundenapplikation übernommen und wird nur vom TIS/P-Teil der Applikation referenziert (s. Abb. 2, TIS/P). • Bereich für die dynamische Steuerung der Bedieneroberfläche mit sprachabhängiger Textanzeige: Die Basismasken des Systems werden mit einem Editor erstellt und in einer Layoutdatei abgelegt. In der Layoutdatei sind alle Anzeigeobjekte (Buttons, Textfelder, Grafikfelder, Hintergrundbereiche etc.) mit einem Identifier abgelegt, über den die Attribute des Objekts verändert werden können. In der Datenbank ist ein Objektattribut über «maske.tarifsystem. objektid.attributid» referenzierbar. Nach einem Maskenwechsel werden alle Objekte tabellengesteuert befüllt. • Tabelle für die Ablage der verkauften Fahrkarten: Die Daten in dieser Tabelle werden jeweils bei Tagesabschluss zu Buchhaltungs- und Statistikzwecken auf das Hostsystem des Kunden übertragen. Abb. 4: Fahrkarte Datenbankaufruf Im bestehenden TIS/P-Teil (s. Abb. 2, TIS/P), der vom Kunden stammt, wird Pro*C/C++ als Interface zu Oracle verwendet. if (vverbund_tg == nverbund_tg) { EXEC SQL INSERT INTO LOVVERBUND VALUES(0,1,NULL,NULL,NULL, :verbund,USERENV('TERMINAL')); if (sqlca.sqlcode != 0) { /* Fehler in SQL-Statement */ return (-1); } EXEC SQL COMMIT WORK; } Abb. 5: Embedded SQL-Statements Abb. 3: Bedieneroberfläche • Die Behandlung der Fahrkartenlayouts erfolgt analog zur Bedieneroberfläche. Die Basislayouts werden im Editor erstellt und die einzelnen Druckobjekte werden vor dem Druck kontextabhängig befüllt. • Die zentrale Funktion des Kundeninformationssystems ist die dynamische Berechnung der zulässigen Fahrkartengattungen auf der Basis der gewünschten Kundenrelation und den Tarifbestimmungen in den regionsabhängigen Verbünden. Abb. 6: Ablauf des Entwicklungsprozesses mit Pro*C/C++ m e h r a l s n u r s o f t w a r e m e h r a l s n u r s o f t w a r e Im neu entwickelten KIS (s. Abb. 2, KIS) wird die Datenbank über ODBC aufgerufen. Die ODBC-Aufrufe der Datenbank werden über eine Datenbankklasse ausgeführt, die vom Komponentenframework zur Verfügung gestellt wird. StrListList aResult; ostringstream sqlStatement; try { sqlStatement.str(""); sqlStatement << "select DISTANZ from RESULTAT " << "where TTY=USERENV('TERMINAL')"; pDB->simpleSelect( sqlStatement.str().c_str(), aResult); } catch (ErrorElement) { throw UngueltigeDaten(errSQL, sqlStatement.str().c_str()); } Typ Oracle 8i Access 2000 Numerisch NUMBER(Scale) SINGLE, DOUBLE, SHORT, LONG Beispiel: NUMBER(9) NUMBER(9,2) Beispiel einer generierten Sequenznummer von 20 Stellen: NUMBER(20) Text VARCHAR2(Size) Size: maximal 2000 Zeichen VARCHAR(Size) Size: maximal nur 255 Zeichen. Datumsabfragen Direkt via SQL Statement Die Applikation muss selber Systemzeit lesen und in das amerikanische Datumsformat (mm/dd/yy) umwandeln. Dann kann eine SQL Abfrage mit dem umgewandelten Datum erfolgen. Abb. 7: ODBC-Aufruf der Datenbank „SYSDATE between ....“ Mit der TO_DATE Bei Maskenwechseln sind oft sehr viele Datenbankabfragen notwendig, um alle Tarifinformationen und Anzeigeelemente zu bestimmen. Deshalb ist die Geschwindigkeit der Abfragen entscheidend, um vertretbare Systemantwortzeiten zu erhalten. In der Praxis hat sich gezeigt, dass die grösste zeitliche Verzögerung bei der Verarbeitung des Befehls in der Datenbank auftritt. Alle andern Verzögerungen, wie die CORBAAufrufe oder die dynamische Speicherverwaltung bei der Resultattabelle sind dagegen vernachlässigbar. Während der Implementation des Systems wurde in mehreren Durchläufen die Performance verbessert. Den grössten Einfluss auf die Geschwindigkeit hatten die Erweiterung des Hauptspeichers von 64 MB auf 128 MB und die Vereinfachung der Abfragen. Letzteres wurde dadurch erreicht, dass die Datenbank von der ursprünglichen Normalform schrittweise mit redundanter Information versorgt wurde, damit «Joins» von grossen Tabellen vermieden werden konnten. Portierbarkeit In einem zweiten Automatenprojekt konnte die Portierbarkeit des Tarifprozesses auf eine andere Datenbank getestet werden. In diesem Projekt gab es keine Kundenvorgabe bezüglich Distanz- und Preisberechnung. Es wurde deshalb ACCESS, das im System ohnehin schon in einigen Standardkomponenten zur Anwendung kommt, als Datenbank ausgewählt. Die grundsätzliche Vorgabe war somit, einen möglichst grossen Teil des früheren Systemkonzepts zu übernehmen, aber mit ACCESS als Datenbank. Der Portierungsprozess verlief ziemlich rasch und problemlos. Wichtig ist aber, beim Einsatz von ODBC folgende Unterschiede zu beachten: Noser Engineering AG CH-8404 Winterthur CH-3048 Worblaufen CH-6036 Dierikon CH-1003 Lausanne D-81369 München www.noser.com Talackerstrasse 99 Arastrasse 6 Industriestrasse 9 Rue du Petit-Chêne 22 Engelhardstrasse 10 Je nach gewünschtem Wertebereich und Präzision muss ein Datentyp ausgewählt werden. Ist kein nummerischer Datentyp vorhanden, muss der Wert in einem VARCHAR(20) gespeichert werden. Tel. 052 234 56 11 Tel. 031 917 52 11 Tel. 041 450 08 11 Tel. 021 318 82 11 Tel. 089 76 70 43 11 Umwandlung kann das Datumsformat komfortabel gewandelt werden Stored Procedures Datenmenge Wird unterstützt Wird nicht unterstützt Für grosse Datenmengen geeignet. Beispiel Grösse der Datenbank mit einem umfangreichen Tarifsystem inkl. MMI Steuerung: 500MByte Für kleinere bis mittelgrosse Datenmengen geeignet Beispiel Grösse der Datenbank mit einem kleinen Tarifsystem inkl. MMI Ablauf: 1.4 MByte Beurteilung Die Datenbank als zentrales Steuerelement des automatisierten Verkaufsprozesses hat sich als flexibles Werkzeug erwiesen, das dem Kunden in Zukunft breite Möglichkeiten zur selbständigen Anpassung des Systems an neue Anforderungen erlaubt. Autoren: Beat Salzmann Dipl. El. Ing. HTL Fax 052 234 56 22 Fax 031 917 52 22 Fax 041 450 08 22 Fax 021 318 82 12 Fax 089 76 70 43 12 Bruno Tischhauser Dipl. El. Ing. ETH E-Mail [email protected] E-Mail [email protected] E-Mail [email protected] E-Mail [email protected] E-Mail [email protected] m e h r a l s n u r s o f t w a r e