baikem2011 uml_in_der_praxis
Transcription
baikem2011 uml_in_der_praxis
UML konkret einsetzen ein Praxisleitfaden für C/C++ Entwickler Andreas Foltinek, IMACS GmbH [email protected] 1. Kurzfassung Die modellbasierte SW-Entwicklung mit UML hat sich mittlerweile fest etabliert. Immer mehr Entwickler haben sich entschieden, diese zu verwenden, zögern jedoch mit der Einführung. Größtes Hemmnis ist dabei nicht (mehr) der Zweifel an Effektivität oder dem Nutzen, sondern der vermeintliche "Sprung ins Ungewisse" und eine vermutete "lange Einarbeitungszeit". Liegt die Lösung einer Problemstellung mit C/C++ meist intuitiv auf der Hand, so stellen sich beim Einsatz von UML oft viele Fragen: Wie und in welchen Fällen muss ich welches Diagramm verwenden? Wie können Details wie Metadaten und funktionale Implementierungen mit eher abstrakten Diagrammen konkret modelliert und beschrieben werden? Wie werden Kommunikationen, verteilte Systeme oder HMI's modelliert? Wie wird mit zeitkritischen Funktionen umgegangen? Welche Designelemente müssen gewählt werden? Wie wird ein Design/Projekt getestet – auf dem Zielsystem aber auch virtuell? etc. Anhand einer konkreten Modellierung werden diese und andere Fragen anschaulich beantwortet und gezeigt, wie einfach UML funktioniert - genau so intuitiv und offensichtlich wie C/C++. Der Vortrag zeigt dabei die Einfachheit und Gradlinigkeit einer Entwicklung mit UML. Unter Vermeidung theoretischer Darstellungen wird anhand eines konkreten praktischen Beispiels die Realisierung eines Projektes dargestellt. Er gibt ferner einen Eindruck über die Effektivität bei der Verwendung von UML und UMLErweiterungen – vom der modellbasierten Analyse, über das Design und der Implementierung bis zur automatischen Code-Generierung. UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 1 von 9 2. Einleitung 2.1 Fokus Der Vortrag möchte nicht die Frage diskutieren, ob UML/SysML basierte Methoden verwendet werden sollten oder nicht. Die prinzipielle Sinnhaftigkeit hängt von vielfältigen Randbedingungen ab und wurde bereits eingehend diskutiert [1]. Natürlich bewirkt die UML keine Wunder und ein schlechter Programmierer wird sich dadurch nicht signifikant verbessern - fähige Entwickler werden hingegen Ihre Effektivität enorm steigern. Im Fokus demonstriert der Vortrag den Weg von der Produktidee, über das Modell, dem generierten Code, einer realitätsgetreuen Simulation bis zur Integration auf einem lauffähigen Target. Nicht betrachtet werden hier Themen wie Requirements Engineering oder Traceability (die ebenfalls wichtig sind). Auch wird nicht separat auf die SysML eingegangen, da es viele Parallelen zur UML gibt und teilweise lediglich Notationen und Bezeichnungen verwendet werden. Das im Folgenden beschriebene Beispiel ist daher auch im Zusammenhang mit der SysML-Nutzung anwendbar. 2.2 Inhalt und Struktrierung Das grundlegende Problem der UML ist: Es handelt sich lediglich um eine "Sprache". Genau wie bei einer menschliche Sprache mit Vokabular und Grammatik ist es möglich daraus verschiedenste Dinge wie Lyrik, Novellen, Schachbücher, Gesetzestexte etc. zu erstellen. Dabei gibt es zunächst kein globales "richtig" oder "falsch", bzw. kein "gut" oder "schlecht". Die Qualität eines Dokumentes ist erst im Kontext mit dessen Verwendung bestimmbar. Entsprechend ist es möglich, die UML auf ganz verschiedenen Arten anzuwenden – dies mehr oder weniger sinnhaft im Bezug auf den jeweiligen Anwendungsfall. Hier ist es besonders das Erarbeiten und konsequentes Einsetzen eines richtigen Vorgehensmodells. Dieses beschreibt wie die UML für die jeweiligen Problemstellungen richtig eingesetzt wird. Das nächste Kapitel zweigt die vollständige Realisierung eines sehr einfachen embedded Steuerungsprojektes unter dem Einsatz der UML. Das hier verwendete Vorgehensmodell wurde in vielen embedded Projekten erfolgreich verifiziert und zeigt sehr klar die Parallelen zu einer Entwicklung mit C/C++. Der Weg der Entwicklung wird in folgenden Schritten dargestellt: 1) Modellierung … der Applikation mit den zwei Phasen "Design" und "Konkrete Implementierung" 2) Generierung … des plattformunabhängigen Serien-Codes (d.h. es ist keine manuelle Nacharbeit mehr erforderlich) durch Verwendung eines HAL 3) Simulation … und Test auf einer virtuellen Hardware. Diese wird durch einen PC emuliert und stellt hierbei das Verhalten der Steuergeräteumgebung realitätsgetreu dar. 4) Integration … und Test auf einem realen Zielsystem mit Einsatz des Design-Level-Debuggings. 1. Modelierung (Model Editor) 3. Simulation 2. Generierung (PC-Software) (Source Code) 4. Integration (Target) Abbildung 1: Typische Schritte einer modellbasierten Projekt-Generierung UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 2 von 9 2.3 Modellverarbeitung Modellierung Aus Sicht der einzelnen Teilwerkzeuge wird die Modell-Information mit der folgenden Werkzeugkette verarbeitet: Model Editor Generierung Code Import C, C++, ST HMI Visual HMI Target Code Version Control System XML-Repository Projects, Applications, Libraries etc. Interfaces Code-Generator Simulation Editor: C/C++, UML, PLC, HMI IDE, Launcher, Relocator Document. rC-Lib MSVC .NET MSVC .NET Debugger Compiler Offline Simulation Visualization (PC-Software), Software in the Loop, UML-Debugger (PC-Software), DataLogger, UML-Debugger API, Driver, RT-Scheduler other Tools Libraries RTOS Protocol Stack's Target Debugger Target Compiler /Linker any 8,16,32 Bit any 8,16,32 Bit online connection Target(s) single / distributed Integration Abbildung 2: Die vier Entwicklungsschritte im Bezug auf den Tool Chain Flow 2.4 Beispielapplikation Um diesen Ansatz zu demonstrieren, wird ein sehr einfaches Steuerungssystem mit drei Flüssigkeitstanks realisiert. Jeder Tank beinhaltet einen analogen Füllstandsensor AI_Level, einen elektrisches Ventil DO_Valve zur Befüllung sowie ein manuelles Auslassventil. Der gewünschte Flüssigkeitsstand kann über den Parameter SetLevel bestimmt werden. Die Niveauregelung soll über eine Hysterese von 4cm verfügen und eine verzögerte Reaktion von 5s aufweisen um ein Flattern des Einlassventils zu verhindern. Abweichend von den ersten zwei Tanks soll der dritte Tank einen zusätzlichen Alarmausgang DO_Alarm enthalten der aktiviert wird, falls der Flüssigkeitsstand unter die Marke AlarmLevel sinkt. Zur Darstellung der flexiblen Lösungsmöglichkeiten soll die Reglerfunktionalität zum einen klassisch textuell aber auch mit einer grafischen Notation erstellt werden. Abbildung 3: Beispielprojekt, Übersicht der 3 Tanks und Detailansicht von Tank 1 UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 3 von 9 3. Leitfaden für die Umsetzung 3.1 Modellierung 3.1.1 Vorgaben und Richtlinien zur Applikationsmodellierung Der effektivste Weg der modellbasierten Entwicklung ist die Generierung von Serien-Code. Dies bedeutet, das keine nachträgliche manuelle Bearbeitung des Codes mehr erforderlich sein darf/muss. Dadurch ist ein Divergieren von Code und Modell ausgeschlossen und kein problematische "Round-Trip-Engineering" erforderlich (= Nachführen des Modells aufgrund manueller Änderungen im generierten Code). Daher wird für die Modellierung von embedded Steuerungssystemen die Beachtung folgender Grundsätze empfohlen: Alle Applikations-Information sollten innerhalb des Modells gehalten werden – auch die vollständige funktionale Implementierung, Metadaten, HMI etc. (natürlich auf eine virtuelle, hardwareunabhängige Art). Dies vermeidet die manuelle Nachbearbeitung des generierten Codes sowie aller anderer Generierungsprodukte. Realisierung eines hohen Levels an Objektorientierung, was bedeutet, dass alle Informationen, die zu einer logischen/technischen Einheit gehören, im selben Modul (Klasse) abgebildet sind. Die garantiert ein Maximum an Wiederverwendbarkeit und reduziert die Verbindungen innerhalb des Models auf ein Minimum. Redundanz vermeiden. Jede Information/Entität (z.B. Struktur, Daten, Funktionalität, HMI, weiterführende Informationen etc.) sollten nur einmal definiert sein und dann von anderer Seite nur noch entsprechend referenziert werden. Zweitdefinitionen an einer anderen Stelle sind unbedingt zu vermeiden. Um diese Empfehlungen einzuhalten, sind verschiedene zielgerichtete Erweiterungen der UML erforderlich, was dem Geist der UML jedoch nicht wiederspricht (sondern sogar nahegelegt wird). 3.1.2 Konkreter Ablauf der Modellierung Die konkrete Modellierung wird in der Reihe nach entsprechend den unten aufgelisteten Schritten durchgeführt. Neben diesen werden oft auch vorgelagerte Schritte (z.B. Anforderungsbeschreibung mit Anwendungsfällen) und nachfolgende Schritte (funktionale Verifikation) durchgeführt, die jedoch nicht Fokus dieses Vortrags sind. Um den Entwicklungs-Übergang von C/C++ nach UML zu erläutern, sind die korrespondierenden C/C++ Tätigkeiten parallel zur UML dargestellt. Zur Verdeutlichung werden folgenden Symbole verwendet: C = Aktivitäten zur Entwicklung mit C C++ = Aktivitäten zur Entwicklung mit C++ UML = Aktivitäten zur Entwicklung mit UML UML = verwendete UML-Sprachelemente UML = beschreibt die Vorteile durch UML-Einsatz, auch durch automatisch generierte Zusatztools Step 1: Separierung der logischen "Einheiten" und Strukturierung des Designs Bestimmung und Separation der einzelnen technischen/logischen "Einheiten" des Systems. Die "Einheiten" des Beispielprojektes sind: System (root unit), 2 x TankControlA (für Tank 1,2), 1 x TankControlB (für Tank 3). Ferner werden die ersten bekannten Attribute, Daten und Funktionen entwurfsmäßig angelegt. C Erstellung von main() und zwei struct's zur Datenhaltung. Erstellung der (noch) leeren Regelungsfunktionen. C++ :: Erstellung einer Klasse für jede "Einheit". Entwurf der Elemente und Prozeduren. UML :: Erstellung einer Klasse für jede "Einheit". Entwurf der Elemente und Prozeduren (ggf. grafisch). UML :: Klassen Diagramm: Klassen, Komposition, Aggregation, Generalisierung. UML Grafische Dokumentation und Liste der Klassen und deren Attribute. Step 2: Verteilung der "Einheiten" auf mehrere Design-Files Um später die TankControlX Einheit (Klasse) in anderen Projekten wiederverwenden zu können, ist es erforderlich, diese in einer separaten Datei abzulegen. Diese Bibliotheksdatei wird dann in unser Hauptprojekt eingebunden. C Erstellung neuer .c und .h files. Manuelles Verschieben der Code-Teile von der alten in die neue Datei. C++ :: Erstellung neuer .c and .h files. Manuelles Verschieben der Code-Teile von der alten in die neue Datei. UML :: Erstellung neuer Project-Files und Verschieben der Klasse TankControlX per Maus ins die neue Datei. UML :: Paket Diagramm: Relationen UML Grafische Dokumentation der einbezogenen Files, deren Hierarchie und der Klassen in den Files. UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 4 von 9 Step3: Erstellung von Instanzen (Objekte) und Vervollständigung der Relationen Gemäß der benötigten Tankanzahl müssen die Klassen nun instanziiert werden. In UML werden diese Instanzen als Objekte bezeichnet. Weiterführend müssen die Beziehungen nun vervollständigt werden. In unserem Beispiel beinhaltet TankControlB die gleichen Teile von TankControlA mit einigen Erweiterungen/Zusätzen. Daher kann TankControlB von TankControlA erben und übernimmt damit alle Attribute. C Erstellen von zwei globalen Variablen des Typs TankControlA und einer des Typs TankControlB. Erstellen einer zyklisch aufgerufenen Funktion, die die Regelungsfunktionen jedes Tasks separat aufruft und den entsprechenden TankHandle übergibt. C++ :: Erstellen von zwei Instanzen von TankControlA und einer von TankControlB. Eine Vererbungsrelation textuell hinzufügen. UML :: Erstellen von zwei Instanzen von TankControlA und einer von TankControlB. Eine Vererbungsrelation grafisch hinzufügen. UML :: Klassen Diagramm: Komposition, Aggregation, Generalisierung; Objekt Diagramm. UML Grafische Dokumentation und Listung der Klassen und deren Beziehungen. Step 4: Festlegung der Schnittstellen zwischen "Einheiten" und deren Kommunikation Neben der Struktur und Hierarchie der Klassen ist die Art der Interkommunikation essentiell. Im Falle unseres Beispiels wird ein entsprechender Bereich in den Tankmodulen angelegt: C Manuelle Codierung. C++ :: Manuelle Codierung. UML :: Erstelle einen Interface-Bereich (Port) in der Klasse und verschiebe die entsprechenden Elemente und Funktionen dort hinein. UML :: Komponenten Diagramm. UML Grafische Dokumentation und Listung des Klassen Interfaces. Step 5: Vervollständigen der Daten-"Elemente" (aus den Modell-Attributen) Ein "Element" ist in diesem Zusammenhang ein Objekt, womit jegliche Daten beschrieben werden und überdies eine leistungsfähige Virtualisierung für alle Datenarten (RAM Variables, EEPROM Variable, IOs, Timer, Counter, Konstanten, Simulationsvariablen, etc.). Daneben beinhaltet ein Element alle Meta- und Zusatzdaten (multilinguale Beschreibungen, Wertebereich, physikalische Einheit, Visualisierung, graphische Darstellung, Kommunikation etc.), die in den Generierungsprodukten redundanzfrei verwendet werden können. C Vervollständigen der globalen Variablen (TankControlA , TankControlB). Erstellen von separaten Aufrufen der Regelungsfunktion für alle drei Instanzen. Einfügen der Metadaten in ein sep. File. C++ :: Vervollständigen der Elemente und Verschieben dieser in die entsprechende Klasse. Einfügen der Metadaten in ein sep. File. UML :: Vervollständigen der Elemente und Verschieben zur korrekten Stelle. UML :: Klassen Diagramm: Elemente. UML Globale Liste aller angelegten Elemente mit deren Metadaten. Realitätsgetreue Simulation und Test der kompletten Applikation. Sehr offensichtliches Design Level Debugging Step 6: Einfügen der Prozess-Visualisierung (PC-HMI / SCADA) Eine Prozessvisualisierung ist ein hervorragendes Zusatz-Tool zum Testen und Debuggen. Leistungsfähige UML-Tools ermöglichen deren modellinterne Definition sowie die automatische Generierung in Form einer eigenständigen PC-Software. C nicht möglich (bzw. nur mit einem separaten System) C++ :: nicht möglich (bzw. nur mit einem separaten System) UML :: Einfügen der Oberflächen und Visualisierer ins Modell UML :: HMI Vorschau UML Realitätsgetreue Simulation und Test der kompletten Applikation. Sehr offensichtliches Design Level Debugging Step 7: Vervollständigen der Funktionalität Vervollständigung und Fertigstellung der Funktionalität mit textuellen oder grafischen Notationen. C nur textuell mit C-Funktionen möglich C++ :: nur textuell mit C-Funktionen oder C++ -Methoden möglich. UML :: textuell und grafisch durch die Verwendung von Activity-, Signal- und State-Charts or Procedures (C-code). UML :: Klassen Diagramm, Objekt Diagramm. UML Realitätsgetreue Simulation und Test der kompletten Applikation. Sehr offensichtliches Design Level Debugging Bereits ab Schritt 5 ist eine vollständige Code-Generierung des Projektes möglich und damit auch eine lauffähige PC-Simulation dessen verfügbar. Nach den erforderlichen Modifikations-/Korrekturschleifen ist die Modellierungsphase nach erfolgreichem Test abgeschlossen. Ergebnis ist eine plattformunabhängige und getestete Applikation in Form eines UML-Modells. UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 5 von 9 Abbildung 4: Modellteile in Form des Projektbaums, eines Klassendiagramms und eines State-Charts 3.1.3 Umsetzung weiterführende Anforderungen Neben diesem sehr einfachen Beispiel, haben reale Projekte, insbesondere embedded Systeme, natürlich sehr viel komplexere Anforderungen. Die folgende Aufzählung enthält eine Sammlung von Themen (und einen Ansatz zur Umsetzung), die typischerweise von Kunden nachgefragt werden. Laufzeitdynam. Teile Echtzeit, Multitask. Interrupts HW spez. Teile Bestehender Code Target-HMI Verteilte Systeme UML in der Praxis Hierzu können sogenannte "Interface-Klassen" verwendet werden, die als Platzhalter für die dynamischen Instanzen dienen. Zur Laufzeit werden diese auf Anforderung verbunden oder getauscht. Die Funktionalitäten verschiedener Reaktions- und Zeitanforderungen können durch die Wahl von Abarbeitungstypen einer entsprechend Gruppe zugeordnet werden. Diese Gruppen können über das API entsprechend der PrioAnforderungen individuell "schedult" werden. Den Modellteilen, die per Interrupt abgearbeitet werden sollen, wird ein besonderer Abarbeitungstyp zugewiesen, der dann mit der Interrupt-Service-Routine verbunden wird. Für alle hardware-spezifischen Komponenten/Teile kann im HAL/API eine entsprechende, möglichst einfache Schnittstellenfunktion erstellt werden, die dann vom Modell aufgerufen wird. In der Simulation kann diese oft durch wenige Zeilen Code ebenfalls nachgebildet werden. Existente C/C++-Code-Teile können in eine Klasse als gewöhnliche Prozedur(en) integriert werden (das UML-Tool muss dies unterstützen). Leistungsfähige UML-Tools unterstützen die Integration des vollständigen HMIs (textuell und/oder grafisch) bereits im Modell als ein spezieller Bestandteil eine normalen Klasse. Sie unterstützen statische, dynamische und interaktive HMI Inhalte und haben direkten Zugriff auf die Elemente und deren Metadaten (sehr hilfreich). Die Ausführung auf dem Zielsystem wird durch eine HMI-Engine realisiert, die unabhängig von der Applikationsfunktionalität ausgeführt wird und reicht von monochromen Dot-Character-Displays bis zu "full color" SVGA. Leistungsfähige UML-Tools unterstützen die Modellierung (und Code-Generierung) von verteilten Systemen. Die einzelnen Knoten werden hierbei als speziell gekennzeichnete hierarchische Unterklassen instanziiert, und können entweder in der Simulation als Ganzes oder für die jeweiligen Targets separat generiert werden. Für die eigentliche Kommunikation werden entsprechende Funktionsaufrufe generiert, die vom API zur Verfügung gestellt werden. Der Entwickler kann dabei ohne weitere Beachtung direkt auf Daten anderen Knoten zugreifen. IMACS GmbH – Embedded Software Tools 2011 6 von 9 3.2 Code-Generierung 3.2.1 Vorgaben und Richtlinien Für die Code-Generierung (Abbildung 2) wird die Einhaltung der folgenden Grundsätze empfohlen. Prinzipiell können zwei unterschiedliche Methoden der Code-Generierung unterschieden werden: a) Transformierende Code Generation (TCG), ist eine eher simple lineare Methodik, die Templates durch Ersetzen/Einfügen entsprechend dem erstellten Modell anpasst. In der Regel sind die Ergebnisse Code-Frames die manuell vervollständigt werden müssen. b) Compilierende Code Generation (CCG), arbeitet mit einem speziellen Design-Compiler, der komplexe Generierungsprozesse unterstützt (z.B. C-Code aus einem OO-Modell) und verschiedene Generierungsergebnisse erzeugt. In der Regel wird "fertiger" C-Code erzeugt, der ohne Nachbearbeitung für das Zielsystem übersetzt werden kann. Der effizienteste Weg ist die direkte Erzeugung von Serien-Code, der keine manuelle Nachbearbeitung benötigt (technisch nur mit der CCG-Methode möglich). Unterstützung der direkten Generierung von ANSI-C-Code (für 8/16Bit Prozessoren bzw. zur Reduktion der Code-Größe) trotz eines objektorientierten Modells ohne die Beschränkung der OO-Features (technisch nur mit der CCG-Methode möglich). Generierung von gut verständlichem (lesbaren) Code für den Fall eines Source-Level-Debuggens, Zertifizierung oder anderer Prüfungen) Kompakter und performanter Code, passend zum Zielsystem bzw. der Applikation. Neben der Quell-Code-Generierung, sind ebenfalls andere weiterführende Generierungsprodukte nützlich oder sogar zwingend notwendig. Der Code-Generator muss spezielle Eigenheiten des Zielsystems wie z.B. (Alignment, Byte-Anordnung, Segmentierung, etc. unterstützen. 3.2.2 Generierungsergebnisse Im Detail erzeugt der Code-Generator folgende Ergebnisse (Quellcode und Dokumentation): Definition der Datenstrukturen verschiedener Typen von Elementen für alle Instanzen Instanziierte Daten aller Elemente/Module einschließlich deren Metadaten (falls erforderlich) Extensive Pointer-Konstruktionen zur Unterstützung der OO-Eigenschaften auch mit regulärem C-Code Funktionaler Code von State-Charts, Activitiy Charts, Signal-Charts, Prozeduren, … Code-Teile zur Unterstützung der verteilten Kommunikation Ausführliche Dokumentation für alle Bereiche des Modells und dessen implementierende Teile Ferner (falls erforderlich): Vollständige HMI Daten (z.B. für eine Runtime-HMI-Engine) mit Referenzen zu den Daten-Strukturen Weiterführendes für Werkzeuge/Tool-Chain: Cross-Referenz-Listen zur Herstellung der Verbindung zwischen Modell und generiertem Code Da das Beispielprojekt kein Zielsystem-HMI besitzt, hat der hier erzeugte Code nur eine geringe Größe und umfasst lediglich die Definitionen der Datenstrukturen, die instanziierten Daten sowie die multi-entrance fähigen C-Funktionen der modellierten Funktionalität. UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 7 von 9 3.3 Simulation Leistungsfähige UML-Werkzeug-Systeme bieten eine realitätsgetreue Simulation (Abbildung 3) des Modells. Um dies zu ermöglichen, wird der (hardwareunabhängige) generierte Code mit einem allgemeingültigen, virtuellen API übersetzt und kann als eigenständige PC-Software ausgeführt werden. Die Zustände der Simulation des Projektes erfolgt über die generierte PC-basierte Prozessvisualisierung (also ohne separaten Aufwand). Dies ermöglicht dem Entwickler, sein Projekt bereits vorab zu testen und zu präsentieren (Abbildung 1), ohne hierzu ein reales Zielsystem zu benötigen (MBS = modellbasierte Simulation), 3.3.1 Vorgaben und Richtlinien Analog zu den anderen Phasen hat eine effektiv verwendbare Simulation folgende grundsätzliche Anforderungen zu erfüllen: Die Simulation muss automatisch generiert werden - ohne separate Tätigkeiten durch den Entwickler sowie für alle denkbaren Projektarten. Alle Variablen des Projektes müssen in einer gut strukturieren Weise mit Metadaten angezeigt werden und müssen manipulierbar sein. Dies ermöglicht ein effektives DLD (= Design Level Debugging) Das Verhalten der Simulation sollte das reale Laufzeitverhalten des Targets, als auch die Reaktionen der Umweltsimulation im Modell so gut als möglich nachbilden. Für eine RMBS (= Realistic Model Based Simulation) werden > 95% empfohlen. 3.3.2 Ablauf der Offline-PC-Simulation Nach der Generierung und Compilierung kann die PC-Simulation als Standalone-PC-Software gestartet werden. Dies bietet die Möglichkeit, die Simulation einem Kunden oder Kollegen zu geben. Es bietet dem Anwender die volle Funktionalität einschließlich des Embedded Target HMI. 3.4 Integration auf dem Zielsystem Die Kopplung des generierten Codes mit der Tool-Chain des Zielsystems (Abbildung 2) erfolgt über einen HAL/API. Es enthält ca. 15…35 festgelegte C-Funktionen und eine Runtime-Library (hängt davon ab ob das Zielsystem über ein HMI verfügt). Die API-Funktionen abstrahieren den Zugriff auf EA's, Timer, Zähler, Schnittstellen, Display, Touch etc.) Da vom CASE-Tool lediglich die funktionalen Prozeduren bzw. Prozedurpakete generiert werden, müssen diese vom API aus mit der erforderlichen Häufigkeit und Priorität aufgerufen werden. Dadurch behält das API (der Systemintegrator) die Gesamtkontrolle und kann diese individuell und flexibel anpassen. 3.4.1 Ablauf der Online-PC-Visualisierung Höherwertige Tools bieten darüber hinaus die Möglichkeit, die erzeugte PC-Software über eine DatenSchnittstelle (seriell, USB, Ethernet CAN) mit der Hardware zu verbinden und ermöglichen damit DLB (Design-Level-Debugging) auch auf der laufenden Hardware. Durch die Verwendung der "Recorder-Funktion" des Tools ist es möglich, alle internen Zyklen aufzuzeichnen und sie zum Debuggen Schritt für Schritt zu überprüfen. UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 8 von 9 4. Ergebnisse und Diskussion Der größte Nutzen beim Einsatz der modellbasierten Entwicklung ergibt sich bei einer hochgradigen Integration/Abdeckung aller relevanten Projektinformationen durch das Modell. Die Integration der Implementierung (Funktionalitäten und Daten) sowie aller anderen Projektinformationen in das Modell ist sicher ein ungewöhnlicher Ansatz, erfüllt jedoch die Entwickleranforderungen in einer äußerst effektiven und pragmatischen Weise (best practice). Neben dem generierten Zielsystem-Code ist ein weiterer Aspekt die große Anzahl von zusätzlichen Generierungsprodukten aus dem Modell wie Offline-Simulation, Online-Visualisierung, Dokumentation, Kommunikation etc. Die zentrale Frage ist die Absicht des Entwicklers bei der Verwendung von UML. Ist es für ihn ausreichend, mit UML lediglich ein Design zu entwickeln und dann manuell zu implementieren, oder soll das Modell als zentrale Designbasis eine vollständige Generierung des Seriencodes (und Zusatz-Software) ohne manuelle Nacharbeit ermöglichen. Seit nun über 10 Jahren Marktpräsenz nutzen viele Software-Entwickler die "Overall-Object-Orientation"Methode mit Seriencode-Generierung und wollen diese effiziente Weise der Softwareentwicklung mit UML nicht mehr missen. Natürlich bedingt dies die Erweiterung der UML in vielen Gebieten und die UML bekommt dadurch Aspekte einer DSL (Domänen Spezifischen Sprache) für embedded Steuerungssysteme. Dies ist jedoch normal und symptomatisch und jeder effiziente Einsatz der UML mit der Beabsichtigung einer Code-Generierung bedingt Erweiterungen der Sprache. Begriffe: MBS RMBS O³ CCG TCG DLD DSL HAL HMI Model Based Simulation Realistic Model Based Simulation Overall Object Oriented: alle relevanten Informationen (nicht nur Daten und Funktionalitäten) sind Bestandteil einer Klasse/ eines Moduls Compiling Code Generation Transforming Code Generation Design Level Debugging Domänen-spezifische Sprache Hardware Abstraction Layer Human-Machine-Interface: Bedienerschnittstelle Quellen: [1] C. Kechler: "UML 2.0", Galileo Press, Bonn 2006 [2] T. Weilkiens: "Systems engineering mit SysML/UML", dpunkt.verlag, Heidelberg 2006 [3] P. Hruschka, C. Rupp: "Agile Softwareentwicklung …", Hanser, 2002 Autor: Andreas Foltinek studierte Elektrotechnik an der Universität Stuttgart. Bereits vor seinem Studium sammelte er als "Jugend forscht" Teilnehmer und durch zahlreiche Projektentwicklungen für Firmen im MSR-Bereich umfangreiche Erfahrung und kann auf mittlerweile 25 Jahre Embedded Hard- und Softwarepraxis zurückblicken. 1994 gründete er die Firma IMACS GmbH und ist seither dort als Geschäftsführer für Forschung und Entwicklung verantwortlich. Als geistiger Vater eines UML basierten CASE-Tool-Systems gilt seine Leidenschaft den Methoden zur Softwareentwicklung sowie der Erhöhung der Einsetzbarkeit und des Abdeckungsgrades von Softwaremodellen und Codegeneratoren. Schwerpunktmäßig beschäftigt er sich aktuell mit neuen Tool-Konzepten sowie der Beratung von Kunden beim Einsatz von OOP UML, MDD, deren praktischen Umsetzung und der hardwareseitigen Integration. UML in der Praxis IMACS GmbH – Embedded Software Tools 2011 9 von 9