Informatik für Ingenieure
Fit für das Internet der Dinge
0912
2016
978-3-8385-4645-2
978-3-8252-4645-7
UTB
Klaus-Uwe Gollmer
Peter Fischer-Stabel
Ein fundiertes Informatikwissen ist wichtiger Bestandteil eines ingenieurwissenschaftlichen Studiums. Studierende werden deswegen bereits in den ersten Semestern mit Themen wie zum Beispiel Schnittstellen, Algorithmen und Netzwerktechnik konfrontiert. Dieses kompakte Buch führt in die wichtigsten Gebiete der praktischen Informatik ein.
Nach einer kurzen Einführung in die allgemeinen Grundlagen wird das Hintergrundwissen zu Hard- und Software, Netzwerken und Programmierung ausreichend vermittelt. Ein besonderes Kapitel widmet sich einem spannenden Zukunftsthema: Anhand eines Anwendungsbeispiels in Form eines internetfähigen Messdatenerfassungssystems ermöglicht es einen praktischen Einstieg in das Internet der Dinge.
Das Buch richtet sich an Studierende der Ingenieurwissenschaften, die sich fundiertes Hintergrundwissen zum genannten Themenkomplex bereits zum Beginn ihres Studiums aneignen wollen.
Zu diesem Buch werden Übungsaufgaben mit Lösungen und Begleitmaterial online zur Verfügung gestellt.
<?page no="1"?> Eine Arbeitsgemeinschaft der Verlage Böhlau Verlag · Wien · Köln · Weimar Verlag Barbara Budrich · Opladen · Toronto facultas · Wien Wilhelm Fink · Paderborn A. Francke Verlag · Tübingen Haupt Verlag · Bern Verlag Julius Klinkhardt · Bad Heilbrunn Mohr Siebeck · Tübingen Nomos Verlagsgesellschaft · Baden-Baden Ernst Reinhardt Verlag · München · Basel Ferdinand Schöningh · Paderborn Eugen Ulmer Verlag · Stuttgart UVK Verlagsgesellschaft · Konstanz, mit UVK / Lucius · München Vandenhoeck & Ruprecht · Göttingen · Bristol Waxmann · Münster · New York utb 4645 <?page no="2"?> Peter Fischer-Stabel Klaus-Uwe Gollmer Informatik für Ingenieure Fit für das Internet der Dinge UVK Verlagsgesellschaft mbH • Konstanz mit UVK/ Lucius • München <?page no="3"?> Prof. Dr. Peter Fischer-Stabel ist Professor für Angewandte Informatik, Umweltcampus Birkenfeld der Hochschule Trier. Forschungsschwerpunkt sind Themen der Umwelt- und Geo-Informatik. Prof. Dr.-Ing. Klaus-Uwe Gollmer lehrt Technische Informatik und Modellbildung/ Simulation am Umweltcampus Birkenfeld der Hochschule Trier. Forschungsschwerpunkt ist u. a. das Internet der Dinge. Online-Angebote oder elektronische Ausgaben sind erhältlich unter www.utb-shop.de. Bibliografische Information der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über <http: / / dnb.ddb.de> abrufbar. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. © UVK Verlagsgesellschaft mbH, Konstanz und München 2016 Einbandgestaltung: Atelier Reichert, Stuttgart Einbandmotiv: © agsandrew - fotolia.com Druck und Bindung: Pustet, Regensburg UVK Verlagsgesellschaft mbH Schützenstr. 24 • 78462 Konstanz Tel. 07531-9053-0 • Fax 07531-9053-98 www.uvk.de UTB-Nr 4645 ISBN 978-3-8252-4645-7 <?page no="4"?> http: / / www.uvk-lucius.de/ informatik-ing Vorwort Simulationssoftware, CAD/ CAM-Systeme und vernetzte Automatisierungskomponenten gehören längst zum Alltag des Ingenieurs. Nach vielen Jahrzehnten erfolgreicher Informatikanwendung im Ingenieurbereich sollte das Themenfeld also eigentlich hinreichend abgedeckt sein. Aktuell aber bahnt sich eine neue Technologie ihren Weg in die Praxis: Intelligente Gegenstände mit Netzwerkzugang machen die Informatik praktisch überall omnipräsent. Die physikalische Welt der Ingenieure und die virtuelle Welt des Internets verschmelzen zu einem „Internet der Dinge“ (IoT). Mit der Verfügbarkeit des Internets sind plötzlich viele neue Dienste realisierbar. Über GNSS-Daten (z.B. GPS, Galileo) kennt der Gegenstand (z.B. Container) seine aktuelle Position, verschiedene Sensoren ermöglichen weitreichende Information über aktuelle Umweltbedingungen (z.B. Klima) und Drahtlosnetzwerke ermöglichen den autonomen Nachrichtenaustausch der Systeme untereinander (M2M). Die deutsche Industrie und Politik haben das Potential dieser Technik früh erkannt und mit der Industrie 4.0 den Beginn einer vierten industriellen Revolution angekündigt, an deren Ende die Vernetzung aller an der Produktion beteiligten Komponenten steht. Industrie 4.0 ist also das Pendant des Internet der Dinge im produzierenden Gewerbe und erfordert Ingenieure mit entsprechenden Kenntnissen. Das Buch richtet sich an Studierende der Ingenieurwissenschaften, die sich fundiertes Hintergrundwissen zum genannten Themenkomplex bereits zum Beginn ihres Studiums aneignen wollen. Das besondere Augenmerk dieses Buches liegt auf der praxisorientierten Vermittlung des Stoffes. Nach einer kurzen Einführung in die Informationsdarstellung behandelt Kapitel 2 den <?page no="5"?> 6 Vorwort Aufbau eines Rechners. Neben den elektrotechnischen Grundlagen und einer Einführung in die Digitaltechnik werden hier vor allem die Konzepte moderner Rechnerarchitekturen und die zur Prozessankopplung notwendige Interfacetechnik erläutert. Daran anschließend erfolgt eine Vorstellung typischer Softwarekomponenten aus dem Umfeld des Ingenieurs. Breiter Raum ist der Vermittlung des algorithmischen Denkens (Kapitel 4) und der Umsetzung in Form eigener Programme (Kapitel 5) gewidmet. Die aus didaktischer Sicht zwingend erforderliche selbständige Umsetzung eigener Programme wird durch die Verwendung der bekannten Arduino-Plattform gefördert. Hier bietet die Community mit einer Vielzahl von Projekten eine intrinsische Motivation, sich mit dem Thema zu beschäftigen. Geht es dabei hauptsächlich um die Einführung in die Programmiersprache C, so vermitteln die folgenden Kapitel (Netzwerktechnik, Internet, Sicherheit) die zur Umsetzung des Internets der Dinge notwendigen Grundlagen. Begleitende Unterlagen, Simulationen, Programme und Übungsaufgaben finden sich auf der Web-Präsenz des Buches. Wie bereits angemerkt, liegt uns die selbständige Beschäftigung mit dem Thema sehr am Herzen. Ein abschließendes Anwendungsbeispiel in Form eines internetfähigen Messdatenerfassungssystems ermöglicht deshalb den direkten praktischen Einstieg in das Internet der Dinge. Wir wünschen allen Lesern viel Spaß bei der spielerischen Beschäftigung mit diesem wichtigen Zukunftsthema. Klaus-Uwe Gollmer Peter Fischer-Stabel <?page no="6"?> Hinweise zum Buch Hinweise für Studierende Programmieren lernt man nur durch Programmieren! Das heißt durch ständiges Üben der algorithmischen Umsetzung auch eines auf dem ersten Blick trivialen Problems. Die Programmierbeispiele sollten deshalb unbedingt selbständig am Rechner nachvollzogen und idealerweise durch kreative Erweiterungen ergänzt werden. Alle Quelltexte finden sich im Begleitmaterial zum Buch. Es empfiehlt sich die Anschaffung eines eigenen Entwicklungsboards. Entsprechende Vorschläge finden sich im Begleitmaterial zum Buch. Übungsaufgaben sollten ohne vorherigen Blick in die Musterlösung bearbeitet werden. Web-Service zum Buch: http: / / www.uvk-lucius.de/ informatik-ing Die zitierten Internetquellen wurden am 29.6.2016 letztmalig aufgerufen. Auf eine individuelle Datumsangabe wurde bei den Quellenangaben demzufolge verzichet. <?page no="8"?> http: / / www.uvk-lucius.de/ informatik-ing Inhalt Vorwort .............................................................................................. 5 Hinweise zum Buch .......................................................................... 7 Abbildungsverzeichnis ................................................................... 15 Tabellenverzeichnis......................................................................... 19 1 Grundlagen.......................................................................... 21 1.1 Informatik ......................................................................... 21 1.1.1 Was ist Informatik? .......................................................... 21 1.1.2 Wozu Informatik-Kenntnisse? ....................................... 22 1.1.3 Aufgaben der Informatik ................................................ 23 1.1.4 Meilensteine der Datenverarbeitung.............................. 24 1.1.5 Gebiete der Informatik.................................................... 26 1.2 Grundbegriffe der Informationstechnologie ................ 29 1.2.1 Grundbegriffe ................................................................... 29 1.2.2 EVA-Grundprinzip der Datenverarbeitung ................. 31 1.2.3 Informationsdarstellung .................................................. 32 1.2.4 Logische Grundfunktionen............................................. 43 1.3 Literatur ............................................................................. 46 2 Hardware ............................................................................. 47 2.1 Grundelemente eines Rechnersystems .......................... 47 2.2 Elektrotechnische Grundlagen ....................................... 51 2.2.1 Strom, Spannung und elektrische Leistung .................. 52 2.2.2 Einfache Bauelemente und ihre Verknüpfung ............. 54 2.3 Digitaltechnik.................................................................... 61 2.3.1 Schaltnetze ........................................................................ 63 <?page no="9"?> 10 Inhalt http: / / www.uvk-lucius.de/ informatik-ing 2.3.2 Schaltwerke ....................................................................... 70 2.4 Rechnerarchitektur........................................................... 82 2.4.1 Abarbeitung eines Maschinenbefehls ............................ 83 2.4.2 Zugriff auf Ein-/ Ausgabebausteine............................... 86 2.4.3 Cache.................................................................................. 88 2.4.4 Leistungsbewertung ......................................................... 90 2.4.5 Befehlspipeline.................................................................. 92 2.4.6 Befehlssatzarchitekturen.................................................. 94 2.4.7 Multithreading-Architektur ............................................. 95 2.4.8 Rechnerklassifikation nach Flynn .................................. 97 2.5 Interfacetechnik Eingebetteter Systeme........................ 99 2.5.1 Ein- und Ausgabe digitaler Signale ..............................100 2.5.2 Analoge Ausgänge (Digital-Analog-Wandlung) .........102 2.5.3 Analoge Eingänge (Analog-Digital-Wandlung)..........104 2.5.4 Serielle Schnittstellen .....................................................108 2.6 Literatur ...........................................................................113 3 Software ........................................................................... 115 3.1 Klassifikation von Software ..........................................115 3.2 Anwendungssoftware für Ingenieure ..........................118 3.3 Betriebssysteme ..............................................................120 3.3.1 Grundlagen .....................................................................120 3.3.2 Betriebsmittelverwaltung...............................................125 3.3.3 Marktgängige Betriebssysteme......................................129 3.3.4 Virtuelle Maschinen (VM).............................................129 3.4 Software Engineering.....................................................131 3.4.1 Klassisches Phasenmodell (Wasserfallmodell) ...........131 3.4.2 Spiralmodell ....................................................................132 3.4.3 Anforderungsspezifikation (Lastenheft) .....................133 <?page no="10"?> Inhalt 11 http: / / www.uvk-lucius.de/ informatik-ing 3.4.4 Pflichtenheft (Sollkonzept) ...........................................134 3.4.5 Software-Qualität ...........................................................135 3.5 Literatur ...........................................................................137 4 Algorithmen ..................................................................... 139 4.1 Eigenschaften von Algorithmen ..................................140 4.2 Vom Problem zum Programm.....................................141 4.2.1 Exkurs: Komplexität von Algorithmen.......................145 4.3 Beschreibung von Algorithmen ...................................148 4.3.1 Umgangssprachliche (textuelle) Beschreibung ...........148 4.3.2 Graphische Beschreibungsformen...............................149 4.3.3 Beschreibung in einer Programmiersprache ...............153 4.4 Programmiersprachen....................................................154 4.4.1 Grundelemente von Programmiersprachen ...............156 4.4.2 Syntax und Semantik......................................................158 4.4.3 Strukturierte Programmierung......................................159 4.4.4 Objektorientierte Programmierung..............................161 4.5 Literatur ...........................................................................161 5 Grundlagen der Programmierung ................................ 163 5.1 Die Arduino-Plattform ..................................................165 5.1.1 Enwicklungsumgebung .................................................166 5.1.2 Arduino UNO und kompatible Boards ......................168 5.1.3 NodeMCU Board...........................................................169 5.2 Grundlagen der C-Programmierung............................170 5.2.1 Ein erstes Arduino Programm .....................................172 5.2.2 Ausgabe mit printf .........................................................177 5.2.3 Wiederholungsschleifen (for, while) ............................180 5.2.4 Fallunterscheidungen (if … else)..................................187 5.2.5 Mehrfach-Fallunterscheidungen (switch)....................188 <?page no="11"?> 12 Inhalt http: / / www.uvk-lucius.de/ informatik-ing 5.2.6 Elementare Datentypen und Ausdrücke .....................189 5.2.7 Mathematische Standardfunktionen ............................194 5.2.8 Modularisierung (Funktionen)......................................195 5.2.9 Lebensdauer und Geltungsbereich ..............................203 5.2.10 Rekursion ........................................................................205 5.2.11 Höhere Datenstrukturen ...............................................208 5.3 Interfacetechnik: Arduino-Befehle ..............................216 5.3.1 Digital I/ O ......................................................................218 5.3.2 Analog I/ O .....................................................................219 5.3.3 Serielle Protokolle ..........................................................221 5.4 Literatur ...........................................................................223 6 Rechnernetze................................................................... 225 6.1 Netzwerktopologie.........................................................226 6.2 Netzwerkprotokolle .......................................................228 6.2.1 Das OSI-Referenzmodell ..............................................228 6.2.2 Das TCP/ IP-Referenzmodell.......................................230 6.2.3 Feldbusprotokolle ..........................................................237 6.3 Drahtlosnetzwerke .........................................................241 6.3.1 Wireless Personal Area Network (WPAN).................242 6.3.2 Wireless Local Area Network (WLAN) ......................243 6.3.3 Wireless Wide Area Network (WWAN) .....................245 6.4 Literatur ...........................................................................246 7 Internet ............................................................................. 247 7.1 Grundlagen .....................................................................247 7.2 Web-Technologien.........................................................248 7.2.1 URL: Uniform Resource Locator ................................248 7.2.2 HTML und XML ...........................................................251 7.2.3 Skriptsprachen und CGI-Programmierung ................254 <?page no="12"?> Inhalt 13 http: / / www.uvk-lucius.de/ informatik-ing 7.3 Dienste und Anwendungen im Internet .....................255 7.3.1 World Wide Web (WWW) ............................................255 7.3.2 eMail-Dienste ..................................................................259 7.3.3 Weitere Internetdienste .................................................260 7.4 Literatur ...........................................................................261 8 Information Retrieval ..................................................... 263 8.1 Einführung ......................................................................263 8.2 Internet-Suchmaschinen................................................265 8.2.1 Potential webbasierter Informationssysteme..............265 8.2.2 Suchmaschinen ...............................................................265 8.2.3 Bildersuchmaschinen .....................................................271 8.2.4 Deep Web .......................................................................271 8.2.5 Bewertung von Internetressourcen..............................272 8.3 Digitale Bibliothek und Fachdatenbanken..................273 8.3.1 Kataloge...........................................................................273 8.3.2 Fachdatenbanken ...........................................................274 8.4 Web2.0-Werkzeuge ........................................................274 8.4.1 Social Bookmarking .......................................................274 8.4.2 Plattformen für Videos und Präsentationen...............275 8.4.3 MindMapping .................................................................277 8.4.4 Allgemeine Kriterien......................................................277 8.4.5 Quellen für Informatiker und Ingenieure ...................278 8.4.6 Maschinenlesbare Datenquellen ...................................279 8.5 Literatur ...........................................................................280 9 IT-Sicherheit ..................................................................... 281 9.1 Einführung IT-Sicherheit..............................................281 9.1.1 Grundlagen .....................................................................281 9.1.2 Datenschutz personenbezogener Daten .....................284 <?page no="13"?> 14 Inhalt 9.2 Gefährdungsklassen / Schutzmaßnahmen .................285 9.2.1 Gefährdungsklassen IT-Sicherheit...............................285 9.2.2 Schutzmaßnahmen.........................................................287 9.3 Erstellung eines IT-Sicherheitskonzeptes ...................288 9.4 IT-Sicherheit und Datenschutz im Home Office ......290 9.4.1 Allgemeine Regeln..........................................................290 9.4.2 HTTPS (Hypertext Transfer Protocol Secure) ..........292 9.4.3 Vermeidung von Datenspuren .....................................293 9.4.4 Smartphone und Sensory Malware ..............................297 9.5 Literatur ...........................................................................298 10 Anwendung: Internet der Dinge .................................... 299 10.1 Messdatenerfassung .......................................................299 10.1.1 Sensorik und Kalibrierung ............................................299 10.1.2 Datenmodell....................................................................301 10.1.3 Programmtechnische Umsetzung ................................303 10.2 Machine to Machine Kommunikation (M2M) ...........305 10.3 Web-Server......................................................................307 10.3.1 Server-Homepage...........................................................307 10.3.2 WLAN Zugang (Access-Point Modus) .......................309 10.4 Thingspeak Web-Client .................................................311 10.4.1 Internet Zugang WLAN (Station Mode) ....................314 10.4.2 Sichere Verbindung mit HTTPS-Protokoll ................315 10.4.3 Reaktionen: Tweets auslösen ........................................316 10.5 Zugriff auf aktuelle Wetterdaten ..................................317 Index ................................................................................................. 321 <?page no="14"?> http: / / www.uvk-lucius.de/ informatik-ing Abbildungsverzeichnis Abb. 1: Spannweite der Disziplin Informatik ................................... 26 Abb. 2: Zusammenhang zwischen Daten und Information ........... 29 Abb. 3: Daten und Information am Bsp. Wetterstation ................. 30 Abb. 4: EVA-Prinzip der Datenverarbeitung ................................... 31 Abb. 5: Grundprinzip des Dualsystems ............................................ 34 Abb. 6: Grundprinzip der Zweierkomplementdarstellung ............. 38 Abb. 7: Umwandlung Nachkommastellen ........................................ 39 Abb. 8: Periodische Nachkommastellen............................................ 40 Abb. 9: Darstellbare Zeichen im Demosystem ................................ 41 Abb. 10: Komponenten der von-Neumann-Architektur ................ 48 Abb. 11: Spannungsteiler mit zwei Widerständen............................ 56 Abb. 12: DRAM-Zelle ......................................................................... 58 Abb. 13: LED mit Vorwiderstand...................................................... 59 Abb. 14: Schaltsymbol Bipolartransistor ........................................... 60 Abb. 15: Transistor als Schalter .......................................................... 61 Abb. 16: Prinzipieller Aufbau eines UND-Gatters .......................... 61 Abb. 17: Symbole Grundgatter mit zwei Eingängen ....................... 62 Abb. 18: Schaltnetz............................................................................... 64 Abb. 19: Schaltung Halbaddierer........................................................ 66 Abb. 20: Prinzipieller Aufbau programmierbare Logik................... 67 Abb. 21: Addition zweier Zahlen A und B ....................................... 68 Abb. 22: Schaltung 1-Bit Volladdierer ............................................... 69 Abb. 23: 4-Bit Volladdierer und Schaltungssimulation ................... 70 Abb. 24: Schaltwerk (Schaltnetz mit Rückkopplung) ...................... 71 Abb. 25: Einfachstes Schaltwerk (astabile Kippstufe) ..................... 71 Abb. 26: Einfachste Speicherzelle (bistabile Kippstufe) ................. 72 Abb. 27: Bistabile Kippstufe mit NAND-Gattern .......................... 72 Abb. 28: Wertetabelle NAND-Verknüpfung ................................... 73 Abb. 29: RS-Flipflop ............................................................................ 74 Abb. 30: Taktflankengesteuerte Flipflops ......................................... 74 Abb. 31: D-Flipflop.............................................................................. 75 <?page no="15"?> 16 Abbildungsverzeichnis http: / / www.uvk-lucius.de/ informatik-ing Abb. 32: Schieberegister zur Seriell/ Parallel-Wandlung.................. 75 Abb. 33: T-Flipflop............................................................................... 76 Abb. 34: Asynchroner Zähler ............................................................. 76 Abb. 35: Timing-Diagramm Zähler ................................................... 77 Abb. 36: Ampelsteuerung .................................................................... 78 Abb. 37: Zustandsdiagramm Ampelsteuerung ................................. 78 Abb. 38: Ansteuerung für das grüne Signal der Ampel A 2 ............. 80 Abb. 39: VHDL-Beschreibung der Ampelsteuerung ...................... 80 Abb. 40: Buszugriff IF-Phase.............................................................. 83 Abb. 41: Buszugriff ID-Phase............................................................. 84 Abb. 42: Buszugriff OF-Phase............................................................ 84 Abb. 43: Buszugriff Ex-Phase............................................................. 85 Abb. 44: Buszugriff WB-Phase ........................................................... 86 Abb. 45: Cache-Hierarchie .................................................................. 89 Abb. 46: Getrennter L1-Cache für Daten und Befehle................... 90 Abb. 47: Überlappende Verarbeitung Befehlspipeline .................... 92 Abb. 48: Reaktives Computersystem ................................................. 99 Abb. 49: Minimalbeschaltung eines Mikrocontrollers ................... 100 Abb. 50: Interfaceschaltung digitaler Eingang................................ 101 Abb. 51: Interfaceschaltung digitaler Ausgang ............................... 102 Abb. 52: Digital-Analog-Wandler (DAC)........................................ 103 Abb. 53: Ausgangsspannung DAC .................................................. 103 Abb. 54: Puls-Weiten-Modulation.................................................... 104 Abb. 55: Analog-Digital-Wandlung.................................................. 105 Abb. 56: Ein n-Bit ADC benötigt n-Takte zur Wandlung............ 105 Abb. 57: Mehrdeutigkeiten bei der Abtastung................................ 106 Abb. 58: Aliasing-Phänomen ............................................................ 107 Abb. 59: Serielle Prozessankopplung ............................................... 108 Abb. 60: Synchrone serielle Schnittstelle ......................................... 109 Abb. 61: Bidirektionale Kommunikation ........................................ 109 Abb. 62: Nutzdaten im UART-Zeichen.......................................... 111 Abb. 63: Pufferung der Nachricht.................................................... 112 Abb. 64: Klassifikation von Software .............................................. 116 Abb. 65: Beispielkonstruktion einer abstrakten Maschine ............ 117 Abb. 66: Zentrale Aufgaben des Betriebssystems .......................... 121 <?page no="16"?> Abbildungsverzeichnis 17 http: / / www.uvk-lucius.de/ informatik-ing Abb. 67: Betriebsarten von Betriebssystemen im Überblick ........ 124 Abb. 68: FCFS-Strategie zur Abarbeitung der Prozesse ............... 126 Abb. 69: Prinzip des Round-Robin-Scheduling ............................. 127 Abb. 70: Produktbezeichnungen von Betriebssystemen............... 129 Abb. 71: Prinzip der Hardware-Virtualisierung.............................. 130 Abb. 72: Wasserfallmodell zur Software-Entwicklung.................. 132 Abb. 73: Spiralmodell nach Boehm ................................................. 133 Abb. 74: Qualitätsmerkmale für Software nach ISO 9126 ........... 136 Abb. 75: Vorgehensweise vom Problem zum Programm ............ 142 Abb. 76: Laufzeitverhalten verschiedener Sortierverfahren. ........ 147 Abb. 77: Prinzip des Sortierens durch Vertauschen ...................... 149 Abb. 78: Ausgewählte Symbole eines Flussdiagramms ................. 150 Abb. 79: Flussdiagramm zum Sortierverfahren Bubble-Sort ....... 151 Abb. 80: Ausgewählte Symbole nach Nassi-Shneiderman............ 152 Abb. 81: Struktogramm zum Sortierverfahren Bubble-Sort......... 153 Abb. 82: Hierarchie von Programmiersprachen............................. 155 Abb. 83: Aufgaben von Compiler bzw. Interpreter....................... 156 Abb. 84: Eigenschaften von Variablen ............................................ 157 Abb. 85: Arduino-Entwicklungsumgebung .................................... 167 Abb. 86: Vom Arduino-Programm zur Ausführung ..................... 173 Abb. 87: Formatierte Ausgabe mit printf ........................................ 179 Abb. 88: Funktionen als Werkzeug der Modularisierung ............. 199 Abb. 89: Prinzip der Rekursion ........................................................ 207 Abb. 90: Datenfeld mit Messwerten ................................................ 208 Abb. 91: Ein zweidimenionales Datenfeld (Matrix) ...................... 213 Abb. 92: Beispielapplikation: Arduino UNO Board...................... 217 Abb. 93: Beispielapplikation: NodeMCU Board ............................ 218 Abb. 94: Beispiel RFID-Kommunikation ....................................... 222 Abb. 95: Netzwerktopologie ............................................................. 226 Abb. 96: OSI-Schichtenmodell ......................................................... 229 Abb. 97: Protokolloverhead durch Header ..................................... 230 Abb. 98: TCP/ IP-Modell .................................................................. 231 Abb. 99: HTTP-Anfrage einer Web-Seite ....................................... 232 Abb. 100: Netz- und Hostanteil einer IP-Adresse ......................... 235 Abb. 101: Kollisionserkennung Ethernet........................................ 236 <?page no="17"?> 18 Abbildungsverzeichnis Abb. 102: Algorithmus beim Senden einer Nachricht .................. 236 Abb. 103: Kommunikation Automatisierungstechnik................... 237 Abb. 104: CAN-Telegramm .............................................................. 239 Abb. 105: Zerstörungsfreier Buszugriff beim CAN-Bus .............. 240 Abb. 106: Reichweiten verschiedener Funktechnologien ............. 241 Abb. 107: RFID-Kommunikation.................................................... 243 Abb. 108: WLAN-Access Point ....................................................... 244 Abb. 109: Mobilfunkkommunikation .............................................. 245 Abb. 110: Informationserschließung in Hypertext ........................ 249 Abb. 111: Beispiel des Aufbaus einer URL..................................... 249 Abb. 112: URL-Beispiel für eine Dokumentenadresse ................. 250 Abb. 113: HTML-Struktur der Demo-Website aus Kap. 10 ........ 252 Abb. 114: Grundstruktur einer XML-Datei.................................... 253 Abb. 115: Dynamisches Web mittels CGI-Programm.................. 254 Abb. 116: Digitale jährliche Datenmenge in Exabyte (Prognose) ......................................................................... 264 Abb. 117: Generische Funktionsweise einer Suchmaschine......... 266 Abb. 118: Erweiterte Suchmöglichkeiten bei Google ................... 269 Abb. 119: Wiki-Mindmap zum Thema „Algorithmus“................. 276 Abb. 120: Schwachstellen bei Online Diensten.............................. 283 Abb. 121: Gefährdungsklassen IT-Sicherheit ................................. 286 Abb. 122: Erstellung eines Sicherheitskonzepts (nach BSI) ......... 288 Abb. 123: Umsetzungsschritte und Soll-Ist-Vergleich .................. 290 Abb. 124: Funktionsweise eines Firewall-Systems ......................... 292 Abb. 125: Aufbau des Messdatenerfassungssystems ..................... 300 Abb. 126: Kalibrierung der Sensoren............................................... 301 Abb. 127: Datenmodell Messwerterfassung ................................... 301 Abb. 128: Beispielprotokoll M2M-Kommunikation ..................... 305 Abb. 129: Ausgabe MATLAB ® -Visualisierung .............................. 306 Abb. 130: Ausgabe Web-Server........................................................ 310 Abb. 131: Thingspeak-Konfiguration .............................................. 312 Abb. 132: Thingspeak Ausgabe der Messwerte.............................. 315 Abb. 133: Auslösen eines Tweets mittels React-App .................... 316 Abb. 134: Kommunikation yahoo Wetterabfrage .......................... 317 <?page no="18"?> Tabellenverzeichnis Tab. 1: Binäres Einheitensystem......................................................... 32 Tab. 2: Grundprinzip des Dezimalsystems ....................................... 33 Tab. 3: Darstellung einer Zahl im Dualsystem ................................. 34 Tab. 4: Beispiel zur Umwandlung Dezimalin Dualzahl ................ 36 Tab. 5: Gegenüberstellung Zahlensysteme ....................................... 37 Tab. 6: ASCII-Zeichentabelle ............................................................. 42 Tab. 7: Wahrheitstabelle Konjunktion und Disjunktion ................. 45 Tab. 8: Wahrheitstabelle Negation ..................................................... 45 Tab. 9: Boolescher Ausdruck mit drei Variablen X 1 , X 2 , X 3 .......... 46 Tab. 10: Leistungsbedarf typischer Rechnersysteme ....................... 54 Tab. 11: Anteile Energiebedarf eines Spiele-Rechners .................... 54 Tab. 12: Wahrheitstabelle für Y 1 ......................................................... 64 Tab. 13: Wahrheitstabelle für Y 2 ......................................................... 64 Tab. 14: Wahrheitstabelle Halbaddierer ............................................ 66 Tab. 15: Minterme 1-Bit Volladdierer................................................ 68 Tab. 16: Wahrheitstabelle, Grundfunktionen RS-Flipflop.............. 73 Tab. 17: Wertetabelle zur Ampel-Ansteuerung ................................ 79 Tab. 18: Rechenleistung typischer Architekturen............................. 91 Tab. 19: Klassifikation nach Flynn ..................................................... 98 Tab. 20: Rangfolge Programmiersprachen, IEEE Spektrum ....... 164 Tab. 21: Programmiersprachen für Embedded-Systems .............. 166 Tab. 22: Vergleich Mikrocontroller-Boards .................................... 169 Tab. 23: Umwandlungs- und Steuerzeichen ................................... 179 Tab. 24: Vergleichsoperatoren .......................................................... 185 Tab. 25: Logische Verknüpfungen ................................................... 185 Tab. 26: Wertebereiche Integer-Datentypen................................... 191 Tab. 27: Eigenschaften Zahlendarstellung ...................................... 193 Tab. 28: Mathematische Standardfunktionen ................................. 194 Tab. 29: Portnummern, Internet Kommunikation ........................ 234 Tab. 30: Maximale Übertragungsraten Mobilfunk ......................... 245 Tab. 31: Schutzbedarfsfeststellung von IT-Anwendungen........... 289 Tab. 32: Datenmodell Messkanal ..................................................... 302 <?page no="20"?> http: / / www.uvk-lucius.de/ informatik-ing 1 Grundlagen Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: Aufgaben und Gebiete der Informatik kennen; mit den Grundbegriffen der Informationstechnologie vertraut sein; Grundprinzipien der Informationsdarstellung im Rechner skizzieren können. 1.1 Informatik 1.1.1 Was ist Informatik? Definition: Informatik (engl. Computer Science) ist eine Ingenieurswissenschaft, die sich mit der systematischen und automatischen Verarbeitung, Speicherung und Übertragung von Informationen aus Sicht der Hardware, der Software, sowie mit deren Auswirkungen befasst. Die Informatik war zunächst ein Spezialgebiet innerhalb anderer wissenschaftlicher Disziplinen wie Elektrotechnik, Mathematik oder Physik, hat sich aber heute als eigenständiges Fachgebiet etabliert. Was sind die Ziele der automatisierten Informationsverarbeitung? Erleichterung geistiger Arbeit (d.h. Aufgaben, die vom Menschen oft nur mühsam zu erledigen sind, werden vom Rechner ausgeführt). <?page no="21"?> 22 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Reduzierung/ Erleichterung körperlicher Arbeit durch Automatisierung (z.B. Robotersteuerung in der industriellen Fertigung). Rationalisierung, Effizienz- und Qualitätssteigerung in betrieblichen Abläufen (z.B. medienbruchfreie Kommunikation, Datenqualitätsaspekte). 1.1.2 Wozu Informatik-Kenntnisse? Die Informationstechnik durchdringt mittlerweile nicht nur unser Alltagsleben sondern auch alle Funktionsbereiche (Entwicklung, Produktion, Vertrieb, Beschaffung, Rechnungswesen) einer Unternehmung, unabhängig von deren Größe. Mit der vierten industriellen Revolution erreicht das Internet in Form der Industrie 4.0 sämtliche Akteure im industriellen Umfeld und stellt diese vor neue Herausforderungen. Insbesondere bei Ingenieuren stellen Daten und Informationen, welche in der Entwicklung, Simulation, dem Test und Betrieb von technischen Produkten erzeugt und verwendet werden oftmals die Basis der beruflichen Tätigkeit dar. Hinzu kommt, dass die Entwicklung von Anwendungssystemen in interdisziplinär zusammengesetzten Teams erfolgt, denen sowohl Betriebswirte, Ingenieure als auch Informatiker angehören. Erfolgreiche Kommunikation und ein allgemeines Problemverständnis erfordern seitens der Ingenieure somit betriebswirtschaftliche und (informations-)technische Kenntnisse. Das Erkennen von Möglichkeiten welche die Fortschritte in der Informations- und Kommunikationstechnologie (IKT) bei der Gestaltung von Geschäftsmodellen bieten (z.B. Aufbau von E- Commerce-Szenarien für Direktvertrieb) sowie die oftmals erwartete eigenverantwortliche Entwicklung von kleineren Planungs- und Entscheidungssystemen unter Verwendung von Standardsoftware wie z.B. Excel ® oder MATLAB ® erfordern ebenso wie die Erstellung von Kosten-/ Nutzen-Analysen und Wirtschaftlichkeitsuntersuchungen zu IT-Lösungen ein entsprechendes Wissen. <?page no="22"?> 1.1 Informatik 23 http: / / www.uvk-lucius.de/ informatik-ing Weitere Gründe die für eine intensive Beschäftigung mit der Informationstechnik sprechen, sind z.B. die unternehmensinterne und -übergreifende Kommunikation die über Netze erfolgt, die elektronische Erstellung und der veränderungsfreie Transport von Dokumenten, oder auch die Bewertung von Risiken die mit dem Einsatz der IT in einer Unternehmung verbunden sind, um nur einige weitere Gründe zu benennen. Die intensive Nutzung von Rechnern und die Kommunikation mit IT-Abteilungen verlangt somit ein informationstechnologisches Grundwissen, insbesondere bei Ingenieuren, unabhängig von deren Fachrichtung. 1.1.3 Aufgaben der Informatik Folgende Aufgaben soll die Informatik als Wissenschaftsdisziplin erfüllen: Erforschung grundsätzlicher Verfahrensweisen der Informationsverarbeitung. Erforschung allgemeiner Methoden der Bereitstellung von Werkzeugen und ihrer Anwendung. Dabei stellen die Benutzer üblicherweise folgende Anforderungen an die Informationsverarbeitung: muss kostengünstig sein (niedriger Preis). Ergebnisse müssen schnell vorliegen (Geschwindigkeit). Ergebnisse müssen stimmen (Korrektheit). Wie lassen sich diese Ziele erreichen? schnelle, preiswerte, zuverlässige Hardware. intelligente Verfahren, flexibel realisiert in Software. schnelle und sichere Rechnernetze. <?page no="23"?> 24 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing 1.1.4 Meilensteine der Datenverarbeitung Die historischen Wurzeln der Datenverarbeitung und der Informatik reichen sehr weit zurück. Nachfolgend sind - ohne Anspruch auf Vollständigkeit - einige Meilensteine der Entwicklung der Datenverarbeitung und Rechenmaschinen aufgelistet: Ca. 1100 v. Chr.: erste mechanische Rechenmaschinen in Indien / China, z.B. Abakus. Ca. 300 v. Chr.: Beschreibung von reproduzierbaren Rechenverfahren, z.B. größter gemeinsamer Teiler durch Euklid. ca. 830 n. Chr.: al-Chwarizmi beschreibt Grundlagen von Rechenvorschriften; Begriff des Algorithmus ist von seinem Namen abgeleitet. 1822: Konzept für eine programmgesteuerte Analytical Engine mit Speicher, Steuereinheit und Verarbeitungseinheit durch Charles Babbage. Da nur die Mechanik verfügbar ist, wird deren Konstruktion jedoch nie vollendet. 1854: George Boole entwickelt die Boolesche Logik und Algebra, welche grundlegende logische Operatoren UND, ODER und NICHT umfasst. 1941: Konrad Zuse entwickelt eine mechanisch-elektronische, programmgesteuerte Rechenmaschine (Z3) auf Basis des Dualsystems. 1945: Beschreibung einer universellen Rechnerarchitektur durch John von Neumann. 1946: Fertigstellung des ersten rein elektronischen Universalrechners, dem Electronic Numerical Integrator and Computer (ENIAC). Ca. 1950er Jahre: erste Rechnergeneration; Technologie auf Röhrenbasis. Ca. 1960er Jahre: zweite Rechnergeneration; Verwendung von Transistoren; Aufkommen von Betriebssystemen und Compiler für Programmiersprachen. Ca. 1970er Jahre: dritte Rechnergeneration; integrierte Schaltkreise / Mikrochips. <?page no="24"?> 1.1 Informatik 25 http: / / www.uvk-lucius.de/ informatik-ing Ca. 1980er Jahre: vierte Rechnergeneration; hochintegrierte Schaltkreise; Mikroprozessoren. 1978: Entwicklung der x86-Architektur. 1982: Öffnung des Massenmarktes für Heimanwender mit Verfügbarkeit des C64 von Commodore. 1989: Grundlagen des WorldWideWeb am CERN. 2007: Einführung des iPhones; damit verbunden Wandel des Nutzerverhaltens im Internet. Weitere Entwicklungen bis heute: Verbreitung von Multiprozessorsystemen; stetig wachsende Geschwindigkeit und Speicherkapazitäten; zunehmende Vernetzung sowohl räumlich als auch von unterschiedlichsten technischen Komponenten (u.a. Objekte des alltäglichen Lebens); Computer durchdringen mittlerweile alle Lebensbereiche z.B. Internet der Dinge. Im Internet der Dinge (auch Internet of Things, IoT) wird der PC bzw. traditionelle Rechner zunehmend als Gerät verschwinden und durch „intelligente Gegenstände“ ersetzt. Statt - wie derzeit - selbst Gegenstand der menschlichen Aufmerksamkeit zu sein, soll das „Internet der Dinge“ den Menschen bei seinen Tätigkeiten unmerklich unterstützen (z.B. RFID, Sensoren, Paketverfolgung, …). Intelligente Geräte sollen denken lernen, Waren ihren Weg zum Ziel selbst organisieren, intelligente Gebäude selbstständig für ein angenehmes Wohnumfeld sorgen oder den Energieverbrauch in Abhängigkeit von der aktuellen Energieproduktion „organisieren“, um nur einige Szenarien zu nennen. Das Internet der Dinge ist inzwischen bereits in vielen Bereichen Realität, es wächst exponentiell, es ist Treiber der Digitalisierung und legt die Grundlagen für Industrie 4.0. <?page no="25"?> 26 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Definition: „Internet der Dinge bezeichnet die Vernetzung von Gegenständen mit dem Internet, damit diese Gegenstände selbstständig über das Internet kommunizieren und so verschiedene Aufgaben für den Besitzer erledigen können. Der Anwendungsbereich erstreckt sich dabei von einer allg. Informationsversorgung über automatische Bestellungen bis hin zu Warn- und Notfallfunktionen.“ 1 1.1.5 Gebiete der Informatik Die Disziplin der Informatik ist sehr breit aufgestellt und gliedert sich in die Kerninformatik (Theoretische-, Praktische-und Technische Informatik) sowie in die Angewandte Informatik. Abb. 1: Spannweite der Disziplin Informatik 1 Springer Gabler Verlag (Herausgeber), Gabler Wirtschaftslexikon, Stichwort: Internet der Dinge, online im Internet: 35/ Archiv/ 1057741/ internet-der-dinge-v4.html <?page no="26"?> 1.1 Informatik 27 http: / / www.uvk-lucius.de/ informatik-ing Theoretische Informatik: Das Gebiet der Theoretischen Informatik beschäftigt sich mit den abstrakten und mathematikorientierten Aspekten dieser Wissenschaft. Das Gebiet ist breit gefächert und bearbeitet unter anderem Themen aus der theoretischen Linguistik (Theorie formaler Sprachen bzw. Automatentheorie), der Algorithmen- und Komplexitätstheorie. Ziel dieser Teilgebiete ist es, fundamentale Fragen wie „Was kann berechnet werden? “ und „Wie effektiv/ effizient kann man etwas berechnen? “ umfassend zu beantworten. Praktische Informatik: Die Praktische Informatik entwickelt grundlegende Konzepte und Methoden zur Lösung konkreter Probleme in der realen Welt, beispielsweise der Verwaltung von Daten in Datenstrukturen oder der Entwicklung von Software. Eines der zentralen Themen der praktischen Informatik ist die Softwaretechnik (synonym: Softwareengineering) oder auch der Compilerbau. Während sich die Softwaretechnik mit der systematischen Erstellung von Software beschäftigt, ist die effiziente Übersetzung einer (höheren) Programmiersprache in eine Maschinensprache im weitesten Sinne inhaltlicher Gegenstand des Compilerbaus. Technische Informatik: Die Technische Informatik befasst sich vorwiegend mit der Konstruktion von Rechnern, wie etwa der Mikroprozessortechnik, Rechnerarchitektur, eingebetteten und Echtzeitsystemen oder Rechnernetzen, aber auch mit dem Aufbau von Peripherie-Geräten. Die Grenzen zwischen der Technischen Informatik und der Elektrotechnik gehen dabei fließend ineinander über. Angewandte Informatik: Die Angewandte Informatik beschäftigt sich mit der anwendungsorientierten Nutzung der aus der Kerninformatik stammenden Erkenntnisse für spezielle Fachgebiete. Beispiele hierfür finden sich in der Umweltinformatik, der medizinischen Informatik, der Ingenieursinformatik, der Wirtschaftsinformatik etc. <?page no="27"?> 28 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Die Ingenieursinformatik verbindet interdisziplinär die Ingenieurwissenschaften (z.B. Elektrotechnik, Maschinenbau, Verfahrenstechnik, Bauingenieur- und Wirtschaftsingenieurwesen) mit der Informatik. Sie beschäftigt sich mit den Grundlagen der Daten- und Informationsverarbeitung sowie deren Anwendungsgebieten in den Arbeitsfeldern der unterschiedlichen Disziplinen des Ingenieurswesen wie beispielsweise Systemen zur Lösung mathematischer und statistischer Probleme, Simulation, Enterprise Resource Planning (ERP), Produktionsplanung und Steuerung (PPS), Computer Aided Design (CAD) und vieles mehr. Erkenntnisziele der Ingenieursinformatik: Beherrschung der Komplexität von Informations- und Kommunikationssystemen. Entwicklung und Analyse neuer Konzepte der Fertigung im Bereich Industrie 4.0. Anwender-/ Mensch-Maschine-Schnittstellen. Modellbildung und Simulation von Produkten, Produktionsplanung und Steuerung. Entwicklung intelligenter Software zur Lösung neuer Herausforderungen in den jeweiligen Ingenieursdisziplinen. Vertiefung der interdisziplinären Bezüge zwischen Ingenieurswissenschaften und der Informatik. Neue Lehr- und Lernformen. <?page no="28"?> 1.2 Grundbegriffe der Informationstechnologie 29 http: / / www.uvk-lucius.de/ informatik-ing 1.2 Grundbegriffe der Informationstechnologie 1.2.1 Grundbegriffe Daten und Information Information unterrichtet uns über bestimmte Sachverhalte, sie muss aus vielen Nachrichten/ Daten abgeleitet werden. Daten sind Zeichen, die zum Zweck der Verarbeitung Information aufgrund bekannter oder unterstellter Abmachungen darstellen [DIN 44300]. In der Elektronischen Datenverarbeitung (EDV) versteht man unter Daten alles, was sich in einer für die DV-Anlage erkennbaren Weise codieren lässt. Abb. 2: Zusammenhang zwischen Daten und Information Am Beispiel der Messwerte einer Wetterstation soll der Unterschied zwischen Daten und Information deutlich werden: <?page no="29"?> 30 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Abb. 3: Daten und Information am Bsp. Wetterstation Datenverarbeitungssystem, Rechensystem (data processing system): Eine Funktionseinheit zur Verarbeitung von Daten, nämlich zur Durchführung mathematischer, umformender, übertragender und speichernder Operationen [DIN 44300]. Ein Datenverarbeitungssystem besteht aus Hardware- und Softwarekomponenten. Synonyme Begriffe: Datenverarbeitungsanlage, Digitalrechner, Computersystem usw. Hardware: Menge aller technischen Geräte eines Datenverarbeitungssystems. D.h. Menge der physikalischen Komponenten wie Speicher, Drucker, Rechner (Computer, Zentraleinheit), Scanner, Tastatur etc. Algorithmus: Ein Algorithmus ist eine präzise, d.h. in einer festgelegten Sprache abgefasste, endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer elementarer (Verarbeitungs-)Schritte. Station ID Standortbezeichnung Längengrad des Standortes Breitengrad des Standortes Messdatum Uhrzeit der Messung Lufttemperatur (°C) Windgeschwindigkeit (m/ sec) 4336 Saarbrücken-Ensheim 8,678 49,123 06.03.2016 13: 30 13 5,7 4336 Saarbrücken-Ensheim 8,678 49,123 06.03.2016 12: 30 13 5,7 Daten Informationen Interpretation Codierung <?page no="30"?> 1.2 Grundbegriffe der Informationstechnologie 31 http: / / www.uvk-lucius.de/ informatik-ing Programm: Formulierung eines Algorithmus und der zugehörigen Datenbereiche in einer Programmiersprache zur Ausführung auf einer Rechenanlage. Software: Gesamtheit aller Programme, die auf der Hardware ausgeführt werden; z.B. Windows 10 ® , MATLAB ® , MS-Excel ® etc. 1.2.2 EVA-Grundprinzip der Datenverarbeitung Eine Datenverarbeitungsanlage besteht auch heute noch immer aus den drei klassischen Funktionseinheiten einer Von-Neumann-Maschine: Eingabeeinheit: Eingaben bzw. Befehle durch einen Benutzer; Informationen von einem automatischen Lesegerät; Informationen von anderen Computern etc.; es existiert eine hohe Vielfalt an Eingabegeräten: Tastatur, Maus, Scanner, Digitalisiertablett, 3D-Maus, Joystick … Verarbeitungseinheit: Durchführen von Berechnungen; Speichern von Daten; Vergleichen von Daten; etc. Hardwarekomponenten: Prozessor; Speicher; Massenspeicher: Festplatte; CD-ROM. Ausgabeeinheit: Bildschirmausgabe; Ausdruck; Weitergabe an andere Computer etc.; hohe Vielfalt an Ausgabegeräten: Bildschirm, Drucker, Plotter, 3D-Drucker, Beamer … Abb. 4: EVA-Prinzip der Datenverarbeitung <?page no="31"?> 32 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing 1.2.3 Informationsdarstellung Digitale Rechenanlagen können nur binäre Informationen (“0“ und “1“) verarbeiten. Für die Speicherung und Verarbeitung müssen die Informationen somit binär, d.h. als Folge von 0‘en und 1‘en, kodiert werden. Bei der Angabe der Maßeinheiten kommt es im Kontext der Binärzahlen häufig zur Verwechslung mit den SI-Einheiten (frz. Système international d’unités). Im SI-System bezeichnen die Präfixe immer Zehnerpotenzen, d.h. 1 k = 10 3 = 1000, 1 M = 10 6 . Im Binärsystem dagegen Zweierpotenzen d.h. Ki = 2 10 = 1024. Um Mehrdeutigkeiten zu vermeiden, definiert die IEC 60027-2 deshalb eigene Präfixe für die binäre Bedeutung. Dabei wird an die bekannten SI-Präfixe der Kleinbuchstabe i angehängt. Die folgende Tabelle verdeutlicht die Problematik: Tab. 1: Binäres Einheitensystem Name Symbol Bit b 1 bit Byte B 8 bit Kilobit kb 1 kb = 1000 b Kibibit Kib 1 Kib = 1024 b Kibibyte KiB 1 KiB = 1024 B Megabit Mb 1 Mb = 1000 kb Mebibit Mib 1 Mib = 1024 Kib Gigabit Gb 1 Gb = 1000 Mb Gibibit Gib 1 Gib = 1024 Mib Terabyte TB 1 TB = 1000 GB Tebibyte TiB 1 TiB = 1024 GiB <?page no="32"?> 1.2 Grundbegriffe der Informationstechnologie 33 http: / / www.uvk-lucius.de/ informatik-ing Zur Ein- und Ausgabe müssen die Daten in einen verständlichen bzw. gebräuchlichen Code, beispielsweise in das Dezimalsystem oder das lateinische Alphabet, umgerechnet werden. 1.2.3.1 Zahlensysteme Zahlensysteme legen fest, wie sich der Wert einer Zahl aus dem Wert der einzelnen Ziffern berechnet. Da an dieser Stelle lediglich das Grundprinzip der Zahlensysteme vorgestellt werden soll, beschränken wir uns im Weiteren auf das Dezimal-, das Dualsowie das Hexadezimalsystem. Bei einer Zahlendarstellung im Stellenwertsystem hängt die Wertigkeit einer Ziffer von seiner Position (Stelle) ab. Im Alltag gebräuchlich ist das Dezimalsystem. Zahlen im Stellenwertsystem können z.B. einfach durch voranstellen von Nullen auf eine einheitliche Länge gebracht werden. Dezimalsystem Ist ein Stellenwertsystem zur Zahlenbasis 10, weil sich der Wert einer Zahl aus den Ziffern und aus deren Stellung innerhalb der Ziffernfolge ergibt. Stellen werden als Einer, Zehner, Hunderter, Tausender etc. bezeichnet. Tab. 2: Grundprinzip des Dezimalsystems Dualsystem Computer können intern nur mit zwei Ziffern arbeiten, da sie auf binären Schaltelementen basieren, die zwei Zustände (offen/ Stelle Potenz von 10 Dezimalsystem 5 6 3 8 Einer 10 0 8 = 8 · 10 0 Zehner 10 1 3 = 3 · 10 1 Hunderter 10 2 6 = 6 · 10 2 Tausender 10 3 5 = 5 · 10 3 <?page no="33"?> 34 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing geschlossen) annehmen können. Sie führen ihre Berechnungen im Binärsystem aus. Weiteres Beispiel für ein binäres System (kein Stellenwertsystem): Morsealphabet (kurz/ lang); Das Dualsystem ist ein binäres Stellenwertsystem zur Zahlenbasis 2. Seine Ziffernfolgen bestehen aus 0‘en und 1’en. Die einzelnen Ziffern b i werden als Bit (binary digit) bezeichnet, 𝑧𝑧 = � 𝑏𝑏 𝑖𝑖 ∙ 𝑛𝑛−1 𝑖𝑖=0 2 𝑖𝑖 Abb. 5: Grundprinzip des Dualsystems Anwendungsbeispiel: Umwandlung Dualin Dezimalzahl Tab. 3: Darstellung einer Zahl im Dualsystem Aus der Abbildung ergibt sich folgende Dezimalzahl: 1 · 2 4 + 0 · 2 3 + 1 · 2 2 + 0 · 2 1 + 1 · 2 0 = 16 + 4 + 1 = 21 b n-1 b n-2 ... b 1 b 0 2 n-1 2 n-2 ... 2 1 2 0 Wertigkeit Ziffer MSB (Most Significant Bit) LSB (Least Significant Bit) Stelle Potenz von 2 Dualsystem 1 0 1 0 1 Einer 2 0 1 = 1 · 2 0 Zweier 2 1 0 = 0 · 2 1 Vierer 2 2 1 = 1 · 2 2 Achter 2 3 0 = 0 · 2 3 .... 2 4 1 = 1 · 2 4 . . . 2 5 2 6 <?page no="34"?> 1.2 Grundbegriffe der Informationstechnologie 35 http: / / www.uvk-lucius.de/ informatik-ing Umwandlung einer Dezimalzahl in eine Dualzahl Vorüberlegung: Wenn man eine natürliche Zahl z durch eine andere natürliche Zahl d <> 0 exakt teilt erhält man einen Quotienten q sowie einen Rest r. Beispielsweise gilt 17/ 8 = 2 Rest 1. Der Rest ist immer kleiner als der Divisor d, also 0<= (z mod d) < d Die Zahl z wird somit als Vielfaches c des Divisors d mit einem Rest r dargestellt: 𝑧𝑧 = 𝑞𝑞 ∙ 𝑑𝑑 + 𝑟𝑟 d.h. in unserem Beispiel: 17 = 2 ∙ 8 + 1 Die Operation des Dividierens ohne Rest wird in der Informatik mit div bezeichnet, die Operation die den Divisionsrest ermittelt, wird mit mod (Modulo) bezeichnet. Für eine Zahl z im Dezimalsystem ist (z mod 10) die letzte Ziffer, d.h. in unserem Beispiel, bei der 17, die Ziffer 7. (z div 10) erhält man durch Streichen der letzten Ziffer, d.h. 17 div 10 = 1. Dies gilt analog für alle anderen Zahlensysteme. Diese Vorgehensweise wenden wir nun zur Umrechnung von Dezimalin Dualdarstellung an: Schritt 1: Dividieren Sie die Dezimalzahl durch 2. Der Rest der Division gibt die Stelle mit der Wertigkeit 2 0 an. Schritt 2: Dividieren Sie das Ergebnis aus Schritt 1 durch 2. Der Rest der Division gibt die Stelle mit der Wertigkeit 2 1 an. Wiederhole, bis der Quotient 0 ist. Bemerkung: Die Umrechnung von Dezimalin Hexadezimaldarstellung erfolgt in gleicher Weise. Als Divisor wird dann die Basis 16 verwendet. <?page no="35"?> 36 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Tab. 4: Beispiel zur Umwandlung Dezimalin Dualzahl Tab. 5: Gegenüberstellung Zahlensysteme Hexadezimalsystem Das Hexadezimalsystem verwendet die Basis 16=2 4 und damit die Ziffern 0, 1…8, 9, A ,B, …, F. zur Darstellung einer Zahl. Hauptmotivation für die Wahl dieses Stellenwertsystems ist die einfache Möglichkeit, eine lange Folge von binären Ziffern möglichst platzsparend zu notieren. Moderne Rechner verfügen Dezimal Dual Hexadezimal 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F Dezimalzahl z z div 2 z mod 2 (Rest) 17 8 1 (2 0 ) 8 4 0 (2 1 ) 4 2 0 (2 2 ) 2 1 0 (2 3 ) 1 0 1 (2 4 ) <?page no="36"?> 1.2 Grundbegriffe der Informationstechnologie 37 http: / / www.uvk-lucius.de/ informatik-ing z.B. über eine Wortbreite von 64 Bit, d.h. die Darstellung einer Zahl im Speicher würde 64 binäre Ziffern erfordern. Gemäß der dargestellten Tabelle lassen sich immer 4 Bit einer Dualzahl zu einer hexadezimalen Ziffer zusammenfassen. Damit wären 64 binäre Ziffern durch 64/ 4 = 16 hexadezimale Ziffern ersetzbar. Da die Ziffer 0 und 1 bei allen bisher vorgestellten Stellenwertsystemen auftaucht, wird zur Verdeutlichung der gewählten Basis diese häufig als Subindex hinter die Zahl geschrieben: Die Dezimalzahl 9365 10 aus dem vorherigen Beispiel lässt sich in Hexadezimalschreibweise damit viel kürzer darstellen: 0010 0100 1001 0101 2 = 2495 16 Darstellung negativer Zahlen Die bisherigen Ausführungen bezogen sich auf natürliche Zahlen (unsigned integer). Eine Erweiterung auf negative Zahlen (signed integer) wäre z.B. einfach möglich, indem analog zum Dezimalsystem ein Vorzeichenbit (+/ -) eingeführt wird. Nachteil dieser Vorgehensweise ist die doppelte Null, d.h. es existiert eine unterschiedliche Darstellung für +0 und für -0, was das Design entsprechender Rechenwerke zur Addition/ Subtraktion von Zahlen unnötig erschwert. Zweierkomplementdarstellung Ein einfacher Ausweg ist die Kodierung der vorzeichenbehafteten Zahlen in Zweierkomplementdarstellung. Hierbei wird auf das Vorzeichen verzichtet. Stattdessen bekommt die höchstwertigste Ziffer (MSB, most significant bit) eine negative Wertigkeit zugewiesen. 𝑧𝑧 = −𝑏𝑏 𝑛𝑛−1 ∙ 2 𝑛𝑛−1 + � 𝑏𝑏 𝑖𝑖 ∙ 2 𝑖𝑖 𝑛𝑛−2 𝑖𝑖=0 <?page no="37"?> 38 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Abb. 6: Grundprinzip der Zweierkomplementdarstellung Beispiel: 10101 2 = -16+4+1 = -11 Bei den ganzen Zahlen ist also die Anzahl n der zur Verfügung stehenden binären Stellen ausschlaggebend für den Wertebereich der Zahlen. Je nach Vereinbarung (vorzeichenlos, unsigned, oder vorzeichenbehaftet, signed) ergibt sich dabei ein möglicher Wertebereich von 0 bis 2 n-1 bzw. von -2 n-1 bis 2 n-1 -1. Im Kapitel Programmiersprachen werden wir genauer beleuchten, was dieses für die Verwendung von ganzen Zahlen im Rechner bedeutet. Darstellung reeller Zahlen (Festkomma) Spaltet man die Vorkommastellen einer reellen Zahl ab und kodiert diese mit n-Stellen als ganze Zahl, so verbleibt ein Nachkommarest nz < 1. Analog zum Dezimalsystem, bei dem die Nachkommastellen eine Wertigkeit von 1/ 10, 1/ 100 usw. aufweisen, lässt sich auch zur Basis 2 eine entsprechende Codierung realisieren. Hierbei haben die binären Nachkommastellen eine Wertigkeit von 2 -1 = 1/ 2, 2 -2 = 1/ 4, 2 -3 usw. ∑ = − ⋅ = m i i i b nz 1 2 b n-1 b n-2 ... b 1 b 0 - 2 n-1 +2 n-2 ... +2 1 +2 0 Wertigkeit Ziffer MSB entscheidet über Vorzeichen <?page no="38"?> 1.2 Grundbegriffe der Informationstechnologie 39 http: / / www.uvk-lucius.de/ informatik-ing Anwendungsbeispiel: Festkommazahl Betrachten wir eine Binärzahl mit je vier Vor- und Nachkommastellen z.B. 0110..1101 2 = 4+2+1/ 2+1/ 4+1/ 16 = 6.8175 10 Die reelle Zahl 6.8175 10 lässt sich also exakt als Festkommazahl mit je vier binären Vor- und Nachkommastellen kodieren. Umwandlung Dezimalzahl in Festkommadarstellung Die Umwandlung einer der echt gebrochenen Dezimalzahl nz in die Binärdarstellung erfolgt durch fortgesetzte Multiplikation des gebrochenen Anteils mit der Basis 2 und der Abspaltung der jeweils vordersten Ziffer. Mit dem gebrochenen Anteil wird solange weiter gerechnet, bis das Ergebnis Null ist. Abb. 7: Umwandlung Nachkommastellen Die Genauigkeit hängt dabei von der Anzahl m der zur Verfügung stehenden Nachkommastellen ab. Viele für den menschlichen Betrachter „schöne“ Dezimalzahlen benötigen zur exakten Speicherung leider eine unendliche Zahl von binären Nachkommastellen. Als Beispiel sei hier die häufig als Schrittweite gewählte Zahl nz=0.1 10 angeführt: 0.625 *2 = 1 .25 0.625 10 = 0. 1 Abspaltung 1 *2 = 0 .5 0.25 0 Abspaltung 0 Abspaltung 1 1 2 0.5 *2 = 1 .0 0.0 *2 = 0 .0 Ende <?page no="39"?> 40 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Abb. 8: Periodische Nachkommastellen Da die Anzahl der Stellen für die Codierung einer Zahl im Rechner praktisch immer beschränkt ist, heißt das für uns, die entsprechende Dezimalzahl lässt sich im Rechner gar nicht exakt speichern. Wir machen also einen systembedingten Darstellungsfehler, der sich bei ungünstigen numerischen Rechenoperationen fortpflanzen kann. Die Genauigkeit einer Zahlendarstellung wird durch die für die Codierung der Nachkommastellen zur Verfügung stehende Stellenanzahl m festgelegt. Darstellung reeller Zahlen (Gleitpunktdarstellung) Um den Wertebereich zu vergrößern, wird bei der Zahlendarstellung im Rechner eine halblogarithmische Darstellung mit Basis B=2, Exponent E und Mantisse M realisiert. Der Ingenieur kennt diese Darstellung als wissenschaftliche Notation zur Basis B=10: Über die Anzahl der zur Verfügung stehenden Stellen zur Codierung des Exponenten kann der darstellbare Wertebereich damit nahezu beliebig gesteuert werden. Die Genauigkeit dagegen hängt von der Anzahl m der zur Codierung der Mantisse 0.1 *2 = 0 .2 0 Abspaltung 0 *2 = 0 .4 0.2 0 Abspaltung 0 Abspaltung 0 0 0.4 *2 = 0 .8 0.1 10 = 0. 0.8 *2 = 1 .6 Abspaltung 1 1 0.6 *2 = 1 .2 Abspaltung 1 1 0.2 *2 = 0 .4 Abspaltung 0 0 ..Endlos 0 1 1 0 2 Hatten wir schon E B M z ⋅ = <?page no="40"?> 1.2 Grundbegriffe der Informationstechnologie 41 http: / / www.uvk-lucius.de/ informatik-ing vorgesehenen Stellen ab. Genaues ist in der Norm IEEE 754 für Gleitkommazahlen (float) geregelt. Die Eigenschaften dieser Fließkommadarstellung hat für den Ingenieur entscheidende Bedeutung, hängt doch die Genauigkeit der auf dem Rechner durchgeführten mathematischen Operationen davon ab. Um die Tragweite zur veranschaulichen, soll hier ein Demosystem mit der bekannten Basis B=10 betrachtet werden. Zur Kodierung der Mantisse steht eine dezimale Nachkommstelle zur Verfügung. Der Exponent E kann die Werte -1, 0 und +1 annehmen. Das Vorzeichenbit bleibt unberücksichtigt. Welche Zahlen lassen sich mit diesem System darstellen? Abb. 9: Darstellbare Zeichen im Demosystem Dabei wird ersichtlich, dass sich vom kontinuierlichen Zahlenstrahl nur eine endliche Anzahl an Zahlen exakt darstellen lassen. Alle anderen besitzen einen Darstellungsfehler. Die Auswirkung wird uns noch bei der Behandlung des Datentyps float im Kapitel Programmiersprachen beschäftigen. Wir beobachten weiterhin eine relative Genauigkeit, d.h. große Zahlen liegen weiter auseinander als kleine Zahlen (nichtäquidistante Verteilung auf Zahlengerade). Berechnungen mit exakt darstellbaren Zahlen müssen nicht zwangsläufig wieder eine darstellbare Zahl ergeben. Die Auswirkungen werden klar, wenn wir die Berechnung der Vergütung einer Mobilfunknutzung betrachten. Es sei eine minutengenaue Abrechnung mit 0.1 €/ min vereinbart. Nach der ersten Minute berechnet das System eine Summe von 0.1 €. Nach Ablauf der zweiten Minute wird eine weitere Einheit dazu addiert. Die <?page no="41"?> 42 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing gespeicherte Summe beträgt damit 0.2 €. Dies geht bis zum Ablauf der 10. Minute mit einer Summe von 1 € korrekt weiter. Aber nach Ablauf der elften Minute berechnet das System 1+0.1 = 1.1 €, ein Ergebnis, das in unserem System nicht darstellbar ist. Die Summe wird notwendigerweise gerundet als 1 € gespeichert. Ab diesem Zeitpunkt telefonieren Sie kostenlos! 1.2.3.2 Darstellung von nicht-numerischen Zeichen Für die Darstellung von nichtnumerischen Zeichen (z.B. Buchstaben) wird das Alphabet in Bitfolgen codiert. Es existieren verschiedene Codierungen. American Standard Code for Information Interchange ASCII vereinheitlichter Code, weitverbreitet. 7 Bit-Code. am häufigsten verwendete Codierung. Neben den druckbaren Zeichen (z.B. Klein-, Großbuchstaben, Satzzeichen, Zahlen) codiert ASCII auch sogenannte Steuerzeichen (z.B. Horizontaler-Tabulator HT, Zeilenvorschub LF, Wagenrücklauf CR). Tab. 6: ASCII-Zeichentabelle Co de ..0 ..1 ..2 ..3 ..4 ..5 ..6 ..7 ..8 ..9 ..A ..B ..C ..D ..E ..F 0.. NUL SOH STX ETX EOT ENQ ACK BEL BS HAT LF VT FF CR SO SI 1.. DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 2.. SP ! " # $ % & ' ( ) * + , - . / 3.. 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4.. @ A B C D E F G H I J K L M N O 5.. P Q R S T U V W X Y Z [ \ ] ^ _ 6.. ` a b c d e f g h i j k l m n o 7.. p q r s t u v w x y z { | } ~ DEL <?page no="42"?> 1.2 Grundbegriffe der Informationstechnologie 43 http: / / www.uvk-lucius.de/ informatik-ing Die 2 7 = 128 10 darstellbaren Zeichen können auch als ganze Zahlen (0-127 10 bzw. 00-7F 16 ) interpretiert werden. Die entsprechende Codierung ist der obigen Tabelle zu entnehmen. Beispielsweise wird der Großbuchstabe A mit dem Bitmuster 41 16 bzw. 0100 0001 2 codiert. Es existieren ASCII-Erweiterungen, um sprachenspezifische Zeichen (z.B. Umlaute) zu codieren (8-Bit-Code). Diese wurden von der International Organization for Standardization (ISO) normiert. In Europa ist die ASCII-Erweiterung ISO Latin-1 weit verbreitet. Um im Rahmen der weltweiten Kommunikation und Datenübertragung alle relevanten Zeichen der unterschiedlichen Kulturkreise einheitlich codieren zu können wurde der sogenannte Unicode definiert. Dieser verwendet eine 16-Bit-Codierung und enthält unter anderem auch arabische, kyrillische und japanische Schriftzeichen. 1.2.4 Logische Grundfunktionen Der Aufbau von Digitalrechnern basiert auf einem Konzept der Verknüpfung und wiederholten Anwendung von einfachen „logischen“ Grundoperationen. Diese logischen Operationen werden -neben der rechnerinternen Verwendungauch in zahlreichen weiteren Anwendungen genutzt, z.B. bei der Definition von Anfragen in Suchmaschinen oder Suchmasken. Die Theorie hierzu, die sogenannte Boolesche Algebra, wurde von dem Mathematiker George Boole (1815 - 1864) entwickelt. In der Booleschen Algebra kann eine Variable nur den Wert 0 oder 1 (falsch oder wahr, engl. false oder true) annehmen. Die Werte 0 und werden als Grundwerte bezeichnet. Eng verknüpft mit der Booleschen Algebra ist innerhalb der mathematischen Logik die sogenannte Aussagenlogik. In der Aussagenlogik betrachtet man den Wahrheitsgehalt von Aussagen. Der Inhalt der Aussage ist dabei unwichtig. <?page no="43"?> 44 1 Grundlagen http: / / www.uvk-lucius.de/ informatik-ing Es gibt nur ‘wahr’ und ‘falsch’. Es gilt: - wahr (true) = 1 - falsch (false) = 0 Definition: Eine Aussage ist ein Satz, der entweder wahr oder falsch ist. Beispiele von wahren Aussagen: Luft enthält Sauerstoff 1 + 1 = 2 Es gibt keine natürliche Zahl x, für die gilt: x 2 = 7 Beispiele für eine falsche Aussage: Der Blauwal ist ein Fisch 1 + 1 = 3 Es gibt reelle Zahlen, deren Quadrat -1 ist Mithilfe von Verknüpfungsoperatoren, den sogenannten Junktoren bzw. logischen Operatoren, werden Aussagevariablen zu Formeln oder Ausdrücken verknüpft, die dann entsprechen ausgewertet werden können. Die Zusammenhänge von Aussagen werden in Wahrheitsfunktionen und Wahrheitstabellen (siehe unten) dargestellt. Logische Operatoren besitzen folgende Eigenschaften: Jeder Operator symbolisiert eine bestimmte Funktion. Ein Operator verknüpft zwei (oder mehr) Ausdrücke. Es gibt drei logische Grundoperationen: Negation, Konjunktion und Disjunktion. Konjunktion: Bezeichnung: logisches UND Symbol: ∧, * <?page no="44"?> 1.2 Grundbegriffe der Informationstechnologie 45 http: / / www.uvk-lucius.de/ informatik-ing Disjunktion: Bezeichnung: logisches ODER Symbol: ∨, + Tab. 7: Wahrheitstabelle Konjunktion und Disjunktion Eingabe Ausgabe X 1 X 2 UND ODER 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 Negation: Bezeichnung: logisches NICHT Symbol: - Tab. 8: Wahrheitstabelle Negation Eingabe Ausgabe X 1 NICHT 0 1 1 0 Tabelle 9 verdeutlicht die Auswertung eines Booleschen Ausdrucks mit mehrerern Aussagevariablen X i . <?page no="45"?> 46 1 Grundlagen Tab. 9: Boolescher Ausdruck mit drei Variablen X 1 , X 2 , X 3 Eingabe Ausgabe X 1 X 2 X 3 ( ) 3 2 1 X X X ∧ ∨ - 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1.3 Literatur Gumm H. P., M. Sommer (2013): Einführung in die Informatik. 10. Auflage, Oldenbourg Wissenschaftsverlag GmbH, München Herold H., B. Lurz, J. Wohlrab (2012): Grundlagen der Informatik (Pearson Studium - IT). 2., aktualisierte Auflage, Pearson Deutschland GmbH, München Kersken S. (2013): IT-Handbuch (Tabellenbuch). IT-Systemelektroniker/ -in, Fachinformatiker/ -in. 8. Auflage, Westermann Verlag <?page no="46"?> http: / / www.uvk-lucius.de/ informatik-ing 2 Hardware Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: einen Überblick über die Hardware typischer Computersysteme im Ingenieurumfeld bekommen; elektrotechnische Grundlagen der Informatik kennen, Energieverbräuche und Rechenleistung der Hardware einschätzen können, einfache Interfaceschaltungen verstehen; Grundlagen der Digitaltechnik beherrschen, einfache Schaltnetze entwerfen, Aufbau einfacher Automaten verstehen und darauf aufbauend die Funktionsweise eines einfachen Rechners nachvollziehen können; Konzepte der Nebenläufigkeit und der Speicherhierarchie kennenlernen und moderne Rechnerarchitekturen hinsichtlich ihrer Eigenschaften einordnen können; am Beispiel eines Mikrocontrollers den Aufbau eines einfachen Rechnersystems und der Standardinterfacetechnik zur Prozessankopplung beherrschen. 2.1 Grundelemente eines Rechnersystems Ein einfaches Computersystem besteht gemäß der von-Neumann-Architektur aus mehreren Komponenten: Der CPU (Mikroprozessor, Central Processing Unit) als Zentraleinheit mit der Fähigkeit, Daten einzulesen, Maschinenbefehle abzuarbeiten und Daten auszugeben (EVA-Prinzip). Intern besteht die CPU dazu aus mindestens einem Rechenwerk <?page no="47"?> 48 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing zur Ausführung arithmetischer und logische Verknüpfungen, sowie einem Steuerwerk zur Koordination der Befehlsabarbeitung. Daten und Befehle erhält die CPU über einen Systembus aus dem Speicher bzw. aus den verschiedenen Ein-/ Ausgabeeinheiten (Input/ Output, I/ O), wie Tastatur oder Bildschirm. Abb. 10: Komponenten der von-Neumann-Architektur Der Systembus besteht aus drei Untereinheiten, dem Adressbus zur Übertragung der Speicheradresse, dem Datenbus zum Transport von Daten/ Befehlen und dem Steuerbus zur Koordination der beteiligten Einheiten. Über den Steuerbus wird z.B. festgelegt, ob ein Zugriff auf den Speicher lesend oder schreibend erfolgt. Weiterhin gehören Takt- und Interrupt-Leitungen zum Steuerbus. Über Interruptsignale kann die I/ O-Einheit dem Prozessor z.B. die Ankunft neuer Daten signalisieren. Physikalisch besteht der Systembus aus einer Reihe paralleler elektrischer Verbindungen zur Übertragung der binären Informationen. Hier unterscheiden sich viele Systeme in der Anzahl der zur Verfügung stehenden parallelen Leitungen (Wortbreite) und damit z.B. der adressierbaren Speicherzellen. Bei den heute üblichen Taktfrequenzen im GHz-Bereich ergibt sich eine Periodendauer, d.h. die Dauer einer Taktschwingung, von weniger als einer Nanosekunde. In dieser Zeit legt die elektromagnetische Welle unter Annahme einer Geschwindigkeit Ein- / Ausgabesystem Zentral- Einheit (CPU) Arbeits- Speicher (RAM) Adressbus Datenbus Steuerbus Systembus <?page no="48"?> 2.1 Grundelemente eines Rechnersystems 49 http: / / www.uvk-lucius.de/ informatik-ing von fast Lichtgeschwindigkeit nur wenige cm zurück. Auf einer langen Leitung können also durchaus mehrere Bits gleichzeitig unterwegs sein. Bei den parallelen Leiterbahnen des Systembusses lassen sich auf der Platine deshalb oft mäanderförmige Strukturen zur Laufzeitkorrektur einzelner Leitungen finden. Beim von-Neumann-Rechner werden Daten- und Programmcode im gemeinsamen Speicher abgelegt. Dies bedingt den sequentiellen Transport über ein Bussystem und führt zu einer eingeschränkten Parallelisierbarkeit z.B. durch Pipelineverarbeitung (von-Neumann-Flaschenhals). Beim Speicher wird zwischen RAM (Random Access Memory) mit wahlfreiem lesendem und schreibendem Zugriff und dem ROM (Read Only Memory) mit ausschließlich lesendem Zugriff unterschieden. ROM-Speicher hält seine Daten auch im stromlosen Zustand (nicht flüchtig) und wird z.B. zur Speicherung von Programmcode oder Konfigurationsdaten genutzt. Aufgrund der einfachen Beschreibbarkeit ist heute EEPROM (Electrically Erasable Programmable Read Only Memory) gebräuchlich. Ein solcher Speicher findet sich z.B. als Flash-EEPROM zur Ablage des BIOS (Basic Input/ Output System) der PC- Systeme. RAM-Speicher ist in der Regel flüchtig (volatile), d.h. er verliert seine gespeicherten Informationen im stromlosen Zustand. Je nach verwendeter Speichertechnologie spricht man vom DRAM (dynamischer RAM, Random Access Memory) mit Kondensatoren als physikalischer Ladungsspeicher oder SRAM (statischer RAM) mit bistabilen Kippstufen als speicherndes Element. Ersteres lässt sich kostengünstig fertigen und findet sich z.B. im Hauptspeicher moderner PC- Systeme. Letzteres hat Geschwindigkeitsvorteile und wird deshalb z.B. als schneller Zwischenspeicher (Cache) direkt im Mikroprozessor genutzt. Die heutigen Fertigungstechnologien ermöglichen die Herstellung eines kompletten Rechners auf einem Chip (System on a Chip, SoC). Eingesetzt werden solche Systeme immer dann, <?page no="49"?> 50 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing wenn es auf kleine Abmessungen und/ oder kostengünstige Lösungen ankommt. Konkrete Beispiele sind die Vielzahl von Steuergeräten im Auto oder die intelligenten Sensorsysteme in der industriellen Messtechnik. Im Konsumerbereich verdanken Smartphones und Tablets ihre kompakten Abmessungen der fortschreitenden Entwicklung von SoCs mit integriertem Grafikprozessor und Audio-Decoder. Im Ingenieurumfeld finden sich eine Reihe spezialisierte Hardwarekomponenten: Workstations als besonders leistungsfähige Arbeitsplatzsysteme zur Bearbeitung rechenintensiver Aufgaben wie z.B. der numerischen Simulation oder des rechnergestützten Konstruierens (CAD, Computer-Aided Design). Hier finden sich typischerweise Einzelrechner mit Mehrkern-CPU oder vernetzte Systeme (Rechencluster, High-Performance Computing) die gemeinsam an einer Aufgabe arbeiten. Prozessleitsysteme (PLS) als spezialisierte Rechnersysteme zur Bearbeitung typischer Automatisierungsaufgaben wie Messen, Steuern, Regeln (MSR), sowie der Anzeige und Bedienung von Prozessen z.B. in der Verfahrenstechnik. Ein Charakteristikum im industriellen Bereich ist die hohe Verfügbarkeit der Systeme, ein Ausfall der zentralen Komponente kann dort die gesamte Produktion stilllegen. Das Prozessleitsystem muss über Interfacekomponenten mit dem jeweiligen Prozess interagieren (reaktives Computersystem). Im feldnahen Bereich übernehmen Speicherprogrammierbare Steuerungen (SPS) echtzeitkritische Steuerungs- und Regelungsaufgaben. Im Forschungsumfeld wird die PLS- Funktionalität häufig durch Standard-Arbeitsplatzstationen mit spezieller Software (SCADA-System, Supervisory Control and Data Acquisition) übernommen. <?page no="50"?> 2.2 Elektrotechnische Grundlagen 51 http: / / www.uvk-lucius.de/ informatik-ing Eingebettete Systeme (Embedded Systems), bei denen der Rechner in Form eines Mikrocontrollers eng in ein technisches System eingebunden ist und für den Gerätenutzer praktisch unsichtbar seinen Dienst verrichtet. Hier liegen die Anforderungen im Bereich kostengünstiger Hardware (SoC) und bei deterministischer Reaktionszeit (Echtzeitanforderung). Ein Beispiel im industriellen Umfeld sind intelligente Sensoren (Waagen, Analysensysteme) oder Aktoren mit eingebauter Intelligenz (Pumpen, Massflow-Controller zur Regelung von Volumenströmen). Beim Internet der Dinge (Internet of Things, IoT) werden eingebettete System mit Internetzugang in nahezu beliebige Objekte integriert, die dadurch „intelligent, smart“ werden. Dadurch wird die Lücke zwischen realer und virtueller Welt verschwinden. Beispiele im Bereich Smart-Home sind Glühbirnen mit Netzzugang, schaltbare Steckdosen, fernsteuerbare Heizungsthermostate oder der intelligente Kühlschrank, der selbständig die Nachbestellung von Lebensmitteln organisiert. Im industriellen Umfeld ist die IoT-Entwicklung eng mit Industrie 4.0 Aktivitäten verknüpft, wo intelligente Komponenten den modernen Fertigungsprozess revolutionieren. 2.2 Elektrotechnische Grundlagen Die Elektrotechnik bildet die physikalische Grundlage der modernen Informationstechnik. Fast jedes Gebiet dieser Disziplin findet sich in unseren Rechnern wieder: Die mechanische Festplatte wird durch Elektromotoren gedreht, Milliarden kleinster Kondensatoren sorgen für eine zuverlässige Datenspeicherung (DRAM) und die CPU internen Taktfrequenzen liegen im Bereich der Hochfrequenztechnik. In diesem Kapitel werden elementare Begriffe erläutert und die zum Verständnis der Funktionsweise eines Rechners notwendigen Grundlagen vermittelt. <?page no="51"?> 52 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing 2.2.1 Strom, Spannung und elektrische Leistung Wie im vorhergehenden Kapitel erläutert, werden alle Daten und Informationen im Rechner durch binäre Zustände codiert. In der Regel werden diese binären Zustände durch eine elektrische Spannung repräsentiert. Die elektrische Spannung U (Einheit Volt, V) beschreibt die notwendige Energie, um eine elektrische Ladung innerhalb eines elektrischen Feldes zu bewegen. Die Spannung ist also die treibende Kraft für die Ladungsbewegung innerhalb eines elektronischen Schaltkreises. Die Richtung der Spannung weist vom Anschluss mit höherer Energie (+) zum negativen Pol (-). Meist ist der negative Pol der Versorgungsspannung (VCC) im Rechner zugleich Bezugspotential (Masse, Chassis Ground GND), auf das sich dann alle anderen Spannungsangaben als Referenz beziehen. Die Logikwerte „wahr“ und „falsch“ werden also durch die beiden Zustände „Spannung hoch, High, H“, und Spannung niedrig, Low, L“ repräsentiert. Bei Verwendung einer positiven Logik wird der niedrige Pegel „L“ einem Logikwert „falsch“ und der hohe Pegel „H“ einem Logikwert „wahr“ zugeordnet. Bei einer negativen Logik sind die Zuordnungen vertauscht. Je nach Einsatzzweck finden sich dabei beide Formen durchaus auch gleichzeitig auf einer Platine. Negative Logik wird häufig mit einem Überstrich (Negation) über der Variablenbezeichnung markiert (Ein Symbol Reset bezieht sich auf ein Signal, dass bei L-Pegel einen Reset auslösen soll). Typische Spannungspegel in digitalen Schaltungen sind 5 V (TTL), 3.3 V (LVTTL) oder 1.8 V (CMOS) und richten sich in der Regel nach der Technologie der verwendeten Halbleiterbauelemente. Historisch war das lange Zeit die Transistor-Transistor-Logik (TTL) bei der bipolare Transistoren als Schaltelemente genutzt wurden. Heute kommt fast ausschließlich die energieeffizientere CMOS-Technologie (Complementary Metaloxide Semiconductor) zum Einsatz. <?page no="52"?> 2.2 Elektrotechnische Grundlagen 53 http: / / www.uvk-lucius.de/ informatik-ing Durch Bewegung von Ladungsträgern entsteht ein elektrischer Strom I, dessen Stärke (Einheit Ampere, A) durch die bewegte Ladungsmenge pro Zeit charakterisiert ist. Die in den folgenden Schaltbildern als Strompfeil dargestellte technische Stromrichtung ist willkürlich als Bewegung positiver Ladungsträger festgelegt. Im Rahmen der Energiewende sowie dem vermehrten Betrieb mobiler Systeme rückt der Energiebedarf zunehmend in den Fokus der Aufmerksamkeit. Die elektrische Leistung P = U*I als Produkt von Strom und Spannung beschreibt die Energie pro Zeit (Einheit Watt, 1 W = 1 VA). Bezahlen, bzw. in Form von Batteriekapazität bereitstellen, müssen wir die vom Rechner aufgenommene Energie gemessen in Kilowattstunden (Einheit kWh), d.h. das Produkt aus Leistung und Zeit. Die Energie wird dabei im Rechner zum größten Teil direkt in Wärme umgesetzt. Ein Problem, das beim Betrieb von Rechenzentren mit vielen hundert Serversystemen einen erheblichen zusätzlichen Aufwand erfordert. Hier rechnen die Betreiber, bedingt durch die notwendige Kühlung, häufig mit dem doppelten Energiebedarf der Systeme. Klar, dass insbesondere dort die Auslastung der Hardware eine entscheidende Rolle spielt. Wie wir am Ende des Kapitels noch sehen werden, besitzen moderne Mikroprozessoren mehrere parallele Ausführungseinheiten, die vom Betriebssystem verwaltet werden. Ist aktuell nur wenig Rechenleistung erforderlich, kann das Betriebssystem einzelne oder alle Ausführungseinheiten in einen energiesparenden Schlafzustand versetzen (Power-Management). Auch im häuslichen Umfeld trägt die Informationstechnologie mit über 25 % zum Gesamtenergiebedarf bei. Hier unterscheiden sich die gebräuchlichen Rechnersysteme ganz erheblich: <?page no="53"?> 54 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Tab. 10: Leistungsbedarf typischer Rechnersysteme Rechnersystem Elektr. Leistung Serversystem Rechenzentrum einige kW Desktop PC 300-600 W Notebook 30-60 W Kleinstrechner (z.B. Raspberry Pi) 3-6 W Embedded System (z.B. Arduino UNO) 1-300 mW Betrachten wir einen typischen PC-Arbeitsplatzrechner, so lässt sich die Grafikkarte als Hauptverbraucher identifizieren. Moderne Grafikkarten besitzen eine Rechenleistung die vor ein paar Jahren noch zur Aufnahme in die „Top 500“ der Supercomputer gereicht hätte (s. Tab. 18 Leistungsbewertung). Tab. 11: Anteile Energiebedarf eines Spiele-Rechners 2 Komponente Anteil am Energiebedarf Grafikkarte 50 % Prozessor 25 % Netzteil 10 % Mainboard 5 % 2.2.2 Einfache Bauelemente und ihre Verknüpfung Neben Strom und Spannung ist zum Verständnis der Funktion digitaler Schaltungen die Kenntnis der beiden folgenden Kirchhoffschen Regeln notwendig: 2 www.my-green-power.de <?page no="54"?> 2.2 Elektrotechnische Grundlagen 55 http: / / www.uvk-lucius.de/ informatik-ing Knotenregel Transportierte Ladungen können in einem Knoten nicht verschwinden. Deshalb gilt: Die Summe der abfließenden Ströme ist gleich der Summe der zufließenden Ströme. Maschenregel In jedem Netz ist die Summe der von den Quellen abgegebenen Energie gleich der Summe der von den Verbrauchern aufgenommenen Energie. Deshalb gilt: Die Summe der Spannungen innerhalb eines Maschenumlaufs ist Null. ∑ = k k U 0 Mit diesen beiden Regeln im Hinterkopf und einigen wenigen diskreten Bauteilen lassen sich die meisten Schaltungen der Digitaltechnik einfach analysieren. Im Folgenden werden deshalb die wichtigsten Bauteile und ihre Eigenschaften in Bezug auf die Anwendung in der Informatik kurz erläutert. 2.2.2.1 Elektrischer Widerstand In jedem Leiter wird die Bewegung der Ladungsträger durch dessen elektrischen Widerstand behindert. In metallischen Leitern ist bei konstanter Temperatur der Spannungsabfall U dem Strom I proportional. Der Proportionalitätsfaktor ist der Widerstand R gemessen in Ohm, Ω. I R U ⋅ = Als Schaltzeichen wird ein einfaches Rechteck verwendet. Widerstände finden sich im Rechner z.B. zur Strombegrenzung bei Leuchtdioden (LED), als Spannungsteiler zur Pegelanpassung 0 = ∑ k k I <?page no="55"?> 56 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing oder als Pullup-/ Pulldown-Widerstand zur Festlegung eines Ruhepegels bei offenen Eingängen. Abbildung 11 zeigt den Einsatz als Spannungsteiler. Abb. 11: Spannungsteiler mit zwei Widerständen Durch Anwendung der Maschenregel lässt sich die Spannung U R2 am Widerstand R 2 berechnen: 0 2 1 2 2 U R R R U R ⋅ + = Wird der Widerstand R 2 veränderlich ausgeführt, z.B. durch Einsatz eines temperaturabhängigen NTC- (Negative Temperature Coefficient) oder eines lichtempfindlichen Foto-Widerstands (Light Dependent Resistor, LDR), so kann dieser Aufbau als einfache Interfaceschaltung zur Umwandlung einer physikalischen Größe in eine davon abhängige Spannung U R2 verwendet werden. Wir werden diese Schaltung später als einfachen Beleuchtungssensor nutzen (Anwendungskapitel 10). Weitaus häufiger sind Widerstände im Computer allerdings als unerwünschte technologiebedingte Eigenschaft der Transistoren anzutreffen. Idealerweise funktioniert ein Transistor, wie wir noch sehen werden, als Schaltelement mit den Zuständen „durchgeschaltet“, d.h. ideal leitend (R = 0) bzw. „gesperrt“, d.h. ideal isolierend (R = ∞). Leider sind diese Zustände beim realen Transistor technologisch nicht zu erreichen, so dass auch im gesperrten Zustand ein kleiner Strom fließt (Leckstrom). Bei Milliarden Transistoren auf einem Chip addieren sich die kleinen Ströme und die resultierende Wärmeentwicklung wird zu einem ernst zu nehmenden Problem. R 2 I U 0 R 1 U R2 <?page no="56"?> 2.2 Elektrotechnische Grundlagen 57 http: / / www.uvk-lucius.de/ informatik-ing Betrachtet man die quadratische Beziehung zwischen Spannungsabfall und der am Widerstand umgesetzten Leistung R U I U P 2 = ⋅ = wird eine wichtige Einflussgröße deutlich: Gelingt es, den Spannungsabfall an den Schalttransistoren möglichst klein zu halten, lässt sich die in Wärme umgesetzte Verlustleistung eines Rechnersystems quadratisch reduzieren. Dieser Effekt führt bei modernen Mikroprozessoren zu einer immer weiter reduzierten Versorgungsspannung (Kernspannung). Leider lässt sich die Kernspannung nicht beliebig reduzieren, andernfalls können die Transistoren nicht schnell genug durchschalten, um die Frequenz des Systemtaktes zu gewährleisten. Je nach Hersteller existieren verschiedene Power-Management Strategien (Intel: SpeedStep ® , AMD: PowerNow! ® ), welche eine unter energetischen Gesichtspunkten optimale Balance zwischen Kernspannung und Taktfrequenz garantiert. 2.2.2.2 Kondensatoren als (Ladungs-)Speicher Bisher haben wir uns auf zeitlich konstante Ströme und Spannungen beschränkt (Gleichspannung). Bei der Verarbeitung im Rechner treten aber beliebige Wechsel zwischen High- und Low-Pegel auf. Die zeitlich Abhängigkeit wird in der Elektrotechnik häufig durch die Verwendung kleiner Symbole u(t) bzw. i(t) für Spannung und Strom kenntlich gemacht. Bei Verwendung geeigneter Messtechnik in Form eines Oszilloskops oder eines Logikanalysators kann die zeitliche Veränderung in Form von Timing-Diagrammen dargestellt werden. Neben den rein ohmschen Widerständen gibt es Bauteile (Kondensatoren) deren Wechselstromwiderstand von der zeitlichen Änderung der anliegenden Spannungspegel abhängt. ) ( ) ( t u C t i C dt d C ⋅ = Jede Spannungsänderung führt zur Bewegung von Ladungsträgern und damit zu einem Stromfluss. Die Proportionalitäts- <?page no="57"?> 58 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing konstante (Kapazität) C wird in der Einheit Farad, F gemessen und ist bei unseren Anwendungen in der Größenordnung weniger pF bis zu einigen µF angesiedelt. Eine Reihenschaltung von Widerstand und Kondensator wird in der Elektrotechnik als RC-Glied bezeichnet und findet Einsatz z.B. als Tiefpassfilter zur Bandbreitenbegrenzung von Signalen (Anti-Aliasing-Filter, s. Kapitel Interfacetechnik, Abtasttheorem). In der Digitaltechnik können Kondensatoren vor allem als Speicher für Ladungsträger aufgefasst werden. Diese Eigenschaft wird z.B. zur Spannungsglättung am Netzteil oder als kurzfristige Energiequelle für impulsförmige Ströme (Blockkondensator) direkt am Halbleiterchip genutzt. Darüber hinaus basiert die Wirkungsweise des DRAM-Speichers auf der Ladungsspeicherung in Milliarden kleiner Kondensatoren. Eine DRAM-Zelle besteht dabei aus einem Transistor und einem Kondensator (1T1C-Zelle) und speichert genau ein Bit. Die Auswahl erfolgt über den Transistor, der die gespeicherte Ladung isoliert oder zum Scheib/ Leseverstärker durchreicht. Abbildung 12 verdeutlicht den prinzipiellen Aufbau einer solchen Speicherzelle. Abb. 12: DRAM-Zelle Der größte Nachteil dieser Anordnung liegt im technologisch bedingten Ladungsverlust durch Kriechströme. Das führt dazu, dass die Ladung mehrere tausendmal in der Sekunde aufgefrischt werden muss (Refresh), was den Zugriff der CPU auf den Speicher einschränkt und zu erhöhten Zugriffszeiten führt. GND Zellenauswahl Zum Schreib- / Leseverstärker Speicherkondensator Schalttransistor <?page no="58"?> 2.2 Elektrotechnische Grundlagen 59 http: / / www.uvk-lucius.de/ informatik-ing Leider wirken parallele Leitungen auch als Kondensator und bewirken damit parasitäre Kapazitäten auf der Platine oder bei der Signalübertragung über lange Leitungen. Dadurch werden die ursprünglich rechteckigen Spannungssignale während der Übertragung verzerrt und können am Empfänger nur schwer dekodiert werden. Dies ist einer der Gründe, warum sich auf Netzwerkleitungen nicht beliebig hohe Übertragungsraten realisieren lassen. 2.2.2.3 Dioden Bisher haben wir ohmsche Widerstände und frequenzabhängige Widerstände (Kondensatoren) kennengelernt. Halbleiterdioden sind aus Sicht der Informatik richtungsabhängige Widerstände. Je nach Stromrichtung spricht man vom Durchlassbetrieb (Widerstand R klein) oder Sperrbetrieb (Widerstand R groß). Mit dieser „Ventilfunktion“ lassen sich z.B. Wechselspannungen im Netzteil gleichrichten oder einfache logische Grundgatter (Dioden-Logik) realisieren. Anwendungsbeispiel: LED-Ansteuerung Außerdem dienen Leuchtdioden (Light-Emitting Diode, LED) zur einfachen Visualisierung von binären Zuständen. Abbildung 13 zeigt eine in Durchlassrichtung betriebene Leuchtdiode. Abb. 13: LED mit Vorwiderstand Je nach Lichtfarbe fällt an der LED eine Flussspannung U D von 2 bis 3 V ab. Der Widerstand R dient zur Strombegrenzung. Typische LEDs zur Signalisierung werden mit einem I U U D R <?page no="59"?> 60 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Strom I mit wenigen mA (5-20 mA) betrieben. Der notwendige Vorwiderstand berechnet sich zu I U U R D − = Wir werden diese Schaltung später zur Visualisierung unserer Ausgaben nutzen (Anwendungskapitel 10). 2.2.2.4 Der Transistor als Schalter Zentrales Element der digitalen Schaltungstechnik ist der als Schalter betriebene Transistor. Ein Transistor ist ein stromverstärkendes bzw. stromschaltendes Bauteil. Dazu dienen drei Anschlüsse, die Basis B, der Collektor C und der Emitter E. Abbildung 14 zeigt das Symbol eines npn-Transistors. Abb. 14: Schaltsymbol Bipolartransistor Der große Ausgangsstrom I C wird durch einen kleinen Basisstrom I B gesteuert (Stromverstärkung β) B C I I ⋅ = β . Anwendungsbeispiel: Transistor als Schalter Für den Betrieb als Schalter sind praktisch nur zwei Zustände interessant: Bei einem Basisstrom I B =0 ist der Schalter geöffnet, bei einem Strom I B > 0 ist der Schalter geschlossen. Collektor Emitter Basis l B l C l E <?page no="60"?> 2.3 Digitaltechnik 61 http: / / www.uvk-lucius.de/ informatik-ing Abb. 15: Transistor als Schalter Wie bereits erwähnt, ist der reale Transistor durch Leckströme charakterisiert, d.h. auch bei geöffnetem Schalter fließt ein kleiner Strom I C . Geht man von einem Sperrwiderstand R CEclose im Megaohmbereich aus, fließen Ströme von wenigen nA, die sich im Mikroprozessor mit seinem Milliarden Transistoren aber zu einer nicht vernachlässigbaren Größe addieren. 2.3 Digitaltechnik Wie bereits dargestellt, bildet die Boolesche Algebra das theoretische Gerüst zur Beschreibung der Funktion aller Elemente eines Digitalrechners. Die grundlegenden logischen Verknüpfungen (UND, ODER, NICHT) haben wir dazu im Einführungskapitel bereits kennengelernt. Diese lassen sich mit dem Schaltermodell des Transistors nun einfach realisieren. Abbildung 16 zeigt exemplarisch eine UND-Verknüpfung mit zwei Eingängen X 1 und X 2 . Abb. 16: Prinzipieller Aufbau eines UND-Gatters Nur wenn die beide Transistoren X 1 und X 2 durchsteuern, d.h. ein Strom in die jeweilige Basis fließt, dann liegt am Ausgang Y ein High Potential und die LED leuchtet. Zur Vereinfachung X 1 X 2 Y Transistor als Schalter X 1 X 2 Y UND U VCC R R <?page no="61"?> 62 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing wird die Negation (Inverter, NOT-Verknüpfung) im Schaltsymbol häufig durch einen kleinen Kreis dargestellt (Negationskreis). Abbildung 17zeigt typische Schaltsymbole. Abb. 17: Symbole Grundgatter mit zwei Eingängen Diese Grundgatter bilden die Ausgangsbasis für die nächsten Kapitel, bei denen exemplarisch der interne Aufbau einzelner Komponenten eines Rechners entwickelt werden soll. Dabei unterscheidet man zwischen Schaltnetzen und Schaltwerken. Schaltnetze oder kombinatorische Schaltkreise stellen die technische Realisierung einer beliebigen Booleschen Funktion dar. Ein solches Netz besteht aus einer Kombination von Grundgattern und verknüpft mehrere Eingangsgrößen zu einem oder mehreren Ausgangsgrößen. Der Zustand der Ausgänge zu einem Zeitpunkt hängt nur vom Zustand der Eingänge zu diesem Zeitpunkt ab. Typische Vertreter dieser Gruppe sind z.B. der Adressdecoder zur Auswertung einzelner Adresskombinationen am Adressbus und damit der Auswahl der richtigen Speicherzelle oder das Rechenwerk zur Addition zweier Dualzahlen. Schaltwerke oder sequentielle Schaltkreise dagegen besitzen einen inneren Zustand, d.h. der Zustand der Ausgangsgrößen hängt nicht nur vom Zustand der Eingangsgrößen zu einem Zeitpunkt ab, sondern auch von der Vergangenheit des Systems (Gedächtnis). 1 ≥ & 1 ≥ 1 NICHT NOT UND NICHT NAND ODER OR ODER NICHT NOR X 1 X 2 & UND AND <?page no="62"?> 2.3 Digitaltechnik 63 http: / / www.uvk-lucius.de/ informatik-ing Erreicht wird dieses Verhalten durch Rückkopplung im System, d.h. eine oder mehrere der Ausgangsgrößen dienen gleichzeitig auch als Eingangsgrößen. Damit sind solche Anordnungen prädestiniert zur Realisierung von Speicherzellen, Zählwerken und einfachen Automaten z.B. zur Steuerung der Abarbeitung von Maschinenbefehlen innerhalb der CPU (Steuerwerk). Diese Elemente bilden auch die Grundlage im Bereich Steuerungstechnik (Speicherprogramierbare Steuerungen, SPS). 2.3.1 Schaltnetze Da die Ausgänge eines Schaltnetzes nur vom aktuellen Zustand der Eingänge abhängen, erschließt sich die Funktion eines gegebenen Schaltnetzes einfach durch Aufstellen der Wahrheitstabelle. 2.3.1.1 Analyse von Schaltnetzen Dazu werden bei einem Schaltnetz mit n Eingängen alle 2 n Eingangskombinationen in die Tabelle aufgenommen und der jeweilige Zustand des Ausgangs analysiert. Anwendungsbeispiel: Schaltnetz Wir verdeutlichen das Vorgehen an einem Schaltnetz mit zwei Eingängen X 1 und X 2 sowie zwei Ausgängen Y 1 und Y 2 (Abb. 18). Bei zwei Eingängen gibt es 2 2 = 4 mögliche Eingangskombinationen. Betrachten wir zunächst den oberen Teil und führen zur einfachen Berechnung von Y 1 die Zwischengrößen Z 1 und Z 2 ein. Z 1 ergibt sich durch Auswertung des ersten UND-Gatters mit einem invertierten Eingang, Z 2 analog dazu aus dem zweiten Gatter. Aus der NOR-Verknüpfung der Zwischengrößen leiten wir schließlich den jeweiligen Zustand für die Ausgangsgröße Y 1 ab. Die Ausgangsgröße Y 1 wird genau dann 1, wenn nur einer der Eingänge 1 ist. Dieses Verhalten wird auch als exklusive ODER (XOR) bzw. Kontravalenz bezeichnet. <?page no="63"?> 64 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Abb. 18: Schaltnetz Tab. 12: Wahrheitstabelle für Y 1 X 1 X 2 Z 1 Z 2 Y 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 Eine entsprechende Analyse des unteren Schaltungsteils zeigt ein identisches logisches Verhalten auch für den Ausgang Y 2 . Tab. 13: Wahrheitstabelle für Y 2 X 1 X 2 Z 3 Z 4 Z 5 Z 6 Y 2 0 0 1 1 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 ≥ & & X 1 X 2 Y 1 1 ≥ Y 2 1 ≥ 1 ≥ 1 ≥ 1 ≥ Z 1 Z 2 Z 4 Z 5 Z 3 Z 6 <?page no="64"?> 2.3 Digitaltechnik 65 http: / / www.uvk-lucius.de/ informatik-ing Eine Boolesche Funktion lässt sich also schaltungstechnisch auf verschiedene Weise realisieren. Technologisch einfacher ist die Herstellung einer gewünschten Funktion aus einheitlichen Gattern, in unserem unteren Teilbeispiel Y 2 aus NOR-Gattern. Theoretisch lässt sich jede beliebige Boolesche Funktion durch ausschließliche Verwendung von NORbzw. von NAND-Gattern realisieren. Hier helfen die De Morgansche Regeln: 2.3.1.2 Synthese von Schaltnetzen Ausgangspunkt zur Synthese von Schaltnetzen bildet die gewünschte Funktion des Schaltnetzes in Form der Wahrheitstabelle. Wir werden uns im Folgenden auf die disjunktive Normalform (DNF) zur Beschreibung beschränken. Die DNF wird gebildet, indem nur die Zeilen der Wahrheitstabelle für die die Ausgangsgröße „wahr“ ist betrachtet werden. Die zu einer Zeile gehörenden Eingangsgrößen werden UND-verknüpft. Dabei werden diejenigen Eingänge die „wahr“ sind direkt, die Eingänge die „falsch“ sind negiert aufgeschrieben. Der sich aus konjunktiven Verknüpfung ergebende Term wird Minterm genannt. Durch die disjunktive Verknüpfung aller Minterme erhält man schließlich die disjunktive Normalform. Anwendungsbeispiel: Halbaddierer Betrachten wir zunächst einen Halbaddierer zur Addition zweier einstelliger Dualzahlen A 0 und B 0 . Aus den Grundlagen B A B A B A B A ∧ = ∨ → ∧ = ∨ B A B A B A B A ∨ = ∧ → ∨ = ∧ <?page no="65"?> 66 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing der Zahlendarstellung erhalten wir die folgende Wertetabelle für die Summe S 0 und den Übertrag C 1 in die nächste Stelle (Carry): Tab. 14: Wahrheitstabelle Halbaddierer A 0 B 0 C 1 S 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 Die disjunktiven Normalformen ergibt sich zu wobei die UND-Verknüpfung aus Vereinfachungsgründen in der Minterm-Gleichung häufig nicht mitgeschrieben wird. Die schaltungstechnische Realisierung besteht dann aus einer Inverterstufe, den UND-Verknüpfungen zur Berechnung der Minterme und einer ODER-Stufe zur Verknüpfung der Minterme. Abb. 19: Schaltung Halbaddierer Aus der Konstruktion der DNF ergibt sich ein dreistufiger Aufbau aus Inverter, UNDsowie einem ODER-Block. A 0 B 0 & 1 & 1 1 ≥ & S 0 C 1 0 0 0 0 0 0 0 0 0 0 0 1 B A B A B A B A S B A C ∨ = ∧ ∨ ∧ = ∧ = <?page no="66"?> 2.3 Digitaltechnik 67 http: / / www.uvk-lucius.de/ informatik-ing Diese Anordnung bildet die Grundlage der modernen programmierbaren Logikbausteine (Complex Programmable Logic Device, CPLD), welche dem Anwender eine Reihe von universellen UNDbzw. ODER-Matrizen zur Verfügung stellen. Durch Programmierung (im Sinne von Konfiguration, d.h. Freigeben einzelner Verbindungen der Matrix) lassen sich mit diesem universellen Hardwarebaustein praktisch alle denkbaren Funktionen realisieren. Solche Bausteine (und die noch komplexeren Field Programmable Gate Arrays, FPGA) haben die Digitaltechnik revolutioniert. Anstatt einer Vielzahl verschiedener Hardwarebausteinen auf einer Platine zu verdrahten, erfolgt das Schaltungsdesign durch Konfiguration innerhalb eines CPLD-Bausteins. Deshalb finden wir auf den meisten modernen Rechnerboards nur noch wenige diskrete Bauteile. Abb. 20: Prinzipieller Aufbau programmierbare Logik Anwendungsbeispiel: n-Bit Volladdierer Um zwei beliebig große Dualzahlen zu addieren, bedarf es allerdings mehr als einem Halbaddierer (HA). Schon bei der nächsten Stelle ist ggf. der Übertrag aus der vorherigen Stelle zu be- UND-Matrix 1 1 1 ODER-Matrix Eingänge Ausgänge Minterme Inverter <?page no="67"?> 68 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing rücksichtigen. Dies führt zum 1-Bit Volladdierer, der die Addition von 3 einstelligen Dualzahlen ermöglicht. Verschaltet man diese 1-Bit Volladierer (VA) so, dass der Übertrag der vorherigen Stelle als Eingang C i in die nächste Stelle wandert, lassen sich schließlich Dualzahlen beliebiger Wortbreite addieren. Abb. 21: Addition zweier Zahlen A und B Tab. 15: Minterme 1-Bit Volladdierer <?page no="68"?> 2.3 Digitaltechnik 69 http: / / www.uvk-lucius.de/ informatik-ing Der dazu notwendige 1-Bit Volladdierer besitzt die vorstehende Wertetabelle (Tab. 15), aus der sich die entsprechenden Gleichungen für S i und C i+1 analog zum Halbaddierer ermitteln lassen. Zum besseren Verständnis sind die einzelnen Minterme der Summe markiert. Abb. 22: Schaltung 1-Bit Volladdierer Wird das obige Schaltnetz zu einem VA zusammengefasst und anschließend so verdrahtet, dass der Übertrag C i+1 des einen VA mit dem Eingang C i des nächsten VA verbunden wird, so erhalten wir einen Ripple-Carry Volladdierer. Unser Beispiel (Abb. 23) realisiert einen 4-Bit Volladdierer, wobei der Übertrag C 0 bei der Addition fest auf 0 gelegt wird. Wird der Übertrag C 0 dagegen auf 1 gesetzt, so berechnet unser Addierer die Summe der Dualzahlen am Eingang plus einer Eins. Erinnern wir uns an die Zweierkomplementdarstellung von vorzeichenbehafteten Zahlen, bei der die negative Zahl durch Komplementbildung plus Eins ermittelt wird, dann ist eine Erweiterung unseres Addierwerks zum universellen Addier-/ Subtrahierwerk (S=A-B) durch einfache Komplementbildung der Eingangswerte B und C 0 =1 möglich. Die Arbeitsweise einer solchen digitalen Schaltung lässt sich hervorragend anhand einer & & & 1 ≥ & & & & 1 ≥ A i B i C i C i+1 S i A i B i C i C i+1 S i 1-Bit VA <?page no="69"?> 70 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Schaltungssimulation 3 nachvollziehen. Entsprechende Simulationsdateien finden sich im Begleitmaterial zum Buch. Abb. 23: 4-Bit Volladdierer und Schaltungssimulation Die dargestellte Vorgehensweise zur Entwicklung des Schaltnetzes aus einer Wertetabelle findet sich auch in anderen Ingenieurdisziplinen. Beispielhaft sei hier die Ermittlung einer Steuerfunktion zur Automatisierung von Maschinen erwähnt. Aus Gründen der Sicherheit dürfen z.B. bestimmte Motoren nur laufen, wenn vorher alle Schutzkontakte des Gehäuses geschlossen sind. Weitere Beispiele finden sich in den Übungsaufgaben zu diesem Kapitel. 2.3.2 Schaltwerke Werden Ausgänge des Schaltnetzes durch elektrische Verbindungen wieder an den Eingang zurückgekoppelt, so entsteht ein gänzlich anderes Verhalten des resultierenden Schaltkreises. 3 z.B. www.cburch.com/ logisim <?page no="70"?> 2.3 Digitaltechnik 71 http: / / www.uvk-lucius.de/ informatik-ing Abb. 24: Schaltwerk (Schaltnetz mit Rückkopplung) Ein Schaltwerk besitzt ein Gedächtnis und eignet sich damit hervorragend zur Realisierung schneller Speicherbausteine oder auch von Zählern, die z.B. in der Lage sind, Speicherzellen fortlaufend zu adressieren (Programmcounter, PC). Anwendungsbeispiel: Astabile Kippstufe Zur Analyse des Rückkopplungsprinzips eignet sich das einfachste Schaltnetz, der Inverter. Wird der Ausgang eines Inverters direkt auf den Eingang zurückgeführt, so entsteht ein Bauelement mit zwei alternierenden Zuständen. Abb. 25: Einfachstes Schaltwerk (astabile Kippstufe) Liegt am Eingang Q des Inverters eine 0 an, so wird sich nach Ablauf der Gatterlaufzeit am Ausgang eine 1 einstellen. Diese wird elektrisch auf den Eingang zurückgekoppelt, so dass nach einer weiteren Gatterlaufzeit wiederum eine 0 am Ausgang erscheint. Dieses Spiel wiederholt sich periodisch, der Techniker spricht von einer astabilen Kippstufe (Multivibrator). Was passiert nun bei zwei hintereinander geschalteten Invertern? 1 Zeit Q 1 0 0 1 Q 0 1 <?page no="71"?> 72 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Anwendungsbeispiel: Bistabile Kippstufe Hier sorgt der zweite Inverter für den Wechsel des Signalpegels, wobei als Resultat zwei stabile Zustände für den Ausgang Q entstehen (bistabile Kippstufe). Abb. 26: Einfachste Speicherzelle (bistabile Kippstufe) Damit besitzt diese Anordnung ein Gedächtnis und eignet sich ähnlich der DRAM-Zelle zur einfachen Speicherung der Zustände 0 oder 1. Diese Form der Informationsspeicherung findet sich im SRAM und im Cache. Einziges Problem ist die Beeinflussung dieser Speicherzelle, d.h. das Setzen oder Rücksetzen des Speicherzustands Q. Eine Möglichkeit zur Steuerung bietet der Austausch der Inverter durch zwei NAND-Gatter mit je zwei Eingängen. Abb. 27: Bistabile Kippstufe mit NAND-Gattern Die Analyse der Wertetabelle eines solchen NAND-Gatters zeigt, dass ein NAND im Falle des Anlegens einer 1 an den Eingang E am Ausgang immer das Inverse des zweiten Eingangs X ausgibt. 1 Q 1 Q Q 0 1 0 1 1 0 1 1 Q Q & & E 1 E 2 <?page no="72"?> 2.3 Digitaltechnik 73 http: / / www.uvk-lucius.de/ informatik-ing Abb. 28: Wertetabelle NAND-Verknüpfung Für unsere rückgekoppelte Struktur bedeutet dies im Fall E 1 =E 2 =1, dass die NAND-Gatter beide als Inverter arbeiten und damit der alte Zustand gespeichert bleibt. Hier sprechen wir vom Speicherfall, d. h, der neue Zustand Q n+1 ist identisch zum alten Zustand Q n . Wird der Eingang E 1 dagegen auf 0 gesetzt, so gibt das damit verbundene NAND unabhängig vom zweiten Eingang immer eine 1 auf den Ausgang. Diese 1 wird vom zweiten NAND invertiert und führt zu einem Rücksetzen des gespeicherten Zustands (Q n+1 =0). Wird analog dazu nur der Eingang E 2 auf 0 gesetzt, so sorgt das rechte NAND für das Setzen des gespeicherten Zustands (Q n+1 =1). Damit verfügen wir über eine Speicherzelle, die durch die beiden Steuereingänge E 1 und E 2 beeinflusst werden kann. Tab. 16: Wahrheitstabelle, Grundfunktionen RS-Flipflop E 1 E 2 Q n+1 Funktion 0 0 1 0 1 0 Rücksetzen 1 0 1 Setzen 1 1 Q n Speichern Durch Umbenennung der Eingänge in S (für Setzen) und R (für Reset) erhalten wir daraus ein einfaches RS-Flipflop. <?page no="73"?> 74 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Abb. 29: RS-Flipflop Eine analoge Realisierung des RS-Flipflops ist auch unter Verwendung von NORstatt NAND-Gattern möglich. Taktflankensteuerung Bei der Analyse des rückgekoppelten Systems haben wir bisher das genaue Timing, d.h. die Frage, wann die Eingänge ausgewertet werden und der Ausgang Q umschaltet, nicht näher betrachtet. Sollen mehrere Speicherzellen in einem Rechnersystem zusammenwirken, ist eine gleichzeitige (synchrone) Funktion unumgänglich. Hierzu dienen Takteingänge, deren steigende oder fallende Flanke die Auswertung der Eingänge R und S freischaltet. Im Schaltsymbol wird das positiv taktflankengesteuerte Flipflop durch einen zusätzlichen Eingang C (Clock) mit einem kleinen Dreieck gekennzeichnet. Für das auf eine negative Taktflanke sensitive Pendant wird der Eingang mittels Inverterkreis negiert bzw. in der älteren Darstellungsform mit ausgefülltem Dreieck gekennzeichnet. Abb. 30: Taktflankengesteuerte Flipflops Zur Verdeutlichung der Einsatzmöglichkeiten von Schaltwerken sollen im Folgenden exemplarisch ein Schieberegister und ein Zählerbaustein entwickelt werden. Ausgangsbasis bilden Modifikationen des bereits entwickelten RS-Flipflops. Wird der Ein- Q Q & & S R 1S 1R Q Q <?page no="74"?> 2.3 Digitaltechnik 75 http: / / www.uvk-lucius.de/ informatik-ing gang R über einen Inverter intern aus dem S Signal generiert, so entsteht daraus ein neues Bauteil, das sogenannte D-Flipflop (Delay-, Daten-Flipflop). Abb. 31: D-Flipflop Dieses Flipflop besitzt nur noch einen Steuereingang D und eignet sich dadurch z.B. zur einfachen Realisierung von Speicher- oder Schieberegister. Bei Vorliegen der Taktflankenbedingung wird der Pegel der Datenleitung D n ausgewertet und in den neuen Zustand Q n+1 übernommen. Die Charakteristische Gleichung lautet demzufolge: n n D Q = +1 Anwendungsbeispiel Seriell/ Parallel-Wandlung Werden vier dieser D-Flipflops hintereinander geschaltet, so ergibt sich ein Schieberegister zur Seriell/ Parallel-Wandlung. Abb. 32: Schieberegister zur Seriell/ Parallel-Wandlung Die Datenbits werden seriell, d.h. im Gänsemarsch zeitlich nacheinander auf der Leitung D ser übertragen. Mit der ersten negativen Taktflanke wird der aktuell an der Datenleitung D ser anliegende Zustand ins Schieberegister P 3 übernommen. Mit dem nächsten Taktereignis wandert der Zustand P 3 ins nächste 1 S R Q Q C1 D Q Q C1 D <?page no="75"?> 76 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Schieberegister P 2 und P 3 übernimmt wieder den dann aktuellen Zustand der Datenleitung usw. Nach vier Takten befinden sich alle auf der Leitung seriell übertragenen Bits b 3 ...b 0 in den Registern P 3 …P 0 des Schieberegisters und können dort parallel (d.h. gleichzeitig) ausgelesen werden. Da der Systembus unserer Rechner als paralleler Bus ausgeführt ist, müssen alle seriell empfangene Datenströme (USB, COM, Netzwerk) vorher über eine solche Schaltung aufbereitet werden. Dieses Schaltwerk bildet also die Grundlage für die im Kapitel Interfacetechnik behandelten seriellen Schnittstellen. Noch einen Schritt weiter geht das T-Flipflop (Toggle-Flipflop), bei dem der invertierte Ausgang auf den Dateneingang zurückgekoppelt wird. Abb. 33: T-Flipflop Ein solches Flipflop besitzt nur noch den Takteingang C und ändert den Ausgangszustand Q mit jedem Taktereignis: n n Q Q = +1 . Anwendungsbeispiel Zähler Der Sinn einer solchen Reduktion der Beschaltung erschließt sich bei Analyse der folgenden Schaltung. Abb. 34: Asynchroner Zähler S R Q Q C1 1 T D Q Q T T T T Q 0 Q 1 Q 2 Takt <?page no="76"?> 2.3 Digitaltechnik 77 http: / / www.uvk-lucius.de/ informatik-ing Mit jedem Taktereignis (hier der negativen Taktflanke) ändert der Zustand Q 0 seinen Wert. Da dieser Ausgang des ersten Flipflops gleichzeitig die Taktquelle für das zweite Flipflop darstellt, toggelt dieses zweite Flipflop bei jedem negativen Flankenwechsel an Q 0 seinerseits den Ausgang Q 1. Dieses Verhalten führt praktisch zu einer Halbierung, Viertelung bzw. Achtelung des ursprünglichen Takts. Abbildung 35 verdeutlicht das Timing. Abb. 35: Timing-Diagramm Zähler Werden die Ausgänge [Q 2 Q 1 Q 0 ] als Dualzahl interpretiert, so lässt sich eine Zählfolge 000, 001, 010, 011, 100, 101, 110, 111, 000, … des Ausgangsvektors erkennen. Ein solches Schaltwerk arbeitet als asynchroner Zähler. Asynchron deshalb, weil bei genauer Betrachtung die Zustände Q i nacheinander und nicht gleichzeitig wechseln. Einsatzmöglichkeit bietet z.B. die Adressierung fortlaufender Speicherbereiche, wobei der Ausgangsvektor Q dann z.B. direkt auf den Adressbus eines Rechnersystems gegeben wird. Anwendungsbeispiel Ampelsteuerung Auch in der Automatisierungstechnik finden sich vielfältige Anwendungen von Schaltwerken in Form endlicher Automaten. Das folgende Beispiel zeigt eine einfache Straßenkreuzung mit Ampelsteuerung. <?page no="77"?> 78 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Abb. 36: Ampelsteuerung Die Straßenverkehrsordnung gibt die Regeln für die Abfolge der Ampelfarben vor. Gegenüberliegende Ampeln zeigen immer gleiches Signalmuster, weshalb in der Tabelle der Ampelzustände nur die zwei Spalten A 1 und A 2 aufgeführt werden. Zur Vereinfachung gehen wir von acht sich periodisch wiederholenden Ampelphasen aus. Eine solche Ampelsteuerung kann auch in Form eines Zustandsautomaten visualisiert werden. In jedem der acht Zustände (Kreise) zeigen die Ampelfarben (Ausgänge) ein bestimmtes Muster. Die Pfeile verdeutlichen den möglichen Zustandsübergang z.B. bei fallender Taktflanke. Abb. 37: Zustandsdiagramm Ampelsteuerung Jede dieser acht Phasen kann durch einen bestimmten Zustand unseres asynchronen Zählers kodiert werden. Die Zählfolge 0,1,2,3…7,0,…entspricht damit dem zyklischen Wechsel der <?page no="78"?> 2.3 Digitaltechnik 79 http: / / www.uvk-lucius.de/ informatik-ing Ampelphasen. Dazu wird in der Tabelle der Ampelschritt durch den Bitvektor [Q 2 Q 1 Q 0 ] ersetzt. Tab. 17: Wertetabelle zur Ampel-Ansteuerung Anschließend sollen in Abhängigkeit vom aktuellen Schritt die Ampel A 1 und A 2 entsprechend der Vorgaben gesetzt werden. Jede Ampel besitzt drei Signallampen (rot, gelb, grün). Wird der Lampenzustand, wie in Tabelle 17 ersichtlich, binär kodiert, ergeben sich 6 anzusteuernde Ausgänge. Im abschließenden Designschritt wird ein Schaltnetz gesucht, welches die Ausgänge in Abhängigkeit vom aktuellen Zählerstand ansteuert. Die disjunktive Normalform für die grüne Lampe der Ampel A2 lässt sich beispielsweise direkt aus der Tabelle ablesen: 0 1 2 0 1 2 2 Q Q Q Q Q Q A grün ∨ = Die schaltungstechnische Realisierung besteht aus einem Zustandsspeicher in Form des Zählers und einem Schaltnetz zur Generierung der Ausgabe. Eine solche Anordnung wird allgemein auch als Moore-Automat bezeichnet. <?page no="79"?> 80 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Abb. 38: Ansteuerung für das grüne Signal der Ampel A 2 Wie bereits erwähnt, werden solche Schaltungen in der Praxis heute nicht mehr aus diskreten Bauteilen aufgebaut, sondern durch Konfiguration der Verdrahtung innerhalb eines programmierbaren Logikbausteins realisiert. Dazu ist die vorherige Erstellung eines Schaltplans nicht mehr zwingend erforderlich. Vielmehr existieren sogenannte Hardwarebeschreibungssprachen (Hardware Description Language, HDL), welche es dem Anwender ermöglichen, die Funktion der gewünschten Schaltung in einer hochsprachenähnlichen Syntax zu formulieren. Um die Grundidee dieses immer mehr an Bedeutung gewinnenden Verfahrens zu verdeutlichen, soll hier exemplarisch die VHDL-Beschreibung (Very High Speed Integrated Circuit Hardware Description Language) unserer Ampelsteuerung dargestellt werden: Abb. 39: VHDL-Beschreibung der Ampelsteuerung Q 2 T T T Q 0 Q 1 Takt A1 grün A1 rot A1 gelb A2 rot A2 gelb A2 grün Schaltnetz & & >1 <?page no="80"?> 2.3 Digitaltechnik 81 http: / / www.uvk-lucius.de/ informatik-ing Der erste entity-Block definiert die Schnittstelle, d.h. welche Ein- und Ausgangsvariablen unser Baustein besitzt. Der architecture-Block beschreibt das gewünschte Verhalten, in unserm Fall ein 3 Bit umfassender interner Zustand Q (signal), welcher bei fallender Flanke des Taktsignals inkrementiert wird. In Abhängigkeit vom Zustand Q wird schließlich die Ausgangsgröße beschrieben. Das Umsetzen der Beschreibung in eine Verdrahtung der UNDbzw. ODER-Matrizen und die Konfiguration des physikalischen Bausteins übernehmen dann herstellerspezifische Tools. Ein wenig erinnert der Übersetzungsprozess an die Umsetzung eines Hochsprachenprogramms in einen ausführbaren Maschinencode (s. Kapitel Software). Im Gegensatz dazu wird hier aber Hardware direkt verdrahtet, d.h. die resultierenden Abläufe werden auf elektrotechnischer Ebene hochgradig parallel ausgeführt. Diese Idee spart nicht nur Platz auf der Platine (die ganze Schaltung ist in einem universellen Baustein abgelegt), sondern vereinfacht auch die Logistik, d.h. es müssen nicht hunderte verschieden Logikbausteine verfügbar sein. Da die CPLDbzw. FPGA-Bausteine rekonfigurierbar sind, kann die Verdrahtung im Laufe des Entwicklungsprozesses beliebig modifiziert werden. Mittlerweile sind Bausteine mit der Komplexität von mehreren Millionen Grundgattern verfügbar, so dass sich komplexe Funktionsgruppen oder sogar ganze Mikroprozessoren damit realisieren lassen 4 . Durch die Möglichkeit, die Verdrahtung per Rekonfiguration zu verändern, kann ein und dieselbe Hardware auch z.B. einmal als Funktionsgruppe zur schnellen Fouriertransformation und kurze Zeit später als Kryptomodul zur Verschlüsselung genutzt werden. Da die Berechnungen direkt auf elektrotechnischer Ebene stattfinden, lassen sich Ausführungsgeschwindigkeiten und Energieverbräuche erreichen, die mit Universalprozessoren nicht erzielbar sind. Beispielsweise lohnen sich die zur Erzeu- 4 OpenCores.org <?page no="81"?> 82 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing gung (Mining) von Bitcoins (elektronische Alternativwährung) notwendigen kryptografischen Berechnungen nur bei Einsatz von FPGA-gestützten Systemen. Universalprozessoren sind zu langsam und verursachen am Ende mehr Energiekosten, als sich durch die berechneten Bitcoins als Gewinn erzielen lassen. 2.4 Rechnerarchitektur Im vorherigen Kapitel haben wir den Entwurf und die Realisierung digitaler Systeme anhand des einfachen Beispiels einer Ampelsteuerung kennengelernt. Auch wenn moderne Technologien wie die programmierbare Logik die anwendungsspezifische Umsetzung kleiner Aufgabenstellungen direkt in Hardware ermöglicht, so funktionieren die weitaus meisten Rechnersysteme nach wie vor nach dem Prinzip eines von-Neumann-Universalrechners. Universale Ausführungseinheiten ermöglichen die Berechnung der unterschiedlichsten Problemstellungen. Ein solcher Rechner arbeitet die im Speicher stehenden Maschinencodes Befehl für Befehl nacheinander ab und realisiert so die in Form eines Algorithmus beschriebene Aufgabe. Ein Maschinenbefehl kann dabei z.B. die Addition zweier im Rechnersystem verfügbaren Dualzahlen darstellen (S=A+B). Dazu wird beim Design der CPU ein fester Binärcode (Maschinencode) festgelegt, der den ADD-Befehl repräsentiert. Die CPU dekodiert den aus dem Speicher geholten Befehl und führt die entsprechenden Berechnungen durch. Im Falle des ADD- Befehls haben wir die Ausführungseinheit in Form des Addierwerks bereits kennengelernt. Ein anderer Maschinebefehl wäre dann z.B. der SUB-Befehl (S=A-B), welcher durch einen anderen Maschinencode repräsentiert wird, aber durch Addition des Zweierkomplements auf Implementierungsebene von derselben Ausführungseinheit bearbeitet wird. Eine lineare Befehlsfolge wird realisiert, indem fortlaufend Maschinenbefehle aus dem Speicher geholt und abgearbeitet werden. Der dafür notwendige Adresszähler (Programmcoun- <?page no="82"?> 2.4 Rechnerarchitektur 83 http: / / www.uvk-lucius.de/ informatik-ing ter, PC) enthält die Adresse des nächsten abzuarbeitenden Befehls und wird mit jedem abgearbeiteten Befehl (ähnlich wie unser asynchroner Zähler) entsprechend der Codelänge des Maschinenbefehls inkrementiert. Bedingte Sprunganweisungen verändern den Adresszähler in Abhängigkeit von den Resultaten der Rechenoperationen (z. B. dem Übertragsflag der Addition, Carry). Dies ermöglicht die Realisierung von Fallunterscheidungen und Programmschleifen und damit die flexible Steuerung des Programmablaufs in Abhängigkeit von den Ergebnissen vorhergehender Operationen. 2.4.1 Abarbeitung eines Maschinenbefehls Die typische Befehlsabarbeitung eines im Speicher liegenden Maschinenbefehls besteht aus fünf Phasen: [1] Befehl aus Speicher holen [2] Befehl dekodieren [3] Operanden holen [4] Befehl ausführen [5] Ergebnis speichern Innerhalb dieser Schritte sind wiederum verschiedene Unterschritte notwendig. Die Abarbeitung erfolgt nach ähnlichem Muster wie die Abfolge der Ampelphasen in unserer Zustandsmaschine für die Ampelsteuerung. Im Einzelnen sind das: Befehl holen (Instruction Fetch, IF) Abb. 40: Buszugriff IF-Phase <?page no="83"?> 84 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Der aktuelle Inhalt des Programmcounters (PC) wird auf den Adressbus gegeben. Die Speicherzelle im RAM wird lesend adressiert (w/ r-Leitung Steuerbus). Der Arbeitsspeicher decodiert die Adresse (Schaltnetz) und legt den Inhalt der adressierten Speicherzelle (z.B. D-Flipflop, DRAM-Zelle) auf den Datenbus. Befehl dekodieren (Instruction Decode, ID) Abb. 41: Buszugriff ID-Phase Die CPU liest die Information vom Datenbus und interpretiert das Datenwort als Maschinenbefehl. Hier wird der Befehl dekodiert und die CPU entscheidet, ob noch ein weiterer Speicherzyklus notwendig ist, um z.B. Daten vom Speicher zu lesen bzw. Daten in den Speicher zu transportieren. Operanden holen (Operand Fetch, OF) Abb. 42: Buszugriff OF-Phase <?page no="84"?> 2.4 Rechnerarchitektur 85 http: / / www.uvk-lucius.de/ informatik-ing Dazu verfügen moderne Mikroprozessoren über verschiedene Adressierungsarten, d.h. verschiedene Möglichkeiten, die Adresse der Operanden zu beschreiben. Eine Möglichkeit ist, die Operanden direkt aus dem Speicher zu holen. Dazu legt die CPU die Adresse der Operanden auf den Adressbus, der Steuerbus signalisiert dem Speicher lesenden Zugriff. Anschließend dekodiert der Speicher die Adresse und legt den Speicherinhalt der Operandenadresse auf den Datenbus. Befehl ausführen (Execute, EX) Abb. 43: Buszugriff Ex-Phase Die CPU liest die Informationen vom Datenbus, interpretiert das Datum als Operand und führt den vorgesehenen Befehl aus. Außerdem wird der PC aktualisiert und damit der nächste abzuarbeitende Befehl festgelegt. Dies kann einfach der im Speicher folgende Befehl sein, oder bei Sprüngen eine vom Ergebnis der Befehlsabarbeitung abhängige Speicheradresse. Ergebnis zurückschreiben (Write Back, WB) Bei Bedarf (STORE) erfolgt ein Transport der Ergebnisdaten in den Speicher. Auch diesmal legt die CPU die Speicheradresse des Ziels auf den Adressbus. Der Steuerbus signalisiert aber schreibenden Zugriff, d.h. die adressierte Speicherzelle übernimmt die am Datenbus anliegende Information in den Speicher. Anschließend beginnt der Befehlszyklus erneut mit dem holendes nächsten Befehls. <?page no="85"?> 86 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Abb. 44: Buszugriff WB-Phase 2.4.2 Zugriff auf Ein-/ Ausgabebausteine Der Zugriff auf die Einbzw. Ausgabebausteine erfolgt wie ein normaler Speicherzugriff. D. h., die Speicherzellen (Register) der Peripherie werden wie normale Speicherzellen im Adressraum der CPU angesprochen (Memory-Mapped I/ O). Der Interfacebaustein stellt seine Informationen in speziellen Datenbzw. Konfigurations- und Statusregistern zur Verfügung. Die Abfrage kann auf unterschiedliche Weise erfolgen: Abfragebetrieb (Polling) Die einfachste Möglichkeit ist die von der CPU ausgehende zyklische Abfrage des Datenregisters im Interfacebaustein. Denkbar wäre z.B., dass die CPU ständig das Datenregister einer Tastatur abfragt und ggf. die neuen Tastatureingaben entgegennimmt und in eine entsprechende Verarbeitungsroutine verzweigt. Damit aber keine Eingabe versäumt wird, muss die CPU sehr häufig im jeweiligen Datenregister nachschauen (Busy-Waiting). Sind mehrere Datenquellen abzufragen, wird damit eine nicht vernachlässigbare CPU-Last generiert und die Reaktionszeit auf einzelne Ereignisse wird immer langsamer. Gerade bei den vergleichsweise langsamen Tastatureingaben ist dieses Vorgehen nicht sehr effizient, da die langsame Peripherie die CPU komplett ausbremst. Ausnahmebehandlung (Interrupt) In einem solchen Fall ist die autonome Ereignismeldung durch die Peripherie eine bessere Methode. Dazu verfügt der <?page no="86"?> 2.4 Rechnerarchitektur 87 http: / / www.uvk-lucius.de/ informatik-ing Mikroprozessor über eine oder mehrere Interruptleitungen. Diese werden durch die CPU neben dem normalen Programmablauf ständig überwacht. Signalisiert ein Interfacebaustein durch entsprechenden Pegel an der IRQ-Leitung (Interrupt Request) einen Bearbeitungswunsch, so beendet die CPU den aktuellen Maschinenbefehl des ausgeführten Programmes und verzweigt sofort in eine sogenannte Interrupt-Service-Routine (ISR). Die ISR besteht aus einer Reihe von Maschinenbefehlen, die dann z.B. die Informationen vom Interfacebaustein entgegennehmen. Das Wesentliche an diesem Konzept der Ausnahmebehandlung (exception management) ist die Tatsache, dass ein Interfacebaustein die Abarbeitung des Hauptprogramms asynchron (d.h. zu jeder Zeit) unterbrechen kann. Entsprechende Mechanismen sorgen dafür, dass die CPU nach Abarbeitung des Interrupts wieder an der richtigen Stelle im zuvor unterbrochenen Programm weiterarbeiten kann. Die Speicherung der Rücksprungadresse und des aktuellen CPU-Zustands (Registersatz) erfolgt auf dem Stack. Der Stack (Stapelspeicher) ist ein im LIFO-Prinzip (Last In First Out) verwalteter Speicherbereich im RAM und wird auch zur Verwaltung von Unterprogrammaufrufen genutzt (s. Kapitel Programierung). Das Verfahren ist vergleichbar mit dem Führen eines Telefongespräches. Niemand würde auf die Idee kommen, den ganzen Tag neben dem Telefon zu sitzen und zyklisch den Hörer abzuheben in der Hoffnung, ein Gesprächspartner wäre in der Leitung (Polling). Vielmehr signalisiert das Klingelzeichen (Interrupt Request) das asynchrone Eintreffen neuer Informationen. Der annehmende Gesprächspartner wird seine bisherige Tätigkeit an geeigneter Stelle (Maschinenbefehl) unterbrechen, sich ggf. eine kurze Notiz zum Stand der Arbeit machen (Stack), zum Telefon gehen und das Gespräch führen (ISR). Anschließend erinnern wir uns an die zuvor unterbrochene Tätigkeit (Stack) und setzen die Arbeit dort fort (Rücksprung aus ISR). <?page no="87"?> 88 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Speicherdirektzugriff (Direct Memory Access, DMA) Besitzt der Interfacebaustein selbst die Fähigkeit, schreibend auf den Systembus zu zugreifen, kann der Baustein ohne Umweg über die CPU direkt mit dem Speicher kommunizieren. Dadurch wird die CPU nicht mehr mit Kommunikationsaufwand belastet, muss aber ihrerseits in der Lage sein, die Kontrolle über den Systembus kurzzeitig an den DMA- Controller abzutreten (Arbitrierung). Effizient wird dieses Verfahren insbesondere beim Transport größerer Datenblöcke (z.B. von der Festplatte oder dem Netzwerk). Voraussetzung für den sinnvollen Einsatz der DMA-Technik ist natürlich die Möglichkeit, die CPU in der Zwischenzeit sinnvoll zu beschäftigen. Wenn die CPU während des DMA-Zyklus pausieren muss, da sie den Systembus nicht besitzt und demzufolge keine neuen Befehle aus dem Speicher holen kann, wird durch DMA kein Vorteil erzielt. Moderne Prozessoren verfügen u. A. deshalb über einen schnellen Pufferspeicher (Cache), der lokale Kopien des eigentlichen Hauptspeichers enthält und eine weitere Programmabarbeitung ohne Zugriff auf den Systembus ermöglicht. 2.4.3 Cache In den vorherigen Kapiteln haben wir die Informationsspeicherung mit DRAM-Zellen kennengelernt und gesehen, dass die Zugriffsgeschwindigkeit durch die Notwendigkeit eines Refresh der Kondensatoren eingeschränkt wird. Trotzdem sind PC- Systeme aus Kostengründen mit DRAM-Hauptspeicher ausgestattet. Der Geschwindigkeitsnachteil wird durch intelligente Pufferspeicher (Caches) direkt auf der CPU kompensiert. Hier sind sehr schnelle SRAM-Bereiche mit geringer Speicherkapazität (wenige Mbyte) angesiedelt, die eine Kopie der zuletzt genutzten Daten und Befehle vorrätig halten. Ein Zugriff auf den langsamen Hauptspeicher kann dadurch häufig verhindert werden. Voraussetzung ist allerdings eine hohe Trefferwahrscheinlichkeit (hit-ratio, h, typisch h > 90 %), d.h. die gewünschten Informationen müssen im Cache auch vorhanden sein. Dafür <?page no="88"?> 2.4 Rechnerarchitektur 89 http: / / www.uvk-lucius.de/ informatik-ing sorgen ausgefeilte Cache-Organisationsstrategien und die Lokalitätseigenschaften von Programmen. Zeitliche Lokalität: Da ein Programm oft mehrmals auf die gleichen Daten zugreift (z.B. in Programmschleifen), müssen die Daten nur einmal aus dem langsamen Hauptspeicher (Zugriffszeit T RAM ) geholt werden. Beim folgenden Zugriff befindet sich dann eine Kopie im Cache und der Zugriff wird direkt von dort bedient (T cache ). Räumliche Lokalität: Logisch zusammengehörende Daten (Datenfelder, -strukturen, Stack) liegen direkt nebeneinander im Speicher. Wird auf ein Element zugegriffen, werden benachbarte Adressbereiche deshalb gleich mit in den Cache übernommen. Auch hier werden die folgenden Zugriffe direkt aus dem Cache bedient. Gleiches gilt für Programmcode, der häufig sequentiell nacheinander abgearbeitet wird. Im Mittel ergibt sich damit trotz langsamen DRAM-Speichers eine schnelle effektive Zugriffszeit RAM cache eff T h T T ⋅ − + = ) 1 ( . Moderne Architekturen (z.B. die Intel Core-i-Serie ® ) besitzen eine mehrstufige Cachehierarchie, bei der mehrere Ebenen ineinander greifen. Der Prozessor greift zuerst auf den schnellsten (und kleinesten) Pufferspeicher in Ebene 1 (Level 1, L1- Cache) zu. Sind die Informationen dort nicht vorhanden, so erfolgt der Zugriff auf den langsameren (und größeren) L2- Cache und ggf. über einen L3-Pufferspeicher schließlich auf das langsame DRAM. Abb. 45: Cache-Hierarchie <?page no="89"?> 90 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Auf der untersten Ebene wird der Cachespeicher häufig getrennt nach Daten- und Befehlsspeicher verwaltet. Es gibt also einen Befehlscache und einen Datencache, die dabei auch über getrennte Bussysteme an den Prozessor angekoppelt sind. Vorteil ist der gleichzeitige Zugriff auf Befehle und Daten (Harvard-Architektur). Dies ist eine zwingende Voraussetzung für die im Folgenden beschriebene Pipelineverarbeitung. Abb. 46: Getrennter L1-Cache für Daten und Befehle 2.4.4 Leistungsbewertung Bei einfachen Mikroprozessoren ist a priori bekannt, wie viele Takte für die einzelnen Phasen eines bestimmten Maschinebefehls i benötigt werden (Cycle Per Instruction, CPI). Mit dieser Information lässt sich bei Kenntnis der Anzahl N A der abzuarbeitenden Befehle und der Taktfrequenz f CPU einfach die zur Bewältigung der Aufgabe notwenige Zeit T A berechnen. Im Bereich der Echtzeitverarbeitung ist das ein wichtiges Kriterium um sicher zu stellen, dass ein Programm z.B. rechtzeitig auf ein äußeres Ereignis reagieren kann. Aber schon beim Einsatz von einfachen Cache-Systemen verkompliziert sich die Berechnung, da ein Speicherzugriff unterschiedlich lange dauern kann, je nachdem ob er aus dem Cache oder dem RAM bedient wird. Hier sind worst-case-Betrachtungen nötig. Für nicht echtzeitkritische Aufgaben wird deshalb häufig auf Benchmark- Programme zur Bewertung zurückgegriffen. Das sind für diesen Zweck entwickelte Programme, die eine bestimmte Aufgabe ∑ = ⋅ = A N i i CPU A CPI f T 1 1 <?page no="90"?> 2.4 Rechnerarchitektur 91 http: / / www.uvk-lucius.de/ informatik-ing repräsentieren. Zum Vergleich der Rechenleistung wird das jeweilige Benchmark-Programm gestartet und die notwendige Ausführungszeit gestoppt. Typische Ingenieuraufgaben im Bereich numerischer Mathematik werden z.B. mit dem LIN- PACK-Benchmark zur Lösung linearer Gleichungssysteme gerankt. Verglichen wird hier die Rechenleistung in Form von Gleitpunkt-Operationen (Floating Point Operations Per Second, FLOPS). Tab. 18: Rechenleistung typischer Architekturen Rechnersystem Leistung (TFLOPS) Supercomputer (Platz 1, 2016) ~ 30 Supercomputer (Platz 1, 2000) ~ 1 Grafikkarte (GPU,2016) ~ 1 Desktop PC (i7,2016) ~ 0.1 Notebook (i7,2016) ~ 0.05 Kleinstrechner (Raspberry Pi,2016) ~10 -5 Embedded System (Arduino UNO,2016) ~10 -7 Um die Leistungsfähigkeit des Rechners weiter zur erhöhen, d.h. die zur Bewältigung der Aufgabe notwendige Zeit zu reduzieren gibt es neben der Beschleunigung des Speicherzugriffs durch Cache weitere Optimierungsmöglichkeiten. Zum einen die Erhöhung der Taktfrequenz, d.h. die Verkürzung der Zykluszeit für einen Takt. Die technologisch mögliche Schaltfrequenz steigt mit fallender Strukturgröße der Transistorelemente auf dem Halbleiter. Eine Verkleinerung (shrink) der Chipstrukturen ermöglicht also eine Erhöhung der Taktfrequenz. Zum anderen die Veränderung der Mikroarchitektur, d.h. der für die Ausführung eines Befehls im Mittel benötigten Takte (CPI). Hier ist es die überlappende Verarbeitung der Befehle in mehreren parallelen Ausführungseinheiten (Pipeline-Verarbeitung). <?page no="91"?> 92 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing 2.4.5 Befehlspipeline Leistungsfähige Mikroprozessoren sind heute nebenläufig aufgebaut, d.h. die zur Befehlsabarbeitung notwendigen Phasen werden nicht sequentiell nacheinander abgearbeitet, sondern ähnlich wie bei der Fließbandproduktion im Automobilsektor überlappend ausgeführt. Ein Werker erledigt immer nur einen kleinen Teil der Gesamtaufgabe und reicht das Zwischenergebnis an den nächsten Arbeiter weiter. Ist der erste Maschinenbefehl in der Decodierphase, so kann der nächste Befehl schon aus dem Speicher geladen werden usw. Abbildung 47 verdeutlicht die Bearbeitung innerhalb der einzelnen Stufen der Befehlspipeline: Abb. 47: Überlappende Verarbeitung Befehlspipeline Sind alle Stufen der Pipeline gefüllt, so wird mit jedem Takt ein Maschinenbefehl fertig abgearbeitet (CPI=1), obwohl der Gesamtbedarf für den einzelnen Befehl in unserem Fall weiterhin 5 Takte beträgt. Allgemein ergibt sich bei einer Pipeline mit k- Stufen eine Beschleunigung (Speedup S k ) der Ausführungszeit von , wobei der zu erwartende Gewinn aufgrund von Konflikten (Hazards) in der Regel unterhalb von k liegt. Ein solcher Konk TT S Ak A k ≤ = 1 <?page no="92"?> 2.4 Rechnerarchitektur 93 http: / / www.uvk-lucius.de/ informatik-ing flikt tritt z.B. bei bedingten Sprungbefehlen auf. Hier ist das Sprungziel (der nächste Befehl) erst in der Ausführungsphase (EX) bekannt. Der Befehl kann somit vorher nicht auf Vorrat in die Pipeline geladen werden. Hier wird versucht, mittels Sprungvorhersageeinheit (Branch Prediction) per Hardware den Programmablauf vorherzusagen. Schlägt die Vorhersage fehl, so befinden sich die falschen Befehle in der Pipeline und müssen aufwendig entfernt werden (Pipeline-Flushing), was bei hoher Stufenzahl eine erhebliche Latenz verursacht. In der Praxis finden sich deshalb auch in modernen Architekturen nur 10-20 Stufen (Superpipeline). Gibt es gar n Fließbänder (Ausführungseinheiten), auf die die Befehle verteilt werden, so werden unter optimalen Bedingungen mehrere Befehle gleichzeitig fertig (CPI<1). Im Rahmen der Rechnerarchitektur spricht man dann von einer n-fach superskalaren Architektur. In der Regel sind diese nebenläufigen Ausführungseinheiten auf bestimmte Befehlsgruppen spezialisiert, d.h. es gibt besondere Einheiten für die Integer-Rechnung und eigene Einheiten für die Rechnung mit IEEE-Gleitpunktzahlen. Bei der Verteilung (Scheduling) der Maschinenbefehle auf die einzelnen Funktionseinheiten gibt es zwei Strategien: Bei einer In-Order Execution dürfen sich gleichzeitig oder nacheinander gestartete Maschinenbefehle nicht überholen. Das führt häufig zu einer schlechten Nutzung der einzelnen Funktionseinheiten. Eine bessere Auslastung verspricht die Out-Of-Order Execution (OOO), bei denen die Befehle nach der Decodierung in Warteschlangen einsortiert werden und anschließend unabhängig von der logischen Reigenfolge abgearbeitet werden. Dieses Scheduling erfolgt zur Laufzeit des Programmes auf der Ebene der Hardware und erfordert eine hohe Anzahl an Transistoren zur Realisierung. Damit steigen die Herstellungskosten und natürlich auch der Energiebedarf der jeweiligen CPU. Die Intel-Atom ® -Architektur verwendete deshalb lange Zeit eine In- <?page no="93"?> 94 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Order-Verarbeitung. Aktuelle Varianten und die Intel-Core-i- Serie ® verwenden OOO. 2.4.6 Befehlssatzarchitekturen Ein zur Zeit in der Diskussion befindlicher Ansatz ist die Auslagerung des Scheduling in den Compiler, d.h. die Verlagerung von der Hardwareauf die Softwareebene und die Einführung von superlangen Maschinenbefehlen (z.B. 128 Bit), die praktisch für jede vorhandene Ausführungseinheit der CPU schon einen optimal angeordneten Teilbefehl im Maschinencode vorsehen (Very Long Instruction Word, VLIW). Damit einher geht aber eine völlig neue Maschinensprache, d.h. eine neue Befehlssatzarchitektur (Instruction Set Architecture, ISA) und folglich der Verlust der Kompatibilität zur bestehenden Maschinenprogrammen. Da die Anwender damit auch alte Programme im Binärcode nicht mehr verwenden können, ist die Einführung neuer Architekturen auf dem Markt nicht einfach durchsetzbar (s. Intel IA-64 ® , Itanium ® ). Bekannteste Vertreter verschiedener Befehlssatzarchitekturen sind die CISC- (Compex Intruction Set Computer) bzw. RISC- Architekturen (Reduced Instruction Set Computer). Die letzteren verzichten zugunsten der effizienten Implementierung von Superskalareinheiten auf eine große Zahl von möglichen Maschinenbefehlen und Adressierungsarten. Komplexe Maschinenbefehle werden dabei durch mehrere einfache Befehle nachgebildet (emuliert). Heute arbeiten praktisch alle modernen Mikroprozessoren zumindest intern mit RISC-Befehlen. Auch die ursprünglichen x86-CISC-Befehle (Intel-64 ® , z.B. Intel- Core-i-Serie ® ) werden vor der Ausführung intern in RISC-ähnliche Mikrobefehle (µOPs) zerlegt. Die in Smartphones und Tablets verwendeten Prozessoren nutzen eine native RISC- Architektur (ARM ® , Advanced RISC Machines), deren Maschinencode nicht kompatibel zur Intel-64-Architektur ist. Ein Grund, warum PC-Programme nicht auf Smartphones laufen und umgekehrt. Um die Kompatibilität zur bestehenden Software aufrecht zu erhalten, beschränken sich die Hersteller in der <?page no="94"?> 2.4 Rechnerarchitektur 95 http: / / www.uvk-lucius.de/ informatik-ing Regel auf Erweiterungen einer bestehenden Architektur (Intel- 64 bzw. ARMv8). Diese umfassen z.B. die Erhöhung der internen Wortbreite (32-Bit auf 64-Bit) und damit einhergehend des adressierbaren Hauptspeichers oder die Einführung spezieller Befehle (Multi-Media-Extension MMX, Streaming SIMD Extension, SSE) zur Verarbeitung von Vektordaten (Multiple Data, MD). 2.4.7 Multithreading-Architektur Die bisher behandelten Beschleunigungstechniken (Cache, Pipeline, Befehlssatzerweiterungen) sind aus der Sicht des Programmierers transparent, d.h. er muss sich nicht zwingend darum kümmern. Auch der Binärcode der vor 30 Jahren für den 16-Bit Mikroprozessor Intel 8086 erstellten DOS-Programme ist im Prinzip noch auf der aktuellen Intel-64-Hardware lauffähig. Klassische Programme aus dieser Zeit gehen von einem roten Faden (Thread, Ausführungsstrang) im Programmablauf aus. Wie wir bereits gesehen haben, arbeitet die CPU die Befehle üblicherweise in der durch das Programm (Aufgabe, Task) vorgegebenen Reihenfolge ab. Das Konzept der Interruptverarbeitung ermöglicht dabei die asynchrone Unterbrechung des Programmfadens und die Verzweigung zu einer Interrupt-Service- Routine (ISR). Am Ende der ISR erfolgt normalerweise der Rücksprung in den ursprünglichen Programmfaden. Der Programmierer des Hauptfadens benötigt keine Kenntnis über Vorhandensein und vom Zeitpunkt einer Unterbrechung. Die Mechanismen der Interruptverarbeitung in Verbindung mit der Rettung des Prozessorstatus (CPU-Registersatz) auf dem Stack sorgen dafür, dass das Hauptprogramm praktisch nur kurz angehalten wird, dann aber unbeeinflusst weiter arbeiten kann. Multitasking Betriebssysteme (wie Windows ® , Linux, s. Kapitel Software) klinken sich in die zyklisch aufgerufene ISR ein, springen dabei allerdings nicht zwingend wieder in den vorher abgearbeiteten Programmfaden zurück. Das Betriebssystem kann vielmehr selbst entscheiden, ob es aktuell wichtigere Aufgaben (Tasks) gibt und aktiviert dann einfach einen anderen Pro- <?page no="95"?> 96 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing grammfaden (Scheduling). Für den Anwender sieht es so aus, als ob mehrere Programme quasi gleichzeitig auf dem Rechner laufen. In Wirklichkeit teilen sich alle Programmfäden die nur einmal vorhandene Ressource CPU. Zu einer bestimmten Zeit ist immer nur ein Programm aktiv (Single Instruction, SI). Hier greift die Multithreading-Architektur ein. Dabei besitzt die CPU mehrere interne Registersätze, d.h. Programmzähler, Stackpointer, Datenregister usw. sind mehrfach vorhanden. Vorteil ist eine schnelle Umschaltung des Programmfadens. Die ISR muss nicht mehr alle CPU-Register auf den Stack retten, sondern nur den internen Registersatz der CPU umschalten, um zu einem andern Programmfaden zu wechseln. Beim Betriebssystem meldet sich eine solche CPU mit Multithreading-Architektur als Mehrkernprozessor an. Besitzt die CPU dabei zwar einen mehrfachen Registersatz, aber nur eine Ausführungseinheit, so kann trotz der virtuellen Mehrkerne aber auch weiterhin nur ein Programmfaden pro Zeit aktiv sein (Hyper-Threading). Eine Beschleunigung rechenintensiver Aufgaben ist bei einer solchen CPU deshalb nicht zu erwarten. Nur bei mehreren parallelen Aufgaben mit häufigen Wartezeiten ist durch die vereinfache Threadumschaltung ein kleiner Ausführungsvorteil zu erwarten. Echte Mehrkernprozessoren vervielfältigen dagegen nicht nur den Registersatz, sondern auch die Ausführungseinheiten. Ein solcher Prozessor besteht praktisch aus mehreren unabhängigen CPUs (Multiprozessor), die auf einem Chip realisiert werden. Aktuell gibt es Mischformen, z.B. Mehrkernsysteme mit 2 Kernen und 4 Registersätzen. Damit können diese Systeme tatsächlich zwei oder mehrere unabhängige Programmfäden gleichzeitig ausführen (Multiple Instruction, MI). Für den Anwender bringen solche Systeme tatsächlich einen Leistungsgewinn, aber nur, wenn tatsächlich alle Kerne mit Aufgaben versorgt werden können (d.h. z.B. zwei unabhängige Programme gleichzeitig ausgeführt werden). Alte Programme aus der Zeit vor Aufkommen der Mehrkernsysteme nutzen weiterhin nur einen Kern und können durch ein solches System nicht schneller abgearbei- <?page no="96"?> 2.4 Rechnerarchitektur 97 http: / / www.uvk-lucius.de/ informatik-ing tet werden. Zur optimalen Nutzung der Multithreading-Architektur ist also schon bei der Softwareentwicklung der parallelen Ausführung in verschiedenen Threads Rechnung zu tragen. Damit hält ein neues Paradigma der echten Parallelverarbeitung Einzug in die Softwareentwicklung. Leider skalieren bei sorgfältiger Parallelisierung nicht alle Algorithmen linear, d.h. ein gegebenes Problem wird auf n Kernen nicht zwingend n-fach schneller ausgeführt (Speedup, Amdahlsches Gesetz): Vielmehr existiert bei den meisten Algorithmen ein nicht parallelisierbarer Anteil (1-α), welcher den erreichbaren Geschwindigkeitsvorteil reduziert. Im Ingenieurbereich kann z.B. die numerische Lösung gewöhnlicher Differentialgleichungen als typischer Vertreter schlecht skalierbarer Probleme gelten. Einschrittverfahren zur Lösung (z.B. Euler-Verfahren) sind konzeptionell seriell aufgebaut, d.h. zur Berechnung eines Zeitschrittes ist die Kenntnis des vorherigen Zeitschritts zwingend erforderlich. Dagegen skalieren Probleme der grafischen Datenverarbeitung sehr gut, weswegen aktuelle Grafikkarten spezialisierte Mehrkernprozessoren (Grafikprozessor, GPU) mit Tausenden von Kernen enthalten. 2.4.8 Rechnerklassifikation nach Flynn Nachdem wir verschiedene Rechnerarchitekturen kennengelernt haben, wird es Zeit, etwas Ordnung in die Systematisierung zu bringen. Der amerikanische Computer-Pionier M. Flynn hat dazu eine einfache Taxonomie entworfen, die auch heute noch weit verbreitet ist. Ein Rechner arbeitet dabei zu einem Zeitpunkt einen (Single Instruction, SI) oder mehrere Befehlsstöme (Multiple Instruction, MI) ab. Außerdem operiert er zu einem α α α − ≤ + − = = 1 1 1 1 1 n An A n T T S <?page no="97"?> 98 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Zeitpunkt auf einem (Single Data, SD) oder mehreren Datenströmen (Multiple Data, MD). Tab. 19: Klassifikation nach Flynn Unser klassischer von-Neumann-Rechner ist demnach ein einfaches SISD-System. Befehlssatzerweiterungen wie MMX oder SSE besitzen Maschinenbefehle, die einfache Operationen wie Addition, Subtraktion usw. gleichzeitig auf alle Elemente eines Vektors durchführen. Hier handelt es sich um eine Architektur vom SIMD-Typ (Vektorrechner, Feldrechner). Echte Mehrkernprozessoren wie die Intel-Core-i-Serie ® oder die ARM ® - Architektur sind in der Lage, mehrere Befehle gleichzeitig auf Vektordaten anzuwenden (MIMD-Typ). Einen typischen Vertreter für die MISD-Gruppe zu finden gestaltet sich dagegen schwierig. Aus Ingenieurssicht könnte man dort vielleicht die redundanten Systeme einordnen, bei denen mehrere unterschiedliche Mikroprozessoren (auch mit unterschiedlichen Befehlssatzarchitekturen) gleichzeitig auf ein und dieselben Messdaten arbeiten und somit auch auf das gleiche Ergebnis liefern sollten. Ein Vergleich der Ergebnisse von drei Rechnern und Mehrheitsentscheid ermöglicht die Erkennung von Systemfehlern. Einsatzgebiet z.B. fehlertolerante Rechner beim Autopilot im Flugzeug. D I einfach mehrfach mehrfach einfach SISD SIMD MISD MIMD <?page no="98"?> 2.5 Interfacetechnik Eingebetteter Systeme 99 http: / / www.uvk-lucius.de/ informatik-ing 2.5 Interfacetechnik Eingebetteter Systeme Nach Angaben des Bundesverbands Informationswirtschaft (BIT- KOM, 2010) werden 98 % aller weltweit hergestellten Mikroprozessoren in eingebetteten Systemen „versteckt“. Bedingt durch die enge Kopplung eines solchen reaktiven Computersystems an den jeweiligen technischen Prozess müssen sich Ingenieure heute zwangsläufig mit dem Thema der Interfacetechnik auseinandersetzen. Verschiedene Sensoren liefern aktuelle Informationen aus dem Prozess, Aktoren ermöglichen die ständige Beeinflussung des Prozesses (closed loop, Regelkreis). Abb. 48: Reaktives Computersystem Im folgenden Unterkapitel werden die zur rechnergestützten Erfassung und Ausgabe digitaler und analoger Spannungssignale notwenigen Komponenten beschrieben. Als Plattform dient dabei die Atmel megaAVR ® -Mikrocontrollerfamilie, ein lowcost 8-Bit RISC SoC mit weiter Verbreitung in Industrie und Hobby. Der bekannte Arduino-UNO basiert auf einem ATmega328 mit 32 kByte Flashspeicher für Programme und 2 kByte SRAM für Daten. Umgebung z.B. technisches / biologisches System d out DAC d in ADC Reaktives Computersystem Sensoren Aktoren Elektrische Stellgrößen Elektrische Messgrößen <?page no="99"?> 100 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Zum Betrieb des 28 Pins umfassenden Mikrocontrollers ist als Minimalbeschaltung nur eine über einen Stützkondensator C geglättete Spannungsversorgung VCC notwendig. Dies können z.B. zwei in Serie geschaltete AAA-Batterien mit je 1.5 V und einer Kapazität von ca. 1000 mAh übernehmen. Der CPU-Takt wird ohne externe Beschaltung direkt aus einer internen Taktstufe gewonnen (s. astabile Kippstufe). Abb. 49: Minimalbeschaltung eines Mikrocontrollers Der Strombedarf bei 1 MHz Taktfrequenz liegt lt. Datenblatt 5 zwischen 0.2 mA (Active Mode) und 0.75 µA (Power Save Mode). Damit ist die theoretische Batterielebensdauer irgendwo zwischen einem halben Jahr (Active) und 150 Jahren (Power Save) anzusiedeln. 2.5.1 Ein- und Ausgabe digitaler Signale Ein Mikrocontroller soll natürlich in möglichst vielen Anwendungsfällen universell einsetzbar sein. Deshalb lässt sich fast jeder der verbleibenden 26 Pins des Mikrocontrollers als digitaler I/ O-Pin nutzen. Die Kommunikation mit der CPU erfolgt, wie bereits beschrieben, im Memory-Mapped-I/ O-Verfahren. 5 www.atmel.com 28 27 26 25 24 23 22 21 20 19 18 17 16 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ADC5 ADC0 VCC GND C PB5 PB1 <?page no="100"?> 2.5 Interfacetechnik Eingebetteter Systeme 101 http: / / www.uvk-lucius.de/ informatik-ing Jedes Interface-Modul des Mikrocontrollers besitzt feste Speicherzellen (Register), die im Falle des digitalen I/ O direkt mit den Pins verbunden sind (Eingangsregister). Immer 8 Pins korrespondieren dabei mit einer Speicherzelle. In unserem Fall hat die Speicherzelle den symbolischen Namen PINB. Soll z.B. der an Pin 19 (PB5) anliegende Spannungspegel eingelesen werden (Digital Input), so wird vom Programm aus lesend auf die Speicherzelle PINB zugegriffen und das 5. Bit ausgewertet. Liegt am Pin 19 ein High-Pegel, so wird dort eine 1 eingelesen. Liegt der Pin auf Masse, dann wird eine 0 eingelesen (Hinweis: nicht beschaltete Eingangspins liefern ein zufälliges Signal). Abb. 50: Interfaceschaltung digitaler Eingang Oft bestehen digitale Sensoren nur aus einem einfachen Schließkontakt (z.B. Reed-Schalter). Dann würde bei geöffnetem Schalter ein zufälliges Potential am Eingang anliegen. Um dies zu verhindern wird, wie in obigen Schaltplan an Pin 15 gezeigt, ein externer Pullup-Widerstand R benötigt (typisch 5-10 kΩ). Zur Schaltungsvereinfachung besitzen die meisten Mikrocontroller auch die Möglichkeit, interne Pullup-Widerstände zu aktivieren. Nach Einschalten der Versorgungsspannung wacht der Mikrocontroller immer in einem sicheren Zustand auf, d.h. alle Pins sind als Eingang konfiguriert. Damit wird sichergestellt, dass das Bauteil keinen Kurzschluss auf der Platine verursachen kann. Sollen einzelne Pins als Ausgang genutzt werden, d.h. ihrerseits einen Spannungspegel generieren, muss der jeweilige Pin erst durch einen Eintrag im Konfigurationsregister des I/ O-Moduls 22 21 20 19 18 17 16 15 7 8 9 10 11 12 13 14 PB5 VCC GND VCC GND R <?page no="101"?> 102 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing freigeschaltet werden. Dazu besitzt der Mikrocontroller mehrere Konfigurationsregister (Datenrichtungs-Register DDRB). Das Anwendungsprogram setzt z.B. das 5. Bit der Speicherzelle DDRB um den Pin PB5 als Ausgang zu betreiben. Abb. 51: Interfaceschaltung digitaler Ausgang Danach führt ein Setzen des 5. Bits im Ausgangsregister PORTB zu einem High-Potential und in unserem Fall zum Leuchten der LED. Ein gelöschtes Bit 5 führt zu Low-Potential und damit zum Erlöschen der LED. Der in Serie geschaltete Widerstand R (z.B. R=220 Ω) dient dabei zur Strombegrenzung (s. Übungsaufgaben). Der hier genutzte Mikrocontroller kann an seinem Pin einen maximalen Strom von 40 mA liefern. Dies ist bei der Entwicklung von Aktorschaltungen zu beachten. Eventuell sorgt ein externer Transistor für die Verstärkung der Schaltleistung. Typische binäre Aktoren sind LEDs oder Relais zum Schalten größerer Lasten (Motoren, 230 V-Verbraucher). 2.5.2 Analoge Ausgänge (Digital-Analog-Wandlung) Andere Aktoren werden kontinuierlich angesteuert (z.B. die Drehzahl von Motoren, die Förderrate von Pumpen oder der Lautsprecher am PC). Hier muss der Mikrocontroller in Abhängigkeit von einem n-Bit-Binärwort [D n-1,…, D 1, D 0 ] ein analoges Spannungssignal U DAC liefern. Diesen Prozess bezeichnet man als Digital-Analog-Wandlung (Digital-Analog-Conversion, DAC). Ein einfacher DAC lässt sich anschaulich aus dem folgenden Widerstandsnetzwerk herleiten. <?page no="102"?> 2.5 Interfacetechnik Eingebetteter Systeme 103 http: / / www.uvk-lucius.de/ informatik-ing Abb. 52: Digital-Analog-Wandler (DAC) Dazu wird die Referenzspannung U ref über gesteuerte Schalter (Transistoren) und verschiedene Widerstände auf einen gemeinsamen Knotenpunkt gelegt. Gemäß der Kirchhoffschen Regel summieren sich die Teilströme I k im Knoten zu einem Strom I ges . Werden die Widerstände in Form von Zweierpotenzen gewählt, ergibt sich ein Strom mit der Wertigkeit der einzelnen Bits k. Ein Operationsverstärker als Strom-Spannungswandler setzt den Strom in eine proportionale Spannung 1 2 − ⋅ = n ref DAC D U U um. In Abhängigkeit vom Datenwort D kann die Ausgangsspannung also 2 n verschiedene Werte annehmen. Abb. 53: Ausgangsspannung DAC Diese Schaltung erfordert bei der Herstellung hochgenaue Widerstände in einem großen Wertbereich. Deshalb wird in der Praxis meist ein ähnliches Netz mit nur zwei verschiedenen Widerstandswerten genutzt (2R-R Schaltung). R/ 2 D 1 I 1 R/ 4 D 2 I 2 R/ 8 D 3 I 3 I ges R D 0 +U ref I 0 _ + U DAC <?page no="103"?> 104 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Leider verfügt der hier verwendete Mikrocontroller über kein eigenes DAC-Modul. Analoge Ausgänge können trotzdem über ein Pulsweitenmodulation (PWM) genanntes Verfahren erzeugt werden. Diese Methode nutzt ein digitales Rechtecksignal mit fester Frequenz und unterschiedlichem Tastverhältnis; d.h. Einschaltzeit (duty-cycle) im Verhältnis zur Periodendauer. Ein nachgeschalteter Tiefpass (z.B. RC-Tiefpass) oder ein anderes System mit glättendem Verhalten erzeugt daraus schließlich eine analoge Spannung. Abb. 54: Puls-Weiten-Modulation 2.5.3 Analoge Eingänge (Analog-Digital-Wandlung) Bei der Messung physikalischer Größen wird der zu bestimmende Wert vom Sensor in eine proportionale Spannung U ADC gewandelt. Aufgabe des Analog-Digital-Wandlers (Analog-Digital-Conversion, ADC) ist die Umsetzung der kontinuierlichen analogen Eingangsspannung in eine zeit- und wertediskrete Darstellung im Rechner. Dazu wird zu bestimmten Zeitpunkten eine Probe aus dem Signal genommen (Abtastung) und diese anschließend quantisiert, d.h. in ein binäres Codewort gewandelt. Ein häufig verwendetes Verfahren verwendet dazu einen DAC-Baustein und einen Operationsverstärker als Vergleicher sowie eine intelligente Steuerung. <?page no="104"?> 2.5 Interfacetechnik Eingebetteter Systeme 105 http: / / www.uvk-lucius.de/ informatik-ing Abb. 55: Analog-Digital-Wandlung Das sukzessive Approximation genannte Verfahren implementiert eine intelligente Strategie, die beginnend mit dem höchstwertigsten Bit verschiedene DAC-Spannungen erzeugt und diese mit der unbekannten Spannung U in vergleicht. Das Verfahren ähnelt dem Vorgehen einer Marktfrau, die eine unbekannte Menge an Kartoffeln abwiegen möchte. Sie stellt den Behälter mit der unbekannten Masse U in auf die Balkenwaage (Vergleicher) und setzt nacheinander (beginnend mit dem größten Gewicht) ihre n Referenzgewichte (U DAC ) auf die andere Waagschale. Ist ein Referenzgewicht k zu schwer, wird es wieder von der Waage genommen. Abb. 56: Ein n-Bit ADC benötigt n-Takte zur Wandlung Nach insgesamt n-Schritten (Takten) ist das Gewicht der unbekannten Masse schließlich mit der Genauigkeit des kleinsten Referenzgewichtes festgelegt. Essentiell ist, dass während des Wägevorgangs keine Veränderung der unbekannten Masse stattfindet. Dafür sorgt eine Sample & Hold-Schaltung (Kondensator) im ADC. <?page no="105"?> 106 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing Da die Referenzgewichte mit dem vorher behandelten DAC erzeugt werden, bietet das Verfahren eine Auflösung der Spannungsmessung von 1 2 − = ∆ n ref U U . Der hier verwendete Mikrocontroller verfügt über einen 10 Bit ADC, welcher über einen Multiplexer (Umschalter) die analoge Spannung an den Pins 23 (AD0) bis 28 (AD5) bestimmen kann. Wir können damit nacheinander (nicht exakt gleichzeitig) die Spannungen von sechs verschiedenen Sensoren erfassen. Die Referenzspannung U ref wird intern erzeugt, kann aber bei Bedarf auch extern vorgegeben werden. 2.5.3.1 Das Abtasttheorem Durch die Abtastung wird zu jedem Zeitpunkt t i eine Probe aus dem zeitkontinuierlichen Signalverlauf entnommen. Die Abtastfrequenz f S bestimmt somit die Abstände der Probenahme. Das Verfahren ähnelt der Belichtung eines analogen Films, bei dem die Einzelaufnahmen mit einer Abtastfrequenz von 24 Bildern pro Sekunde angefertigt werden. Betrachten wir das folgende Signal und die äquidistante Abtastung, so erkennen wir, dass das gleiche Signal (mittleres Bild), nur etwas zeitverschoben, ein komplett anderes Abtastsignal liefert. Abb. 57: Mehrdeutigkeiten bei der Abtastung Im linken Teilbild erzeugt dagegen ein völlig anderes Ursprungssignal das gleiche Abtastmuster. Damit existieren offensichtlich Mehrdeutigkeiten bei der Abtastung. Eine Unterabtas- Zeit Zeit gleiches Signal, nur verschoben Zeit völlig anderes Signal, <?page no="106"?> 2.5 Interfacetechnik Eingebetteter Systeme 107 http: / / www.uvk-lucius.de/ informatik-ing tung, also eine zu langsame Abtastung führt bei der Rekonstruktion zu neuen Signalanteilen (Aliasing), die im Originalsignal gar nicht vorhanden sind. Abb. 58: Aliasing-Phänomen Der Effekt ist auch aus alten Westernfilmen bekannt, bei denen die Speichen der schnell fahrenden Postkutsche durch die Unterabtastung auf dem Film scheinbar rückwärtslaufende Wangenräder vortäuschen. Ziel unserer Signalverarbeitung ist aber die eindeutige Repräsentation des Ursprungssignals und die identische Rekonstruktion des Signals bei der späteren analogen Ausgabe. Aliasing kann nur durch schnelle Abtastung verhindert werden. Die Theorie dazu liefert das Abtasttheorem (Nyquist- Shannon), welches besagt, dass die Abtastfrequenz f S mindestens doppelt so hoch sein muss wie der höchste Frequenzanteil im Ursprungssignal. Sind höhere Frequenzanteile im Signal vorhanden (z.B. durch Störrauschen), so wird das Signal vor der Abtastung mittels Tiefpassfilterung (Anti-Aliasingfilter, z.B. RC-Glied) bandbegrenzt. Anwendungsbeispiel: Audio-Daten Betrachten wir als Beispiel die Abtastung von Audiosignalen im Frequenzbereich 20 Hz - 20 kHz. Hier muss die Abtastung mindestens 40.000-mal in der Sekunde erfolgen (40 kHz). In der Praxis verwendet man eine Abtastfrequenz von 44.1 kHz mit einer Auflösung von 16 Bit (CD-Qualität). Rekonstruktion Zeit Zeit <?page no="107"?> 108 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing 2.5.4 Serielle Schnittstellen Aus den vorherigen Kapiteln wird deutlich, dass die Messwertübertragung mittels analogen Spannungssignalen für jedes Signal eine eigene Leitung benötigt. Über längere Stecken kommen weitere Probleme, wie zunehmende Leitungswiderstände und Kontaktwiderstände durch Rangierverteiler hinzu. Gleichzeitig wirken elektromagnetische Effekte auf die Leitungen ein (z.B. aus dem Stromnetz, oder Felder große Elektromotoren) und führen zu ungewollten Störungen. Um dies alles zu reduzieren, erfolgt der Übergang zwischen digitaler und analoger Welt heute so dicht am Prozess wie möglich. Dazu wandern die Wandler direkt in die Sensorik/ Aktorik (Smart-Sensors). Die Feldgeräte verfügen über eine intelligente Interfacekomponente, welche die Signalwandlung vornimmt und über digitale Nachrichtenübertragungssysteme (Netzwerke) mit dem Rechner kommuniziert. Hierbei kommen in der Regel serielle Schnittstellen zum Einsatz, d.h. die Übertragung der Nachricht erfolgt Bit für Bit zeitlich nacheinander über wenige elektrische Datenleitungen. Abb. 59: Serielle Prozessankopplung Im folgenden Abschnitt werden die Grundlagen der Punkt-zu Punkt-Kommunikation, also der direkten Verbindung zweier Kommunikationspartner betrachtet. Die Erweiterung auf Netzwerke erfolgt im Kapitel Rechnernetze. D out DAC D in Umgebung z.B. technisches / biologisches System Sensoren Aktoren Digitale Nachrichtenübertragung ADC Interface Interface Interface Interface Reaktives Computersystem <?page no="108"?> 2.5 Interfacetechnik Eingebetteter Systeme 109 http: / / www.uvk-lucius.de/ informatik-ing Für eine taktsynchrone Verbindung sind nur drei Leitungen notwendig: Bezugspotential (GND), der Takt und die eigentliche Datenleitung. Letztere wird aus Sicht des Senders häufig als TxD (Transmit Data) und aus der Sicht des Empfängers mit RxD (Receive Data) beschriftet. Abb. 60: Synchrone serielle Schnittstelle Eine solche Verbindung wird als unidirektional bezeichnet, d.h. die Datenübertragung erfolgt nur in Richtung vom Sender zum Empfänger. Die Rückmeldung z.B. zur Bestätigung ist nicht vorgesehen. Soll die Übertragung in beide Richtungen funktionieren (bidirektional), ist eine weitere Leitung nötig. Je nachdem, ob die Daten gleichzeitig oder nur abwechselnd übertragen werden können, spricht man vom Vollduplexbzw. Halbduplex-Betrieb. Abb. 61: Bidirektionale Kommunikation Eine asynchrone Kommunikation verzichtet auf die Übertragung des Taktes. Stattdessen verfügen beide Kommunikationspartner über eine genaue Zeitbasis (Quarzoszillator), die zumindest für die Übertragung einer Nachricht ausreichend genau aufeinander abgestimmt sind. Zusammen mit einer eindeutigen Erkennung des Nachrichtenstarts (Start-Bit) lässt sich der Takt TxD Takt GND RxD Takt GND Sender Empfänger TxD Takt GND RxD Takt GND Sender Empfänger TxD RxD <?page no="109"?> 110 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing auf beiden Seiten ersetzen und die Kommunikation synchronisieren. Darüber hinaus gibt es weitere Kodierungsverfahren, die eine Taktrückgewinnung aus dem Datenstrom ermöglichen (Manchester-Code). Diese Verfahren werden z.B. bei Rechnernetzen eingesetzt. Wichtig in diesem Zusammenhang ist die Datenübertragungsrate (Bitrate, Bandbreite, Kapazität), die angibt, wie viele Bit pro Zeiteinheit übertragen werden. Oft wird dabei auch von der Baudrate gesprochen. Die Baudrate (Schrittgeschwindigkeit) ist definiert als die übertragene Symbolmenge pro Zeiteinheit. Bei binärer Kommunikation gibt es nur zwei Symbole und die Baudrate ist identisch mit der Datenübertragungsrate (1 Bd = 1 b/ s). Die digitale Kommunikation ermöglicht neben der eigentlichen Messwertübertragung auch die Übertragung weiterer Informationen wie Status- oder Störmeldungen oder Konfigurationsdaten. Messwerte lassen sich z.B. direkt als Gleitpunktzahl in der physikalischen Einheit übertragen. Prüfsummen (CRC, Cyclic Redundancy Check) ermöglichen eine automatische Fehlererkennung (bedingt z.B. durch elektromagnetische Störungen) und ggf. die automatische Fehlerkorrektur. Ein einfaches Beispiel ist das Prüfsummenbit (Parity) bei der RS-232 bzw. COM- Schnittstelle am PC. Diese, oft nur als „serielle Schnittstelle“ bezeichnete RS-232 dient im Kapitel Programmierung zur Anbindung eines Mikrocontrollers an die Entwicklungsumgebung am PC und wird deshalb im Folgenden genauer vorgestellt. Serielle Schnittstelle RS-232 / V.24 Historisch diente diese asynchrone serielle Schnittstelle lange Zeit zur Anbindung externer Geräte wie Maus oder Modem an den PC. Dieser verfügte dazu über einen oder mehrere COM- Ports. Noch immer haben viele Geräte im industriellen Umfeld des Ingenieurs ein solches Interface (Messgeräte, Waagen, Pumpen usw.). Fehlt modernen PCs oder Notebooks der COM- <?page no="110"?> 2.5 Interfacetechnik Eingebetteter Systeme 111 http: / / www.uvk-lucius.de/ informatik-ing Port, so lässt sich dies über entsprechende USB-Seriell-Wandler leicht nachrüsten. Unser später zum Programmieren verwendeter Mikrocontroller besitzt einen solchen Umsetzer bereits auf der Platine und kann deshalb direkt per USB-Ankopplung eine virtuelle serielle Schnittstelle am PC implementieren. Fast alle Mikrocontroller unterstützen eine oder mehrere serielle Schnittstellen, welche in diesem Umfeld auch UART-Baustein (Universal Asynchronous Receiver Transmitter) genannt wird. Innerhalb der UART-Bausteins erfolgt die Seriell/ Parallelbzw. Parallel/ Seriell-Wandlung (Schieberegister s. Kapitel Schaltwerke). Die UART-Schnittstelle an sich arbeitet mit ihren TxD-, RxD-Pins auf niedrigen Spannungspegeln (TTL, LVTTL) und ermöglicht nur kurze Leitungslängen. Erst durch Pegelwandler werden daraus schließlich die in RS-232 bzw. V.24 genormten Spannungspegel von +3 ... +15 V zur Darstellung einer logischen 0 (SPACE) und -3 ... -15 V zur Darstellung einer logischen 1 (MARK). Der Nachrichtenaustausch zwischen zwei Teilnehmern ist nur möglich, wenn beide vorher die gleichen Schnittstellenparameter vereinbaren. Dazu gehört die verwendete Baudrate, das Prüfbit-Verfahren, sowie die Anzahl der Daten-, Start- und Stopp-Bits. Typische Raten sind 9600, 19200 oder 57600 Baud. Abb. 62: Nutzdaten im UART-Zeichen Vor der Übertragung befindet sich das TxD-Signal vereinbarungsgemäß im Ruhezustand (High-Pegel). Die Übertragung eines UART-Zeichens startet mit einem Startbit (S), welches immer einen Low-Pegel besitzt. Daran erkennt der Empfänger den Beginn der Nachricht und startet die Zeitmessung. Auf- TxD E E S 1 0 0 1 1 0 1 0 P S E Bsp: Nutzdaten (8 bit) 0 1 0 1 1 0 0 1 Zeit <?page no="111"?> 112 2 Hardware http: / / www.uvk-lucius.de/ informatik-ing grund der vorher vereinbarten Baudrate ist somit auch ohne Takt bekannt, wann die nächsten Bits auf der Schnittstelle gültig sind. Der Sender legt jetzt nacheinander alle Bits des Nutzdatenbytes auf die Schnittstelle (beginnend mit dem niederwertigsten Bit, LSB). Im Anschluss daran folgt das Prüfbit (Parity P) und ein oder ggf. mehrere Stopp-Bits (S). Das Prüfbit ergänzt die Anzahl der Einsen in den Nutzdaten zu einer geraden (even) bzw. einer ungeraden (odd) Anzahl. Im obigen Beispiel wurde also ein ungerades Prüfbit vereinbart. Insgesamt dauert die Übertragung von 8 Bit Nutzdaten also 11 Bitzeiten (UART- Rahmen). Anwendungsbeispiel: Mikrocontroller an PC Bei der Nachrichtenübertragung zwischen zwei Teilnehmern darf keine Information verloren gehen, d.h. jedes gesendete Zeichen muss auch beim Empfänger gelesen werden. Um die beiden Teilnehmer zu entkoppeln werden in der Regel verschiedene Puffer (First In First Out, FIFO) zwischengeschaltet. Abbildung 63 verdeutlicht die Kommunikation zwischen einem Mikrocontroller (Sender) und einem Anwendungsprogramm auf dem PC (Empfänger). Abb. 63: Pufferung der Nachricht printf("Hallo Welt"); Sendepuffer (Mikrocontroller) Interrupt: UART- Hardware FIFO frei -> ein Byte wird bewegt UART-Baustein 2 Byte FIFO UART-Baustein FIFO UART-Zeichen (11 Bit / Zeichen) Treiber - Interrupt: UART- Zeichen im FIFO -> ein Byte wird bewegt Empfangspuffer (Betriebssystem, Treiber) [String] = fscanf(s1) Mikrocontroller sendet Nachricht PC: Anwendung empfängt <?page no="112"?> 2.6 Literatur 113 http: / / www.uvk-lucius.de/ informatik-ing Das Anwendungsprogramm auf dem Mikrocontroller schreibt mittels printf-Befehl einen Text an den Empfänger. Damit der Mikrocontroller aufgrund der langsamen Übertragung nicht ausgebremst wird, schreibt der printf nicht direkt auf die UART sondern legt die Daten im Sendepuffer ab. (Bei 9600 Baud dauert die Übertragung eines ASCII-Zeichens etwa 1 ms, die Übertragung des „Hallo Welt“ also 10 ms - aus der Sicht des Mikrocontrollers eine sehr lange Zeit). Ist der UART-Baustein sendebereit, so zeigt er das per Interrupt an. Die Interrupt Service Routine ISR holt ein Zeichen aus dem Sendepuffer und überträgt es an den Baustein. Dieser sendet also Zeichen für Zeichen auf die Schnittstelle. Das Anwendungsprogramm kann derzeit schon andere Aufgaben erfüllen, wird aber immer kurzzeitig vom der ISR unterbrochen. Auf der Empfängerseite am PC treffen die Zeichen nacheinander am dortigen UART-Baustein ein. Dieser sendet ein Interruptsignal ans Betriebssystem, woraufhin ein Treiber (virtueller COM-Port) das Zeichen abholt und in einen Empfangspuffer des Betriebssystems schreibt. Aus diesem Puffer holt sich schließlich das Anwendungsprogramm per fscanf-Befehl die Daten ab. Ein Datensatz wird dabei typischerweise durch ein Terminator-Zeichen (z.B. Carriage Return, CR, ASCII 13 10 ) abgeschlossen. Im Rahmen der Programmierübungen verwenden wir auf PC- Seite ein Terminalprogramm (Serial Monitor der Arduino-IDE) zur Visualisierung der Ausgaben des Mikrocontrollers. 2.6 Literatur Bitkom, 2010, Eingebettete Systeme - Ein strategisches Wachstumsfeld für Deutschland Hoffmann, D. W., Grundlagen der Technischen Informatik, Hanser-Verlag Wüst, K., Mikroprozessortechnik, Vieweg+Teubner Märtin, C., Einführung in die Rechnerarchitektur, Fachbuchverlag Leipzig Plate, J., Sensorik für Datentechniker, netzmafia.de/ skripten/ hardware/ Control/ sensoren.pdf <?page no="114"?> http: / / www.uvk-lucius.de/ informatik-ing 3 Software Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: unterschiedliche Klassen von Software kennen; zentrale Aufgaben von Betriebssystemen erläutern können; Qualitätsmerkmale von Software benennen und mit den Grundlagen und Vorgehensmodellen beim Software-Engineering vertraut sein. 3.1 Klassifikation von Software Es existieren unterschiedliche Definitionen für Software: technisch: Gesamtheit aller Programme, die auf einer Rechenanlage eingesetzt werden. 6 betriebswirtschaftlich: Computerprogramme, Prozeduren, Regeln und Daten sowie die dazugehörige Dokumentation, die im Zusammenhang mit dem Betrieb eines Rechnersystems stehen. 7 Dienstleistungen in diesem Zusammenhang werden auch der Software zugerechnet. Software wird unterschieden in a) Systemsoftware: die für den korrekten Betrieb einer Rechenanlage erforderlich ist oder der Programmerstellung dient. Sie 6 Engesser et al. (2001): Duden. Informatik. Ein Sachlexikon für Studium und Praxis. Bibliographisches Institut, Berlin 7 Gabler Lexikon Wirtschaftsinformatik; http: / / wirtschaftslexik on.gabler.de/ Definition/ software.html <?page no="115"?> 116 3 Software http: / / www.uvk-lucius.de/ informatik-ing regelt den Ablauf der Anwendungsprogramme. In der Regel ist diese für eine spezielle Hardwarefamilie optimiert. b) Anwendungssoftware: Software, die für Endbenutzer entwickelt und von ihnen genutzt wird. D.h. Software zur Lösung von Benutzerproblemen (z.B. Buchhaltung, statistische Auswertungen, Textverarbeitung, Modellierung etc.). Abb. 64: Klassifikation von Software Ein Anwender sieht immer ein Gesamtsystem aus Hard- und Software, wobei man die Software in Abhängigkeit von ihrer Nähe zur Hardware in Schichten (Ebenen, Layer) ordnen kann. Dadurch erhalten wir ein Konstruktionsprinzip für abstrakte Maschinen: Die Hardware stellt die unterste Maschine M 0 dar. Durch Hinzunahme einer Schicht S i (z.B. Betriebssystem, Anwendungsprogramm) zur Maschine M i-1 entsteht die Maschine M i. <?page no="116"?> 3.1 Klassifikation von Software 117 http: / / www.uvk-lucius.de/ informatik-ing Jede abstrakte Maschine bietet nach oben eine bestimmte Funktionalität, d.h. eine Menge von anwendbaren Funktionen an. Die bi-direktionale Kommunikation zwischen den einzelnen Layern der Maschine erfolgt über klar definierte Schnittstellen (Interfaces). Abb. 65: Beispielkonstruktion einer abstrakten Maschine Neben der Differenzierung in System- und Anwendungssoftware existiert auch eine Unterscheidung zwischen Standardsoftware und Individualsoftware. Standardsoftware wird für den „anonymen“ Markt entwickelt, d.h. muss die fachlichen und technischen Anforderungen vieler Anwender abdecken, ist in vielen Unternehmen und Geschäftsbereichen einsetzbar und nutzbar, deckt nur einen klar umrissenen Funktionsbereich ab, Entwicklung und Vertrieb durch ein Softwareunternehmen. <?page no="117"?> 118 3 Software http: / / www.uvk-lucius.de/ informatik-ing Beispiele: Office Software, Betriebliche Anwendungssysteme für Standardaufgaben wie Buchhaltung und Auftragsbearbeitung, Systemsoftware etc. Individualsoftware wird für einen einzelnen Anwender (Unternehmen, Anwendergruppe) entwickelt, ist oft eine Eigenentwicklung des Unternehmens; aber auch Auftragsarbeit, deckt die fachlichen und technischen Anforderungen eines Bereiches vollständig ab. Beispiele: Software für spezielle persönliche Auswertungen (z.B. spezielle Datenauswertungen mit Diagrammen); spezielle betriebliche Produktionssysteme; Intranet, spezielle Steuerungssysteme z.B. Ariane V etc. 3.2 Anwendungssoftware für Ingenieure Der Markt für Anwendungssoftware für Ingenieure ist so vielfältig wie die Aufgabenfelder der unterschiedlichen Ingenieurs- Disziplinen. Nachfolgend ist daher lediglich eine kleine, unvollständige Auswahl an verfügbarer Software für Ingenieure aufgelistet. Weiterführende Informationen findet der Leser in den branchenspezifischen Portalen sowie in den speziellen Web- Verzeichnissen (Softwareguide) zur Verfügbarkeit von Anwendungssoftware. Office-Software: Bündelung von Software, die im Büroalltag eingesetzt wird. Typische Komponenten bilden hierbei die Textverarbeitung und das Desktop-Publishing, Präsentationssoftware sowie die Tabellenkalkulation. Beispiele: MS Office ® , OpenOffice ® Projektmanagement: Software zur Erleichterung der Planung, Organisation und Durchführung von Projekten. Insbesondere auch zum Monitoring der Mitarbeiter- und Budget- <?page no="118"?> 3.2 Anwendungssoftware für Ingenieure 119 http: / / www.uvk-lucius.de/ informatik-ing Ressourcen eingesetzt, um Engpässe im Projektverlauf zu vermeiden. Oftmals auch branchenspezifische Lösungen. Beispiele: MS Project ® , Redmine, OpenProject Technisch-wissenschaftliche Software: Werkzeug zur Erstellung mathematischer Modelle und Formeln, Durchführung komplexer mathematischer Berechnungen, Ergebnisdarstellung und Visualisierung. Beispiele: Mathcad, Maple, MATLAB ® , LabView ® Computer Aided Design (CAD): Software zum rechnergestützten Konstruieren, der Entwicklung von 3D-Modellen. Ursprünglich als Hilfsmittel zur Erstellung von technischen 2D-Zeichnungen entwickelt, können heute neben der räumlichen Abbildung von Objekten auch zugehörige Fachinformationen wie z.B. Materialeigenschaften verwaltet und ausgewertet werden. Beispiele: AutoCAD ® , CATIA ® , SolidWorks, FreeCAD; viele branchenspezifische Lösungen am Markt erhältlich. Computer Aided Manufacturing (CAM): Software die die Erstellung von Steuerungsprogrammen für CNC-Maschinen übernimmt und innerhalb der rechnerunterstützten Fertigung einen wesentlichen Bestandteil der computerintegrierten Produktion (CIM = Computer Integrated Manufacturing) darstellt. Datenaustausch und enge Zusammenarbeit zwischen CAD und CAM-Systemen. Beispiele: CATIA ® , TopSolid, NX ® Produktionsplanung und Steuerung (PPS): Unterstützt den Anwender bei der Produktionsplanung und -steuerung mit dem Ziel der Realisierung kurzer Durchlaufzeiten sowie einer optimalen Nutzung der Betriebsmittel. PPS-Systeme sind oftmals in übergeordnete Systeme des Enterprise Ressource Planning (ERP-Software; umfasst zusätzlich finanzielle und personelle Ressourcen) integriert. Beispiele: SAP ® , Oracle, Microsoft Dynamics NAV; viele branchenspezifische Lösungen <?page no="119"?> 120 3 Software http: / / www.uvk-lucius.de/ informatik-ing Geographische Informationssysteme (GIS): Software zur Erfassung, Modellierung und raumbezogenen Auswertung georeferenzierter Daten (Vektor-, Rastergeometrie und Fachdaten) zum Einsatz in der Raum- und Standortplanung sowie der Analyse und Dokumentation von Ver- und Entsorgungsstrukturen. Beispiele: ArcGIS, GeoMedia, QuantumGIS Weitere Kategorien sind Software zum Produktdatenmanagement (PDM), Simulationssysteme, AVA-Software (Ausschreibung, Vergabe, Abrechnung), Betriebliche Anwendungssoftware etc., um nur einige weitere zu benennen. 3.3 Betriebssysteme 3.3.1 Grundlagen Betriebssysteme stellen die wichtigste Software auf einem Rechner dar. Anwendungsprogramme sind in der Regel ohne ein Betriebssystem nicht ausführbar. Ausnahmen bilden hier die „bare metal“ Systeme, welche ohne ein Betriebssystem auskommen (z.B. Embedded Systems). Betriebssysteme sind der Systemsoftware zugeordnet und gehören zur Grundausstattung eines Rechners. Betriebssysteme bestehen aus einer Vielzahl von Softwarekomponenten. Betriebssysteme steuern und kontrollieren die Ausführung von Programmen. Betriebssysteme übernehmen eine Mittlerfunktion zwischen Hardware und Anwendungsprogrammen, wie z.B.: - Erkennen und Weiterleiten der Eingaben und Ausgaben (Verwaltung der E/ A-Kanäle). - Verwaltung der Dateien auf externen Datenträger. - Verwaltung der Peripheriegeräte, wie Drucker, DVD-Laufwerk etc. <?page no="120"?> 3.3 Betriebssysteme 121 http: / / www.uvk-lucius.de/ informatik-ing Betriebssysteme unterstützen den gleichzeitigen Ablauf von verschiedenen Programmen (Multitasking). Sie unterstützen die gleichzeitige Nutzung durch mehrere Benutzer (Multiuser). Sie stellen dem Benutzer elementare Dienste zur Verwaltung der Ressourcen zur Verfügung. Zentrale Aufgaben des Betriebssystems sind somit: Betriebsmittelverwaltung Auftragsverwaltung Dateiverwaltung Benutzerverwaltung Kommunikation/ Netzwerk-Einbindung Abb. 66: Zentrale Aufgaben des Betriebssystems 8 Betriebssysteme unterstützen in Abhängigkeit von der Nutzerinteraktion unterschiedliche Betriebsarten: 8 Verändert nach Stahlknecht & Hasenkamp (2004): Einführung in die Wirtschaftsinformatik. Springer Verlag Betriebssystem Benutzerverwaltung Dateiverwaltung Kommunikation/ Netzwerk Auftragsverwaltung Betriebsmittelverwaltung Geräte (z.B. für E/ A) Speicher Prozessor Zudem Graphische Benutzeroberfläche (Graphical User Interface) zum Aufruf der Funktionen <?page no="121"?> 122 3 Software http: / / www.uvk-lucius.de/ informatik-ing Batch processing (Stapelverarbeitung): Aufträge werden vollständig inklusive der erforderlichen Eingabedaten und Anwendungen (Tasks) durch Benutzer beschrieben. Weitere Abarbeitung erfolgt ohne Nutzerinteraktion. Laufen unter Verantwortung des Rechenzentrums. Batch-Aufträge werden beispielsweise während der Arbeitszeit eingeplant, aber erst während der Nacht (wenige Benutzer) abgearbeitet. Diese Aufträge werden auch als Jobs bezeichnet. Beispiele: Aufträge zur Verarbeitung großer Datenmengen (Kontobewegungen in einer Bank, Verbuchung von Warenbewegungen, Drucken von Rechnungen für Hunderte oder Tausende von Kunden). Transaction processing (Dialogverarbeitung): Rechnersystem arbeitet im Dialog mit dem Benutzer. Auf eine Eingabe erhält der Benutzer vom System eine Antwort, dann nächste Eingabe. Entspricht der Arbeitsweise an Bildschirmarbeitsplätzen. Beispiel: Kontostand am Geldautomat, Textverarbeitung etc. Realtime processing (Echtzeitverarbeitung): Rechnersystem arbeitet in direkter Kopplung mit der Umwelt. Automatische Eingabe von Sensor- und Ausgabe von Steuerinformationen. Das Ergebnis einer Berechnung muss innerhalb einer definierten Zeitspanne vorliegen (Echtzeitbedingung). Nicht notwendigerweise besonders schnell, sondern garantiert rechtzeitig. Entspricht der Arbeitsweise eines Prozessrechners. Beispiel: digitaler Regelkreis, CNC-Steuerung. Innerhalb der Dialogverarbeitung können wir noch zwischen einem Mehrbenutzer- und einem Einbenutzerbetrieb differenzieren: <?page no="122"?> 3.3 Betriebssysteme 123 http: / / www.uvk-lucius.de/ informatik-ing Multi-User (Mehrbenutzerbetrieb): Gleichzeitige Nutzung des Rechnersystems durch zwei oder mehr Benutzer. Time-Sharing-Verfahren steuert die Zuordnung der Prozessorzeit an die einzelnen Benutzer. Mainframes und Mid-Range-Systeme sind in der Regel für den Mehrbenutzerbetrieb ausgelegt. Single User (Einbenutzerbetrieb): Nur ein Benutzer kann zu einem Zeitpunkt mit dem System arbeiten. Workstations und PCs sind in der Regel für den Einbenutzerbetrieb ausgelegt. Abhängig von der Anzahl der hardwareseitig verfügbaren Prozessoren müssen wir noch die Begrifflichkeiten des Mehrprogrammsowie des Mehrprozessorbetriebs definieren: Multitasking (Mehrprogrammbetrieb): Betriebssystem unterstützt den gleichzeitigen Ablauf von unabhängigen Programmen auf einem Prozessor (Prozess = Programm in Ausführung). Prozesse werden verzahnt abgearbeitet. Prozesse teilen sich den Prozessor (Prozessorzeit wird in gleich große Zeitintervalle zerlegt und abwechselnd den Aufträgen nach einem Time-Sharing-Verfahren zugeordnet). Priorisierung einzelner Prozesse ist möglich. Die meisten Systeme unterstützen Multitasking. Beispiel: Textverarbeitung mit MS Word ® im Dialog, wobei gleichzeitig ein anderes Dokument gedruckt wird. Multiprocessing (Mehrprozessorbetrieb): Betriebssystem unterstützt den Ablauf von einem Programm (Prozess) auf mehreren Prozessoren. <?page no="123"?> 124 3 Software http: / / www.uvk-lucius.de/ informatik-ing Erläuterung: Wenn nur ein Prozessor zur Verfügung steht, kann nur ein Prozess auf den Prozessor zugreifen. Mehrere Prozesse müssen verzahnt bearbeitet werden (Multitasking). Stehen mehrere Prozessoren zur Verfügung, können bei Multiprocessing Prozesse parallel bearbeitet werden. Abb. 67: Betriebsarten von Betriebssystemen im Überblick Der Kern (engl. kernel) ist der zentrale Bestandteil eines Betriebssystems, weitere Komponenten setzen auf dem Kern auf. Teil des Betriebssystems den das System als erstes lädt. Wichtige Aufgaben des Kernels sind: - Speicherverwaltung - Prozessverwaltung Prozesse und Aufträge: Ein Prozess bezeichnet die Ausführung eines Programms auf einem Prozessor unter Kontrolle des Betriebssystems. Prozesse werden vom Betriebssystem eindeutig gekennzeichnet (PID = Process Identifier). Man unterscheidet Anwendungs- und Systemprozesse. Anwendungsprozesse werden vom Betriebssystem infolge eines Auftrages eines Benutzers erzeugt. Betriebsarten batch processing interactive processing transaction processing realtime multi-user single-user <?page no="124"?> 3.3 Betriebssysteme 125 http: / / www.uvk-lucius.de/ informatik-ing Ein Auftrag eines Benutzers wird beispielsweise durch das Anklicken einer Anwendung oder Eingabe eines Kommandos zum Starten einer Anwendung (Programm) ausgelöst (in Windows ® auch als Task bezeichnet). Nach Erledigung eines Auftrages wird der Prozess beendet. 3.3.2 Betriebsmittelverwaltung Betriebsmittel (Speicher, Prozessor etc.) werden vom Betriebssystem zugeteilt. Dabei sollen folgende Ziele erreicht werden: Vermeidung von Doppelbelegungen. Rückgabe von Betriebsmitteln bei einem Programmabsturz. Zuteilung der Betriebsmittel jeweils an ein Objekt, z.B. Programm, Prozess, User ... Beispiele: Geräte / Devices exklusiv od. gleichzeitig (sharable) nutzbar. Vergabe von Plattenspeicher an Dateien. Bereitstellung und Zuteilung von Hauptspeicher an Prozesse. Vergabe von Bildschirmoberfläche; Programme erhalten Fenster auf Monitor. 3.3.2.1 Prozessverwaltung Unabhängig davon, ob ein Ein- oder Mehrbenutzerbetrieb oder ein Ein- oder Mehrprozessorsystem zugrunde liegt, konkurrieren alle Prozesse um die Ressource CPU. Eine zentrale Aufgabe des Betriebssystems ist die effiziente Verwaltung der anstehenden Prozesse, die eine angemessene Abarbeitung ermöglicht. Der Wechsel der Zuordnung von Prozessen zum Prozessor wird als Multiplexen des Prozessors bezeichnet, wobei der Scheduler der Teil des Betriebssystems ist, welcher die Zuteilung des realen Prozessors vornimmt (Aktivierung z.B. im zyklischen Interrupt vergl. Kapitel Hardware). Es existieren unterschiedliche Auswahlstrategien, die entscheiden, in welche Reihenfolge die Prozesse abgearbeitet werden. <?page no="125"?> 126 3 Software http: / / www.uvk-lucius.de/ informatik-ing First Come, First Served (FCFS): die abzuarbeitenden Prozesse werden in einer Warteschlange hintereinander aufgereiht; Prozesse werden vorne in der Warteschlange entnommen und abgearbeitet. Abb. 68: FCFS-Strategie zur Abarbeitung der Prozesse Bewertung: Wartezeiten sind nicht minimal; für Timesharing- Betrieb nicht geeignet. Shortest Job First (SJF): die Warteschlange wird nach der Länge der nächsten Rechenphase sortiert, wobei sich die Länge auf die nächste Rechenphase bis zur nächsten Warteoperation (z.B. Ein-/ Ausgabe) bezieht. Bewertung: SJF optimiert die mittlere Wartezeit; aufgrund der schwierigen Vorhersehbarkeit der genauen Länge der Rechenphase auch nicht ganz optimal. Priorisierung: Prozess mit höchster Priorität wird gewählt. Bewertung: manche Prozesse kommen ggf. nie zum Zuge, da immer andere mit höherer Priorität vorhanden sind. Wichtig für Echtzeitaufgaben, die in deterministischer Zeit bearbeitet werden müssen. Diese bekommen eine hohe Priorität zugewiesen. Round Robin Scheduling: die Auswahl der abzuarbeitenden Prozesse erfolgt reihum; ähnlich FCFS aber verdrängend; Prozessen wird jeweils eine Zeitscheibe für die Abarbeitung zugeteilt. Verfahren wird von den meisten Betriebssystemen genutzt. Bewertung: Wartezeit (Reaktionszeit) kann ggf. lang werden. <?page no="126"?> 3.3 Betriebssysteme 127 http: / / www.uvk-lucius.de/ informatik-ing Abb. 69: Prinzip des Round-Robin-Scheduling 3.3.2.2 Dateiverwaltung Die Dateiverwaltung ist diejenige Komponente des Betriebssystems, welche die Verwaltung des Speicherplatzes der Massenspeicher übernimmt. Dabei sind in der Hauptsache folgende Aufgaben zu lösen: Lokalisierung der Dateien auf einem Datenträger, die vom Benutzer oder einem Programm angefordert werden. Zuweisung von Speicherplatz an Programme, die neue Dateien anlegen möchten. Auflistung der Dateien und Verzeichnisse einzelner Benutzer und der zur Verfügung stehenden Datenträger. Bereitstellung von Zugriffsverfahren auf Dateien. Verwaltung von Zugriffsrechten. Die Verwaltung der Dateien mit Informationen über die Dateien basiert auf einem Dateisystem (z.B. New Technology File System (NTFS) bei Windows ® , exFAT). Definition Datei: Eine Datei ist eine Zusammenfassung von Informationen (Programme oder Daten), die logisch zusammenhängen und die an einem bestimmten Ort (Datenträger wie z.B. Festplatte) dauerhaft gespeichert wird. <?page no="127"?> 128 3 Software http: / / www.uvk-lucius.de/ informatik-ing Eine Datei besteht entweder aus einer unstrukturierten Folge von Zeichen oder aus gleich strukturierten Informationseinheiten, die als Datensätze bezeichnet werden. Diese setzen sich wieder aus Komponenten (Felder) zusammen. Die Interpretation des Datei-Inhalts ist Sache des bearbeitenden Programms (nicht des Betriebssystems). Ein Datei-Inhalt kann interpretiert werden als: Programmtext (Quellcode) in Programmiersprache, sonstiger Text, Zahlen, Binärcode (ausführbarer Maschinencode). Eine Datei hat einen Namen sowie zugehörige Attribute (Dateideskriptor), die für die Verwaltung der Dateien im Dateisystem erforderlich sind. Dateinamen sind unterschiedlich aufgebaut und unterliegen Restriktionen, die durch das Betriebssystem vorgegeben sind. Dateityp bestimmt betriebliche und strukturelle Eigenschaften einer Datei. Dateitypen legen fest, mit welchem Programm eine Datei bearbeitet werden kann. Dateideskriptor besteht aus mehreren Attributen. Art und Anzahl der gespeicherten Attribute hängen vom Dateisystem ab. Beispiele: - Datum der letzten Nutzung. - Datum der letzten Änderung. - Größe in KB. - Schreibschutz und Zugriffsrechte. - Adresse, wo sich die Datei auf dem Datenträger befindet. Hierarchisches Dateisystem: Logisch zusammengehörige Gruppen von Dateien werden zu Verzeichnissen zusammengefasst. Verzeichnissen können selbst wieder in Unterverzeichnisse gegliedert werden. <?page no="128"?> 3.3 Betriebssysteme 129 http: / / www.uvk-lucius.de/ informatik-ing Verzeichnisse (Directory) werden unter graphischen Benutzungsschnittstellen als Ordner (Folder) bezeichnet. Oberstes Verzeichnis wird als Wurzel (Root) bezeichnet. Lokalisierung von Dateien erfolgt über einen Pfadnamen. Absolute Pfadnamen beschreiben das Verzeichnis, in dem sich die Datei befindet, ausgehend von der Wurzel. Relative Pfadnamen beschreiben den Ort ausgehend vom aktuellen Verzeichnis. 3.3.3 Marktgängige Betriebssysteme Abb. 70: Produktbezeichnungen von Betriebssystemen 3.3.4 Virtuelle Maschinen (VM) Aufgrund der Vielzahl verfügbarer unterschiedlicher Rechnertypen, Betriebssysteme und Programmiersprachen kam bereits frühzeitig der Wunsch auf, mittels einer abstrahierenden Zwischenschicht eine Nachbildung der zugrundeliegenden Hardware zu entwickeln, die als gemeinsames Bindeglied zwischen den Programmiersprachen, Betriebssystemen und den konkreten Maschinensprachen fungieren. <?page no="129"?> 130 3 Software http: / / www.uvk-lucius.de/ informatik-ing In der Programmiersprache Java wurde dieses Konzept mit der Einführung einer rechnerunabhängigen virtuellen Java Maschine (JVM) umgesetzt. Systembasierte Virtuelle Maschinen erlauben demgegenüber den gleichzeitigen Betrieb mehrerer Betriebssysteme auf einem Rechner. Die abstrahierende Schicht zwischen dem realen Rechner und der Virtuellen Maschine wird auch als Hypervisor oder Virtual Machine Monitor bezeichnet. Das Gastsystem bzw. mehrere Gastsysteme laufen dabei auf einer virtuellen Hardware. Somit können verschiedenen Betriebssysteme und die jeweils zugehörigen Anwenderprogramme die zugrundeliegende Hardware gemeinsam nutzen (siehe Abb. 71). Abb. 71: Prinzip der Hardware-Virtualisierung Vorteile: Ressourcen des zugrundeliegenden Rechners können besser genutzt werden (v.a. in Rechenzentren mit leistungsfähiger Hardware). <?page no="130"?> 3.4 Software Engineering 131 http: / / www.uvk-lucius.de/ informatik-ing Paralleles Betreiben unterschiedlicher Betriebssysteme mit entsprechender Anwendungssoftware. Wirtschaftlicherer Betrieb als viele kleine Plattformen. Nachteile: Effizienzverlust, da ein Teil der Rechnerleistung für den Betrieb des Hypervisors verwendet wird. 3.4 Software Engineering Das Software-Engineering beschäftigt sich mit dem systematischen, ingenieursmäßigen Entwerfen, Entwickeln, Validieren, Anwenden und Warten von Software, und der Erforschung und Entwicklung der dazu notwendigen Strategien, Methoden, Verfahren und Werkzeugen. Aufgrund der zunehmenden Komplexität der Softwareprodukte sowie der gestiegenen Anforderungen an Leistungsfähigkeit und Zuverlässigkeit wurde eine systematische Software-Entwicklung erforderlich. Sie umfasst eine Vielzahl von Tätigkeiten, die über die eigentliche Codierung von Programmen weit hinaus reicht. Als systematische Vorgehensweise ist sie eine zentrale Voraussetzung für die erfolgreiche Produktentwicklung. Es existieren hierbei unterschiedliche Vorgehensmodelle, von denen nachfolgend einige ausgewählte kurz beschrieben werden. 3.4.1 Klassisches Phasenmodell (Wasserfallmodell) Im Wasserfallmodell werden fünf sequentiell aufeinanderfolgende Entwicklungsphasen unterschieden: [1] Analyse: Ermittlung und Dokumentation der Anforderungen an das zu entwickelnde Softwaresystem. Es wird festgelegt, was die Software leisten soll. [2] Design: Entwicklung eines Modells der Software, das festlegt, wie die Anforderungen in ein Programm umgesetzt werden sollen. Hierzu wird das zu entwickelnde Softwaresystem in einzelne Funktionsmodule zerlegt. <?page no="131"?> 132 3 Software http: / / www.uvk-lucius.de/ informatik-ing Abb. 72: Wasserfallmodell zur Software-Entwicklung [3] Implementierung: Erstellung eines lauffähigen Programms, das in seinem Ein-/ Ausgabeverhalten der Spezifikation entspricht. Diese Phase beinhaltet die eigentliche Codierung. [4] Test: Überprüfung des Ein-/ Ausgabeverhaltens des Softwaresystems anhand der Spezifikation; Sicherstellung der Korrektheit der erstellten Software. [5] Inbetriebnahme, Wartung und Betrieb: Archivierung von Daten, Änderungen und Erweiterungen des Softwaresystems werden geplant und durchgeführt, ... 3.4.2 Spiralmodell Aufgrund der mangelnden Flexibilität sequentieller Vorgehensmodelle wie z.B. das Wasserfallmodell existieren daneben auch nichtsequentielle Verfahren. Im Spiralmodell nach Boehm wird der Entwicklungsprozess als iterativer Prozess gestaltet. Es zählt demzufolge zur Gruppe des Rapid Prototyping. Problem Pflichtenheft Spezifikation Programm und Dokumentation Test- oder Abnahmeprotokoll Analyse „Verschrottung” Betrieb und Wartung Design Implementierung Test Planung Phase 1: Phase 4: Phase 3: Phase 2: Phase 5: <?page no="132"?> 3.4 Software Engineering 133 http: / / www.uvk-lucius.de/ informatik-ing Durch eine zyklische Wiederholung der einzelnen Phasen erfolgt eine schrittweise Erweiterung und Verbesserung eines Prototypen bis letztlich das fertige Produkt entwickelt ist. Evolutionäres Software-Engineering kann als Sonderfall des Spiralmodells angesehen werden. Abb. 73: Spiralmodell nach Boehm 3.4.3 Anforderungsspezifikation (Lastenheft) Das Lastenheft des Auftraggebers beschreibt die Zielsetzungen, Aufgabenstellungen und Eckdaten des Softwareprojektes und bedient sich dabei der Dokumentation des Istzustands mit anschließender Erläuterung des Sollzustands. Das fachliche Ergebnisdokument der Planungsphase wird oft als Lastenheft bezeichnet. Im Lastenheft wird definiert, was zu lösen ist und wofür etwas zu lösen ist. Kosten Zustimmung durch Überprüfung Prototyp 1 Prototyp 2 betriebsfähiger Prototyp Risikoanalyse Risikoanalyse Risikoanalyse Verifikation & Validation Verifikation & Validation Implementierung Feinentwurf Code Integration Test Testplanung Planung der Anforderungen Entwicklungsplan Lebenszyklusplanung Konzept für Betrieb Anforderungen Grobentwurf Fortschritte 2. Beurteilen von Alternativen Risikoanalyse 3. Entwicklung und Test 4. Planung des nächsten Zyklus Abnahme 1. Festlegen der Ziele <?page no="133"?> 134 3 Software http: / / www.uvk-lucius.de/ informatik-ing Es enthält die Zusammenfassung der Anforderungen aus Anwendersicht an ein Produkt/ eine Leistung einschließlich aller Randbedingungen. Diese sollten quantifizierbar und prüfbar sein. Das Lastenheft wird von einem Auftraggeber oder in dessen Auftrag erstellt und dient als Ausschreibungs-, Angebots- und Vertragsgrundlage. Bei kleinen Projekten wird oftmals bereits auf Basis eines Lastenheft mit der Entwicklung begonnen, zumal die Projekte dann häufig so überschaubar sind, dass das Lastenheft schon ausreichend sein kann. Zur Erstellung eines Lastenheftes existieren keine allgemeingültigen Vorgaben. Inhalt und Umfang sind i.d.R. von der Komplexität des Projektes sowie von der Zielsetzung abhängig. Nachfolgende Punkte listen eine mögliche Gliederung eines Lastenheftes auf: Aufgabenstellung Unternehmenscharakteristik Istzustand, d.h. Beschreibung der Ausgangssituation Sollzustand, d.h. Beschreibung der Aufgabenstellung Anforderungen an den Projektablauf Allgemeine Hinweise Anlagen 3.4.4 Pflichtenheft (Sollkonzept) Das Pflichtenheft enthält eine Zusammenfassung aller fachlichen Anforderungen, die das zu entwickelnde Software-Produkt erfüllen muss (siehe auch Anforderungsanalyse im Wasserfall- Modell). Es detailliert das Lastenheft und beschreibt ein Lösungskonzept. Im Pflichtenheft wird eine definierte Aussage über die Realisierbarkeit gemacht. <?page no="134"?> 3.4 Software Engineering 135 http: / / www.uvk-lucius.de/ informatik-ing Laut DIN 69901-5 umfasst das Pflichtenheft die „vom Auftragnehmer erarbeiteten Realisierungsvorgaben aufgrund der Umsetzung des vom Auftraggeber vorgegebenen Lastenhefts“. Die Adressaten sind: Auftraggeber (extern oder intern, z.B. Fachabteilung), Auftragnehmer (Projektleiter und die Systemanalytiker, Qualitätskontrolle, Benutzerrepräsentant) und/ oder ausgewählte potenzielle Benutzer. Wesentliche Inhalte eines Pflichtenheftes: Fachlicher Funktions-, Daten-, Leistungs- und Qualitätsumfang des Produktes. Beschreibung wie und womit die Anforderungen realisiert werden. Das Pflichtenheft ist verbindlich, d.h. es dient als Basis eines juristischen Vertrags und stellt somit die vertragliche Beschreibung des Lieferumfangs dar. Ebenso bildet es die Grundlage der Produktabnahme. Die im Pflichtenheft beschriebenen Anforderungen müssen realisierbar sein. Es darf keine vorweggenommenen Einschränkungen oder Entscheidungen der Entwurfs- und Implementierungsphase enthalten. Beispiel einer Gliederung eines Pflichtenhefts: Vorbemerkungen zum gewünschten Pflichtenheft Unternehmenscharakteristik Lösungsweg zur Erreichung des Sollzustands Projektablauf Allgemeine Hinweise Anlagen 3.4.5 Software-Qualität Software-Qualität ist die Gesamtheit von Eigenschaften und Merkmalen eines Software-Produkts oder einer Tätigkeit, die sich auf deren Eignung zur Erfüllung gegebener Erfordernisse bezieht [DIN ISO 9126]. <?page no="135"?> 136 3 Software http: / / www.uvk-lucius.de/ informatik-ing Abb. 74: Qualitätsmerkmale für Software nach ISO 9126 Erläuterung ausgewählter Qualitätsmerkmale: Funktionalität: Vorhandensein von Funktionen, die die definierten Anforderungen erfüllen. Zuverlässigkeit: Fähigkeit der Software, ihr Leistungsniveau unter festgelegten Bedingungen über einen festgelegten Zeitraum einzuhalten. Benutzbarkeit: Aufwand, der zur Benutzung erforderlich ist; individuelle Beurteilung der Benutzung durch eine festgelegte oder vorausgesetzte Gruppe von Benutzern. Effizienz: Verhältnis zwischen dem Leistungsniveau der Software und dem Umfang der eingesetzten Betriebsmittel unter festgelegten Bedingungen. Änderbarkeit: Aufwand, der zur Durchführung vorgegebener Änderungen notwendig ist (z.B. Korrekturen, Verbesserungen oder Anpassungen an Änderungen der Umgebung, der Anforderungen und der funktionalen Spezifikationen). Übertragbarkeit: Eignung der Software, von einer Umgebung in eine andere übertragen zu werden (z.B. neue organisatorische Umgebung, Hardware- oder Softwareumgebung). Qualitätsmerkmale Übertragbarkeit Änderbarkeit Effizienz Benutzbarkeit Zuverlässigkeit Funktionalität Interoperabilität Ordnungsmäßigkeit Sicherheit Angemessenheit Richtigkeit Wiederherstellbarkeit Fehlertoleranz Reife Bedienbarkeit Erlernbarkeit Verständlichkeit Verbrauchsverhalten Zeitverhalten Prüfbarkeit Stabilität Modifizierbarkeit Analysierbarkeit Konformität Austauschbarkeit Installierbarkeit Anpassbarkeit <?page no="136"?> 3.5 Literatur 137 3.5 Literatur Tanenbaum Andrew S. (2009): Moderne Betriebssysteme. 3., aktualisierte Auflage, Verlag Pearson Studium Sommerville, Ian (2012): Software Engineering. 9., aktualisierte Auflage, Verlag Pearson Studium Rupp, Chris & die SOPHISTen (2014): Requirements-Engineering und -Management. Aus der Praxis von klassisch bis agil. 6. Auflage, Carl Hanser Verlag München <?page no="138"?> http: / / www.uvk-lucius.de/ informatik-ing 4 Algorithmen Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: die Bedeutung des Begriffs des Algorithmus sowie deren Eigenschaften kennen; den Workflow vom Problem zum fertigen, ausführbaren Programm erläutern können; verschiedene Methoden zur Beschreibung von Algorithmen beherrschen; einen grundlegenden Überblick zu den unterschiedlichen Klassen von Programmiersprachen haben. In allen Lebensbereichen haben wir es mit Anweisungen (Vorschriften, Rezepten, Regeln etc.) zu tun, nach denen man etwas ausführen muss oder soll, um eine bestimmte Aufgabe zu lösen. Beispiele: Einnahme von Medikamenten nach Beipackzettel: Wenn vom Arzt nicht anders verordnet, 3-4 mal täglich 15-20 Tropfen am besten in warmem Wasser. Kinder nur die halbe Tropfenzahl. Wechseln eines Autoreifens: Packe das Werkzeug und das Reserverad aus. Entferne dann die Radkappe. Lockere anschließend alle Radmuttern. Setze dann den Wagenheber an und hebe den Wagen an. Schraube anschließend alle Radmuttern ab. Nimm das defekte Rad ab und setze das Reserverad an … Definition Algorithmus: Ein Algorithmus ist eine präzise, d.h. in einer festgelegten Sprache abgefasste, endliche Beschreibung eines allgemeinen Verfahrens (zur Lösung eines Problems) unter Verwendung ausführbarer elementarer (Verarbeitungs)-Schritte. <?page no="139"?> 140 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing Der Begriff Algorithmus wurde vom Namen des arabischen Gelehrten Al Chawarizmi (ca. 830 n. Chr.) abgeleitet. 4.1 Eigenschaften von Algorithmen Wichtige Eigenschaften von Algorithmen sind: Exaktheit: Es muss eine präzise Beschreibung vorliegen, damit eine eindeutige Verständigung über das Verfahren möglich ist. Endlichkeit (Finitheit): Die Beschreibung eines Algorithmus besitzt eine endliche Länge, d. h. er besteht aus einer begrenzten Anzahl von Anweisungen. Zudem darf ein Algorithmus zu jedem Zeitpunkt für seine Daten nur endlich viel Platz belegen. Terminierung: Der Algorithmus kommt zu einem Ende und führt nur endlich viele elementare Schritte aus. Determinismus: Der Algorithmus liefert für die gleichen Eingabewerte stets das gleiche Ergebnis, wobei die Folge der elementaren Schritte genau festgelegt ist. Es gibt aber auch Algorithmen, die bewusst nicht terminieren, z.B. den im Umfeld von Embedded Systems oft typischen „Endlosschleifen“ wie z.B. Regelalgorithmus beim Kühlschrank. Es ist also durchaus möglich, mittels einer endlichen Beschreibung (finit) einen Prozess zu definieren, der nicht nach endlicher Zeit beendet wird, also nicht terminiert. Ein Algorithmus ist unabhängig … von der Programmiersprache, in der er geschrieben ist, und vom Rechnertyp, auf dem er ausgeführt wird. Er ist demzufolge technologieinvariant. Programmiersprachen und Rechner sind nur Mittel zum Zweck einer automatischen Ausführung. „Für den Gast ist alleine das <?page no="140"?> 4.2 Vom Problem zum Programm 141 http: / / www.uvk-lucius.de/ informatik-ing Rezept bedeutend, nicht die Sprache, in der es formuliert ist oder das Alter des Kochs, der es ausführt“. 9 Beachte: Lösungen können von unterschiedlicher Qualität sein. Nicht immer existiert eine „effiziente“ / „beste“ Lösung. Es gibt einfache, schwierige und unlösbare Probleme. Nicht alle Probleme sind algorithmisch lösbar (Begriff der Berechenbarkeit). Einige mathematische Probleme haben sich hartnäckig einer algorithmischen Lösung widersetzt. Beispiele hierfür liefern: Die Vermutung von Fermat (1601-1665): es gibt keine natürlichen Zahlen n>=3, für die positive ganze Zahlen x, y und z mit x n + y n = z n existieren. (Großer fermat´scher Satz; Fermats letzter Satz) Diese Vermutung konnte erst 1994 vom Mathematiker Andrew Wiles bestätigt werden. Die Vermutung von Goldbach (1690-1764): Jede gerade Zahl n>=4 lässt sich als Summe von zwei Primzahlen darstellen. Diese Vermutung ist bis heute weder bewiesen noch widerlegt worden. 4.2 Vom Problem zum Programm Der Weg von der Problemstellung hin zum fertigen, ausführbaren Programm erstreckt sich über viele Einzelschritte und umfasst weit mehr als das Programmieren im engeren Sinne (gleich Codieren). Nachfolgende Grafik beschreibt anschaulich den Rahmen. 9 Scheidig, H. (1995): Einführung in die Informatik für Hörer aller Fakultäten. Skript zur Vorlesung, Universität des Saarlandes. <?page no="141"?> 142 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing Abb. 75: Vorgehensweise vom Problem zum Programm Folgende Liste von Arbeitsschritten zeigt einen möglichen Weg zur Programmerstellung auf (in Anlehnung an Scheidig 10 ): [1] Beschreibung des Problems: Beschreibung der Ein- und Ausgabedaten. Nebenbedingungen, Anforderungen, Sonderfälle. [2] Analyse des Problems: Erarbeitung einer Problemspezifikation, d.h. Umsetzung der informellen Beschreibung in eine Spezifikation. Häufig funktionale Spezifikation: - Menge gültiger Eingabegrößen (Definitionsbereich). - Menge der möglichen Ausgabegrößen (Wertebereich). - Beziehung zwischen Ein- und Ausgabegrößen. 10 Scheidig, H. (1995): Einführung in die Informatik für Hörer aller Fakultäten.- Skript zur Vorlesung, Universität des Saarlandes. Problem Lösungsidee analysieren/ abstrahieren Lösungsverfahren (Algorithmus) Programm programmieren/ codieren formalisieren Ausführung / Ergebnis testen/ debuggen (vgl. Kap. 5) (vgl. Kap4) <?page no="142"?> 4.2 Vom Problem zum Programm 143 http: / / www.uvk-lucius.de/ informatik-ing Typische Fragen: - Welche Informationen wurden angegeben? - Was wollen wir herausfinden? - Wie können wir eine Lösung charakterisieren? - Welche Informationen sind nicht vorhanden? - Sind Teilinformationen wertlos? - Welche Annahmen wurden gemacht, sind diese realistisch? - Gibt es ähnliche bereits gelöste Probleme? [3] Entwicklung eines Lösungsmodells: Nach präziser Formulierung eines Problems Erarbeitung eines abstrakten Modells i.d.R. als mathematisches Modell. Wichtiger Schritt im Gesamtlösungsprozess; Güte der Lösung hängt wesentlich von der Wahl des Modells ab. Modell wird insbesondere Vorstellungen über passende (mathematische) Strukturen / Objekte enthalten, mit denen wir arbeiten wollen. Folgende Forderungen an die Struktur sollten erfüllt sein: - Bequeme Repräsentation. - Einfacher Umgang und Manipulation. - Ausreichende Funktionalität. Grundsätzlich: dieser Schritt ist nicht automatisierbar; jedes Problem muss individuell untersucht werden. [4] Entwurf eines Lösungsverfahrens (Algorithmus): Nächster Schritt nach Festlegung auf ein Modell ist der Entwurf eines Algorithmus auf Basis dieses Modells. Wahl des Algorithmus ist verantwortlich für die Effizienz der Problemlösung. Zwei unterschiedliche Algorithmen können durchaus beide korrekt sein und die Lösung erbringen, obwohl sie sich in der Leistung stark unterscheiden. <?page no="143"?> 144 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing [5] Nachweis der Korrektheit des Algorithmus: Frage: Tut ein Algorithmus auch wirklich das, was wir von ihm verlangen? Übliche Vorgehensweise: Codieren des Algorithmus (Programmerstellung) und Erprobung anhand einer Vielzahl von Testfällen. Wenn diese Stichproben mit den Erwartungswerten übereinstimmen, sind wir versucht die Schlussfolgerung zu ziehen, dass der implementierte Algorithmus korrekt sei. Diese Vorgehensweise stellt jedoch nicht zweifelsfrei fest, dass unser Algorithmus unter allen Bedingungen korrekt arbeitet. Proof by exhaustion (= Beweis durch vollständiges Durchmustern; Britische Museumsmethode); einfachstes aller Beweisverfahren. Merke: Ein Test kann nur die Anwesenheit eines Fehlers feststellen, nie die Abwesenheit! Testen ist keine formale Methode; kein Beweis für Fehlerfreiheit. [6] Analyse der Effizienz: Für den Einsatz eines Algorithmus in der Praxis ist ein Urteil über seine „Güte“ wichtig. Wie groß ist die benötigte Rechenzeit (= Laufzeit)? Wie groß ist der Umfang des Speicherplatzes (allgemeiner: der Betriebsmittel), die benötigt werden? Bedeutung: - Sind Ressourcen für die Ausführung vorhanden? - Welche Teile benötigen den größten Teil der Laufzeit? Kann Laufzeit / Ressourcenbedarf verbessert werden? Mögliche prinzipielle Vorgehensweise: - Bestimme Anzahl der Schleifendurchläufe. - Bestimme die pro Schleifendurchlauf ausgeführten Elementaroperationen (z.B. arithmetische Operationen / Zuweisungen). <?page no="144"?> 4.2 Vom Problem zum Programm 145 http: / / www.uvk-lucius.de/ informatik-ing - Hieraus Feststellung des Gesamtaufwands. Genauere Überlegungen zu Kosten: z.B. Verdoppeln ist billiger als Addieren (s. Kapitel Hardware, Schieberegister). [7] Implementierung: Umsetzung des abstrakten Modells in einer geeigneten Programmiersprache. Die Korrektheit des Algorithmus muss auf das Programm übertragen werden. [8] Test und Fehlerbeseitigung („Debugging“): Testen eines Programms liefert maximal den experimentellen Nachweis, dass das Programm in ausgewählten Fällen das tut, was es soll. Testen ist kein Ersatz für den Nachweis der Korrektheit. Folgende Aktionen: Entdeckung, Lokalisierung und Beseitigung von Fehlern. [9] Dokumentation des Programms: Zu Beginn jeder Prozedur sollte kurz erläutert werden, was die Prozedur leistet (Ein-/ Ausgaben beschreiben). Insbesondere komplizierte Programmteile sind zu dokumentieren. Die Verwendung von Variablen - falls dies nicht offensichtlich ist - sollte beschrieben werden, ebenso nachträgliche Änderungen an einer Prozedur. Wichtig: Man sollte parallel zur Programmerstellung kommentieren! 4.2.1 Exkurs: Komplexität von Algorithmen Sei A ein Algorithmus, der ein Problemen löst, und sei n ein Maß für die Größenordnung eines speziellen Problems, beispielsweise die Dimension einer Matrix, Anzahl der Äste eines Netzwerks, Länge einer Zeichenkette, Umfang des zu verarbeitenden Inputs, … <?page no="145"?> 146 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing f A (n) sei eine „Aufwandsfunktion“, die die obere Schranke der Maximalzahl von Elementaroperationen angibt, die der Algorithmus A ausführen muss, um irgendein Problem der Größenordnung n zu lösen. Die O-Notation: Wird benutzt, um den oben skizzierten Sachverhalt zur Effizienz bzw. Komplexität auszudrücken. Eine Funktion f(n) für große n ist von der Ordnung g(n), in Zeichen: O(g(n)), wenn gilt: Ziel: Die Bezeichnung der Größenordnung der (Zeit-) Komplexität eines Alg. als Funktion einer Kenngröße - gewöhnlich der Eingabe - unter Abstraktion von unwesentlichen Details (Technologieparametern, Implementierungsdetails). Schreibweise: - O(log n): logarithmische Komplexität - O(n): lineare Komplexität - O(n 2 ): quadratische Komplexität - O(c n ): exponentielle Komplexität, c > 1 Beachte: I.d.R. kommt es nur auf die Größenordnung der Komplexität an, nicht auf die tatsächlichen Werte der eingehenden Konstanten! Bsp.: für 3+4*n+100n 2 gilt: O(n 2 ) Das Kriterium basiert auf der „worst case“-Laufzeit (Annahme des ungünstigsten Falls). <?page no="146"?> 4.2 Vom Problem zum Programm 147 http: / / www.uvk-lucius.de/ informatik-ing Abb. 76: Laufzeitverhalten verschiedener Sortierverfahren. Abbildung 76 stellt den Zusammenhang zwischen Größe der Eingabe (z.B. Anzahl von Zahlen) und benötigter Laufzeit zur Sortierung der Eingabedaten dar. Die Auswirkungen der Komplexität von Sortieralgorithmen kann an einem einfachen Beispiel verdeutlicht werden (vgl. Ernst et al. 2015 11 ): Bei der im Jahre 1987 durchgeführten Volkszählung in der Bundesrepublik Deutschland fielen ca. 60.000.000 Datensätze an. Ein Sortierlauf unter Verwendung von BubbleSort würde bei einem angenommen Zeitbedarf von einer Mikrosekunde pro Schlüsselvergleich 28 Jahre beanspruchen, bei einer Verwendung von Quicksort wären die Datensätze dagegen in nur 26 Minuten sortiert. 11 Ernst, H., Schmitt, J. & G. Beneken (2015): Grundkurs Informatik, Grundlagen und Konzepte für die erfolgreiche IT-Praxis. Eine umfassende, praxisorientierte Einführung. 5. Auflage, Springer Vieweg Verlag <?page no="147"?> 148 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing 4.3 Beschreibung von Algorithmen Algorithmen können mit unterschiedlichen Mitteln beschrieben werden. Am Beispiel des einfachen Sortierverfahrens „Bubble- Sort“ werden die unterschiedlichen Beschreibungsmethoden nachfolgend skizziert. Sortieralgorithmen sind in der Informatik auch heute noch von zentraler Bedeutung, da sie die Voraussetzung für ein schnelles Wiederfinden von Datensätzen bilden. Wir sprechen von einem internen Sortiervorgang, wenn alle Datensätze im Arbeitsspeicher gehalten werden können. Wenn externe Speicher als Zwischenspeicher in den Sortiervorgang einbezogen werden, von externem Sortiervorgang. 4.3.1 Umgangssprachliche (textuelle) Beschreibung Der Algorithmus liefert zu einer gegebenen Liste von (unsortierten) Zahlen im Ergebnis eine Liste, in der die eingegebenen Zahlen aufsteigend sortiert sind. Folgende Vorgehensweise (Bubble-Sort bzw. Sortieren durch Vertauschen): Beim Sortieren durch Vertauschen werden benachbarte Felder solange paarweise vertauscht, bis sich alle Felder in der richtigen Reihenfolge befinden. Dabei wird in jedem Schritt das aktuelle Element mit dem rechten Nachbarn verglichen. Falls die beiden Elemente das Sortierkriterium verletzen (z.B. größere Zahl steht vor kleinerer Zahl), werden sie getauscht. Am Ende des ersten Listendurchlaufs steht bei aufbzw. absteigender Sortierung das größte bzw. kleinste Element der Eingabe am Ende der Liste. Die Vergleichsphase wird solange wiederholt, bis die Eingabeliste vollständig sortiert ist. Dabei muss das letzte Element des vorherigen Durchlaufs nicht mehr betrachtet werden, da die restliche zu sortierende Eingabe keine größeren bzw. kleineren Elemente mehr enthält. <?page no="148"?> 4.3 Beschreibung von Algorithmen 149 http: / / www.uvk-lucius.de/ informatik-ing Abb. 77: Prinzip des Sortierens durch Vertauschen 4.3.2 Graphische Beschreibungsformen Es existieren verschiedene graphische Formen zur Beschreibung von Algorithmen. Alle Formen bzw. Notationen haben zum Ziel, den Ablauf des Lösungsweges, d.h. des Algorithmus, in einer leicht verständlichen Art zu präsentieren. Sie sind somit ein wichtiges Hilfsmittel beim Entwurf. Insbesondere veranschaulichen graphische Beschreibungen sehr gut Kontrollstrukturen, welche den Ablauf eines Algorithmus steuern. Beispielsweise ob bzw. wie oft und in welcher Reihenfolge Anweisungen ausgeführt werden sollen. Es existieren verschiedene Software-Hilfsmittel zur Umsetzung der graphischen Beschreibungen (z.B. MS Visio ® , LucidChart ® , Dia ® , yEd Graph Editor ® ). Prinzipiell ist hierfür jedoch jedes Zeichen- und Präsentationsprogramm geeignet. 4.3.2.1 Flussdiagramme / Programmablaufpläne Ein Flussdiagramm ist eine nach DIN 66001 normierte Methode zur graphischen Darstellung von Programmen. Die verschiedenen Darstellungselemente werden durch Pfeile miteinander <?page no="149"?> 150 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing verbunden. In der Regel sind sie für die Beschreibung kleinerer Programme oder Algorithmen sehr gut, für umfangreiche Programme jedoch nicht geeignet (werden bei zunehmender Komplexität unübersichtlich). Symbolauswahl Flussdiagramme: Abb. 78: Ausgewählte Symbole eines Flussdiagramms Abbildung 79 zeigt ein Flussdiagramm zu unserem Beispielalgorithmus, dem Sortierverfahren BubbleSort. Anfang Ende Richtung Programmablauf Operation Verzweigung ja nein Ein-/ Ausgabe <?page no="150"?> 4.3 Beschreibung von Algorithmen 151 http: / / www.uvk-lucius.de/ informatik-ing Abb. 79: Flussdiagramm zum Sortierverfahren Bubble-Sort 4.3.2.2 Struktogramme Struktogramme sind wie Programmablaufpläne ein graphisches Darstellungsmittel für Programme. Die Struktogramm-Notation wurde von Nassi und Shneiderman 1973 eingeführt (Nassi- Anfang Werte-Eingabe in ein Array data[..] n = len - 1 n > 0 ? i = 0 i < n ? data[i] > data[i + 1] merk = data[i] data[i] = data[i+1] data[i+1] = merk n = n - 1 i = i + 1 ja ja nein Ende nein Ausgabe der sortierten Werte nein <?page no="151"?> 152 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing Shneiderman-Diagramme). Zentrale Darstellungselemente heißen Strukturblöcke. Im Gegensatz zu Programmablaufplänen werden durch Struktogramme unnötige Sprunganweisungen vermieden. Jede Anweisung wird in einen Strukturblock eingetragen. Eine Folge von Anweisungen wird durch die Aneinanderreihung der Strukturblöcke dargestellt. Abb. 80: Ausgewählte Symbole nach Nassi-Shneiderman Abbildung 81 zeigt ein Struktogramm zu unserem Beispielalgorithmus, dem Sortierverfahren BubbleSort. Name Bedingung ja nein 1 2 … n = x solange Bedingung solange Bedingung einfacher Strukturblock Prozeduraufruf Auswahl/ einfache Verzweigung Mehrfachauswahl/ Fallunterscheidung kopfgesteuerte/ abweisende Schleife fußgesteuerte/ nicht abweisende Schleife <?page no="152"?> 4.3 Beschreibung von Algorithmen 153 http: / / www.uvk-lucius.de/ informatik-ing Abb. 81: Struktogramm zum Sortierverfahren Bubble-Sort 4.3.3 Beschreibung in einer Programmiersprache Schlussendlich kann ein Algorithmus sowohl in Form eines Pseudo-Codes als auch direkt im Code der jeweiligen Programmiersprache, z.B. C, formuliert werden. Nachfolgend finden Sie unseren Algorithmus in Pseudocode niedergeschrieben. Im Kapitel Grundlagen der Programmierung (Kap. 5.2.11) finden Sie den Algorithmus zudem in der Sprache C formuliert. Programm Pseudocode BubbleSort { / / Sortiert Zahlen in einem Datenfeld / / Dateieingabe in ein Datenfeld der Länge len Dateneingabe data[..]{ } Eingabe von Werten in ein Array data[..] For (n=len-1) (n > 0) For i=0 --> (i < n) data[i] > data[i + 1] ja nein merk = data[ i ] data[i] = data[ i+1] data[i+1] = merk i = i + 1 n = n - 1 Ausgabe der sortierten Werte <?page no="153"?> 154 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing / / Sortieren der Werte im Datenfeld data For (n = len-1) (n > 0) For i =0 (i < n) / / Vergleich benachbarter Feldinhalte If data[i] > data[i+1] then / / Tauschoperation benachbarter Feldinhalte merk = data[i] data[i] = data[i+1] data[i+1]= merk Endif Next i Next (n - 1) / / Ausgabe der sortierten Werte For i=1 n Ausgabe data[i] } 4.4 Programmiersprachen Programmiersprachen sind die Werkzeuge des Software-Entwicklers. Sie erlauben die Beschreibung von Objekten, die verarbeitet werden sollen wie z.B. Zahlen, Zeichenketten, Adressen, Bilder etc. Zudem ermöglichen Programmiersprachen die Beschreibung von Methoden auf diesen Objekten (z.B. Addiere zwei Zahlen, Vergleiche zwei Zahlen oder Zeichenkette, Sortiere eine gegebene Liste von Adressen nach Namen). Programmiersprachen steuern auch die Kommunikation zwischen verschiedenen Programmen. Anforderungen an Programmiersprachen: Die Sprache muss eine einfache knappe Darstellung des Algorithmus in dem Anwendungsbereich gestatten, für den sie entworfen ist. <?page no="154"?> 4.4 Programmiersprachen 155 http: / / www.uvk-lucius.de/ informatik-ing Die Sprache muss effizient und bedeutungsäquivalent in Maschinensprache übertragbar sein. in dieser Sprache geschriebene Programme müssen für den Menschen leicht verständlich sein, so dass sie einfach korrigiert und geändert werden können. Die Durchsicht des Programmtextes sollte zeigen, dass die Programmausführung tatsächlich den auszuführenden Prozess wiedergibt. Die Sprache sollte die Fehlermöglichkeiten bei der Umsetzung eines Algorithmus in ein Programm minimieren. Es existieren viele verschiedene Programmiersprachen für unterschiedliche Zwecke. Nachfolgend finden Sie eine Hierarchie der Programmiersprachen aufgelistet. Je näher wir an den natürlichen Sprachen sind, desto einfacher und verständlicher erscheint die Syntax. Abb. 82: Hierarchie von Programmiersprachen Zu jeder Programmiersprache wird ein Compiler (Übersetzer) oder ein Interpreter benötigt, der die Unabhängigkeit der Programmiertätigkeit von der Architektur der zugrundeliegenden Hardware realisiert. Der Compiler übersetzt das Programm als Ganzes in Maschinencode (Folge von Maschineninstruktionen). <?page no="155"?> 156 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing Die Effizienz der Programme hängt somit unter anderem auch von der Qualität des Compilers ab. Die Firma Intel hat beispielsweise jahrelang eine Abfrage des Herstellernamens der ausführenden CPU in ihren Compiler eingebaut. Damit nutzt der Compiler je nach identifiziertem CPU-Hersteller verschiedene Folgen von Maschinenbefehlen. Beispielsweise wurde bei eigenen CPUs die vorhandenen SSE2-Befehlssatzerweiterungen konsequent genutzt, bei Prozessoren der Konkurrenz wurde dagegen auf den Einsatz dieser optimierten SIMD-Befehle (obwohl auch vorhanden) verzichtet, weshalb die Konkurrenz in Benchmarktests oft schlechter dargestellt wurde 12 . Abb. 83: Aufgaben von Compiler bzw. Interpreter Ein Interpreter nimmt die ausführbaren Einheiten eines Programms in der durch die Kontrollstrukturen vorgegebenen Reihenfolge und führt diese sofort aus. Die Verwendung eines Interpreters ist demzufolge für den Benutzer sehr einfach und auch sehr flexibel. Dies wird jedoch mit dem Nachteil erkauft, dass die Interpretation sehr viel langsamer als die Ausführung eines compilierten Programms ist. Im Idealfall bieten Programmiersprachen sowohl einen Interpreter zum schnellen Austesten der Programme als auch einen Compiler zur finalen Erstellung eines ausführbaren Programms. 4.4.1 Grundelemente von Programmiersprachen Zentrale Elemente von Programmiersprachen bilden Konstanten, Variablen, Zuweisungsoperationen und Kontrollstrukturen. Konstanten bestehen aus einem Bezeichner (Namen) und einem festen Wert, der sich während der kompletten Pro- 12 Quelle: winfuture.de/ news,52310.html Compiler oder Interpreter Maschinencode Programm Eingabe Ausgabe <?page no="156"?> 4.4 Programmiersprachen 157 http: / / www.uvk-lucius.de/ informatik-ing grammausführung nicht verändert. Variablen besitzen ebenfalls einen Bezeichner. Dieser steht dabei für den Namen eines (logischen) Speicherplatzes, der bestimmte Werte aufnehmen kann. Variablen und Konstanten werden vom Programmierer festgelegt und sind i.d.R. von einem bestimmten Datentyp. Beachte: In allen Programmiersprachen existieren reservierte Wörter (Schlüsselwörter). Diese dürfen nicht als Bezeichner für Variablen oder Konstanten verwendet werden. Abb. 84: Eigenschaften von Variablen Zuweisungsoperationen weisen einen Wert explizit einer Variablen zu. Dieser wird dann in der entsprechenden Speicherzelle abgelegt. Einfache Anweisungen sind somit Zuweisungen zur Speicherung von Werten. Wir haben dabei folgende Grundstruktur: variable = Ausdruck Ein Ausdruck ist eine Kombination aus Variablennamen, Konstanten, Operatoren, Funktionsaufrufen etc., der zu einem Wert (Zahl, Zeichenkette, ...) ausgewertet werden kann. Das Zeichen = wird als Zuweisungsoperator bezeichnet und bewirkt, dass der Wert des Ausdrucks in der Variablen variable gespeichert wird. Beispiel einer einfachen Zuweisung: A = 10 / / d.h. die Variable A hat nach Ausführung den Wert 10 Beispiel mit arithmetischen Operationen: X = X + 1 Zinssatz = 3 * X <?page no="157"?> 158 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing Kontrollstrukturen: Die Lösung komplizierter Aufgaben basiert in der Regel auf der Wiederholung von Befehlssequenzen. Demzufolge führt ein Programm seine Aufgabe aus, indem es wiederholt eine Menge von Elementarschritten (Additionen, Subtraktionen, Vergleiche, ...) durchführt. Dabei kommen bestimmte Konstruktionen wie z.B. bedingte Anweisungen, Alternativen, Mehrfachauswahl oder auch Wiederholungsanweisungen (z.B. Schleifen) zum Einsatz. Da diese Strukturen den Ablauf des Algorithmus steuern bzw. kontrollieren, bezeichnen wir diese auch als Kontrollstrukturen. 4.4.2 Syntax und Semantik Die Definition einer Programmiersprache erfolgt durch Spezifikation ihrer Syntax und Semantik. Die Syntax beschreibt formal, wie Programme aus gegebenen Bausteinen wie Buchstaben, Zahlen und anderen Zeichen zusammengesetzt werden können. Die Syntax im Falle von Programmiersprachen ist somit ebenso zu verstehen wie im Falle einer natürlichen Sprache: Ihre Basis bildet eine Grammatik, die syntaktisch korrekte Sätze der Sprache definiert. Beispiele In einem arithmetischen Ausdruck gehört zu jeder öffnenden Klammer eine schließende Klammer. A = ((B + 10) * 3) / / Syntaktisch richtig A = ((B+10 * 3) / / Syntaktisch falsch In einer Zeile darf nur eine Anweisung stehen. B = 20 A = B + 10 / / Syntaktisch falsch B = 20 / / Syntaktisch richtig A = B + 10 / / Syntaktisch richtig Beachte: Ein Programm, welches syntaktisch korrekt ist, dessen Text also den syntaktischen Regeln entspricht, kann auch falsche Ergebnisse produzieren. Insbesondere können sogenannte semantische Fehler vorliegen. <?page no="158"?> 4.4 Programmiersprachen 159 http: / / www.uvk-lucius.de/ informatik-ing Die Semantik einer Programmiersprache gibt die Bedeutung der im Sinne der Syntax gültigen Programmkonstrukte an: Anwendungsbeispiel B = A + 3 Semantik: Zum Wert der Variablen A wird der Wert 3 addiert. Das Ergebnis wird der Variablen B zugewiesen Einer Variablen eines bestimmten Datentyps dürfen nur Werte von diesem Typ zugewiesen werden. z.B. Datentyp Integer: Variable X darf nur ganzzahlige Werte annehmen. X = 10 / / Richtig X = „Methoden“ / / Falsch Semantische Fehler entstehen unter anderem, wenn der entworfene Algorithmus falsch ist, oder wenn der entwickelte Algorithmus nicht korrekt in ein Programm überführt wurde. Folgendes Beispiel zeigt einen syntaktisch korrekten, semantisch aber nicht korrekten Satz: „Der gelbe Apfel ist ein schöner Strauch“. 4.4.3 Strukturierte Programmierung Ein Programm bearbeitet Daten mit Hilfe von Anweisungen. In der Praxis zeigt sich aber oft die Notwendigkeit, ein (größeres) Programm nicht als lineare Folge von Anweisungen zu entwickeln, sondern in Funktionseinheiten zu unterteilen, also zu strukturieren. Unterprogramme (Prozeduren, Funktionen) dienen dabei als Mechanismen der Strukturierung. Das Programm wird dabei in systematischer Weise so aus Unterprogrammen zusammengesetzt, dass diese mit einfachen Regeln zusammenarbeiten können. Diese Regeln der Zusammenarbeit sind so gewählt, dass ein Unterprogramm ohne größere Schwierigkeiten durch ein anderes ersetzt werden kann, wenn dies erforderlich ist. Aufgrund der Zerlegung des Gesamtprogrammes in Teilprogramme (Prozeduren) wird diese weit verbreitete Art der Soft- <?page no="159"?> 160 4 Algorithmen http: / / www.uvk-lucius.de/ informatik-ing wareentwicklung auch als prozedurale Programmierung bezeichnet. Prozedurale Programmiersprachen wie z.B. C, C#, Java oder Visual Basic unterstützen die strukturierte Programmierung. Neuere Programmierparadigmen wie z.B. die objektorientierte Programmierung bauen auf der strukturierten Programmierung auf und erweitern diese. Algorithmen zur Lösung eines Problems müssen präzise den auszuführenden Prozess beschreiben und zudem alle denkbaren Ausnahmen berücksichtigen. Bei sehr komplexen Problemstellungen ist daher eine systematische Vorgehensweise erforderlich, um bei der Entwicklung von Lösungsalgorithmen diese Kriterien auch tatsächlich erfüllen zu können. Es existieren hierfür zwei Strategien, der Top-Down-Entwurf und der Bottom-Up-Entwurf, die beide im Zusammenhang mit der strukturierten Programmierung zu sehen sind. Dabei verfolgt der Top-Down-Entwurf das Prinzip der schrittweisen Verfeinerung: [1] Zerlege den Prozess in Schritte, von denen jeder durch einen Algorithmus beschrieben werden kann. [2] Die Teilalgorithmen für die Schritte sind weniger komplex und einfacher als für den ursprünglichen ganzen Prozess. [3] Bei Bedarf kann ein Teilalgorithmus weiter verfeinert werden. [4] Das Verfahren wird solange fortgesetzt, bis alles ausreichend detailliert beschrieben ist. Durch die Zerlegung nimmt die Komplexität der Schritte ab und die Beschreibung der dazugehörigen Algorithmen wird einfacher. Bei dem Bottom-Up-Entwurf werden demgegenüber zuerst einfache und elementare Funktionen geschrieben, aus diesen werden anschließend die Funktionen der nächsthöheren Ebene zusammengesetzt. <?page no="160"?> 4.5 Literatur 161 http: / / www.uvk-lucius.de/ informatik-ing 4.4.4 Objektorientierte Programmierung Die objektorientierte Programmierung (OOP) ist ein Konzept, dessen Idee darin besteht, die Architektur einer Software an den Grundstrukturen der Realität auszurichten. Dabei wird ein Modell der realen Strukturen, bestehend aus den auftretenden Objekten und deren Abstraktionen in der Entwurfsphase aufgestellt. Aufgrund der immer größer werdenden Komplexität von Softwaresystemen bietet die Objektorientierung eine bewährte Methode, diese Komplexität in den Griff zu bekommen. Die Entwicklung der Objektorientierung als Konzept des Softwareengineering ist direkt mit der Entwicklung von objektorientierten Programmiersprachen verbunden gewesen. Aktuell weit verbreitete objektorientierte Sprachen sind C++, C# oder auch Java. Daneben existieren ältere Sprachen wie z.B. Smalltalk, aber auch moderne Programmiersprachen (z. B. Python), die sowohl die OOP als auch den prozeduralen Ansatz wie wir ihn mit der Sprache C in unseren Übungsbeispielen verwenden, vereinen. Objektorientierte Programmiersprachen unterstützen die oben genannte Programmstrukturierung mit einem speziellen Datentyp, dem Objekt. Neben der Einführung dieses Datentyps wurden auch neue Konzepte erforderlich, wie die Datenkapselung, die Einführung von Klassen (= Sammlung selbstständiger und wiederverwendbarer Programmkomponenten -> Klassenbibliotheken), Vererbung und Polymorphie. Details können der weiterführenden Literatur entnommen werden. 4.5 Literatur Nahrstedt, Harald (2012): Algorithmen für Ingenieure. Technische Realisierung mit Excel und VBA. Vieweg + Teubner Verlag, Wiesbaden Ottmann, T. & P. Widmayer (2012): Algorithmen und Datenstrukturen. 5. Auflage, Spektrum Akademischer Verlag Lahres, B. & G. Rayman (2009): Objektorientierte Programmierung. 2., aktualisierte und erweiterte Auflage, Rheinwerk Computing <?page no="162"?> http: / / www.uvk-lucius.de/ informatik-ing 5 Grundlagen der Programmierung Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: grundlegende Elemente (Kontrollstrukturen, Funktionen, Ein-/ Ausgabe) der Programmiersprache C verstehen und anwenden können; die Eigenschaften elementarer Datentypen und höherer Datenstrukturen (Arrays, Strukturen) benennen und sinnvoll einsetzen können; Auswirkungen der Sichtbarkeit und Lebensdauer von Variablen verstehen; einfache Algorithmen eigenständig entwickeln und in der Sprache C umsetzen; Prozessankopplung mit dem Arduino beherrschen und eine einfache Interfaceschaltung zur Erfassung von Umweltdaten analysieren können. Wer eine Programmiersprache erlernen möchte, fragt sich natürlich zuerst, welche Sprache ist die „Richtige“? Die Antwort darauf ist ohne Anwendungsdomäne und konkretes Programmierziel nicht seriös anzugeben. Zu vielfältig ist der Markt der verfügbaren Sprachen. Natürlich lässt sich ein berechenbares Problem prinzipiell mit jeder Sprache lösen. Allerdings gibt es deutliche Vor- und Nachteile, die eine Sprache für das jeweilige Anwendungsgebiet besonders interessant machen. Im Wirtschaftsbereich dominierte lange Zeit die Sprache Cobol, wohingegen FORTRAN als „die Programmiersprache“ des Ingenieurs gehandelt wurde. Durch das Internet haben sich in den letzten Jahren viele neue Sprachen (Java, Python, C#) entwickelt und andere sind bedeutungslos geworden. <?page no="163"?> 164 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Aus Sicht des angehenden Ingenieurs ist die jährlich im IEEE Spektrum (Institute of Electrical and Electronics Engineers, IEEE) erscheinende Übersicht interessant 13 . Tab. 20: Rangfolge Programmiersprachen, IEEE Spektrum Platz Sprache Punkte Einsatz 1 Java 100 Internet, Mobile, Anwendung 2 C 99.9 Mobile, Anwendung, Embedded 3 C++ 99.4 Mobile, Anwendung, Embedded 4 Python 96.5 Internet, Anwendung 5 C# 91.3 Internet, Mobile, Anwendung 10 MATLAB ® 72.4 Anwendungsprogrammierung Eine umfangreiche Analyse jeder dieser Sprachen würde den Rahmen dieses Buches deutlich sprengen und, bedingt durch den dynamischen Markt, auch sicher immer nur einen historischen Zustand widerspiegeln. Glücklicherweise ist die Wahl der ersten zu erlernenden Programmiersprache nicht so kritisch, wie es auf den ersten Blick scheint. Anders als bei natürlichen Sprache, wo die Kenntnis einer Fremdsprache oft nur wenig Vorteil beim Erlernen einer weiteren Sprache bietet, ist das bei Programmiersprachen durchaus anders. Wer das algorithmische Denken anhand einer Programmiersprache verinnerlicht hat, dem fällt der Umstieg auf eine andere Sprache später leichter. Ist das primäre Ziel z.B. eine möglichst tragfähige Grundlage zur späteren Lösung komplexer numerischer Problemstellungen 13 http: / / spectrum.ieee.org/ computing/ software/ the-2015-top-tenprogramming-languages <?page no="164"?> 5.1 Die Arduino-Plattform 165 http: / / www.uvk-lucius.de/ informatik-ing zu entwickeln, so bietet sich der Einstieg mit MATLAB ® als Sprache zum wissenschaftlichen Rechnen an. Durch die konsequente Ausrichtung der Sprach-Syntax auf eine Formulierung von Matrixproblemen gelingt die Berechnung und Darstellung typischer Ingenieuraufgaben mit erstaunlich wenigen Programmzeilen (Rapid Prototyping). Eine Einführung in die Programmierung mit MATLAB ® würde aber aufgrund des Sprachumfangs und der Komplexität der Entwicklungsumgebung den Umfang eines Kapitels dieses Buches deutlich übersteigen. Hier sei deshalb auf die weiterführende Literatur verwiesen. 5.1 Die Arduino-Plattform Gerade für Programmieranfänger ist es wichtig, eine Sprache und Programmierumgebung mit möglichst niedriger Komplexität und Einstiegsschwelle zu wählen. Weiterhin ist die intrinsische Motivation der Programmiertätigkeit (z. B. durch eigene Projektideen) ausschlaggebend für den Lernerfolg. All die Anforderungen werden in idealer Weise von der kostengünstig verfügbaren Arduino-Plattform erfüllt. Dieses Open- Source Projekt nutzt auf Softwareebene die Sprache C bzw. C++, wobei technische Detail wie Header-Dateien u. ä. dem Anfänger durch eine intuitive Oberfläche weitgehend verborgen bleiben. Auch die Zielhardware, d.h. der komplette Rechner auf dem das spätere Programm abläuft, ist in Form von Open- Source Hardware bzw. kommerziellen Boards leicht verfügbar. Gerade diese Kombination aus freier Entwicklungsoberfläche und kostengünstiger Hardware erlaubt den Einsatz der Plattform in ganz neuen Anwendungen. Eine Reihe von speziellen „Arduino-Befehlen“ (welche in Wirklichkeit C bzw. C++ Funktionen aus externen Programm-Bibliotheken sind), ermöglicht erstmals auch dem Programmieranfänger die einfache Realisierung hardwarenaher Funktionen. Sogar bisher nicht als besonders technikaffin eingestufte Nutzergruppen haben die Vorteile der Arduino-Welt für sich entdeckt und programmieren mit <?page no="165"?> 166 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Begeisterung künstlerische Objekte oder schneidern intelligente Kleidung. Kein Wunder also, dass die Arduino-Plattform auch im Umfeld der Ingenieure breite Anwendung findet. Tab. 21: Programmiersprachen für Embedded-Systems 14 Platz Sprache 1 C 2 C++ 3 Assembler 4 Arduino Unter dem Aspekt des zukünftig ubiquitär anzutreffenden Internet der Dinge (IoT) und den damit in allen Lebensbereichen geforderten Umgang mit „intelligenten Dingen“ lohnt es sich umso mehr, sich mit der hardwarenahen Programmierung dieser Anwendungen auseinanderzusetzen. Die folgenden Unterkapitel fokussieren deshalb das Ziel, eine eigene IoT-Anwendung zu entwickeln. Dazu werden wir uns zuerst mit der Arduino-Entwicklungsumgebung und der Hochsprache C befassen, um anschließend einfache Sensoren und Aktoren anzukoppeln. Den Abschluss bildet eine Beispielapplikation zur Messdatenerfassung inclusive Netzwerkprogrammierung und die Integration der Anwendung ins Internet (Kapitel 10). 5.1.1 Enwicklungsumgebung Wie bereits erwähnt, laufen die zukünftig zu entwickelnden Programme auf einer kostengünstigen Hardware, d.h. ein für wenige Euro erhältlicher Mikrocontroller führt den von uns entwickelten Programmcode in Form einer Sequenz von Maschinenbefehlen aus. Im Kapitel Hardware haben wir bereits die dazu erforderliche Minimalbeschaltung kennengelernt. Zur Pro- 14 http: / / spectrum.ieee.org/ computing/ software/ the-2015-top-tenprogramming-languages <?page no="166"?> 5.1 Die Arduino-Plattform 167 http: / / www.uvk-lucius.de/ informatik-ing grammentwicklung wird eine komfortable Entwicklungsumgebung (IDE) am PC genutzt. Diese kommuniziert über eine serielle Schnittstelle (USB) mit dem Mikrocontroller. Unter www.arduino.cc findet sich die jeweils neuste Version für verschiedene Betriebssysteme kostenlos zum Download. Alle folgenden Ausführungen beziehen sich auf die Version 1.6.9. unter Windows ® . Abb. 85: Arduino-Entwicklungsumgebung Nach Programmstart bietet die Entwicklungsumgebung eine komfortable Möglichkeit der Programmeingabe. Der Editor unterstützt den Programmierer durch verschiedene farbliche Hervorhebung von Befehlen und Kommentaren. Im Bedienfeld besteht die Möglichkeit, das Programm zu speichern , in Maschinecode zu übersetzen (überprüfen) und schließlich auf die Zielhardware zu übertragen (hochladen, upload) . Um zur Laufzeit des Programmes interaktive Nutzereingriffe zu ermöglichen, besitzt die Entwicklungsumgebung ein eingebautes Terminal-Programm (hier als Serial Monitor <?page no="167"?> 168 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing bezeichnet) . Etwaige Syntax-Fehler, Warnungen oder Probleme beim Hochladen werden im Statusbereich angezeigt. Bei der ersten Inbetriebnahme wird das verwendete Hardwareboard per USB mit dem PC verbunden. Das Betriebssystem erkennt das Interface und installiert eine virtuelle COM- Schnittstelle zur Kommunikation mit dem Board. Anschließend ist auf der Entwicklungsoberfläche der Menüpunkt „Werkzeuge“ aufzurufen und der entsprechende COM- Port unter „Port“ auszuwählen. Die Plattform unterstützt eine Vielzahl an unterschiedlichen Mikrocontrollern und Entwicklungsboards. Waren es ursprünglich vor allem megaAVR-Boards, so werden mittlerweile auch Mitglieder der ARM-Cortex oder der Intel-Familie integriert. Allen gemeinsam ist die Programmierung in C/ C++ und die für den Anwender transparente Kapselung der hardwarenahen Programmteile durch entsprechend einheitliche Arduino-Befehle. Kein Programmierer muss sich durch hunderte Seiten Datenblatt wühlen, um das Interface z.B. eines Analog-Digital-Wandlers oder einer seriellen Schnittstelle der jeweiligen Architektur anzusprechen. Bezüglich Ausstattung an Hauptspeicher, Programmspeicher und Interfacekomponenten wie DAC, ADC oder Netzwerkschnittstellen unterscheiden sich die unterstützten Boards dagegen zum Teil erheblich. 5.1.2 Arduino UNO und kompatible Boards Alle im Rahmen des ersten bis dritten Unterkapitels vorgestellten Programme sind auf einem bereits im Kapitel Hardware vorgestellten ATmega328 (z.B. Arduino UNO, Duemilanove Kosten ca. 20 Euro) ausführbar. Die weitaus meisten der im Internet verfügbaren Arduino-Programme und Informationen beziehen sich auf diesen Controller-Typ, weswegen dieses Board den idealen Ausgangspunkt für diejenigen Leser bildet, die sich später tiefer in die Details der Prozessankopplung und Interfaceprogrammierung einarbeiten möchten. Aufgrund der einfachen Austauschbarkeit im Fehlerfall sollte einem Board mit <?page no="168"?> 5.1 Die Arduino-Plattform 169 http: / / www.uvk-lucius.de/ informatik-ing Controller im DIL-Gehäuse (dual in-line package) der Vorzug gegeben werden (Mikrocontroller ca. 3 Euro). Da dieses Board direkt von der Entwicklungsumgebung unterstützt wird, ist unter „Werkzeuge“ im Untermenü „Board“ einfach das entsprechende Board auszuwählen. Die später vorgestellte Internet-Kopplung erfordert zusätzliche Hardware in Form einer WLAN-Schnittstelle. Diese lässt sich zwar prinzipiell auch bei Boards der megaAVR Familie nachrüsten (Arduino WiFi Shield) ist aber mit fast 100 Euro nicht mehr im low-cost Rahmen angesiedelt. Hier hat sich der Markt im Jahre 2015 aber grundlegend geändert. 5.1.3 NodeMCU Board Mit dem ESP8266 hat die Firma Espressif 2015 ein WLAN- SoC zu einem unschlagbaren Preis auf den Markt gebracht 15 . Für weniger als 4 Euro ermöglicht das briefmarkengroße System den WLAN- und damit den Internet-Zugang für wenig Geld. Da es sich dabei um eine komplett andere Rechnerarchitektur mit anderem Befehlssatz und Speicheraufbau handelt, sind die Boards auf Maschinenebene natürlich nicht kompatibel. Glücklicherweise wird aber auch diese Hardware seit kurzem von der Arduino-Umgebung unterstützt 16 . Tab. 22: Vergleich Mikrocontroller-Boards Arduino UNO (ATmega328) NodeMCU (ESP8266) Prozessor Atmel Tensilica Takt 16 MHz 80 MHz SRAM 2 kBytes 45 kBytes Flash 32 kBytes > 512 kBytes 15 https: / / espressif.com/ en/ products/ hardware/ esp8266ex/ overview 16 https: / / github.com/ esp8266/ arduino <?page no="169"?> 170 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Digital I/ O 14 + 6 5 V, max. 20 mA 17 3.3 V, max. 12 mA Analog Input 6 (0…5V) 1 (0…1V) VCC 5 V 3.3 V Solange sich der Programmierer auf die Sprache C(C++ und Arduino-Befehle beschränkt, sind die Architekturen weitgehend kompatibel. Einzig bei der elektrischen Ankopplung sind die jeweiligen Versorgungsspannungen (5V, 3.3V) zu beachten. Wir verwenden im Rahmen dieses Buches ein Entwicklungsboard vom Typ NodeMCU 17 , welches im Internet für ca. 10 Euro zu beziehen ist. Da es sich um ein sogenanntes „Third Party Board“ handelt, erfolgt die Anbindung an die Entwicklungsumgebung über den „Boardverwalter“. Dazu zuerst unter „Datei“ im Untermenü „Voreinstellungen“ die folgende Boardverwalter-URL eintragen: http: / / arduino.esp8266.com/ stable/ package_esp8266com_index.json. Anschließend im Menü „Werkzeuge“ im Untermenü „Board“ den „Boardverwalter“ anwählen und die esp8266 Toolchain installieren. Nach erfolgreicher Installation steht schließlich das NodeMCU-Board „NodeMCU 1.0 (ESP-12E Module)“ zur Anwahl zur Verfügung. 5.2 Grundlagen der C-Programmierung Mit dem GNU-C Compiler (gcc) steht für alle Boards der gleiche leistungsfähige Open-Source Compiler zur Verfügung, der z.B. am PC auch zur Übersetzung des Linux-Kernels eingesetzt wird. Je nach Zielsystem erzeugt dieser Compiler natürlich einen angepassten Maschinencode. Da wir uns auf die prozedurale Programmierung beschränken, sprechen wir im Folgenden von der Sprache C, obwohl wir auch Erweiterungen von C++ nutzen. 17 nodemcu.com <?page no="170"?> 5.2 Grundlagen der C-Programmierung 171 http: / / www.uvk-lucius.de/ informatik-ing Das Hauptprogramm ist in C eine Funktion mit dem Namen main(). Innerhalb des Funktionsrumpfes wird der zu implementierende Algorithmus abgearbeitet und das Programm anschließend beendet, d.h. es erfolgt ein Rücksprung ins Betriebssystem. Ist, wie beim Arduino-System, kein Betriebssystem vorhanden, so läuft die main()-Funktion üblicherweise in einer Endlosschleife: . In der Syntax der Sprache C hätte ein Arduino-Programm damit den folgenden Aufbau: 1: int main(void){ 2: setup(); / / Initialisierung 3: while (true) { / / Wiederhole endlos 4: loop(); / / abgearbeiteter Befehl in Schleife 5: } 6: return 0; / / Rücksprung Programmende 7: } Die links stehenden Zeilennummern dienen hier nur dem einfachen Bezug auf die jeweilige Zeile und sind nicht Bestandteil des Programmes. Einzelne Befehle werden in C durch ein Semikolon voneinander getrennt. Bei den Befehlen unterscheiden wir die Schlüsselwörter der Sprache C (im Editor später grün) und die beiden Arduino-Befehle setup() und loop() (im Editor später rot). Eine Liste der Befehle findet sich unter dem Menüpunkt „Hilfe“ im Unterpunkt „Referenz“. Die wichtigsten Schlüsselwörter werden aber im Rahmen der folgenden Abschnitte sukzessive eingeführt. Mit Hilfe weiterer externer Bibliotheken kann die Liste der Arduino-Befehle mühelos erweitert werden und so z.B. ganz spezielle Hardware unterstützt werden (s. DHT-Sensor in einem der folgenden Kapitel). Wiederhole endlos Scheifen-Anweisungen (loop) Initialisierungs-Anweisungen (setup) <?page no="171"?> 172 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Wir werden später auch eigene „Befehle“ in Form von C- Funktionen und eigene Variablen (Speicherorte) erstellen. Dabei gelten immer die folgenden Regeln für benutzerdefinierte Bezeichner: Jeder Name muss mit einem Buchstaben beginnen. Groß- und Kleinschreibung beachten. Sonderzeichen (z.B. Umlaute) und Leerzeichen sind nicht zulässig Reservierte Schlüsselworte dürfen nicht verwendet werden Welcher der folgenden Namen sind gültige Bezeichner? Var1, Beispiel_1, Beispiel 2, 3.Beispiel, Beispiel4+, Übung1, Programm5 Lösung: Var1, Beispiel_1, Programm5 Die innerhalb einer Zeile hinter dem Kommentarzeichen ‚/ / ‘ stehenden Zeichen dienen nur der ausführlichen Beschreibung und sind nicht Teil der abzuarbeitenden Befehle. Soll ein ganzer Textblock als Kommentar gelten, so wird der Text mit / * … */ eingefasst. Viele Befehle beziehen sich auf einen Befehlsblock, d.h. auf eine Folge von Einzelanweisungen. Diese Blöcke werden in C durch geschweifte Klammern {..} zusammengefasst. Bei der Programmerstellung sollte unbedingt eine Einrückung der Blöcke erfolgen, andernfalls wird das Programm komplett unlesbar, wie das folgende identische Programm zeigt: int main(void){ setup(); while (true) { loop(); }return 0; } Der Editor der Entwicklungsumgebung hilft durch automatische Einrückung bei der Strukturierung des Programmcodes. 5.2.1 Ein erstes Arduino Programm Da der Programmierer gemäß Arduino-Philosophie möglichst von unnötigem Overhead entlastet werden soll, entfällt die explizite Angabe der main() Funktion. <?page no="172"?> 5.2 Grundlagen der C-Programmierung 173 http: / / www.uvk-lucius.de/ informatik-ing Stattdessen braucht der Programmierer nur die beiden setup()- und loop()-Funktionen mit Leben zu füllen. Die Programmentwicklung startet also mit dem eigentlichen Hochsprachenprogramm (Endung .ino), im Arduino-Kontext auch Sketch genannt, bestehend aus den folgenden beiden Funktionen: 1: void setup() { / / Hauptprogramm, main() 2: Serial.begin(9600); / / Schnittstelle 9600 Baud 3: Serial.print("Versuche es selbst! "); / / Textausgabe 4: } 5: 6: void loop() { / / anschließend 7: } / / einfach Nichtstun In der Funktion setup() erfolgt üblicherweise alles, was nur einmalig notwendig ist. In unserem Anwendungsfall ist das z. B. die Initialisierung der seriellen Schnittstelle mit der Vorgabe einer bestimmten Übertragungsgeschwindigkeit (Baudrate). Danach folgt mittels Serial.print() eine Textausgabe auf die serielle Schnittstelle. Die loop() Funktion enthält den endlos ausgeführten Programmteil. In unserer Einführung verzichten wir aus didaktischen Gründen erst einmal bis auf weiteres auf die Verwendung von loop() und lassen diese Funktion leer. Abb. 86: Vom Arduino-Programm zur Ausführung Arduino- Programm C- Programm Object- Code ELF/ HEX Code Arduino-System gcc compiler Bibliotheken gcc linker Bootloader C-Präprozessor Board <?page no="173"?> 174 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Unser Arduino-Sketch ist für den Mensch recht leicht lesbar, muss aber schließlich als Maschinenprogramm auf der Zielhardware landen. Abbildung 86 verdeutlicht den dazu notwenigen Ablauf, der sich beim Arduino auf wenige Mausklicks reduziert. Wie bereits gesehen, werden die beiden Funktionen setup() und loop() von der Arduino-Umgebung unsichtbar zu einem normalen C-Hauptprogramm main() ergänzt. Innerhalb des Programms sind alle Befehle der Sprache C und die Arduino- Befehle zulässig. Das C-Programm wird dann von einem C- Präprozessor textlich bearbeitet. Dadurch lassen sich z. B. bestimmte Codeabschnitte schon vor der eigentlichen Übersetzung ausbzw. einblenden oder Textmakros erstellen. Dieses Tool ist vor allem zur vereinfachten Pflege von verschiedenen Softwareversionen für unterschiedliche Hardware sehr nützlich. Erst danach wird das C-Programm mittels gcc-Compiler in den Objektcode (einer Vorstufe des Maschinencodes) übersetzt. Der gcc-Linker bindet anschließend die Arduino-Befehle in Form von Bibliotheken hinzu und erzeugt damit den endgültigen Maschinencode. Im letzten Schritt schließlich erfolgt die Übertragung in den Flash-Speicher des Mikrocontrollers. Dieses geschieht über die serielle Schnittstelle mittels eines „Bootloader“ genannten Programmteils im Flash-Speicher des Mikrocontrollers. Ist der Code einmal übertragen, so wird er bis zur nächsten Programmierung auch über einen Reset hinaus im nicht flüchtigen Flash-Speicher gehalten. Für alle diese Schritte ist innerhalb der Arduino-Oberfläche nach Eingabe des Programmcodes nur ein Klick auf den Menüpunkt Hochladen ( ) notwendig. Anschließend erfolgt die Übersetzung, Übertragung und Programmausführung im Mikrocontroller. Im Falle unseres Programmes ist dazu der serielle Monitor zur öffnen . Dort erscheint der folgende Text: Versuche es selbst! Dabei ist die Ausgabe durchaus wörtlich zu verstehen. Programmieren kann man nur lernen, wenn man selber <?page no="174"?> 5.2 Grundlagen der C-Programmierung 175 http: / / www.uvk-lucius.de/ informatik-ing eigene Programme entwickelt. Ein einfaches Abschreiben der Codezeilen oder Durchlesen der Musterlösung bringt keinen nachhaltigen Erfolg. Da verhält es sich wie mit dem Fahrradfahren - nur vom Anschauen eines 7-Tage- Rennens wird niemand zum sicheren Radfahrer. Erst die ständige Übung und ggf. die blutigen Knie des Anfängers (in Form von Fehlermeldungen) führen zu einer sicheren Beherrschung des Gleichgewichts. Was einmal fast unmöglich aussah, wird dann nach kurzer Zeit praktisch unbewusst richtig gemacht. Wer einmal das algorithmische Denken gelernt hat, der kann sich in jede Programmiersprache leicht einarbeiten. Aber wie im richtigen Leben können Stützräder (in Form der Arduino-Philosophie) den Lernerfolg deutlich beschleunigen. 5.2.1.1 Häufige Fehlerquellen Wichtig ist, sich von Anfang an mit den möglichen Fehlerquellen auseinander zu setzen. Die erste Hürde ist das syntaktisch korrekte Programm, d.h. die Rechtschreibung (in unserem kleinen Beispiel vielleicht den Befehl serial.print klein geschrieben) oder die Grammatik (z.B. eine Klammer vergessen). Die Fehlermeldung und der rot hinterlegte Hinweis der betreffenden Zeile im Editor liefert meist schnell die Ursache. Ein vergessenes Semikolon beklagt der Compiler z.B. mit der Meldung: expected '; ' before '}' token Solche Meldungen sind zwar nervig, werden aber im Laufe der Einarbeitung in die Syntax der Programmiersprache immer seltener. Typische Syntaxfehler sind: fehlendes Semikolon zu viele Semikolon ( z.B. while(); oder if(); ) Nutzung von = (Zuweisung) statt == (identisch gleich) bei Vergleichsoperation falsch gesetzte Klammerung (z.B. bei Blöcken {}) <?page no="175"?> 176 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing falscher Datentyp oder vergessene Parameter bei einem Funktionsaufruf (z.B. der Aufruf der Funktion Serial.begin() ohne Übergabeparameter). Ist der Compiler schließlich zufriedengestellt, erfolgt das Hochladen über den COM-Port. Auch hier gibt es beliebte Fehlerquellen, z.B. dass der „Bootloader“ des Boards nicht antwortet oder der COM-Port nicht gefunden wird. Abhilfe schafft die Kontrolle des verwendeten Ports (notfalls über die Windows ® - Systemsteuerung), die Auswahl des richtigen Boards und ggf. das Abziehen und erneute Anstecken der USB-Verbindung. Sind diese Hürden genommen, so kann es immer noch sein, dass das Programm zur Laufzeit nicht die gewünschten Ausgaben erzeugt. Ursache falscher Ergebnisse sind in der Regel logische Fehler des Programmierers. Diese lassen sich nur durch sorgfältige Analyse des Algorithmus und ggf. dem Einbau von Testausgaben beheben. Hilfreich ist die Verwendung von grafischen Hilfsmitteln (Struktogramm) zur Gliederung und die exemplarische Abarbeitung des Algorithmus von Hand. Typische Fehler sind: Variablen nicht initialisiert (lokale Variablen verlieren mit jedem Aufruf ihren vorherigen Wert) Falsche Reihenfolge der Parameter bei Funktionen Verwendung von '/ n' statt '\n' (printf) Rangfolge bei logischen Ausdrücken, lieber eine Klammerung zu viel Vergessen, in der while-Schleife die Bedingung zu verändern -> Endlosschleife Falsche Indizierung beim Feldzugriff Fehler beim Typecast zur Wandlung float / integer Verlassen des Gültigkeitsbereich (z.B. sqrt(-1.0)) Teilen durch Null (x=0; y=2/ x) Zugriffs auf Feld außerhalb der definierten Feldgröße Überlauf bei Addition von Ganzzahlen <?page no="176"?> 5.2 Grundlagen der C-Programmierung 177 http: / / www.uvk-lucius.de/ informatik-ing Zum Test der eigenen Programme ist es wichtig, sich vorher über mögliche kritische Fälle Gedanken zu machen und diese dann anhand von Beispielen am fertigen Programm zu verifizieren. Hierzu sind an kritischen Stellen geeignete Ausgaben vorzusehen. Wir werden im Laufe des Kapitels noch die Möglichkeiten des Präprozessors zur Steuerung der Ausgabe kennen lernen. 5.2.2 Ausgabe mit printf Typischerweise beginnt fast jede Einführung in eine Programmiersprache mit der Ausgabe des "Hallo Welt"-Textes. Auch unser erstes Programm hat einen Text über die serielle Schnittstelle an den PC gesendet, der dort mittels Terminal-Programm auf dem Bildschirm ausgegeben wurde. Die Sprache C kennt dazu mit dem printf-Befehl eine mächtige Möglichkeit der formatierten Ausgabe. Im Gegensatz zum einfachen Serial.print() kann dieser Befehl nicht nur eine Zeichenkette ausgeben, sondern sorgt gleichzeitig für ein formatiertes Einfügen weiterer Informationen wie z.B. Zahlen oder Steuerbefehle in den Text. Leider ist dieser Komfort nicht kostenlos zu haben, so dass der printf-Befehl aufgrund seiner Flexibilität viel Speicherplatz benötigt. Das ist der Grund dafür, dass in der Arduino- Philosophie stattdessen standardmäßig der einfache print-Befehl zum Einsatz kommt. Mit Serial.print("Versuche es selbst! "); haben wir diesen bereits zur Textausgabe kennengelernt. Aber auch Zahlen lassen sich so ausgeben: Serial.print(4711); Serial.print(3.14); Soll also eine Messwertausgabe der Form „Die Temperatur beträgt 23 Grad Celsius“ generiert werden, so sind dazu mehrere hintereinander ausgeführte print-Befehle notwendig, die das ganze Programm sehr unübersichtlich aussehen lassen. In einem <?page no="177"?> 178 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing solchen Fall wird die formatierte Ausgabe mittels printf-Befehl oft bitter vermisst. Das ist auch die Motivation dafür, sich gleich zu Beginn des Programmierens mit printf zu befassen: Testausgaben z. B. von Variableninhalten gelingen viel leichter. Da unser Arduino diesen Befehl leider nicht kennt, müssen wir zuerst einen solchen Befehl nachrüsten. Wir integrieren dazu ab sofort ein paar wenige Codezeilen in unsere Arduino-Programme. Damit der zusätzliche Code wenig störend wirkt, fügen wir diese Zeilen hinter den loop()-Befehl ein. Über den inneren Aufbau des dadurch geschaffenen tprintf()-Befehl brauchen wir uns an dieser Stelle keine Gedanken zu machen. Dafür steht uns die Standardfunktionalität des printf zur Verfügung. Wir nennen unseren Befehl allerdings tprintf (tiny printf), da er als Einschränkung leider keine Gleitpunktzahlen ausgeben kann. Wird eine Gleitpunktzahl benötigt, müssen wir stattdessen doch auf Serial.print() zurückgreifen. Betrachten wir jetzt die durch tprintf() erzeugte Ausgabe auf das Standardausgabegerät (die serielle Schnittstelle): 1: void setup() { / / statt Hauptprogramm main() 2: Serial.begin(9600); / / Schnittstelle mit 9600 Baud 3: tprintf("Hallo Welt \n"); 4: tprintf("Aktuell sind es %i Grad Celsius \n",23); 5: tprintf("%i mal %i macht %s \n",3,2,"Sechs"); 6: } / / Ende Hauptprogramm 7: 8: / / diesen Teil fügen wir jetzt bei allen unseren Programmen an 9: void loop() { } / / loop-Funktion: Nichtstun 10: 11: / / Nachbildung der printf Funktion 12: void tprintf(const char *fmt, ... ){/ / tiny printf function 13: char buf[128]; / / Ausgabe limitiert auf 128 zeichen 14: va_list ap; / / speichere variable Übergabeliste 15: va_start (ap,fmt); / / initialisiere Übergabeliste 16: vsnprintf(buf, 128, fmt, ap); / / schreibe Ergebnis in puffer 17: va_end (ap); / / lösche Übergabeliste 18: Serial.print(buf); / / schreibe Ergebnis auf seriellen Port 19: } Ausgabe: Hallo Welt Aktuell sind es 23 Grad Celsius 3 mal 2 macht Sechs Anders als der beim print(), können beim tprintf() mehrere durch Komma getrennte Parameter übergeben werden, wobei <?page no="178"?> 5.2 Grundlagen der C-Programmierung 179 http: / / www.uvk-lucius.de/ informatik-ing der erste Parameter das Ausgabeformat steuert. Innerhalb dieser Formatangabe können neben Text auch Umwandlungszeichen (hier %i, %s) eingesetzt werden. Diese dienen als Platzhalter für die hinter dem Format angegebenen weiteren Parameter. Soll der Text in einer neuen Zeile beginnen, sorgt das Steuerzeichen '\n' für eine neue Zeile (Zeilenumbruch). Steuerzeichen sind Zeichen, die bei der Ausgabe nicht als solche angezeigt werden, aber z.B. die Position der folgenden Zeichen beeinflussen. Das Steuerzeichen '\n' sorgt z.B. für den Zeilenumbruch. Deutlich wird das Zusammenspiel am obigen Beispiel in Zeile 4: Hier steht das Umwandlungszeichen %i für eine ganze Zahl (integer), sie bei der Ausgabe an der entsprechenden Stelle in den Text eingefügt wird. Die einzufügende Zahl (hier 23) folgt als nächster Parameter hinter der Formatangabe. Abb. 87: Formatierte Ausgabe mit printf Tab. 23: Umwandlungs- und Steuerzeichen Zeichen Funktion %i, %li Ganzzahl (integer), 16-Bit / 32-Bit %c einzelnes Zeichen (char) %s Zeichenkette (char []) %f, %e Gleitpunktzahl (float), Festkomma / wiss. Darstellung \n Zeilentrenner (new line) \r Wagenrücklauf (carriage return) Text: Hallo, Integer: 123, mit Stellen: 123, Float: 1.23 tprintf("Text: %s, Integer: %i, mit Stellen: %5i, Float: %4.2f","Hallo",123,123,1.23); Befehl: Ausgabe: <?page no="179"?> 180 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Die Formatbreite, also die Anzahl der Stellen (incl. Vorzeichen, Dezimalpunkt) lässt sich durch eine zusätzliche Angabe hinter dem % beeinflussen. In der obigen Abbildung ergibt die Ausgabe mit %4.2f z.B. eine Ausgabe der Fließkommazahl mit einer Formatbreite von 4 Zeichen und 2 Nachkommastellen. Ohne Angabe werden automatisch so viele Stellen benutzt, wie notwendig sind. Bei Fließkommazahlen gibt die Zahl hinter dem Dezimalpunkt die Anzahl der Nachkommastellen an. Anwendungsbeispiel Messwertausgabe: Erzeugen Sie mit einem tprintf-Befehl die folgende Ausgabe: i. Messwert : x V k. Messwert : y V Für i, k, x, y sollen später beliebige Zahlen eingesetzt werden. Die Ausgabe der Werte x und y soll 4-stellig erfolgen. Lösung: tprintf("%i. Messwert : %4i V \n %i. Messwert : %4i",i,k,x,y); 5.2.3 Wiederholungsschleifen (for, while) Soll ein Text mehrfach ausgegeben werden, so ist der naive Ansatz offensichtlich: einfach mehrere printf-Anweisungen nacheinander ausführen: 1: void setup() { / / Hauptprogramm statt main() 2: Serial.begin(9600); / / Schnittstelle mit 9600 Baud 3: tprintf("Wiederholung macht den Meister \n"); 4: tprintf("Wiederholung macht den Meister \n"); 5: tprintf("Wiederholung macht den Meister \n"); 6: } 7: Hier folgt die Definition der loop() und tprintf() Funktion, d.h. der Programmcode aus den Zeilen 9-19 unseres letzten Programmes Bei häufiger Wiederholung wird allerdings sofort ein großer Nachteil dieses Vorgehens deutlich: der notwendige Programmcode kann sehr lang und unübersichtlich werden. Man stelle sich nur einmal die tausendfache Wiederholung der obigen Textausgabe vor. Aber auch die flexible Steuerung, d.h. die Berechnung der Anzahl der Durchläufe zur Laufzeit des Programmes ist damit unmöglich. Zur Änderung muss immer der Quellcode <?page no="180"?> 5.2 Grundlagen der C-Programmierung 181 http: / / www.uvk-lucius.de/ informatik-ing bearbeitet und anschließend übersetzt werden - ein überaus unpraktisches Unterfangen. Hier bietet die Sprache C mit ihren Kontrollstrukturen sehr elegante Möglichkeiten, die wiederholte Ausführung bestimmter Programmteile zu steuern. Dabei gibt es zwei grundsätzliche Möglichkeiten der Wiederholung: die Zählschleife und die Bedingungsschleife. Erstere wird gewählt, wenn die Anzahl der Durchläufe vor Schleifeneintritt bekannt ist. Letztere ist immer dann sinnvoll, wenn die Anzahl der Durchläufe vom Ergebnis der in der Schleife durchgeführten Berechnungen abhängt. Ein Beispiel wäre die Durchführung einer Nullstellensuche, die solange iteriert, bis eine bestimmte Genauigkeit der Lösung vorliegt. 5.2.3.1 Zählschleifen (for) Ist die Zahl der Durchläufe also vorher bekannt, so ist über eine Zählschleife eine elegante Lösung möglich: Übersetzt in den C-Code führt dies zu einer kompakten und übersichtlichen Beschreibung: 1: void setup() { / / Hauptprogramm, statt main() 2: Serial.begin(9600); / / Schnittstelle mit 9600 Baud 3: for (int i=1; i<=3; i=i+1) / / Wiederhole 3 mal, KEIN ; 4: tprintf("Wiederholung macht den Meister \n"); 5: } / / Ende des Hauptprogramms Der nächste dem Schlüsselwort for() folgende Befehl (oder Befehlsblock) wird wiederholt ausgeführt. Häufiger Fehler ist ein Semikolon direkt hinter der for() Anweisung. Dann wird ein leerer Block wiederholt - was dazu führt, dass die vom Programmierer vorgesehene Wiederholung scheinbar nur einmalig ausgeführt wird. Wiederhole von i = Start bis Ende, Schrittweite Schleifen-Anweisungen <?page no="181"?> 182 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Kennzeichnendes Merkmal ist das Schlüsselwort for, gefolgt von drei durch Semikolon getrennten Ausdrücken: Der erste Ausdruck wird einmal zu Beginn der Schleife ausgeführt. Im obigen Beispiel legen wir eine Zählvariable i an und initialisieren sie mit dem Wert 1 (int i=1). Eine Variable ist ein Speicherplatz mit beliebigen symbolischen Namen (hier ‚i‘, s. Regeln für benutzerdefinierte Bezeichner) und dient der Ablage von Informationen. Interpretieren wir für einen Moment den Hauptspeicher als Kommode (mit einzelnen Schubladen als Speicherplatz), so reservieren wir damit eine Schublade und kleben einen Aufkleber mit dem Namen ‚i‘ darauf. Ab diesem Moment können wir die Speicherstelle per Namen (dem Bezeichner) ansprechen. Da die Schublade vielleicht noch Reste aus der letzten Nutzung enthalten kann, räumen wir den Platz und legen dort per Zuweisung die binäre Darstellung der Zahl 1 ab. Wann immer in unserem Programm jetzt der Bezeichner ‚i‘ auftaucht, weiß der Compiler, in welcher Schublade er die Information findet, bzw. wo er die Information ablegen soll. Bei einer Zuweisung der Form i = … wird der rechts vom Gleichheitszeichen stehende Ausdruck ausgewertet und das Ergebnis dann in der Variable (in der Schublade) i abgelegt. Je nach Art der abzulegenden Information benötigt die Variable unterschiedliche räumliche Dimension (d.h. Anzahl Bytes). Die Information, welche Größe benötigt wird, erhält der Compiler durch die Angabe eines Datentyps (hier int, für integer, vorzeichenbehaftete ganze Zahl). Das wichtige Thema Variablen und Datentypen wird später noch ausführlich behandelt. Der zweite Ausdruck beschreibt die Schleifenbedingung, d.h. wie oft die Schleife zu durchlaufen ist. Diese Bedingung wird bei jedem Durchlauf ausgewertet. Solange die Bedingung wahr ist, erfolgt ein erneuter Schleifendurchlauf. Andernfalls wird mit der der Schleife folgenden Anweisung <?page no="182"?> 5.2 Grundlagen der C-Programmierung 183 http: / / www.uvk-lucius.de/ informatik-ing fortgefahren. Hier testen wir die Zählvariable und wiederholen solange diese kleiner gleich 3 ist (i<=3). Nach Ausführung eines Durchlaufs wird schließlich der letzte Ausdruck ausgeführt, d.h. bei uns die Zählvariable inkrementiert (i=i+1). Dazu wird der Inhalt der Inhalt aus der Speicherzelle geholt, eine 1 hinzu addiert (s. Kapitel Hardware, Addierwerk) und das Ergebnis anschließend wieder in der Speicherzelle abgelegt. Eingefleischte C-Programmierer verwenden für die Addition einer Eins lieber den aus zwei Pluszeichen bestehenden Inkrement-Operator (i++). Um den Blick auf das Wesentliche zu lenken, wird der Programmcode in den folgenden Beispielen auf die reine Zählschleife beschränkt. Zur Ausführung ist der restliche Code entsprechend zu ergänzen. Die Ausgabe von i verdeutlicht den Ablauf der Schleife: 1: for (int i=1; i<=3; i=i+1) 2: tprintf("Die %i. Wiederholung macht den Meister \n",i); Ausgabe: Die 1. Wiederholung macht den Meister Die 2. Wiederholung macht den Meister Die 3. Wiederholung macht den Meister Durch Modifikation der drei schleifenbestimmenden Ausdrücke lassen sich beliebige Zählreihenfolgen erzeugen. Dazu sei angeraten, die folgenden Schleifen einmal von Hand auf einem Blatt Papier durchzuspielen und mit den Ausgaben zu vergleichen: 1: for (int i=2; i<=6; i=i+1) 2: tprintf("%i",i); 3: 4: Serial.print(" "); / / Abstand 5: for (int i=9; i>0; i=i-1) { 6: tprintf("%i",i); 7: } 8: Serial.print(" "); / / Abstand 9: int n=6; 10: for (int k=1; k<=n; k=k+2) { 11: tprintf("%i",k); 12: } Ausgabe: 23456 987654321 135 <?page no="183"?> 184 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Anwendungsbeispiel Summenbildung Aus Ingenieursicht sind Zählschleifen sehr praktisch z. B. zur Umsetzung einer Summe oder eines Produktes: ∑ = = n i i S 1 2 1: int n=6,S=0; 2: for (int i=1; i<=n; i=i+1) 3: S=S+i*i; 4: tprintf("%i",S); Ausgabe: 91 Hinweis: Die schleifenbestimmenden Ausdrücke sind nicht auf die Verwendung von ganzen Zahlen beschränkt. Beispielsweise können auch Gleitpunktzahlen (float) als Schleifenzähler genutzt werden. 5.2.3.2 Bedingte Wiederholungen (while) Mehr Flexibilität bieten bedingte Wiederholungen in Form der whilebzw. do while-Schleife. Je nach Schlüsselwort wird hier am Anfang (while) oder am Ende (do while) der Schleife eine Bedingung geprüft. Ist die Bedingung wahr, so wird in der Schleife fortgefahren, andernfalls der Durchlauf beendet. Betrachten wir als erstes Beispiel die Implementierung einer alternativen Zählschleife mit Hilfe der while.- 1: int i = 1; 2: while (i<=3) { / / Test zu Beginn 3: tprintf("%i",i); / / Ausgabe 4: i = i+1; / / Inkrement 5: } bzw. der do while-Scheife: 1: i = 1; 2: do { 3: tprintf("%i",i); / / Ausgabe 4: i = i+1; / / Inkrement 5: } while (i<=3); / / Test am Ende Wiederhole solange Bedingung wahr Schleifen-Anweisungen Wiederhole solange Bedingung wahr Schleifen-Anweisungen <?page no="184"?> 5.2 Grundlagen der C-Programmierung 185 http: / / www.uvk-lucius.de/ informatik-ing In beiden Fällen ist die Ausgabe gleich: 123 Ein beliebter logischer Fehler ist die fehlende Veränderung der Abbruchbedingung innerhalb der Schleife. In unserem Fall das Heraufzählen des Index i. Ein solcher Fall mündet bei der Ausführung u. U. in einer Endlosschleife. Zur Steuerung der Abbruchbedingung können verschiede logische Ausdrücke genutzt werden. Diese liefern in der Sprache C einen Wahrheitswert in Form einer ganzen Zahl. Dabei wird die 0 als logisch „falsch“ und alle Zahlen ungleich 0 als logisch „wahr“ interpretiert. Logische Ausdrücke werden mit Vergleichs- und Logischen Operatoren gebildet. Tabelle 24 gibt einen Überblick über die möglichen Vergleichsoperatoren: Tab. 24: Vergleichsoperatoren Vergleichsoperator Bedeutung == identisch gleich ! = ungleich <= kleiner gleich >= größer gleich < kleiner > größer Schon im ersten Kapitel haben wir die Bedeutung des Rechnens mit Wahrheitswerten kennengelernt. Unsere logischen Ausdrücke lassen sich also auch mit Logischen Operatoren zu komplexen Ausdrücken verknüpfen: Tab. 25: Logische Verknüpfungen Logischer Operator Bedeutung && Logisch UND || Logisch ODER ! Negation <?page no="185"?> 186 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Soll die Iteration beispielsweise nur durchgeführt werden, solange der Inhalt der Variable i größer 5 und gleichzeitig der Inhalt der Variable k ungleich Null ist, käme die folgende Schleifenbedingung zum Einsatz: while ((i>5) && (k! =0)) / / Obwohl es ähnlich wie bei der „Punkt vor Strichrechnung“ eine klare Rangfolge der Operatoren gibt, ist dem Anfänger angeraten, die Reihenfolge durch Klammerung direkt vor zu geben. Anwendungsbeispiel: Quadratwurzel Wie bereits mehrfach angedeutet, ist ein Haupteinsatzgebiet in der Ingenieurpraxis die iterative Berechnung z.B. zur Lösung von Gleichungssystemen. Als einfaches Beispiel sei hier die iterative Berechnung der Quadratwurzel 18 einer Zahl dargestellt: 1: float zahl = 2.; / / Wurzel der Zahl gesucht 2: float wurzel = 1.; / / Erste Schätzung 3: float hilfsgroesse,fehler; / / Hilfsgroessen 4: do { / / wiederhole Iterationsfomel 5: hilfsgroesse = wurzel; / / Merker letze Schätzung 6: wurzel = 0.5*(wurzel+zahl/ wurzel); / / Update (Heron-Verf.) 7: fehler = abs(hilfsgroesse-wurzel); / / Verbesserung 8: } while (fehler > 0.01); / / Genauigkeit zwei Stellen 9: Serial.print(wurzel); / / Ausgabe Ergebnis float Ausgabe 1.41 Anwendungsbeispiel: Warteschleife Im Umfeld der eingebetteten Systeme findet die while-Schleife auch häufig Verwendung beim Warten auf ein externes Ereignis. In unserem folgenden Beispiel ist dies die Eingabe eines Zeichens über den seriellen Monitor, oder später das Eintreffen einer Antwort aus dem Internet. Dazu ist nach dem Start des Programmes in der oberen Eingabezeile ein Textzeichen einzugeben und abzusenden. 1: int s = 0; 2: tprintf("Zeichen eingeben"); 18 http: / / www.mathepedia.de/ Heron-Verfahren.aspx <?page no="186"?> 5.2 Grundlagen der C-Programmierung 187 http: / / www.uvk-lucius.de/ informatik-ing 3: while (Serial.available() < 1) { / / solange kein Zeichen gesehen 4: delay(1000); / / warte 1000 ms (1 Sekunde) 5: tprintf("."); / / Ausgabe Lebenszeichen 6: s++; / / ist dasselbe wie s=s+1; 7: } 8: char z = Serial.read(); / / Zeichen Schnittstelle einlesen 9: tprintf(" Das Zeichen %c ist nach %i s eingetroffen", z,s); Ausgabe: Zeichen eingeben .. Das Zeichen A ist nach 2 s eingetroffen In Zeile 3 wartet das Programm darauf, dass ein Zeichen im Eingangspuffer der seriellen Schnittstelle zur Verfügung steht. (Arduino-Befehl Serial.available()). Mit jeder Sekunde Wartezeit, für die es mit dem delay() auch einen Arduino-Befehl gibt, wird ein Sekundenzähler inkrementiert. Ist das Zeichen schließlich verfügbar, so wird die Schleife verlassen und die insgesamt verstrichene Zeit sowie das Zeichen ausgegeben. 5.2.4 Fallunterscheidungen (if … else) Die bedingte Schleife wiederholt eine Anweisung solange eine Bedingung erfüllt ist. Programmieranfänger verwechseln diese Kontrollstruktur häufig mit einer bedingten Verzweigung, d. h. der Abarbeitung eines Programmzweiges in Abhängigkeit von einer Bedingung. Für diese Fallunterscheidung besitzen die meisten Programmiersprachen mit if ... else eine entsprechende Kontrollstruktur zur Ablaufsteuerung: Zur Erläuterung hier ein kleines Programm zur Ausgabe der Ziffern 1 bis 9. Hierbei wird nur die Ziffer Vier als Text ausgegeben, alle andern als Zahl: 1: for (int i=1; i<10; i=i+1) { / / Zählschleife i = 1..9 2: if (i == 4) { / / Falls i gleich 4 ? 3: tprintf(" Vier "); / / dann Text ausgeben 4: } else { / / in allen andern Fällen 5: tprintf("%i",i); / / Ziffer ausgeben Anweisungs- Block A Bedingung erfüllt ? ja nein Anweisungs- Block B <?page no="187"?> 188 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing 6: } / / Ende if 7: } / / Ende Schleife Ausgabe: 123 Vier 56789 In Zeile 2 erfolgt der Test, ob der Inhalt der Zählvariable i identisch gleich 4 ist. Ist das Ergebnis der Operation wahr, dann wird der Text ausgegeben. In allen anderen Fällen durchläuft das Programm die Zeile 5 und damit die Ausgabe als Ziffer. Dabei ist der else-Zweig immer optional, kann also bei Bedarf (falls es in dem Alternativblock keine auszuführenden Anweisungen gibt) auch entfallen. Interessant wird die Fallunterscheidung vor allem bei geschachtelten Abfragen: 1: for (int i=1; i<10; i=i+1) { / / Zählschleife i = 1..9 2: if (i == 1) { / / Falls i gleich 1 ? 3: tprintf("Eins "); / / dann Text ausgeben 4: } else { / / in allen andern Fällen 5: if (i==2) { / / Test auf i gleich 2 ? 6: tprintf("Zwei "); / / dann Text ausgeben 7: } else { / / andernfalls 8: if (i==3) { / / Test auf i gleich 3 ? 9: tprintf("Drei "); / / dann Text ausgeben 10: } else { / / sonst 11: tprintf("%i",i); / / Ziffer ausgeben 12: } / / Ende if i==3 13: } / / Ende if i==2 14: } / / Ende if==1 15: } / / Ende Schleife Ausgabe: Eins Zwei Drei 456789 An diesem Beispiel wird offensichtlich, welche enorme Bedeutung die Einrückung der Blöcke besitzt. Im Editor ist die Strukturierung glücklicherweise einfach. Bewegt man den Cursor auf eine der geschweiften Blockklammern, so wird die korrespondierende Klammer deutlich hervorgehoben. 5.2.5 Mehrfach-Fallunterscheidungen (switch) Am obigen Beispiel wird aber auch klar, dass bei einer umfangreichen Mehrfachauswahl die Situation trotz Einrückung leicht unübersichtlich wird. Hier bietet die Sprache C mit der switch- Anweisung eine weitere Möglichkeit der Strukturierung: <?page no="188"?> 5.2 Grundlagen der C-Programmierung 189 http: / / www.uvk-lucius.de/ informatik-ing Unser obiges Programm gewinnt so deutlich an Übersicht: 1: for (int i=1; i<10; i=i+1) { / / Zählschleife i = 1..9 2: switch (i) { 3: case 1: tprintf("Eins "); / / Fall 1 4: break; 5: case 2: tprintf("Zwei "); / / Fall 2 6: break; 7: case 3: tprintf("Drei "); / / Fall 3 8: break; 9: default: Serial.print(i); / / sonst 10: } / / 11: } / / Ende Schleife Ausgabe: Eins Zwei Drei 456789 In Abhängigkeit von i werden alle Befehle von der entsprechenden case-Leiste bis zur nächsten break-Anweisung ausgeführt. Taucht die Alternative nirgends in der case-Leiste auf, so erfolgt die Ausführung des default-Zweigs. 5.2.6 Elementare Datentypen und Ausdrücke Nachdem wir schon einige Variablen genutzt haben, wird es Zeit, etwas tiefer in die Datentypen und Operationen einzusteigen. Wie bei den meisten Programmiersprachen muss eine Variable vor der ersten Nutzung definiert werden, d.h. der Compiler reserviert den notwendigen Speicherplatz und führt ggf. eine Initialisierung durch. Dies geschieht durch Angabe des Datentyps und des Variablennamens. Genau genommen wird zwischen Definition und Deklaration unterschieden: eine Deklaration macht die Variable bekannt eine Definition reserviert den Speicherplatz Bei Nutzung externer Bibliotheken kann eine Variable z.B. dort schon definiert sein und muss in unserem Programm nur noch bekannt gemacht werden. Dazu verwendet die Sprache C vor der Angabe des Datentyps das Schlüsselwort extern. Auswahl ? Fall 1 sonst Block 5 Fall 2 Fall 3 Fall 4 Block 4 Block 3 Block 2 Block 1 <?page no="189"?> 190 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Ohne vorherige Deklaration darf die Variable nicht verwendet werden. Eine goldene Regel der Programmerstellung ist deshalb, alle Variablendefinitionen an den Anfang des Programms zu legen. Erst danach werden die Variablen genutzt. Allerdings erlaubt die Sprache C prinzipiell die Definition an beliebiger Stelle im Programm, so wie wir es in Zeile 4 des folgenden Listings gemacht haben. 5.2.6.1 Textzeichen (char) Als Beispiel sei die Definition eines Textzeichens genannt: 1: char z,c; / / Definition 2: extern char d; / / Deklaration 3: z = 'a'; / / Zuweisung (Initialisierung) 4: char b = '1'; / / Definition mit Initialisierung 5: char d='d',e='e'; / / zwei Definitionen mit Initialisierung In Zeile 1 wird vom Compiler je ein Byte für die Variable z und c reserviert. Der Speicherplatz für die Variable d wurde dagegen schon in einem anderen Programmteil (Modul) angefordert. In Zeile 3 wird der Inhalt der Speicherzelle z mit dem Buchstaben 'a' initialisiert. Die Definition und Zuweisung kann, wie in Zeile 4 und 5, auch gleichzeitig erfolgen. 5.2.6.2 Ganze Zahlen (int) Im einführenden Kapitel haben wir die Zahlendarstellung im 2er-Komplementsystem kennengelernt. Dieses Kodierungssystem eignet sich hervorragend für den Umgang mit vorzeichenbehafteten ganzen Zahlen (integer). Die Sprache C bietet dazu den Standarddatentyp int. Dieser beschreibt eine mindestens 16-Bit umfassende Zahl, wobei die Wortbreite bei Rechnern mit größerer interner Wortbreite allerdings auch entsprechend größer ausfallen kann. Damit ist der Wertebereich einer Variablen dieses Datentyps leider abhängig von der verwendeten Rechnerarchitektur, was manchmal zu Problemen bei der Portierung führen kann. Deshalb kennen viele Compiler eine erweiterte Typdefinition: <?page no="190"?> 5.2 Grundlagen der C-Programmierung 191 http: / / www.uvk-lucius.de/ informatik-ing Tab. 26: Wertebereiche Integer-Datentypen Typ Breite Wertebereich int 16 -32768…32767 megaAVR 32 -2147483648…2147483647 ESP8266 int8_t 8 -128…127 uint8_t 8 0…255 int16_t 16 -32768…32767 uint16_t 16 0…65535 int32_t 32 -2147483648…2147483647 uint32_t 32 0…4294967295 Wichtig ist hierbei vor allem der Wertebereich einer Zahl. Ein Überschreiten des Wertebereichs führt nicht etwa zu einer Fehlermeldung, sondern zu einer gültigen Zahl am anderen Ende des Zahlenkreises. Das folgende Programm verdeutlicht diese Problematik am Beispiel 16-Bit vorzeichenbehafteter Zahlen: 6: int16_t ganzzahl = 32765; / / kurz vor Zahlenüberlauf 7: for (int i = 1; i<=4; i++) { / / 4 Durchläufe 8: ganzzahl=ganzzahl+1; / / Addition 9: tprintf("32765+%i=%i, ",i,ganzzahl); / / Ausgabe 10: } / / Ende Schleife Ausgabe: 32765+1=32766, 32765+2=32767, 32765+3=-32768, 32765+4=-32767, Um hier einen Zahlenüberlauf zu vermeiden, müsste die nächstgrößere Wortbreite int32_t gewählt werden. Unter Verzicht der negativen Zahlen wäre allerdings auch uint16_t möglich. Wichtig ist in diesem Zusammenhang noch einmal der Rückgriff auf die binäre Zahlendarstellung: Die Addition zweier n-Bit Zahlen führt zu einem Ergebnis mit n+1 Stellen. Die Multiplikation zweier n-Bit Zahlen führt zu einem Ergebnis mit 2n-Stellen. Das solche Probleme nicht nur akademischer Natur sind, zeigt der aktuelle Fall der Boeing 787 Dreamliner-Flotte. Die Flug- <?page no="191"?> 192 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing behörde hat aufgrund eines Überlaufs in der Steuersoftware einen regelmäßigen Reset der Triebwerksrechner angeordnet 19 . 5.2.6.3 Gleitpunktzahlen (float) Aufgrund der endlichen Speicherkapazität kann nicht jede reelle Zahl auch exakt im Rechner dargestellt werden. Damit einher geht die Tatsache, dass Berechnungen mit diesen Zahlen auch nur bis zu einer bestimmten Genauigkeit durchgeführt werden können. Zahlen, die für den menschlichen Nutzer schön aussehen (wie z.B. 0.1) werden intern vielleicht als 0.0999999 gespeichert und eventuell auch so wieder ausgegeben (s. erstes Kapitel Grundlagen). Das hat z. B. unerwartete Konsequenzen beim Einsatz von Vergleichsoperationen: 1: float zahl = 0.262; 2: if ((zahl*100.0) == 26.2) { / / Eigentlich sollte die Bedingung 3: tprintf("Gleich"); / / erfüllt sein 4: } else { 5: tprintf("Ungleich"); 6: } Ausgabe: Ungleich Gleitpunktzahlen (float) können im Rechner in einer Festpunktschreibweise oder in der wissenschaftlichen Notation, d.h. mit Zehner-Exponent geschrieben werden. Der Exponent wird dann durch ein ‚E‘ oder ‚e‘ von der Mantisse abgetrennt notiert. float x = 0.000262; / / Gleitpunktzahlen float y = 5678.056; float z = -0.34e-5; Hinzu kommt, dass Gleitpunktzahlen immer in einer wissenschaftlichen Notation mit Mantisse und Exponent gespeichert werden und vor bestimmten mathematischen Operationen (z.B. der Addition) wieder auf den gleichen Exponenten gebracht werden müssen. Damit sind Berechnungen mit Gleitpunktzahlen viel aufwändiger als reine Integer-Arithmetik, weshalb moderne Rechnerarchitekturen spezielle Hardwareunterstützung in 19 https: / / www.federalregister.gov/ articles/ 2015/ 05/ 01/ 2015- 10066/ airworthiness-directives-the-boeing-company-airplanes. <?page no="192"?> 5.2 Grundlagen der C-Programmierung 193 http: / / www.uvk-lucius.de/ informatik-ing Form von Gleitpunkteinheiten besitzen. Mikrocontroller dagegen besitzen diese Hardwarebeschleunigung oft nicht, weshalb alle Gleitpunktrechnungen vom Compiler per Software-Bibliotheken emuliert werden müssen und damit entsprechend langsam sind. Tab. 27: Eigenschaften Zahlendarstellung Typ Eigenschaft int Genaue Rechnung Wertebereich klein float Wertebereich groß (+- 10 -38 bis 10 38 ) Genauigkeit begrenzt (7 Nachkommastellen) Für genaue Rechnungen gibt es double Typen spezielle Hardware erforderlich (oder langsam) 5.2.6.4 Umwandlung von Datentypen (Typecast) Beim Umgang mit Zahlen stellt sich auch das Problem, einen Datentyp in den anderen zu wandeln. Oftmals geschieht das implizit durch den Compiler, kann aber auch bewusst durch den Programmierer vorgenommen werden. Dazu wird der gewünschte Zieldatentyp in runden Klammern vor den Ausdruck geschrieben (Cast-Operator): 1: int16_t i = (int) 3.34; / / Typecast 2: uint32_t k = (uint32_t) i; / / Typecast 3: float x = 3; / / implizit durch Compiler 4: Serial.print(x); Serial.print(" "); 5: x = 1/ 3; / / Compiler implizit 1/ 3 in Ganzzahl gerechnet 6: Serial.print(x); Serial.print(" "); 7: x = (float) (1/ 3); 8: Serial.print(x); Serial.print(" "); 9: x = (float) 1/ 3; 10: Serial.print(x); Serial.print(" "); 11: x = 1.0/ 3.; 12: Serial.print(x); Serial.print(" "); Ausgabe: 3.00 0.00 0.00 0.33 0.33 Leider führt die Typumwandlung immer wieder zu Problemen. In Zeile 3 erfolgt die Umwandlung der ganzen Zahl 3 in die Fließpunktdarstellung implizit durch den Compiler. In Zeile 5 <?page no="193"?> 194 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing bzw. 7 führt die Klammerung (1/ 3) erst zu einer Ganzzahldivision der beiden ganzen Zahlen, wobei 1/ 3 zu Null abgerundet wird. Das Ergebnis wird dann in eine Gleitpunktzahl gewandelt, ist also Null. In Zeile 9 dagegen wandelt der Compiler erst die 1 in eine Gleitpunktzahl und führt die Division korrekt in Gleitpunktarithmetik durch. Um diese Probleme zu vermeiden, sollte der Programmierer Gleitpunktzahlen auch immer korrekt mit dem Komma angeben (Zeile 11). Eine etwaige Null nach dem Komma (3.0) braucht dabei nicht angegeben werden (3. reicht). 5.2.7 Mathematische Standardfunktionen Im Abschnitt Kontrollstrukturen haben wir die Quadratwurzel einer Zahl berechnet. Glücklicherweise bietet die Sprache C schon eine Reihe vordefinierter Standardfunktionen, auf die der Anwender direkt zurückgreifen kann. Tab. 28: Mathematische Standardfunktionen Standardfunktion Bedeutung sqrt(x) Quadratwurzel log(x), exp(x) Natürlicher Logarithmus, Exponentialfunktion sin(x), cos(x), tan(x) Trigonometrische Funktionen (in Bogenmaß) pow(x,a) x hoch a abs(x) Absolutbetrag floor(x), ceil(x) Rundet nach unten/ oben ganzzahlig 1: float x = 3.14; 2: Serial.print(sin(x)); Serial.print(" "); 3: Serial.print(abs(x)); Serial.print(" "); 4: Serial.print(ceil(x)); Serial.print(" "); 5: Serial.print(floor(x)); Ausgabe: 0.00 3.14 4.00 3.00 <?page no="194"?> 5.2 Grundlagen der C-Programmierung 195 http: / / www.uvk-lucius.de/ informatik-ing 5.2.8 Modularisierung (Funktionen) Bisher wurde die gesamte Funktionalität in einem Programm realisiert. Dabei haben wir gesehen, dass die sinnvolle Nutzung von Wiederholungsanweisungen viele Zeilen Programmcode einsparen kann und die Übersichtlichkeit, Flexibilität und Wartbarkeit des Codes deutlich erhöht. Auch haben wir uns daran gewöhnt, Arduino-Befehle (wie Serial.print()) und C-Standardfunktionen (wie sin()) an beliebiger Stelle im Code zu nutzen und damit das Programm viel kürzer zu gestalten, ohne uns z.B. über Details der Ausgabe auf die serielle Schnittstelle oder der Berechnung des Sinus Gedanken zu machen. Was liegt da näher, als immer wieder benötigte Programmteile quasi in eigene Befehle umzuwandeln und damit auch an verschiedenen Stellen im Code als Funktion aufzurufen. Wir haben das sogar unbewusst schon mit der selbstgebauten tprintf()- Funktion realisiert. Die Modularisierung oder Strukturierung, d.h. die Zerlegung der Funktionalität in viele unabhängige Teilfunktionen bietet also klare Vorteile: Die Programmstruktur wird übersichtlicher Die Entwicklung von Algorithmen wird in kleine Teilprobleme zerlegt („top-down“-Entwurf) Funktionen können als Black-Box betrachtet und von andern Programmierern erstellt, bzw. mit anderen Programmierern geteilt werden (Teamarbeit) Module können separat getestet werden Ein wiederholter Aufruf spart Programmspeicherplatz Allerdings gibt es auch einen kleinen Nachteil, denn nach dem Aufruf einer Funktion muss unser Programm den Rücksprung an die jeweilige Stelle im Hauptprogramm wiederfinden. Dies geschieht über den bereits aus dem Kapitel Hardware bekannten Stack-Speicher. Die Mehrarbeit zur Verwaltung des Rücksprungziels erfordert zusätzliche Zeit und Speicher auf dem Stack. Beim Aufruf der Funktion legt die CPU zuerst die Adresse des dem Aufruf folgenden Befehls (Rücksprungadresse) auf <?page no="195"?> 196 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing den LIFO-Stapel des Stacks und verzweigt dann an den ersten Befehl der aufzurufenden Funktion. Ist diese beendet (oder eine return-Anweisung erreicht), dann holt die CPU die Rücksprungadresse vom Stack und initialisiert damit den Programmcounter (PC). Die Ausführung wird folglich mit dem dem Unterprogrammaufruf folgenden Befehl fortgesetzt. Ein C-Programm besteht also aus vielen einzelnen Funktionen. Auch unser Hauptprogramm ist eigentlich eine Funktion, nämlich die Funktion main(), die beim Start vom Betriebssystem (oder beim Arduino nach Reset) aufgerufen wird. Varianten zum Begriff Funktion sind Unterprogramme, Subroutinen oder Prozeduren. Funktionen ohne Rückgabeparameter werden häufig als Unterprogramme bezeichnet. 5.2.8.1 Unterprogramme Schauen wir uns zur Motivation das folgende Programm zur Ausgabe eines bekannten Kinderliedes 20 an: / / sum,sum,sum, Kinderlied, Hoffmann v. Fallersleben 1: tprintf("Summ, summ, summ! \n"); / / Refrain 2: tprintf("Bienchen summ herum! \n"); 3: tprintf("Ei, wir tun dir nichts zuleide,\n"); 4: tprintf("flieg nur aus in Wald und Heide! \n"); 5: tprintf("Summ, summ, summ! \n"); / / Refrain 6: tprintf("Bienchen summ herum! \n"); 7: tprintf("\n"); / / 2. Strophe 8: tprintf("Summ, summ, summ! \n"); / / Refrain 9: tprintf("Bienchen summ herum! \n"); 10: tprintf("Such in Blumen, such in Bluemchen\n"); 11: tprintf("dir ein Troepfchen, dir ein Kruemchen! \n"); 12: tprintf("Summ, summ, summ! \n"); / / Refrain 13: tprintf("Bienchen summ herum! \n"); Hier fällt sofort auf, dass der Programmcode für den Refrain an verschiedenen Stellen benötigt wird und deshalb besser in eine Funktion ausgelagert werden könnte: 1: void refrain() { / / Funktionsdefinition 2: tprintf("Summ, summ, summ! \n"); / / Refrain-Text 3: tprintf("Bienchen summ herum! \n"); 4: } 20 „Summ, summ, summ“, Hoffmann von Fallersleben (1842) <?page no="196"?> 5.2 Grundlagen der C-Programmierung 197 http: / / www.uvk-lucius.de/ informatik-ing 5: 6: void setup() { / / Hauptprogramm Lied 7: Serial.begin(9600); 8: refrain(); / / Aufruf refrain 9: tprintf("Ei, wir tun dir nichts zuleide,\n"); 10: tprintf("flieg nur aus in Wald und Heide! \n"); 11: refrain(); / / Aufruf refrain 12: tprintf("\n"); / / 2. Strophe 13: refrain(); / / Aufruf refrain 14: tprintf("Such in Blumen, such in Bluemchen\n"); 15: tprintf("dir ein Troepfchen, dir ein Kruemchen! \n"); 16: refrain(); / / Aufruf refrain 17: } / / Ende Lied 18: An diesem Beispiel wird deutlich, dass vor der ersten Benutzung des neuen refrain-Befehls die entsprechende Funktion refrain() bekannt gemacht werden muss (Funktionsdefinition). Im aufrufenden Hauptprogramm erfolgt dann an der entsprechenden Stelle der Aufruf. Gemäß C-Standard muss die Definition im Programm vor dem ersten Aufruf stehen, eine formale Randbedingung, die den Quelltextaufbau stark einschränkt und bei Programmieranfängern häufig zu Fehlern führt. Soll die Definition weiter hinten im Quelltext folgen, so muss sie dem Compiler vorher durch eine sogenannte Prototypdeklaration bekannt gemacht werden. Glücklicherweise entlastet die Arduino-Philosophie hier den Programmierer und sorgt unsichtbar für eine korrekte Deklaration, so dass wir die Definition der Funktion eigentlich zukünftig an beliebiger Stelle im Quelltext vornehmen können und uns um die entsprechende Prototypdeklaration keine Sorge mehr machen müssen. Sogar geschachtelte Funktionen sind möglich. Auch können einem Unterprogramm beim Aufruf verschiedene Werte mit gegeben werden (Eingabeparameter). Damit finden wir schließlich eine sehr elegante Lösung für unser kleines Lied: <?page no="197"?> 198 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing 1: void refrain(); / / Prototypen, eigentlich bei 2: void strophe(int); / / Arduino nicht notwendig 3: 4: void setup() { / / Hauptprogramm Lied 5: Serial.begin(9600); / / Schnittstelle mit 9600 Baud 6: for (int i=1; i<=3; i++) / / Drei Strophen 7: strophe(i); 8: } / / Ende Lied 9: 10: void strophe(int nr) { / / Funktionsdefinition strophe 11: / / Eingangsparameter nr: Nummer der auszugebenen Strophe 12: refrain(); / / Aufruf Refrain 13: switch (nr) { / / Mehrfachauswahl Strophe 14: case 1: tprintf("Ei, wir tun dir nichts zuleide,\n"); 15: tprintf("flieg nur aus in Wald und Heide! \n"); 16: break; / / Ausstieg 1. Strophe 17: case 2: tprintf("Such in Blumen, such in Bluemchen\n"); 18: tprintf("dir ein Troepfchen, dir ein Kruemchen! \n"); 19: break; / / Ausstieg 2. Strophe 20: default: tprintf("Weitere Strophen sind nicht vorgesehen\n"); 21: } 22: refrain(); / / Aufruf refrain 23: tprintf("\n"); 24: } 25: 26: void refrain() { / / Funktionsdefinition refrain 27: tprintf("Summ, summ, summ! \n"); / / Refrain-Text 28: tprintf("Bienchen summ herum! \n"); 29: } Es lohnt sich also, im Folgenden die Funktionsdefinition noch einmal genauer anzuschauen. 5.2.8.2 Funktionen Der Funktionsname ist ein vom Programmierer sinnvoll zu wählender Bezeichner. Die kommagetrennte Liste der Eingangsparameter beim Aufruf korrespondiert mit der Liste der formalen Parameter bei der Definition. Die formalen Parameter fungieren dabei als Platzhalter für die Werte der beim Aufruf übergebenen Eingangsparameter. Beides kann ggf. auch leer sein, wenn das Unterprogramm wie das obige refrain-Beispiel keine Eingangsparameter benötigt. Auch der Rückgabewert kann entfallen, z.B. wenn ein Unterprogramm, wie in unseren obigen Beispielen, keine Ergebnisse zurückliefern muss. Dann entfällt auch das Schlüsselwort return im Funktionsrumpf und für den Rückgabedatentyp schreiben wir das Schlüsselwort void (engl. für leer). <?page no="198"?> 5.2 Grundlagen der C-Programmierung 199 http: / / www.uvk-lucius.de/ informatik-ing Formal hat eine Funktionsdefinition einen festen Aufbau: Abb. 88: Funktionen als Werkzeug der Modularisierung Anwendungsbeispiel: Quadratwurzel Zum besseren Verständnis hier zwei Beispiele. Zuerst die Funktionsdefinition für die bereits bekannte Quadratwurzelfunktion: 1: void setup() { / / Hauptprogramm 2: Serial.begin(9600); / / Schnittstelle 600 Baud 3: float y ; / / Ergebnisvariable 4: y = meineWurzel(9.0); / / Funktionsaufruf 5: Serial.print(y); Serial.print(" "); 6: Serial.print(meineWurzel(2.0)); 7: } 8: 9: float meineWurzel (float zahl) { / / Funktionsdefinition 10: / / Eingabeparameter: float, zahl, 11: / / Rückgabeparameter: float, die Wurzel von zahl 12: float wurzel = 1.; / / Erste Schätzung 13: float hilfsgroesse,fehler; / / Hilfsgroessen 14: do { / / Iterationsschleife 15: hilfsgroesse = wurzel; / / Merker 16: wurzel = 0.5*(wurzel+zahl/ wurzel); / / Update 17: fehler = abs(hilfsgroesse-wurzel); / / Verbesserung 18: } while (fehler>0.01); / / bis Genauigkeit 19: return wurzel ; / / Rückgabe Ergebnis 20: } Ausgabe: 3.00 1.41 Die in Zeile 9 definierte Funktion besteht aus einem formalen Eingangsparameter vom Datentyp float mit dem Namen zahl. Aus dieser Zahl wird im Funktionsrumpf durch unsere Iterationsformel die Quadratwurzel berechnet (Zeile 14-18) und das Funktionsdefinition: <Rückgabedatentyp> <Funktionsname> (<Liste formale Parameter>) { …. / / Funktionsanweisungen, Funktionsrumpf return <Ausdruck>; / / falls Rückgabe vorgesehen } Funktionsaufruf: <Funktionsname> (<Liste Eingangsparameter>) Black-Box Funktionsname Liste Eingangsparameter Rückgabe <?page no="199"?> 200 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Ergebnis schließlich als Gleitpunktzahl an den aufrufenden Programmteil übergeben (Zeile 19). Der Datentyp der Rückgabe wird dabei in Zeile 9 durch den am Anfang definierten Rückgabetyp float bestimmt. Damit ist festgelegt, wie unsere Funktion beim Aufruf meineWurzel(9.0) in Zeile 4 aus dem Eingangsparameter den Funktionswert berechnet: Der Aufrufwert 9.0 wird in den Platzhalter zahl kopiert und zur Iteration genutzt. Das Ergebnis (in dem Fall die 3.0) kommt aus der Funktion zurück und wird in Zeile 4 der Variable y zugewiesen. Diese wird schließlich in Zeile 5 ausgegeben. Zeile 6 fasst diese Schritte zusammen, hier wird das Ergebnis der Wurzelberechnung direkt ohne Umweg einer Variablenzuweisung auf die Schnittstelle gesendet. Am Ende stellt sich unsere Funktion als „Black-Box“ dar, der wir eine Zahl übergeben und aus der wir das Ergebnis der Wurzelberechnung zurückbekommen. Glücklicherweise hat die Sprache C für alle ingenieurrelevanten mathematischen Funktionen schon entsprechende nummerische Standardfunktionen vordefiniert (Tabelle 28). Innerhalb unserer Funktion wäre deshalb sinnvollerweise die Iteration durch den Aufruf der wahrscheinlich schnelleren und genaueren Standardfunktion zu ersetzen: 1: float meineWurzel (float zahl) { / / Funktionsdefinition 2: / / Eingabeparameter: float, zahl, 3: / / Rückgabeparameter: float, die Wurzel von zahl 4: return sqrt(zahl); / / Aufruf Standardfunktion 5: } Hierdurch wird ein wesentlicher Vorteil der Modularisierung deutlich. Zur Verbesserung bzw. Fehlerkorrektur sind die notwendigen Änderungen nur an einer einzigen zentralen Stelle im Quelltext vorzunehmen. Alle anderen Programmteile bleiben unberührt (und brauchen z. B. nicht erneut getestet zu werden). <?page no="200"?> 5.2 Grundlagen der C-Programmierung 201 http: / / www.uvk-lucius.de/ informatik-ing Anwendungsbeispiel: Volumenberechnung Als abschließendes Funktionsbeispiel für eine längere Liste von Eingangsparameter sei im Folgenden die Berechnung des Volumens eines Zylinders dargestellt: 1: / / Volumen eines Zylinders 2: void setup() { / / Hauptprogramm 3: Serial.begin(9600); 4: float h = 5.0,r = 1.0; 5: float V; 6: tprintf("vol(5,1) = "); 7: V = vol(5.,1.); 8: Serial.print(V); 9: tprintf(", vol(h,r) = "); 10: Serial.print(vol(h,r)); / / Gleitpunktzahl nicht mit tprintf 11: tprintf(", vol(r,h) = "); ; 12: Serial.print(vol(r,h)); 13: } / / Ende Hauptprogramm 14: 15: float vol(float h, float r) { / / Funktionsdefinition 16: / / Eingangsparameter: h Höhe des Zylinders 17: / / r Radius der Grundfläche 18: / / Rückgabeparameter: Volumen des Zylinders 19: #define PI 3.1415926 / / Präprozessor, Konstante für pi 20: float Volumen; 21: Volumen = PI*r*r*h; 22: return Volumen; / / 23: } Ausgabe: vol(5,1) = 15.71, vol(h,r) = 15.71, vol(r,h) = 78.54 Hier ist interessant zu sehen, dass die Reihenfolge der Eingangsparameter entscheidend für die Berechnung ist. Der beim Aufruf zuerst übergebene Wert landet im Unterprogramm auch im ersten Platzhalter (in diesem Fall die Höhe h), der zweite Wert im zweiten Platzhalter (dem Radius r). Ein beliebter Denkfehler bei Programmieranfängern ist die Zuordnung über die verwendeten Namen. Die Namen spielen hier aber keine Rolle und sind praktisch beliebig zu wählen. Wie wir gleich noch sehen werden, macht diese Eigenschaft unsere Programme robust gegenüber Seiteneffekten. 5.2.8.3 Parameterübergabe (call by value / reference) Die Höhe h im Hauptprogramm und die Höhe h in der Funktion haben im obigen Beispiel außer der geometrischen Bedeutung und des zufällig gleich lautenden Bezeichners nichts mitei- <?page no="201"?> 202 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing nander zu tun. Beide Größen liegen in verschiedenen Speicherzellen. Erst beim Aufruf wird der Inhalt der Variable h des Hauprogramms in den Platzhalter des Unterprogramms kopiert. Das Unterprogramm arbeitet also mit Kopien (sogenannten lokalen Variablen) und kann die Originalvariablen nicht beeinflussen (Seiteneffekte werden demzufolge vermieden). Dieser Mechanismus wird als „call by value“ bezeichnet. Vorteil ist eine vollständige Kapselung der „Black-Box“, d.h. der Programmierer des Hauptprogramms braucht keine Befürchtung zu haben, dass Teile des Programmcodes im Unterprogramm Auswirkungen auf die Variablen des Hauptprogramms haben. Einzige Verbindung ist der Rückgabeparameter. In einigen Anwendungsfällen kann es allerdings vorkommen, dass eine Funktion mehrere Ergebnisse zugleich an das Hauptprogramm zurückliefern muss. In diesem Fall kommt eine weitere Möglichkeit der Parameterübergabe zum Einsatz. Beim sogenannten „call by reference“ wird nicht eine Kopie des Wertes an das Unterprogramm übergeben, sondern der Referenzoperator ‚&‘ weist den Compiler an, stattdessen die Adresse der Speicherzelle zu übergeben. Mit diesem Verweis (reference) auf die gleiche Speicherstelle hat das Unterprogramm nun die Möglichkeit, Variablen des Hauptprogramms zu verändern und kann so z.B. mehrere Ergebnisse zurücksenden: 1: void setup() { / / Hauptprogramm 2: Serial.begin(9600); 3: int a=2,b=1,sum=6,diff=6; / / Variablen im Hauptprogramm 4: call_by_val(a,b,sum,diff); / / Unterprogrammaufruf 5: tprintf("call_by_val: sum=%i, diff=%i, ",sum,diff); 6: call_by_ref(a,b,sum,diff); / / Unterprogrammaufruf 7: tprintf("call_by_ref: sum=%i, diff=%i",sum,diff); 8: } / / Ende Hauptprogramm 9: 10: void call_by_val(int a, int b, int s, int d) { / / Definition 11: s = a+b; 12: d = a-b; 13: } 14: 15: void call_by_ref(int a, int b, int &s, int &d) {/ / Definition 16: s = a+b; 17: d = a-b; 18: } Ausgabe: call_by_val: sum=6, diff=6, call_by_ref: sum=3, diff=1 <?page no="202"?> 5.2 Grundlagen der C-Programmierung 203 http: / / www.uvk-lucius.de/ informatik-ing Im obigen Beispiel führen beide Unterprogramme die gleichen Berechnungen durch. Einziger Unterschied ist die Verwendung des Referenzoperators bei den letzten beiden Argumenten der Funktion call_by_ref(). Dies veranlasst den Compiler, für die beiden Platzhalter s und d die gleichen Speicherzellen wie für die Variablen sum und diff im Hauptprogram zu verwenden. Die Zuweisungen in Zeile 16 und 17 haben somit direkte Auswirkungen auf die Werte der Variablen im Hauptprogramm. Programmieranfänger sollten diese Übergabemöglichkeit mit Vorsicht einsetzen, besteht doch die große Gefahr, dass Programmteile, die sich irgendwo versteckt viele Zeilen später im Unterprogramm befinden, indirekt die Inhalte von Variablen des Hauptprogramms verändern können. Solche unvorhergesehene Seiteneffekte lassen sich oft nur schwer finden, weshalb der Mechanismus „call by reference“ sehr bewusst eingesetzt werden sollte. Trotzdem werden wir diese Art der Parameterübergabe wieder antreffen, nämlich bei der Übergabe von Datenfeldern (arrays). Hier würde eine Übergabe per „call by value“ zu einer lokalen Kopie der Datenstruktur und damit zu einem doppelten Speicherbedarf führen. Deshalb verzichtet die Sprache C auf diese Möglichkeit. 5.2.9 Lebensdauer und Geltungsbereich Wie wir bereits gesehen haben, führt die Definition der Übergabe mit „call by value“ zu lokalen Kopien der übergebenen Parameter. Auch die innerhalb einer Funktion deklarierten Variablen sind außerhalb der Funktion nicht sicht- und veränderbar. Sie sind lokal und temporär, d.h. sie sind für andere Programmteile unsichtbar und sie existieren nur solange sich die Funktion tatsächlich in Abarbeitung befindet. Nach Beendigung des Aufrufs wird der Speicherplatz freigegeben und die bisher darin gespeicherten Daten sind verloren. Lokale Variablen werden üblicherweise auf dem Stack gespeichert. <?page no="203"?> 204 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Das Verhalten hat, wie bereits gesehen, deutliche Vorteile in Bezug auf unerwünschte Seiteneffekte und die Wartbarkeit von Programmen. Dadurch wird ein Programmierstil gefördert, der eine vollständige Kapselung von Programmteilen garantiert. Verschiedene Module kommunizieren nur über die definierte Schnittstelle der Parameterliste in der Funktionsdefinition und bilden damit perfekt das „Black-Box“ Prinzip ab. Sollen diese lokalen Werte ihren letzten Wert auch bei erneutem Aufruf beibehalten, so wird das Schlüsselwort static verwendet. Die so markierten Variablen (Variable y im folgenden Listing) sind auch lokal, d.h. nur in der betreffenden Funktion sichtbar, aber besitzen dennoch ein Gedächtnis auch über die Lebensdauer des jeweiligen Funktionsaufruf hinaus. Außerdem bietet die Sprache C die Möglichkeit, Variablen über Funktionsgrenzen hinaus sichtbar zu machen. Diese globalen Variablen werden außerhalb einer Funktion definiert, sind dann von überall veränderbar und behalten ihren Wert über die ganze Lebensdauer des Programmes bei. Der Einsatz sollte sorgfältig geplant werden, birgt er doch wieder die Gefahr der unerwünschten Seiteneffekte. Im folgenden Codesegment ist die Variable z von allen Funktionen im Quelltext sicht- und veränderbar. 1: int z=0; / / globale Variable 2: void setup() { / / Hauptprogramm 3: Serial.begin(9600); 4: lese(); / / einmal ausgeben und zählen 5: seite(); / / Seiteneffekt nur auf globale z 6: lese(); / / einmal ausgeben und zählen 7: } / / Ende Hauptprogramm 8: 9: void seite(){ / / x, y nicht sichtbar 10: z = 5; / / Zugriff auf globale Variable 11: } 12: void lese(){ / / Verändern und Ausgeben 13: int x = 0; / / lokale Variable 14: static int y = 0; / / lokale Variable mit Gedächtnis 15: tprintf("x(lokal) = %i, y(static) = %i, z(global) = %i\n",x,y,z); 16: x++; y++; z++; / / Alle verändern 17: } Ausgabe: x(lokal) = 0, y(static) = 0, z(global) = 0 x(lokal) = 0, y(static) = 1, z(global) = 5 <?page no="204"?> 5.2 Grundlagen der C-Programmierung 205 http: / / www.uvk-lucius.de/ informatik-ing Eine weitere bewusste Anwendung ist die Nutzung beim Datenaustausch innerhalb nebenläufiger Programmteile z. B. bei der Verwendung von Interrupt-Service-Routinen (ISR). Hier gibt es, wie wir bereits im Kapitel Hardware gesehen haben, keinen expliziten Aufruf der ISR und somit auch nicht die Möglichkeit, Übergabebzw. Rückgabeparameter zu definieren. Der Datenaustausch erfolgt dann notwendigerweise über globale Speicherbereiche, bei deren Definition ein besonderes Schlüsselwort volatile vor dem eigentlichen Datentyp dem Compiler die asynchrone Zugriffmöglichkeit markiert. Der Compiler verzichtet in dem Fall auf eine Optimierung z. B. der temporären Ablage der Variablen in schnellen Zwischenspeichern (Register). 5.2.10 Rekursion Mit der Vereinbarung lokaler Variablen besitzt jede Funktion ihren eigenen und nur für sie sichtbaren Datenbereich. Jeder Aufruf der Funktion nutzt also temporären Speicherplatz zur Anlage der Variablen, der nach Verlassen der Funktion wieder frei gegeben wird. Diese dynamische Speicherallokation auf dem Stack wird automatisch vom Compiler gesteuert. Aber wie verhält es sich, wenn eine Funktion sich selbst wieder aufruft? In einem solchen Fall spricht der Informatiker von einer Rekursion. Jeder Funktionsaufruf wird dabei als Inkarnation (lat. Fleischwerdung) bezeichnet und legt einen neuen Datenbereich an, obwohl der alte Datenbereich noch gültig ist. Jede Inkarnation sieht zwar nur ihren Datenbereich, der Datenbereich des vorherigen Aufrufs bildet aber das Gedächtnis der Rekursion. Gelingt es, ein Problem einer bestimmten Größenordnung n solange durch einfache Operationen auf ein kleineres Problem n-1 der gleichen Problemklasse zurückzuführen, bis am Ende das kleinste Problem gelöst werden kann (Rekursionsanker), so ist auch das ursprüngliche große Problem gelöst. <?page no="205"?> 206 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Anwendungsbeispiel: Rekursive Summenberechnung Ein einfaches Beispiel ist die bereits im Kapitel Zählschleifen iterativ durchgeführte Berechnung der Summe der Zahlen von 0 bis n. Diese kann alternativ auch rekursiv in der Form = > + − = anker Rekursions Rekursion 0 0 0 , ) 1 ( ) ( n für n für n n S n S formuliert und in ein C-Programm verwandelt werden: 1: void setup() { / / Hauptprogramm 2: Serial.begin(9600); 3: int S=sum(3); / / Summe von 0 bis 3 4: tprintf("\nErgebnis Hauptprogramm: S=%i",S); 5: } / / Ende Hauptprogramm 6: 7: int sum(int n) { / / rekursive Summe 8: / / Eingang: n ganze Zahl, bilde Summe von 0…n 9: int S; / / lokale Variable 10: tprintf("call sum(n=%i), ",n); 11: if (n>0) { 12: S = sum(n-1)+n; / / Rekursion 13: } else { 14: S = 0; / / Rekursionsanker 15: tprintf("\n Rekursionsanker \n"); 16: } 17: tprintf("ret %i (von n=%i), ",S,n); 18: return S; / / Rückgabe 19: } Ausgabe: call sum(n=3), call sum(n=2), call sum(n=1), call sum(n=0), Rekursionsanker ret 0 (von n=0), ret 1 (von n=1), ret 3 (von n=2), ret 6 (von n=3), Ergebnis Hauptprogramm: S=6 Dieses „sich selbst am eigenen Schopf herausziehen“ wird deutlich, wenn wir die Lösung des Problems grafisch darstellen: <?page no="206"?> 5.2 Grundlagen der C-Programmierung 207 http: / / www.uvk-lucius.de/ informatik-ing Abb. 89: Prinzip der Rekursion Das wir einen rekursiven und einen iterativen Algorithmus zur Berechnung der Summe gefunden haben, ist kein Zufall: Zu jeder iterativen Lösung existiert auch eine rekursive (und umgekehrt). Eigentlich kämen wir beim Programmieren also auch gut ohne Rekursion aus, allerdings lassen sich einige interessante Probleme viel einfacher rekursiv implementieren. Als Beispiel sei hier die Suche nach einer möglichen Fahrtroute im Navigationssystem oder die Lösung von Optimierungsproblemen genannt. Im Bereich eingebetteter Systeme wird eine Rekursion häufig aufgrund des mit jeder Stufe wachsenden Speicherbedarfs für den Stack (lokale Variablen) und der begrenzten Ressource RAM-Speicher vermieden. 1. Inkarnation n = 3 als lokale Variable auf dem Stack abgelegt S = summe(2) + n 2. Inkarnation n = 2 als lokale Variable auf dem Stack abgelegt S = summe(1) + n 3. Inkarnation n = 1 auf dem Stack abgelegt S = summe(0) + n 4. Inkarnation n = 0 auf dem Stack abgelegt S = 0, Rekursionsanker Ergebnis S = 0 3. Rückgabe (0) mit lokaler Variable n vom Stack (1) addieren Ergebnis S = 1 2. Rückgabe (1) mit lokaler Variable n vom Stack (2) addieren Ergebnis S = 3 1. Rückgabe (3) mit lokaler Variable n vom Stack addieren Ergebnis S = 6 Aufruf S = summe(3) <?page no="207"?> 208 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing 5.2.11 Höhere Datenstrukturen Die bisher bekannten elementaren Datentypen eignen sich sehr gut zur Repräsentation von einzelnen Zahlen oder Textzeichen. Aber was ist mit ganzen Zeichenketten, einer Reihe von N=50 Messdaten, oder gar einer numerischen Matrix? Abb. 90: Datenfeld mit Messwerten Wir hatten die Variablen anschaulich mit den Schubladen einer Kommode verglichen, in die wir Daten eines bestimmten Typs ablegen können. Einfach N=50 Schubladen einzeln in der Form „Messwert1“, „Messwert2“ usw. zu bezeichnen und in viele Variable zu zerlegen erscheint wenig praktikabel. Abgesehen vom Zeitaufwand und dem Umfang des Programmcodes finden sich ganz praktische Schwierigkeiten: Wie soll z.B. die Summe aller Messwerte ermittelt werden? Eine lange Programmzeile, die alle Variablen aufaddiert? Hier wäre es viel hilfreicher, die einzelne Schublade in der Form i. Spalte, j. Zeile zur adressieren. Genau diesen Ansatz verfolgt die Sprache C mit der Einführung von Feldern (engl. array). Alle Elemente eines Datenfeldes besitzen den gleichen Datentyp. Die Adressierung erfolgt über die Angabe eines oder mehrerer Indizes. Hinweis: Die Feldindizes beginnen immer mit 0, d.h. das erste Feld wird mit dem Index 0 adressiert. Ein beliebter Fehler ist der Zugriff auf Elemente des Feldes außerhalb der vereinbarten Dimension. In unserem Beispiel z.B. auf das Feld mit dem Index N=50. Hier gibt es keine Unterstützung durch das Laufzeitsystem, d.h. der Zugriff erfolgt ohne Fehlermeldung auf 1.0 2.0 3.23 4.70 … Feld- Index 0 1 2 N-1 Inhalt Feld[2] -30.0 <?page no="208"?> 5.2 Grundlagen der C-Programmierung 209 http: / / www.uvk-lucius.de/ informatik-ing einen anderweitig genutzten Speicherbereich und verändert dort ggf. andere Variablen (Seiteneffekt). Korrekt wäre der Zugriff über die Indizes 0,1,… bis 49. Eindimensionale Datenfelder Bei eindimensionalen Feldern (Vektoren) erfolgt die Definition analog zu den bereits bekannten elementaren Datentypen, nur mit der Erweiterung einer Angabe der Anzahl der Elemente in eckigen Klammern hinter der Variablenbezeichnung: Ein einfaches Beispiel zeigt die Zeile 2 im folgenden Programm: 1: #define DATA_LEN 3 / / Feldlänge über Präprozessor 2: int vect[3]; / / Datenfeld mit 3 Ganzzahl-Elementen 3: int data[DATA_LEN]; / / Datenfeld mit DATA_LEN=3 Zahlen 4: int mess[3] = {1,3,5} ; / / Feld mit Initialisierung 5: int feld[] = {1,3,5,7} ; / / Feldgröße durch Initialisierung 6: 7: vect[0] = 2; / / Achtung erstes Element über Index 0 8: for (int i=0; i<3; i++) { / / Adressierung über Scheife 9: vect[i] = i+1; 10: } 11: 12: for (int i=0; i<DATA_LEN; i++) { / / Zuweisung über Scheife 13: data[i] = i; / / Länge über Präprozessor 14: tprintf("data[%i]=%i, ",i,data[i]); 15: } 16: tprintf("\n"); 17: 18: int len = sizeof(feld)/ sizeof(int); / / Feldlänge berechnen 19: for (int i=0; i<len; i++) { 20: tprintf("feld[%i]=%i, ",i,feld[i]); 21: } Ausgabe: data[0]=0, data[1]=1, data[2]=2, feld[0]=1, feld[1]=3, feld[2]=5, feld[3]=7, Dabei kann die Anzahl (wie in Zeile 5) auch implizit durch die Initialisierung festgelegt werden. Zugriff auf einzelne Elemente des Datenfeldes erfolgt über den Index des Elementes in eckigen Klammern (Zeile 7). Lernregel: Felder mit eckigen Klammern, Unterprogramme mit runden Klammern, Blöcke mit geschweiften Klammern. Achtung: Das Anfangselement eines Feldes wird mit 0 indiziert! <?page no="209"?> 210 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing „Magische“ Konstanten (wie die 3 in Zeile 2) sollten auf jeden Fall vermieden werden. Diese nackten Zahlen sind im Programm später nur schwer nachvollziehbar. Was ist, wenn sich die Länge des Datenfeldes verändert? Denkt dann noch jemand daran, den Laufindex in Zeile 8 auch anzupassen? Um ein Programm flexibel erweiterbar zu halten, ist es eine gute Praxis, die konstante Dimension des Datenfeldes per Präprozessorbefehl #define vorher festzulegen (Zeile 1 und 3). Damit beziehen sich dann alle Schleifenstrukturen (Zeile 12) zur Initialisierung bzw. zur Ausgabe der Feldelemente immer auf diese Länge. Eine Erweiterung benötigt nur eine neue Kontante in Zeile 1 und alle anderen Bezüge werden automatisch angepasst. Wie bereits dargestellt, wird dieser Präprozessor dem Compiler vorgeschaltet, d.h. vor jeder Übersetzung durchsucht er den Quelltext nach an ihn gerichteten Befehlen und führt diese aus. Präprozessorbefehle beginnen immer mit einem ‚#‘, enden aber im Gegensatz zu den C- und Arduino-Befehlen nicht mit einem Semikolon. Der einfachste Befehl #define erstellt ein Makro, d.h. eine einfache Textersetzung. In unserem Beispiel wird das Makro DATA_LEN eingeführt. Dieses wird durch den Präprozessor kurz vor dem Übersetzen durch den Text ‚3‘ ersetzt. Nach Präprozessorlauf gleichen sich die Schleifenstrukturen in Zeile 8 und 12, mit dem Unterschied, dass eine Änderung der Länge in Zeile 1 beim nächsten Compiler-Durchlauf auch das Schleifenende anpasst. Zur einfachen Identifikation im Programmcode werden Makros immer mit Großbuchstaben bezeichnet. Alternativ dazu wäre auch die Nutzung eines Befehls zur Ermittlung der Feldlänge in Byte möglich. Um daraus die Anzahl der Elemente zu bestimmen, muss die ermittelte Bytezahl durch die Anzahl der Bytes für den verwendeten Datentyp geteilt werden (Zeile 18). Nachteil ist aber der Zeitbedarf zur Laufzeit und der Speicherbedarf für eine lokale Variable Len. Ein Präprozessor #define benötigt dagegen keinen Speicherplatz. <?page no="210"?> 5.2 Grundlagen der C-Programmierung 211 http: / / www.uvk-lucius.de/ informatik-ing Anwendungsbeispiel: Bubblesort Als weiteres Beispiel für einen Einsatz von Datenfeldern wählen wir den im Kapitel Algorithmen bereits kennengelernten Bubblesort-Algorithmus. Bei der Nutzung von Unterprogrammen ist zu beachten, dass die Übergabe von Feldern immer über einen „call by reference“ ähnlichen Mechanismus abgewickelt wird. Hier wird die Basisadresse des Feldes (also die Adresse des ersten Feldelementes) an das Unterprogramm übergeben. Das Unterprogramm nutzt also dieselben Speicherzellen wie das beim Aufruf übergebene Feld. In unserem Fall ist das ein Vorteil, können wir unseren Algorithmus doch „in-place“, d. h. ohne eine zusätzliche Kopie des Datenfeldes im Speicher realisieren. Die ursprünglichen Daten im Datenfeld werden dabei überschrieben. 1: #define N 5 / / Feldlänge über Präprozessor 2: 3: void bubbleSortUP(int data[],int len) { 4: / / Eingabe: data: zu sortierendes Datenfeld 5: / / Achtung: call by refernece, in place 6: / / len: Länge des Feldes 7: int merk; / / Hilfsvariable für swap 8: for (int n = len-1; n>0; n--){ 9: ausgabe(data,len,len-n); 10: for (int i=0; i<n; i++) { 11: if (data[i] > data[i+1]) { / / tauschen aufsteigend 12: merk = data[i]; 13: data[i] = data[i+1]; 14: data[i+1] = merk; 15: } 16: } 17: } 18: } 19: void ausgabe(int data[], int len, int lauf) { 20: / / Eingabe: data: auszugebendes Datenfeld 21: / / len: Länge des Feldes 22: / / lauf: Nummer des Durchlaufs 23: / / Eingabe: array data, 24: if (lauf > 0) { 25: tprintf("%i. Durchlauf: ",lauf); 26: } 27: for (int i=0; i<len; i++) { / / Ausgabeschleife 28: tprintf("%i ",data[i]); 29: } 30: tprintf("\n"); 31: } <?page no="211"?> 212 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing 32: void setup() { / / Hauptprogramm 33: Serial.begin(9600); 34: int feld[N] = {5,6,-1,4,1}; / / Datenfeld 35: tprintf("vorher: "); 36: ausgabe(feld,N,0); 37: bubbleSortUP(feld,N); / / sortiere in place 38: tprintf("nachher: "); 39: ausgabe(feld,N,0); 40: } / / Ende Hauptprogramm 41: Ausgabe: vorher: 5 6 -1 4 1 1. Durchlauf: 5 6 -1 4 1 2. Durchlauf: 5 -1 4 1 6 3. Durchlauf: -1 4 1 5 6 4. Durchlauf: -1 1 4 5 6 nachher: -1 1 4 5 6 Innerhalb der Sortierroutine laufen zwei geschachtelte Zählschleifen durch das Datenfeld. Die innere Schleife betrachtet nur den noch nicht sortierten Feldbereich und vertauscht die Elemente, die nicht in der gewünschten Reihenfolge stehen. Zur Umsetzung dieses Tausches wird eine temporäre Speichervariable merk benötigt (Zeile 7). In Analogie zu unserem Kommoden-Modell möchten wir den Inhalt zweier Schubladen austauschen. Da wir nur eine Hand (einen Programmausführungsfaden, eine CPU) besitzen, brauchen wir eine kurzfristige Ablagemöglichkeit für einen der Inhalte. Die äußere Schleife wird insgesamt len-1 mal durchlaufen, wobei len die Länge des zu sortierenden Feldes ist. 5.2.11.1 Mehrdimensionale Felder Das Konzept der eindimensionalen Arrays kann leicht auf mehrere Dimensionen ausgedehnt werden. <?page no="212"?> 5.2 Grundlagen der C-Programmierung 213 http: / / www.uvk-lucius.de/ informatik-ing Abb. 91: Ein zweidimenionales Datenfeld (Matrix) Nachfolgend ein Beispiel für die Deklaration einer Matrix: : 1: void setup() { / / Hauptprogramm 2: Serial.begin(9600); 3: #define N 5 / / Anzahl der Spalten (Präprozessor) 4: #define M 4 / / Anzahl der Zeilen (Präprozessor) 5: int matrix[M][N] = {{10,20,30,40,50}, 6: {15,25,35,45,55}, 7: {20,30,40,50,60}, 8: {25,35,45,55,65}}; 9: 10: for (int zeile=0; zeile<M; zeile++) { / / für alle Zeilen 11: for (int spalte=0; spalte<N; spalte++) { / / für alle Spalten 12: tprintf("%i ",matrix[zeile][spalte]); / / Ausgabe Element 13: } 14: tprintf("\n"); / / nächste Zeile 15: } 16: } Ausgabe: 10 20 30 40 50 15 25 35 45 55 20 30 40 50 60 25 35 45 55 65 5.2.11.2 Zeichenketten und Strings Eindimensionale Datenfelder vom Datentyp char haben eine besondere Bedeutung bei der Verarbeitung von Strings. Ein String ist eine Kette von Zeichen, die mit einem besonderen NUL-Zeichen (Steuerzeichen '\0', ASCII-Code 0 10 ) abgeschlossen wird. 10 20 30 40 50 15 25 35 45 55 20 20 30 40 50 25 35 45 55 65 Zeilen- Index Spalten- Index 1 M-1 0 0 1 2 N-1 Feld- Inhalt <?page no="213"?> 214 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing 1: char text1[6]= {'H','a','l','l','o','\0' }; / / Initialisierung 2: char text2[] = "Hallo"; 3: char text3[] = "ich bin sichtbar \0, ich nicht"; 4: tprintf("Text: %s oder %s \n",text1,text2); 5: tprintf("%s",text3); 6: tprintf("\n"); 7: for (int i=0; i<29; i++) / / Ausgabe als Einzelzeichen 8: tprintf("%c",text3[i]); 9: 10: if (strcmp(text1,text2)==0 ) / / Textvergleich 11: tprintf("\ntext1 und text2 sind gleich, "); 12: strcpy(text1," Welt"); / / Kopieren 13: 14: String arduinoText = "Hallo"; / / Spezieller Arduino-Typ 15: arduinoText= "\n"+ arduinoText + " Welt" + ", Pi = " String(3.14); 16: Serial.print(arduinoText); / / leider nur mit print 17: Ausgabe: Text: Hallo oder Hallo ich bin sichtbar ich bin sichtbar , ich nicht text1 und text2 sind gleich, Hallo Welt, die Zahl Pi = 3.14 Der Text "Hallo" mit 5 Textzeichen wird also intern in einer Zeichenkette mit 6 Zeichen gespeichert (Zeile 1). Um sich die Schreibarbeit der abschließenden NUL zu sparen, lassen sich Textkonstanten auch in doppelte Hochkommata eingeschlossen schreiben (Zeile 2). Dann fügt der Compiler das Endezeichen automatisch hinzu. Die besondere Bedeutung der NUL wird bei der Ausgabe klar: Datenfelder werden per „call by reference“ ähnlichem Mechanismus übergeben. Bei tprintf() übergeben wir also die Speicheradresse des ersten Zeichens (Zeile 5). Die Funktion schiebt nun den Inhalt der Speicherzelle und aller Folgenden an die serielle Schnittstelle. Das würde jetzt endlos so weiter gehen, wenn es nicht die Vereinbarung des besonderen Zeichens für das Textende gäbe. Anhand der NUL erkennt der Rechner also das jeweilige Ende der Ausgabe. Alle weiteren Zeichen unseres text3 sind zwar im Speicher abgelegt, werden aber von printf nicht mehr ausgegeben. Was wir in Zeile 7 und 8 mit einer eigenen Zeichenausgabe prüfen. Durch diese spezielle Behandlung der Textlänge ist die Manipulation von Zeichenketten nicht ganz trivial. Die Sprache C bietet <?page no="214"?> 5.2 Grundlagen der C-Programmierung 215 http: / / www.uvk-lucius.de/ informatik-ing auch hierzu Standardfunktionen wie strcpy() zum Kopieren oder strcmp() zum Vergleich von Zeichenketten (Zeile 10, 12). Um den Umgang mit den sperrigen Zeichenketten zu erleichtern, bietet die Arduino-Philosopie zusätzlich einen besonderen Datentyp String. Für diesen Typ existiert ein einfacher ‚+‘ Operator zum Aneinanderfügen oder eine String()-Funktion zur Umwandlung von Gleitpunktzahlen in den Text (Zeile 15). Leider kann unsere tpintf() Funktion aber nicht mit diesem Arduino-Datentyp umgehen, so dass wir zur Ausgabe die Serial.print()-Funktion bemühen müssen. 5.2.11.3 Datenverbund (struct) und eigene Datentypen Unser erweitertes Speichermodell kann jetzt prima mit vielen logisch zusammen gehörenden Daten eines Datentyps umgehen. In der Praxis trifft man allerdings immer wieder auf Probleme, bei denen Daten verschiedenen Datentyps zusammen eine Einheit bilden. Klassisches Beispiel ist die Adressinformation eines Anliegers bestehend aus den Komponenten Straße, Hausnummer, Postleitzahl und Stadt. Solche Datenverbünde lassen sich in der Sprache C mit dem Schlüsselwort struct bilden und mit dem typedef-Operator zu einem eigenen neuen Datentyp zusammenfassen. 18: typedef struct { / / Typdeklaration 19: char strasse[30] ; / / Komponente Strasse als Text 20: int hausnummer; / / Komponente Hausnummer als ganze Zahl 21: int plz; / / Komponente Postleitzahl 22: char stadt[30]; / / Komponente Städtename als Text 23: }adress_type; 24: 25: adress_type meineAdresse; / / Variablen 26: strcpy(meineAdresse.strasse,"Hauptstrasse"); / / Zuweisung 27: meineAdresse.hausnummer = 5; 28: meineAdresse.plz = 55678; 29: strcpy(meineAdresse.stadt,"Musterstadt"); Der Zugriff auf einzelne Elemente (Komponenten) dieses Verbundtyps erfolgt durch den Punkt-Operator. Wie wir später im Anwendungsbeispiel einer Messdatenerfassung sehen werden, gelingt damit die anschauliche Strukturierung von zusammengehörenden Daten. <?page no="215"?> 216 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing 5.3 Interfacetechnik: Arduino-Befehle Dieses Unterkapitel behandelt den Zugriff auf den zu steuernden Prozess, d.h. die digitale und analoge Prozessankopplung. Da dies die eigentliche Anwendungsdomäne des Arduino ist, sind hierzu auch viele weitere interessante Einsatzbeispiele im Internet zu finden. Stand im vorherigen Kapitel die Einarbeitung in die Sprache C im Vordergrund, so werden wir uns jetzt der Nutzung arduinospezifischer Befehle zuwenden. Alle Programme dieses Kapitels machen außerdem Gebrauch von der bisher zum Nichtstun verdammten loop()-Funktion. Diese wird ja bekanntlich in einer Endlosschleife kontinuierlich aufgerufen. Die Sprache C hält keine speziellen Befehle zur Programmierung der Interfacebausteine eines Mikrocontrollers bereit. Alle Zugriffe erfolgen z.B. über Memory-Mapped I/ O anhand der in der umfangreichen Dokumentation der Mikrocontrollerfamilie festgelegten Speicherzellen (Register). Dabei bieten die Hardwarehersteller in der Regel spezifische Header-Dateien mit den vordefinierten symbolischen Namen der entsprechenden Speicherzellen. Danach kennt der Compiler die Register mit ihrem Namen. Für den Zugriff auf die digitalen Eingänge an den Pins des PORTB bei der Atmel AVRmega-Familie genügt ein lesender Zugriff auf die Speicherzelle mit dem Namen PINB: uint8_t alle8Eingaenge = PINB; Damit ist der Zustand aller 8 Pins in einem gemeinsamen Byte (der Variable alle8Eingaenge) bekannt. Die einzelnen Pins müssen anschließend mühsam mittels Bit-Masken und Schiebeoperationen aus dem Byte isoliert werden. Wer die intensive Beschäftigung mit einem leicht 500 Seiten umfassenden Datenblatt scheut, der kann stattdessen auf die vorhandenen Arduino-Befehle zugreifen. Wie bereits eingangs erwähnt, ist dieses Feature wohl der Hauptgrund für die weite Verbreitung der Arduino-Spracherweiterung. <?page no="216"?> 5.3 Interfacetechnik: Arduino-Befehle 217 http: / / www.uvk-lucius.de/ informatik-ing Alle Pins des Mikrocontrollerboards haben im Arduino-System unabhängig von der Herstellerbezeichnung eine eindeutige Pin- Nummer. Diese findet sich in der Dokumentation zum jeweiligen Board. Dabei wird zwischen digitalen und analogen Pins unterschieden. Abbildung 92 zeigt ein Schaltungsbeispiel zur Demonstration der Interfaceansteuerung. Dieser Schaltungsaufbau dient im Anwendungsbeispiel Messdatenerfassung als einfache Wetterstation oder zur Raumüberwachung. Abb. 92: Beispielapplikation: Arduino UNO Board Pin 2 des Boards ist mit der Datenleitung eines Sensors zur Messung der Lufttemperatur und der Luftfeuchtigkeit verknüpft. Zur Kommunikation wird ein serielles Protokoll benötigt. Pin 4 ist als digitaler Eingang beschaltet und wird durch einen Schaltkontakt (z.B. Reed-Kontakt, Fensterkontakt, Schalter) gegen Masse (GND) gesteuert. Pin 5 wird als Ausgang betrieben und dient zur Ansteuerung eines einfachen Aktors. Hier ein LED zur Signalisierung. Der analoge Eingang A0 wird über einen Spannungsteiler und einem lichtempfindlichen Widerstand mit Informationen über die Beleuchtungsstärke versorgt. A5 A4 A3 A2 A1 A0 Vin GND GND 5V 3V3 Reset IORef 01234567 8910 11 12 13 GND ARef USB ATmega328 Arduino UNO DHT11 Pin 2 Schaltkontakt Temperatur Feuchte Sensor R 3 =4.7 k VCC Data GND 5 V R 2 =220 R 1 =1k Lichtsensor (LDR) GND A0 Alarm-LED <?page no="217"?> 218 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Abb. 93: Beispielapplikation: NodeMCU Board Eine Liste der verwendeten Bauteile und Bezugsquellen finden sich auf der Web-Seite zum Buch. Elektrotechnisch ist zu beachten, dass beide Boards unterschiedliche Spannungspegel (5 V bzw. 3.3 V und unterschiedliche ADC-Messbereiche nutzen). Die Berechnungen zur Bauteildimensionierung finden sich im Begleitmaterial zum Buch. (Übungen Kapitel Hardware). 5.3.1 Digital I/ O Digitale Pins lassen sich sowohl als Eingang, als auch als Ausgang betreiben. Die Unterscheidung des Betriebsmodus erfolgt während der Initialisierung über den Arduino-Befehl pinMode(). Praktischerweise bieten die meisten Mikrocontroller die Möglichkeit, einen Eingangs-Pin intern mittels Pullup-Widerstand mit VCC zu verbinden. Damit ist der Eingangspegel des nicht verbundenen Pins auf High-Pegel. Wird dieser Pin z.B. mit einem einfachen Schließkontakt auf Masse gezogen, so lässt sich der geschlossene Schalter anhand des resultierenden Low-Pegels identifizieren. Erfasst wird der Zustand über den Befehl A0 RSC RSV SD3 SD2 SD1 CMD SD0 CLK GND 3V3 EN RST GND Vin D0 D1 D2 D3 D4 3V3 GND D5 D6 D7 D8 RX TX GND 3V3 USB ESP8266 VCC Data GND R 1 = 47 Ω R 2 =220 Ω DHT11 A0 GPIO2 GPIO4 NodeMCU Temperatur / Feuchte Sensor Lichtsensor (LDR) Pullup R 3 =4.7 k Schaltkontakt Alarm-LED GPIO5 <?page no="218"?> 5.3 Interfacetechnik: Arduino-Befehle 219 http: / / www.uvk-lucius.de/ informatik-ing digitalRead(), welcher bei geschlossenem Schalter eine 0 und bei offenem Schalter eine 1 liefert. Digitale Ausgänge werden mit dem Befehl digitalWrite() gesteuert. Je nach Übergabeparameter (LOW / HIGH) liegt dann am entsprechenden Pin jeweils 0V bzw. VCC an. 30: #define DOUT_PIN 5 31: #define DIN_PIN 4 32: 33: void setup() { 34: Serial.begin(9600); 35: pinMode(DOUT_PIN,OUTPUT); / / Pin als Ausgang 36: pinMode(DIN_PIN,INPUT_PULLUP); / / Eingang mit internem Pullup 37: } 38: 39: 40: void loop() { 41: if (digitalRead(DIN_PIN)) / / Testen Zustand digitaler Eingang 42: tprintf("Eingang Pin ist high \n"); 43: else 44: tprintf("Eingang Pin ist low \n"); 45: 46: digitalWrite(DOUT_PIN,HIGH); / / Ausgang High-Pegel 47: delay(500); / / 500 ms pause 48: digitalWrite(DOUT_PIN,LOW); / / Ausgabe Low-Pegel 49: delay(500); / / 500 ms pause 50: } Ausgabe: Eingang Pin 12: 1, Eingang Pin 11 ist low Das obige Programm wertet die Zustände zweier Pins aus und gibt gleichzeitig ein Rechtecksignal (1 Hz) an DOUT_PIN aus. Der Widerstand R 2 sorgt für die Strombegrenzung bei der Ansteuerung der LED. 5.3.2 Analog I/ O Auch zur Ankopplung analoger Signale stehen zwei Funktionen bereit. Das Einlesen einer Spannung erfolgt über den Befehl analogRead(). Dieser nutzt als Argument beim Arduino UNO einen der analogfähigen Pins A0 bis A5, der ESP8266 besitzt leider nur einen solchen Eingang A0. Die vorgeschlagene Interfaceschaltung sieht hier als Beispiel für eine einfache Sensorik einen Spannungsteiler mit einem lichtempfindlichen Widerstand (LDR) vor. Je nach Wahl des LDR und des verwendeten Boards muss der Widerstand R 1 entsprechend angepasst werden (vergl. <?page no="219"?> 220 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Spannungsteiler Kapitel Hardware und Übungsaufgaben). Die Spannung ergibt sich dann zu: VCC LDR A U R R R U ⋅ + = 1 1 0 Diese Spannung wird abgetastet und über einen ADC schließlich in einen korrespondierenden Ganzzahlwert gewandelt. Wie bereits erwähnt, besitzen die beiden vorgestellten Boards keine DAC-Module. Deshalb ist die Ausgabe eines analogen Spannungswertes nicht möglich. Als Ersatz bietet sich der analogWrite()-Befehl an. Dieser erzeugt am angegebenen Pin ein Puls-Weiten-moduliertes Signal (PWM), also ein Rechtecksignal mit variabler Einschaltzeit. Ein duty_cycle Wert von 0 entspricht 0 %, ein Wert von 128 entspricht 50 % und ein Wert von 255 entspricht einer Einschaltzeit von 100% der Periodendauer. Wird dieses Rechtecksignal auf ein System mit Tiefpassverhalten gegeben, so entsteht eine geglättete Spannung, die proportional zum duty_cycle ist. Oft ist das Tiefpassverhalten schon im zu steuernden System zu finden. Eingesetzt wird das Verfahren z.B. zur Drehzahlsteuerung eines Motors (Massenträgheit) oder zum Dimmen einer LED (Trägheit des Auges). Anwendungsbeispiel: Dimmen einer LED In diesem Beispiel wird die am AIN_PIN anliegende Spannung gemessen und ausgegeben. Gleichzeitig erfolgt eine PWM- Ausgabe am AOUT_PIN. Schließen wir dort eine LED an, so lässt sich die Veränderung des duty_cycle an der Helligkeitsänderung beobachten: 1: #define AOUT_PIN 5 2: #define AIN_PIN A0 3: 4: void setup() { 5: Serial.begin(9600); 6: pinMode(AOUT_PIN,OUTPUT); / / Ausgang freischalten 7: } 8: 9: void loop() { 10: int ain; 11: ain = analogRead(AIN_PIN); / / Einlesen analog in Pin A0 <?page no="220"?> 5.3 Interfacetechnik: Arduino-Befehle 221 http: / / www.uvk-lucius.de/ informatik-ing 12: 13: static uint8_t duty_cycle = 0; / / Wert für Aout PWM 14: analogWrite(AOUT_PIN,duty_cycle); / / Einschaltzeit PWM setzen 15: tprintf("analogInput: %i analogWrite: %i \n",ain,duty_cycle); 16: duty_cycle = duty_cycle+32; / / fürs nächste mal erhöhen 17: delay(1000); / / 1000 ms warten 18: } Anmerkung: Hier definieren wir die Variable duty_cycle bewusst als statische 8-Bit Zahl, dann sorgt nämlich der Zahlenüberlauf durch die fortgesetzte Addition für einen sägezahnförmigen Verlauf der Helligkeit (n=8 Bit, Wertebereich 0…255). 5.3.3 Serielle Protokolle Im Kapitel Hardware wurden bereits die verschiedenen seriellen Übertragungsmöglichkeiten vorgestellt. Die klassische UART- Schnittstelle wird direkt per Arduino-Befehl Serial.print() bzw. Serial.read() bedient. Wir haben diesen Befehl auch dazu genutzt, uns eine eigene Variante der C-Standardausgabe printf zu erzeugen. Wie bereits erwähnt, deckt die UART-Kommunikation den größten Teil der Schnittstellenanforderungen ab. So gibt es z.B. Abstandssensoren, RFID-Controller oder CO 2 - Sensoren, die sich per UART ansprechen lassen. Zum Kommunikationsprotokoll gehört auch die Interpretation der übertragenen Information. Bisher haben wir z.B. das besondere Zeichen '\n' (Zeilenumbruch) zur Terminalsteuerung kennengelernt. Daneben gibt es noch eine Reihe weiterer Zeichen, die für besondere Protokollaufgaben reserviert sind. Abbildung 94 zeigt die von einem RFID-Controller übertragene Nachricht. Diese wird gesendet, wenn ein RFID-Tag den Empfangsbereich betritt. Sie beginnt mit einem STX, gefolgt von der gelesenen Tag-Nummer und einer Prüfsumme. Beendet wird die Nachricht wieder mit einem speziellen Zeichen (ETX). <?page no="221"?> 222 5 Grundlagen der Programmierung http: / / www.uvk-lucius.de/ informatik-ing Abb. 94: Beispiel RFID-Kommunikation Der Empfänger muss die insgesamt 14 Zeichen der Nachricht auswerten, die Prüfsumme checken und den interessanten Nutzanteil (hier die Tag-Nummer) extrahieren. Eine mühselige Arbeit, die gemäß der Arduino-Philosophie wieder von einem eingebauten Befehl übernommen werden sollte. Anwendungsbeispiel: Feuchtesensor DHT Da viele Sensorhersteller ein eigenes Protokoll verwenden, ist die standardmäßige Unterstützung aller möglichen Protokolle praktisch unmöglich. Glücklicherweise finden sich in der Arduino-Community aber häufig Freiwillige, die für verbreitete Sensoren entsprechende Libraries entwickeln und der Gemeinschaft zur Verfügung stellen. Diese können dann, ähnlich wie beim „Boardmanager“, mit Hilfe eines „Librarymanagers“ nachträglich eingebunden werden (Menü Sketch->Bibliothek einbinden). In unserem Fall benötigen wir das „DHT sensor library“ 21 , welches ggf. installiert werden muss. Zur DTH-Familie (DHT11, DTH22, DHT21) gehören eine Reihe von sehr kostengünstigen (ab 3 €) Temperatur- und Feuchtesensoren, die ihre Messdaten über ein serielles Protokoll zur Verfügung stellen 22 . 1: #include "DHT.h"; / / Einbinden DHT Bibliothek 2: #define DHT_TYPE DHT11 / / Auswahl DHT11, DHT22 oder DHT21 3: #define DHT_PIN 2 / / Pin an dem der DHT angeschlossen ist 4: 5: DHT dht(DHT_PIN, DHT_TYPE); / / Erstelle Objekt 6: 7: void setup() { 8: Serial.begin(9600); 9: dht.begin(); / / Initialisiere dht 10: } 21 https: / / github.com/ adafruit/ DHT-sensor-library. 22 https: / / learn.adafruit.com/ dht/ overview. Nachricht: „<STX> 460071B5F371 <ETX>“ ASCII 0x02 Start off Text ASCII 0x03 End off Text Kartennummer Prüfsumme <?page no="222"?> 5.4 Literatur 223 11: 12: void loop() { 13: float hum = dht.readHumidity(); / / Feuchte auslesen 14: float temp = dht.readTemperature(); / / Temperatur auslesen 15: tprintf("Temp: %i C,Feuchte: %i %\n",(int) temp,(int) hum); 16: delay(1000); / / 1000 ms warten 17: } Ausgabe: Temp: 21 C,Feuchte: 38 % 5.4 Literatur Erlenkötter, H., C: Programmieren von Anfang an, rowohlt Taschenbuch Boxall, J., Arduino-Workshops: Eine praktische Einführung mit 65 Projekten, dpunkt.verlag Kolban, N., Kolban’s book on the ESP8266, ebook, https: / / leanpub.com/ ESP8266_ESP32 Mikrocontroller.net, GCC-Tutorial, wiki http: / / www.mikrocon troller.net/ articles/ AVR-GCC-Tutorial http: / / www.netzmafia.de/ skripten/ hardware/ Arduino/ Arduino _Programmierhandbuch.pdf <?page no="224"?> http: / / www.uvk-lucius.de/ informatik-ing 6 Rechnernetze Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie den allgemeinen Aufbau und die Funktion von Rechnernetzen nachvollziehen können. Die Vor- und Nachteile verschiedener Topologien kennen; das Prinzip des OSI-Schichtenmodells anhand der im Internet eingesetzten TCP/ IP-Protokollfamilie darstellen können; verbreitete Netztypen (Ethernet, Drahtlosnetzwerke) näher beschreiben können und am exemplarischen Beispiel des CAN-Buses, die Vorteile der Feldbussysteme und die Busarbitrierung erläutern können. Ein Netzwerk verbindet verschiedene Teilnehmer und ermöglicht die Kommunikation der einzelnen Systeme untereinander, sowie die Nutzung gemeinsamer Ressourcen (z. B. Netzwerkdrucker oder -speicher). Dies beschränkt sich aber nicht nur auf die Verbindung von ganzen Rechnern wie z.B. im Internet oder im Firmennetz (Intranet), sondern ermöglicht den Informationsaustausch auch mit einfachen Geräten wie Sensoren, Aktoren oder eingebetteten Systemen. Typische Vertreter dieser auch Feldbus genannten echtzeitfähigen Netzwerke sind der CAN- Bus (Controller Area Network) im Automobil oder das in der chemischen Industrie verbreitete Profibus-System (Process Field Bus). Abgesehen vom Systembus innerhalb eines Rechnersystems, bei dem n parallele Leitungen für die Übertragung genutzt werden, erfolgt die Kommunikation bei den meisten Netzwerken über serielle Schnittstellen auf wenigen Leitungspaaren. <?page no="225"?> 226 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing 6.1 Netzwerktopologie Die physikalische Topologie eines Netzwerks beschreibt die Struktur der Verbindungen zwischen den Teilnehmern (Knoten). Dabei kommen sowohl leitungsgebundene als auch drahtlose Verbindungen zum Einsatz. Abbildung 95 zeigt typische Anordnungen: Abb. 95: Netzwerktopologie Die einfachste Topologie ist die direkte Punkt-zu-Punkt- Verbindung (Direktverbindung, Point to Point, PTP), bei der zwei Knoten direkt miteinander verbunden sind. Dies ist im Bereich der Messdatenerfassung eine sehr weit verbreitete Methode. Viele intelligente Sensoren und Aktoren (CO 2 -Sensor in der Gebäudetechnik, Laborwaagen, Schlauchpumpen usw.) bieten eine PTP-Kommunikationsmöglichkeit z.B. über serielle Schnittstellen (RS 232, V.24, COM-Schnittstelle am PC). Daraus ergibt sich in realen Anwendungen durchaus eine Stern- Topologie, bei der der PC oder das Prozessleitsystem im Mittelpunkt Informationen zwischen den einzelnen intelligenten Komponenten vermittelt. Beim Ethernet bilden spezialisierte Knoten (Hubs oder Switches) eine zentrale Anbindung von Endgeräten an das Netzwerk. Störungen dieser Komponente beeinflussen damit die Erreichbarkeit aller daran angeschlosse- <?page no="226"?> 6.1 Netzwerktopologie 227 http: / / www.uvk-lucius.de/ informatik-ing nen Teilnehmer, weswegen aus der Sicht der Ausfallsicherheit das vollvermaschte Netz die beste Möglichkeit darstellt. Bei n Teilnehmern, die alle direkt miteinander verbunden sind, entsteht so ein Netzwerk, welches mit 2 / ) ( 2 n n L − = allerdings sehr viele Leitungen L benötigt. Ein entscheidender Vorteil dieser sehr leistungsfähigen Struktur ist die hohe Ausfallsicherheit. Ist eine Verbindung gestört, so kann die Kommunikation durch Umleitung (Routing) über andere Knoten weiterhin aufrechterhalten werden. Das Internet ist ein bekanntes Beispiel für ein teilvermaschtes Netzwerk, bei dem nur zwischen ausgewählten Knoten eine direkte Verbindung besteht und trotzdem häufig auch alternative Verbindungswege existieren. Die im Bereich der Automatisierungstechnik am häufigsten anzutreffende Bus-Topologie reduziert den Verdrahtungsaufwand auf ein Liniensegment, an das die Teilnehmer über möglichst kurze Stichleitungen angebunden werden. Abschlusswiderstände an den Segmentenden dienen der Vermeidung von Reflektionen auf den Leitungen. Ausschlaggebend für den Einsatz sind vor allem die geringen Verkabelungskosten und die einfache Erweiterbarkeit. Allerdings muss durch geeignete Buszugriffsverfahren sichergestellt werden, dass immer nur ein Teilnehmer zu Zeit das Übertragungsmedium nutzt. Bei Drahtlosnetzwerken existieren gar keine physikalischen Leitungswege zwischen den Teilnehmern. Hier kommt vielmehr eine Zell-Topologie zum Einsatz, bei der die Teilnehmer rund um eine Basisstation (z.B. Wireless Access Point beim WLAN, Mobilfunkmast beim GSM) mit dieser kommunizieren können. In der Praxis wird zwischen physikalischer (Leitungsverbindung) und logischer (Kommunikationsverbindung) Topologie unterschieden. Der Profibus wird physikalisch z.B. als Bus ausgeführt, logisch nutzen die Teilnehmer (Master) eine Token- Ring-Struktur zur Zugriffssteuerung. Bei einer Ring-Topologie sind alle Teilnehmer ringförmig in einer geschlossenen Schleife <?page no="227"?> 228 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing angeordnet. Jeder Knoten hat genau einen Vorgänger und einen Nachfolger. Jedes empfangene Datenpakt (oder die Zugriffsberechtigung auf den Bus-Token) wird vom Knoten ausgewertet und ggf. zu seinem Nachfolger weitergereicht. Bei physikalischen Ringstrukturen arbeiten alle Knoten als Verstärker, so dass hier auch große Entfernungen überbrückt werden können. Andererseits kann eine gestörte Teilverbindung den ganzen Ring blockieren. 6.2 Netzwerkprotokolle Um Informationen zwischen den Teilnehmern eines Netzwerks austauschen zu können, ist nicht nur eine physikalische Verbindung notwendig, sondern auch die Vereinbarung von Kommunikationsregeln (Netzwerkprotokolle) unumgänglich. Solche Regeln umfassen z. B die Eröffnung und Beendigung einer Verbindung, die Vereinbarung von Übertragungsgeschwindigkeiten und Handshake, sowie das Format einer Botschaft. Darüber hinaus werden Vereinbarungen getroffen, wie Nachrichtenverlust verhindert werden kann (Fehlerkorrektur) und was mit Wiederholungen passiert. 6.2.1 Das OSI-Referenzmodell Das OSI-Referenzmodell (Open Systems Interconnection) definiert dazu sieben aufeinander folgende Schichten (Layer) mit klar abgegrenzten Teilaufgaben. Jede Schicht stellt Dienste zur Verfügung, die eine höhere Schicht nutzen kann. Zur Erbringung der eigenen Aufgaben nutzt jede Schicht die Dienste der darunter liegenden Schicht. <?page no="228"?> 6.2 Netzwerkprotokolle 229 http: / / www.uvk-lucius.de/ informatik-ing Abb. 96: OSI-Schichtenmodell Erst auf der Ebene der Bitübertragungsschicht findet schließlich ein Zugriff auf das Übertragungsmedium und damit der physikalische Informationstransport statt. Dazu muss jede Schicht auf Seiten der beiden Teilnehmer dieselben Regeln beherrschen und anwenden. Ausgehend von den zu übertragenden Daten der Anwendungsschicht fügt jede Ebene weitere, für die Aufgaben dieser Ebene notwendige Informationen hinzu, so dass zu den ursprünglichen Nutzdaten ein nicht zu vernachlässigender Protokolloverhead hinzukommt. Dies erklärt die Diskrepanz zwischen Netto- und Brutto-Übertragungsraten beim Informationsaustausch. Beispielsweise erreicht das WLAN IEEE 802.11g bei einer Brutto-Übertragungsrate von 54 Mb/ s nur Teilnehmer A Schicht 7 Anwendung Schicht 7 Anwendung Schicht 6 Darstellung Schicht 6 Darstellung Schicht 5 Kommunikation Schicht 5 Kommunikation Schicht 4 Transport Schicht 4 Transport Schicht 3 Vermittlung Schicht 3 Vermittlung Schicht 2 Sicherung Schicht 2 Sicherung Schicht 1 Bitübertragung Schicht 1 Bitübertragung Übertragungsmedium Datenpaket Teilnehmer B Datenpaket <?page no="229"?> 230 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing eine Netto-Datenrate von 20 Mb/ s. Die beim Empfänger auf der untersten Schicht eintreffenden Datenpakete werden schließlich von Ebene zu Ebene bis zur Anwendungsschicht weitergereicht und die jeweiligen Nutzdaten extrahiert. Abb. 97: Protokolloverhead durch Header 6.2.2 Das TCP/ IP-Referenzmodell In der Praxis hat vor allem das Internetprotokoll eine herausragende Bedeutung, weshalb hier das zugrundeliegende TCP/ IP-Referenzmodell genauer beschrieben wird. Dieser Ansatz fasst die Schichten 5, 6 und 7 des OSI-Models zu einer gemeinsamen Anwendungsschicht zusammen. <?page no="230"?> 6.2 Netzwerkprotokolle 231 http: / / www.uvk-lucius.de/ informatik-ing Abb. 98: TCP/ IP-Modell 6.2.2.1 Anwendungsschicht Diese Schicht umfasst alle Protokolle, die mit Anwendungsprogrammen zusammenarbeiten: In diesem Fall sind das vor allem das Hypertext Transfer Protocol (HTTP) zur Übertragung von Web-Seiten (Hypertext-Dokumente) im World Wide Web (WWW). Das File Transfer Protocol (FTP) zur Übertragung von Dateien, und das Simple Mail Transfer (SMTP) bzw. das Post Office Protocol (POP) zum Austausch von eMails. Darüber hinaus existiert mit dem Teletype-Network-Protokoll (TelNet) eine Möglichkeit zur Fernsteuerung von Computern im Netz. All diese Anwendungsprotokolle nutzen die Transportschicht zum Aufbau einer Ende-zu-Ende Kommunikation. Die meisten Protokolle auf Anwendungsebene arbeiten dabei nach dem Client/ Server-Prinzip. Ein Server ist ein Programm, das bestimmte Dienste (email-, Web-, Datenbank-Server) über das Netzwerk anbietet. Ein anderes Programm (der Client) kann diesen Dienst nutzen. Eine Anwendung mit Kommunikationswunsch (Client) stellt eine Anfrage (request) an einen Rechner (Server = „Dienste-Erbringer“), der ggf. in der Lage ist, diese Anfrage zu beantworten. Bei entsprechender Berechtigung <?page no="231"?> 232 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing liefert letzterer die gewünschte Information (reply) an den Client. Es handelt sich hierbei um ein Architekturmodell, welches die Rollen der Beteiligten und die zeitliche Abfolge der Interaktionsschritte festlegt. Ein Client kann auf mehrere Server während der Verarbeitung zugreifen, während ein Server viele verschiedene Kunden gleichzeitig bedienen kann. In Unternehmen ermöglichen häufig Proxy-Server (Proxy = „Stellvertreter-Software“) den Einzelrechnern einen sicheren Internetzugang. Er steht dabei zwischen Client und Netz. Anwendungsbeispiel: Web-Server Abbildung 99 verdeutlicht dies am Beispiel des Aufrufs einer Webseite. In diesem Fall wird die Seite von einem kleinen Web- Server zur Übermittlung aktueller Messdaten für Temperatur und Luftfeuchtigkeit bereitgestellt (s. Kapitel 10). Abb. 99: HTTP-Anfrage einer Web-Seite Die über das Netzwerk angeforderte Ressource wird im Web- Browser (Client) durch eine eindeutige URL (Uniform Resource Locator) identifiziert. Hier die auf dem Server mit der IP-Adresse 192.168.4.1 befindliche Seite „/ alarm.html.“. In unserem Beispiel richtet der Client seine Anfrage (HTTP- Request) an den Server und erhält vom Server die Antwort (HTTP-Response) zurück. Dabei lautet die als Text versendete Anfrage: GET / alarm.html HTTP/ 1.1 Host: 192.168.4.1 Connection: close <?page no="232"?> 6.2 Netzwerkprotokolle 233 http: / / www.uvk-lucius.de/ informatik-ing wobei der Client durch Verwendung der GET-Methode signalisiert, dass er eine Ressource vom Server anfordert und die Verbindung nach erfolgter Reaktion automatisch geschlossen werden soll. Daneben existiert z.B. eine POST-Methode, mit der der Client selber Daten zur Verarbeitung an den Server senden kann. Der adressierte Server analysiert die Anfrage und liefert daraufhin eine Antwort aus. Diese Antwort besteht aus zwei Teilen: Einem Header, HTTP/ 1.x 200 OK Content-Type: text/ html Connection: close der anzeigt, dass die gewünschte Ressource vorhanden ist und die gewünschten Daten als HTML-Text vorliegen. Gefolgt vom eigentlichen Inhalt der Nachricht: <h1>Alarm aktiviert ! </ h1> In diesem Fall ist das der Status der Alarmüberwachung oder die aktuell gemessene Temperatur und Luftfeuchtigkeit. Diese Information wird schließlich im Browser angezeigt. Da sich eine IP-Adresse nur schwer merken lässt, wird in der Praxis stattdessen meist der Domain-Name verwendet (z.B. umwelt-campus.de). Für die Umsetzung in die notwenige IP- Adresse existiert ein eigenes Anwendungsprotokoll, das Domain Service System (DNS). Dieses Protokoll funktioniert ähnlich einer Telefonauskunft. Der DNS-Server nimmt die Domain-Anfrage (umwelt-campus.de) entgegen und liefert die dazu gehörende IP-Adresse (143.93.47.25) zurück. Auf einem Server-Rechner können gleichzeitig mehrere Dienste (z.B. Web-Server mit HTTP und Mail-Server mit POP) aktiv sein. Um unterscheiden können, für welchen Services ein bestimmtes Datenpaket bestimmt ist, existieren sogenannte Port- Nummern zur Identifikation. <?page no="233"?> 234 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing Tab. 29: Portnummern, Internet Kommunikation Protokoll Standard-Port HTTP, HTTPS 80, 443 SMTP 25 FTP 20, 21 Telnet 23 6.2.2.2 Transportschicht Hier wird zwischen dem unzuverlässigen User Datagram Protocol (UDP) und dem zuverlässigen Transmission Control Protocol (TCP) unterschieden. UDP ist ein verbindungsloses Protokoll, welches vor allem bei zeitkritischen Anwendungen genutzt wird (z.B. Sprachübertragung, Voice over Internet Protocol, VoIP). Hierbei wird der Empfang einer Nachricht nicht bestätigt, es gibt keine Garantie, dass ein Paket ankommt bzw. nur einmal ankommt und auch die Paketreihenfolge kann beim Empfänger abweichen. Alles zugunsten einer möglichst schnellen Übertragung. Das verbindungsorientierte TCP Protokoll vermeidet diese Probleme. Vor dem eigentlichen Informationsaustausch wird eine Verbindung explizit geöffnet und am Ende wieder geschlossen. Das Protokoll sorgt für eine verlustfreie, verlässliche Datenübertragung in beide Richtungen, außerdem sind Algorithmen zur Überlaststeuerung integriert. 6.2.2.3 Internetschicht Diese Schicht implementiert die Vermittlungsschicht des OSI- Modells und gewährleistet über die bereits erwähnte IP- Adresse die weltweit eindeutige Identifikation des Rechners. Die in der Version 4 (IPv4) verwendete Adresse besteht aus 32 Bit, welche üblicherweise mit vier durch Punkte voneinander getrennten Dezimalzahlen notiert wird. Eine IP-Adresse besteht aus einem Netzanteil und einem Hostanteil (Gerät). Die Aufteilung wird durch eine Subnetzmaske festgelegt. <?page no="234"?> 6.2 Netzwerkprotokolle 235 http: / / www.uvk-lucius.de/ informatik-ing Abb. 100: Netz- und Hostanteil einer IP-Adresse Nur Geräte im selben Teilnetz (mit demselben Netzanteil) können direkt miteinander kommunizieren. Innerhalb des Teilnetzes darf kein Hostanteil doppelt vergeben werden. Die Zuweisung der IP-Adresse an einen Rechner kann manuell vorgenommen werden oder über ein Anwendungsprotokoll (Dynamic Host Configuration Protocol, DHCP) automatisiert erfolgen. Hierbei sorgt der DHCP-Server für die eindeutige Vergabe von Subnetzmaske und Hostanteil. Im Heimnetz wird diese Funktion meist vom Router übernommen. Aufgrund der exponentiellen Entwicklung ist abzusehen, dass der verfügbare Adressraum (2 32 = 4.294.967.296 mögliche Teilnehmer) in Zukunft nicht mehr ausreichen wird. Die aktuelle Version (IPv6) des Protokolls erweitert die IP-Adresse deshalb auf 128 bit, womit sich theoretisch über 10 38 Teilnehmer realisieren lassen. Die Hauptaufgabe eines Routers (Vermittlungsrechner) besteht dabei in der Wegfindung (Routing) von Datenpaketen außerhalb des eigenen Teilnetzes. Mittels Routing-Verfahren sollen schnelle, stabile und sichere Übertragungsstrecken ermittelt werden. Unterschieden werden dynamisches und statisches Routing. Beim statischen Routing wird für die Übertragung nur einmal ein Weg festgelegt, beim dynamischen wird der Übertragungsweg in Abhängigkeit von den lokalen Gegebenheiten immer wieder neu bestimmt. 6.2.2.4 Netzzugangsschicht Die Netzzugangsschicht entspricht der Sicherungs- und Bitübertragungsschicht im OSI-Modell. Hier wird die elektrische und mechanische Schnittstelle zum eigentlichen Übertragungsmedium definiert. Zur Vermeidung von Übertragungsfehlern und Datenverlust enthält diese Schicht auch Funktionen zur <?page no="235"?> 236 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing Fehlererkennung, -behebung und Datenflusskontrolle. Im Falle der Internetkommunikation wird hier vor allem die kabelgebundene Ethernet-Technologie eingesetzt. Ethernet entspricht dem IEEE 802.3-Standard für lokale Netze (Local Area Network, LAN) und implementiert eine CSMA/ CD-Strategie für den Zugriff auf das Übertragungsmedium (Carrier Sense Multiple Access/ Collision Detection). Bei dieser Technologie überwacht jeder Teilnehmer das Übertragungsmedium und wartet, bis dieses frei ist. Anschließend sendet der Teilnehmer seine Daten und überprüft gleichzeitig, ob die Nachricht störungsfrei übertragen wird. Abb. 101: Kollisionserkennung Ethernet Wird eine Kollision festgestellt, z.B. weil ein anderer Teilnehmer zeitgleich mit dem Senden begonnen hat, wird die Übertragung durch Senden eines speziellen Störsignals (JAM-Signal) abgebrochen. Danach warten beide Teilnehmer eine zufällige Zeit (Backoff-Strategie) und starten anschließend einen neuen Übertragungsversuch. Abb. 102: Algorithmus beim Senden einer Nachricht Wiederhole bis die Nachricht erfolgreich gesendet wurde Warte bis Übertragungsmedium frei ist Abhören Übertragungsmedium Sende Nachricht, prüfe gleichzeitig auf Kollision Kollision festgestellt ? ja nein Sende JAM-Signal Warte Zufallszeit Nachricht wurde erfolgreich gesendet Eine Station prüft und sendet Zwei Stationen prüften und senden gleichzeitig Kollision, beide Stationen brechen ab Erfolgreicher Buszugriff <?page no="236"?> 6.2 Netzwerkprotokolle 237 http: / / www.uvk-lucius.de/ informatik-ing Aufgrund der zufälligen Wartezeit und der Möglichkeit, dass eine Nachricht wiederholt kollidiert, ist das Zugriffsverfahren nicht echtzeitfähig, d.h. es kann keine Zugriffszeit garantiert werden. Im Bereich der Automatisierungstechnik gibt es deshalb verschiedene Modifikationen (Profinet, EtherCAT usw.). 6.2.3 Feldbusprotokolle Gerade die Automatisierungstechnik hat sehr früh die Vorteile einer durchgehenden Vernetzung erkannt. Um den verschiedene Anforderungen auf den unterschiedlichen Automatisierungsebenen gerecht zu werden, existieren dort eine Vielzahl angepasster Bussysteme. Beginnend auf der untersten Eben der Feldbussysteme mit ihren typischerweise geringen Datenvolumen und den dafür sehr kleinen Reaktionszeiten, über die Ebene der Prozessleitebene bis hin zur Managementebene mit eher geringen Anforderungen an die Echtzeitfähigkeit, aber dafür großen zu übertragenden Datenvolumina. Abb. 103: Kommunikation Automatisierungstechnik Innerhalb der Feldebene sind vor allem drei Vorteile ausschlaggebend für den Einsatz: Feldebene (Sensoren, Aktoren) Steuerungsebene (SPS) SCADA- / Prozessleitsysteme Managementebene Reaktionszeit Datenmenge Übertragungshäufigkeit <?page no="237"?> 238 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing Geringer Verkabelungsaufwand: - Zeitersparnis (Planung, Installation) - Platzersparnis (Rangierverteiler, Schaltschrank) - Gewichtsersparnis (Automobil, Flugzeug) Zuverlässigkeit: - Kurze Signalwege (reduzierte mech./ elektr. Probleme) - Störsicherheit (CRC-Prüfsumme, Timeout) - Eigendiagnose (z.B. Schaltzyklen, Zeitkonstanten) Flexibilität: - Genauigkeit / Messbereich / Anzeigeskala jederzeit änderbar - Struktur variabel (wer spricht mit wem) - Interoperabilität von Geräten verschiedener Hersteller Allerdings sind auch systembedingte Nachteile zu beachten: - Qualifiziertes Personal nötig - Viele verschiedene Standards auf dem Markt - Intelligente Komponenten („Smart“-….) verursachen höhere Kosten für den einzelnen Sensor Langfristig gibt es Bestrebungen, die etablierten Feldbusprotokolle durch echtzeitfähige Ethernet-Erweiterungen zu ersetzen. Damit wäre auch die Idee der Industrie 4.0 mit Internetzugriff bis in die Sensor-/ Aktor-Ebene einfach realisierbar. Stellvertretend für die verschiedenen Feldbusprotokolle (HART, Profibus, Modbus usw.) soll hier im Folgenden das CAN- Protokoll näher vorgestellt werden. 6.2.3.1 Controller Area Network (CAN) Schon in den 1980er Jahren hat die Automobilindustrie das Potential der Sensor-/ Aktor-Vernetzung im Auto erkannt. Der im Fahrzeug zu verlegende Kabelbaum (früher mehr als 2 km Leitungslänge pro Fahrzeug) lässt sich so drastisch reduzieren. Dies führt nicht nur zu niedrigeren Herstellungskosten, sondern <?page no="238"?> 6.2 Netzwerkprotokolle 239 http: / / www.uvk-lucius.de/ informatik-ing natürlich auch zu einer signifikanten Gewichtseinsparung (100 kg Kupfer) und damit einem niedrigeren Treibstoffverbrauch. Das von der Firma Bosch entwickelte und als kostengünstige Hardwarelösung verfügbare CAN-Bus-System implementiert eine sogenannte Multi-Master-Kommunikation, d.h. alle Busteilnehmer sind gleichberechtigt. Die Teilnehmer tauschen ihre Nachrichten in Form eines CAN-Telegramms mit maximal 154 Bit Länge aus: Abb. 104: CAN-Telegramm Innerhalb dieses Telegramms werden maximal 8 Byte Nutzdaten transportiert, was dieses Protokoll ideal zur Sensor- / Aktor-Vernetzung geeignet macht. Bei der Datenübertragung werden keine Knoten adressiert, sondern der Inhalt einer Nachricht wird durch eine eindeutige Kennung (Identifier, ID) beschrieben (z.B. Temperatur = ID 1000, Drehzahl = ID 1001 usw.). Alle Nachrichten werden stets von allen Teilnehmern am Bus empfangen (Broadcast). Eine ausgefeilte Fehlerbehandlung stellt sicher, dass eine Nachricht bei allen Teilnehmern verlässlich ankommt. Stellt ein einzelner Teilnehmer einen Übertragungsfehler fest, sendet er eine Fehlernachricht (Error-Frame) an alle anderen Teilnehmer, die dann ihrerseits diese Nachricht für ungültig werten. Damit erreicht der CAN-Bus ein hohes Sicherheitsniveau, was zu einer weiten Anwendung in sicherheitskritischen Bereichen geführt hat. Neben dem Automobilsektor findet sich der CAN-Bus auch in der Medizintechnik (Magnetresonanz-, Computertomograph, Herz-Lungen-Maschine), der Gebäudetechnik (Aufzugssteuerung) oder der Luft- und Raumfahrttechnik. Ähnlich wie beim Ethernet muss der Zugriff auf das topologisch als Linienbus ausgeführte Leitungspaar per Protokoll geregelt werden. Hier bestimmt die eindeutige Kennung einer <?page no="239"?> 240 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing Nachricht auch deren Priorität bei der Übertragung. CAN verwendet eine CSMA/ CR (Carrier Sense, Multiple Access/ Collision Resolution) genannte Zugriffstechnik, bei der Kollisionen erkannt und gleichzeitig Nachrichten mit der höchsten Priorität zerstörungsfrei übermittelt werden. Zur Anschauung des Buszugriffs (Busarbitrierung) dient Abbildung 105. Abb. 105: Zerstörungsfreier Buszugriff beim CAN-Bus Der Bus besteht physikalisch aus zwei Leitungen. Über Pullup- Widerstände wird auf dem Bus ein „High“-Ruhepegel erzeugt. Die einzelnen Teilnehmer besitzen ein Senderinterface, welches mittels Schalttransistor den Bus auf „Low“-Pegel ziehen kann. Da ein einziger Knoten mit durchgeschaltetem Transistor ausreicht, um den gesamten Bus auf „Low“ Pegel zu ziehen, spricht man von einem dominanten 0- und einem rezessiven 1-Pegel. Alle Teilnehmer können gleichzeitig senden und zur Kontrolle die Busleitung überwachen. Möchte ein Teilnehmer eine Nachricht senden, so wartet er, bis der Bus frei ist. Anschließend wird die Nachricht beginnend mit dem 11-bit (bzw. 29-bit bei <?page no="240"?> 6.3 Drahtlosnetzwerke 241 http: / / www.uvk-lucius.de/ informatik-ing CAN 2.0B) langem Identifier auf den Bus gegeben. Auch hier gibt es, wie beim Ethernet, natürlich das Problem, das zwei oder mehr Teilnehmer gleichzeitig mit dem Senden beginnen. Anders als beim klassischen Ethernet lassen sich Kollisionen hier aber zerstörungsfrei auflösen. Sendet nämlich ein Teilnehmer ein 1- Signal und sieht auf dem Bus ein 0-Signal, so kann er erkennen, dass ein anderer Teilnehmer gleichzeitig den Bus anfordert. Dieser Teilnehmer sendet demzufolge einen dominanten Pegel und gewinnt damit den Buszugriff. Der Teilnehmer mit dem rezessiven Sendewunsch erkennt die Kollision und stoppt sofort seine weitere Übertragung. Damit gewinnt stets die Nachricht mit dem niedrigsten Identifier den Bus (Hier Teilnehmer 3 mit ID 1168 10 ). Diese Nachricht wird trotz Kollision unverzögert übertragen. Teilnehmer mit rezessiven Nachrichten müssen warten, bis der Bus wieder frei ist und startet den Arbitrierungsprozess von neuem. 6.3 Drahtlosnetzwerke Ein Drahtlosnetz nutz elektromagnetische Wellen als Übertragungsmedium. Je nach verwendeter Sendefrequenz, Leistung und verwendeten Antennentyp lassen sich dabei verschiedene Reichweiten überbrücken. Abb. 106: Reichweiten verschiedener Funktechnologien GSM UMTS LTE WWAN Wireless Wide Area Network Wireless LAN 802.11 WLAN Wireless Local Area Network Bluetooth RFID ZigBee WPAN Wireless Personal Area Network EnOcean <?page no="241"?> 242 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing Die aktuellen Entwicklungen im Bereich Internet der Dinge erfordern einen durchgängigen Internetzugriff ohne aufwendige Verdrahtung der Teilnehmer. Hier sind vor allem die niedrigen Frequenzbänder unter 1 GHz im Gespräch. Diese durchdringen Gebäude wesentlich leichter, als die im WLAN-Bereich etablierten Stammfrequenzen 2.4 und 5 GHz. Aussichtsreiche Vertreter in diesem Anwendungsfeld sind Zigbee ® und die Bluetooth ® Low Energy Erweiterung. 6.3.1 Wireless Personal Area Network (WPAN) Bei Reichweiten von einigen Dutzend Metern spricht man von WPAN-Systemen. Die Geräte sind häufig batteriebetrieben, so dass nur eine niedrige Sendeleistung zur Verfügung steht. Auch die jeweils übertragene Datenmenge und Übertragungsgeschwindigkeit sind relativ gering (wenige kb/ s bis Mb/ s). Ein direkter Übergang ins TCP/ IP-Modell und damit ins Internet ist in der Regel auch nicht vorgesehen. Falls trotzdem nötig, muss dazu eine aktive Komponente die Protokollumsetzung auf der Ebene der Anwendungsschicht durchführen (Gateway). Radio Frequency Identification (RFID) ist eine bekannte Technik zur Identifikation von Gegenständen über kurze Distanzen. Hauchdünne Chips (Transponder, RFID-Tag) lassen sich einfach über Klebeetiketten an Gegenständen befestigen und sichern die Ware z.B. im Kaufhaus vor Diebstahl. In Fertigungssystemen dient der Transponder zur Produktverfolgung und Sicherstellung der eindeutigen Identität des zu bearbeiteten Werkstücks. Im einfachsten Fall besteht der Transponder aus einem Chip, auf dem ein weltweit eindeutiger 96-Bit-Code gespeichert ist, und einer Antenne. Die zum Betrieb notwendige Energie wird vom Erfassungsgerät (Transmitter) erzeugt: ein magnetisches Wechselfeld, auf dessen Frequenz ein Schwingkreis im Transponder abgeglichen ist. Durch Resonanz beginnt im Schwingkreis ein Strom zu fließen und der Chip wird mit Energie versorgt. Die aufgenommene Energie führt zu einer Schwächung des Magnetfeldes, welches am Transmitter messbar <?page no="242"?> 6.3 Drahtlosnetzwerke 243 http: / / www.uvk-lucius.de/ informatik-ing ist. Der Informationsaustausch erfolgt durch Modulation des Feldes in beide Richtungen. Abb. 107: RFID-Kommunikation Die wohl bekannteste WPAN-Technologie ist Bluetooth ® (IEEE 802.15.1) zur Verbindung von Druckern, Lautsprechern und Freisprechanlagen. Die Sendeleistung beträgt 1 - 1000 mW bei einer Reichweite von 10 bis 100 m. Zigbee ® (IEEE 802.15.4) verwendet Sendeleistungen von wenigen mW und erreicht Distanzen von bis zu 100 m. Einsatz z.B. als Sensor-/ Aktornetz in der Gebäudeautomatiserung oder im Heimbereich zur Lampensteuerung. Besonders hervorzuheben sind die energieeffizienten Lösungen der Firma EnOcean ® . Das gleichnamige Funkprotokoll arbeitet im Frequenzbereich 868 MHz und nutzt Energy-Harvesting- Methoden als Energiequelle. Beispielsweise reicht die mechanische Energie beim Drücken eines Wandschalters zum Senden einer Nachricht an den Aktor, der z.B. versteckt im Sockel einer Glühbirne sitzt. Damit lassen sich Lichtschalter auch nachträglich flexibel, ohne Verkabelungsaufwand und Batteriewechselintervall, überall im Gebäude installieren. 6.3.2 Wireless Local Area Network (WLAN) Das wohl mit Abstand bekannteste Funknetzwerk ist das WLAN (IEEE 802.11), welches in einigen Ländern auch als WiFi-Netz bezeichnet wird. WLAN nutzt Frequenzbereiche im 2.4 GHz- und 5 GHz-Bereich zur Überbrückung von Distanzen <?page no="243"?> 244 6 Rechnernetze http: / / www.uvk-lucius.de/ informatik-ing von etwa 100 Metern bei Übertragungsraten von mehreren hundert Mb/ s. In dicht besiedelten Gebieten ist der 2.4 GHz-Bereich stark ausgelastet. Hier stehen nur 13 Kanäle (Frequenzen) zur Verfügung. Die meisten WLAN-Router analysieren die Empfangssituation in der Umgebung und wählen den am wenigsten belegten Kanal selbständig. Da ein gewählter Kanal auch die Nachbarkanäle beeinflusst, sollte man bei manueller Kanalwahl die Kanäle 1,6 oder 11 bevorzugen. Im Gegensatz zum WPAN integriert sich WLAN einfach als Netzzugangsschicht in das TCP/ IP-Referenzmodell. Beim Übergang ins Internet ist also kein Protokollumsetzer (Gateway) notwendig. Dies macht das WLAN zum universellen Funknetzwerk. Im Normalfall wird ein WLAN im Infrastrukturmodus betrieben, d.h. ein Wireless-Access-Point (WAP) übernimmt die Koordination aller Clients. Abb. 108: WLAN-Access Point Er sendet in zyklischen Abständen kleine Datenpakete (Beacons, Leuchtfeuer) im Broadcast (Rundruf) an alle Clients in Reichweite. Ein Beacon enthält u. a. Informationen zum Netzwerknamen (SSID, Service Set Identifier) und der Art der Verschlüsselung (WPA2, WiFi Protected Access) des Netzes. Sicherheit gegen unbefugtes Mithören ist bei Drahtlosnetzwerken zwingend geboten (s. Kapitel IT-Sicherheit). Ein WLAN-Client (z.B. Smartphone) hat damit ständigen Überblick über alle in der Nähe befindlichen Access-Points und kann von sich aus eine Verbindung aufbauen. Der Access Point kann sowohl die <?page no="244"?> 6.3 Drahtlosnetzwerke 245 http: / / www.uvk-lucius.de/ informatik-ing Kommunikation zwischen den Clients vermitteln, als auch den Zugang ins LAN bzw. Internet ermöglichen (WLAN-Router). Im Gegensatz zu einem Gateway verbindet der Router die verschiedenen Netze auf OSI-Ebene 3. 6.3.3 Wireless Wide Area Network (WWAN) Hierunter fällt die Kommunikation über große Entfernungen im Mobilfunk-Netz. Eine Basisstation versorgt alle sich in ihrer Zelle befindlichen Clients und ermöglicht den Übergang ins Internet. Abb. 109: Mobilfunkkommunikation Bewegt sich der Client (z.B. beim Autofahren), so erfolgt ein automatisches Handover, d.h. die unterbrechungsfreie Übergabe an eine andere Basisstation. Je nach Mobilfunk-Technik stehen unterschiedliche Übertragungsbandbreiten zur Verfügung. Tab. 30: Maximale Übertragungsraten Mobilfunk Generation Technik Übertragungsrate 2G GSM 9.6 kb/ s EDGE 220 kb/ s 3G UMTS 384 kb/ s HSPA 14.4 Mb/ s 4G LTE 150 Mb/ s Basis- Station Vermittlungs- Stelle Internet- Gateway Internet Mobilteil Funkzelle <?page no="245"?> 246 6 Rechnernetze Im Ingenieurbereich besteht damit die Möglichkeit, Messdaten über weite Strecken drahtlos zu übertragen (Machine to Machine Communication, M2M). Die Teilnehmer können mobil sein, wie z.B. beim „Emergency call“, (eCall) als automatisches Notrufsystem in allen Neufahrzeugen (verpflichtend ab 2018). Oder als solarbetriebene Messstation für Umweltdaten z.B. in der landwirtschaftlichen Wettervorhersage. Auch im Bereich der Überwachungsindustrie finden sich vielfältige Einsatzmöglichkeiten (GSM-Alarmanlagen, GSM-Störungsmelder). Viele komplexe Anlagen bieten heute eine eigene GSM-Schnittstelle zur Fernwartung durch den Hersteller. 6.4 Literatur Kurose, J. F., Ross, K. W. Computernetzwerke: Der Top-Down Ansatz, Pearson Studium Tanenbaum, A. S., Wetherall, D.J., Computernetzwerke, Pearson Studium <?page no="246"?> http: / / www.uvk-lucius.de/ informatik-ing 7 Internet Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: die Funktionsweise des Internets kennen; elementare Web-Technologien erläutern können; mit grundlegenden Diensten und Anwendungen im Internet vertraut sein; das unterschiedliche Potential von HTML und XML für Webanwendungen erkannt haben. 7.1 Grundlagen Das Internet ist ein Zusammenschluss (Netzwerk) aus vielen unterschiedlichsten Computer-Netzwerken, die alle unter dem Protokoll TCP/ IP (vgl. Kapitel Rechnernetze) arbeiten. Die Verwaltung und Finanzierung erfolgt nach dem föderalistischen Prinzip: Jedes Subnetz ist für den darin ablaufenden Datenverkehr zuständig. Jedes Netzwerk ist für die Verbindung zur nächsthöheren Stufe selbst verantwortlich. Nationale Komitees unterstützen die Verwaltung, z.B. www. denic.de (für die Top-Level-Domain .de). Neben dem Internet existiert auch der Begriff des Intranets. Dieses ist ein LAN, welches i.d.R. auf Internet-Techniken aufgebaut ist (z.B. Browser-Technologie). Als Unternehmensnetzwerk ist jedoch nur Mitarbeitern eines Unternehmens Zugriff erlaubt. Eine Öffnung eines unternehmenseigenen Intranets für <?page no="247"?> 248 7 Internet http: / / www.uvk-lucius.de/ informatik-ing kontrollierte Zugriffe aus dem Internet oder Intranet anderer Unternehmen wird häufig über VPN-(Virtual Private Network)- Verbindungen realisiert. 7.2 Web-Technologien Aufgrund der Vielfältigkeit der mittlerweile vorhandenen Webtechnologien können an dieser Stelle nur wenige, ausgewählte Technologien vorgestellt werden. Für das weiterführende Studium sei auf die angegebene Literatur verwiesen. 7.2.1 URL: Uniform Resource Locator Grundlegende Bausteine des WWW sind Hypermedia-Dokumente mit Hyperlinks als ihren Verknüpfungen untereinander. Erste grundlegende Arbeiten über Hypertext wurden bereits 1945 von Vannevar Bush durchgeführt. Das Prinzip von Hypertext (bzw. Hypermedia-Dokumenten) arbeitet folgendermaßen: In Büchern sind die Informationseinheiten durch die Seitennummerierung linear angeordnet. Dokumente, in denen die lineare Anordnung aufgehoben ist, um den Leser über Links (Verweise) zu anderen Dokumentbereichen zu verzweigen, bezeichnet man als Hypertext. Die verwendeten Ressourcen (z.B. Dokumente, Objekte) können dabei räumlich weltweit verteilt vorliegen. Ein Programm zum Anzeigen und Navigieren in Hypertext bezeichnet man als Browser. Werden in einem Hyperdokument Informationseinheiten verschiedener Medien, wie z.B. Text, Bilder (z.B. Graphiken), Bildfolgen (Videoaufzeichnungen) oder Ton (z.B. digitalisierte Sprache oder Musik) miteinander vernetzt, spricht man von Hypermedia. <?page no="248"?> 7.2 Web-Technologien 249 http: / / www.uvk-lucius.de/ informatik-ing Abb. 110: Informationserschließung in Hypertext Um diese Ressourcen richtig lokalisieren und verknüpfen zu können wird ein eindeutiges Identifikationsschema benötigt, den sogenannten Uniform Resource Locator (URL): Uniform Resource Locator beschreibt eindeutig eine Ressource im WWW. URL beinhaltet die für den Browser notwendigen Informationen, über das Wie, Wo und Was. Der URL folgt der für Uniform Resource Identifier (URI als generische allgemeine Ressourcenkennzeichnung im WWW) festgelegten Syntax. Eine URL besteht aus einem Präfix (Schema) und einem Suffix (schemaspezifischer Teil). Abb. 111: Beispiel des Aufbaus einer URL A B C E D b e d c d a e c https: / / student: 123456@www.umwelt-campus.de: 8080/ index.php Schema Benutzer Kennwort Host Port Pfad <?page no="249"?> 250 7 Internet http: / / www.uvk-lucius.de/ informatik-ing Abb. 112: URL-Beispiel für eine Dokumentenadresse Wichtige Protokolle zum Zugriff auf Informationsressourcen sind HTTP (Hypertext Transfer Protocol) und HTTPS (Hypertext Transfer Protocol over Secure Socket Layer). Eine detaillierte Besprechung der beiden Protokolle finden Sie im Kapitel Rechnernetze bzw. IT-Sicherheit. Browser als wichtigste Softwareapplikation auf Präsentationsebene ermöglichen den Benutzern, komfortabel im WWW zu surfen und Inhalte der ausgewählten Seiten darzustellen. Zur Darstellung verschiedener Formate greifen die Browser auf Hilfsanwendungen (oder Plug-Ins) zu. Nachfolgend ist exemplarisch die Kommunikation bei Nutzung von HTTP dargestellt. Eingabe folgender URL im Browser: http: / / www.umwelt-campus.de/ index.html [1] Browser ermittelt über den Domain Name Service (DNS) die IP Adresse des Servers www.umwelt-campus.de. [2] Der DNS liefert die Adresse: 143.93.47.30. [3] Browser baut zu 143.93.47.30 eine Verbindung auf. [4] Browser sendet den Befehl: GET index.html. [5] Server sendet die Datei index.html. [6] TCP-Verbindung wird getrennt. [7] Browser zeigt den Inhalt der Datei index.html an. [8] Browser zeigt die Bilder in der Datei index.html an. Hierzu wird für jede Bilddatei eine Verbindung aufgebaut. https: / / www.umwelt-campus.de/ ucb/ index.php Wie? (Protokoll) hier: HyperText Transfer Protocol Secure Wo? hier: Server des Umwelt-Campus Was? hier: PHP-Datei, Webseite des Umwelt-Campus <?page no="250"?> 7.2 Web-Technologien 251 http: / / www.uvk-lucius.de/ informatik-ing 7.2.2 HTML und XML 7.2.2.1 Hypertext Markup Language (HTML) Die im WorldWideWeb kommunizierten Inhalte sind wie oben beschrieben Hypermedia-Dokumente, die in der hierfür eigens entwickelten Beschreibungssprache HTML aufbereitet werden. Seit den Anfängen seiner Entwicklung im Jahre 1990 durchlief der HTML-Standard bis heute viele Veränderungen, wobei die anfänglich definierten Designziele wie Einfachheit, Plattformunabhängigkeit und Flexibilität immer noch zentrale Bedeutung besitzen. Grundeigenschaften von HTML-Dokumenten sind: Methode zur Strukturierung von Dokumenten, d.h. in der Regel layout-orientierte Auszeichnung von Strukturelementen mit sog. Markups. HTML-Dokument wird durch den Browser beim Nutzer (Client) interpretiert, formatiert und angezeigt. Nur ein Dokumenttyp; keine Möglichkeit der Definition eigener Auszeichnungselemente. Keine eigentliche Trennung von Layout und Inhalt; HTML- Dokumente können auch ohne explizite Formatierungsanweisungen erstellt werden; diese sind dann in einer separaten Formatierungsdatei angegeben (Cascading Style Sheets CSS). Hersteller erweitern Funktionsumfang; es existieren viele Dialekte. Zur Veranschaulichung wird im Kapitel 10.3 ein kleiner Web- Server realisiert. Dieser liefert die Homepage mit den aktuellen Ergebnissen eines Messdatenerfassungssystems als HTML-Seite aus. Die Seite beginnt mit dem <header> und dem <title>- Markup, welches den Titel der Seite im Browser festlegt. Der eigentliche Seiteninhalt <body> folgt danach in einer Überschrift <h1> und einer Tabelle <table> mit verschiedenen Zeilen <tr> bzw. Spalten <td>. Am Dokumentenende findet sich der Link auf die Alarmsteuerung in Form eines <a ref=>-Tags. <?page no="251"?> 252 7 Internet http: / / www.uvk-lucius.de/ informatik-ing Abb. 113: HTML-Struktur der Demo-Website aus Kap. 10 7.2.2.2 Extended Markup Language (XML) Aufgrund der durch die HTML-Syntax festgelegten starren Semantik (Document Type Definition DTD) gestaltet sich eine Kommunikation mit verschiedenen Anwendungsprogrammen (z.B. Datenbanken) recht schwierig. Da zur Erlangung einer diesbezüglichen Flexibilität die Definition von neuen Elementen erforderlich war, wurde mit der Entwicklung der Extensible Markup Language (XML) hier Abhilfe geschaffen. XML ist eine Auszeichnungssprache für Dokumente, die strukturierbare Informationen enthalten. Unter strukturierter Information versteht man die Zerlegung der Information in Inhalt und Bedeutung oder Rolle. Fast alle Dokumente haben irgendeine Struktur! <?page no="252"?> 7.2 Web-Technologien 253 http: / / www.uvk-lucius.de/ informatik-ing XML definiert weder die Semantik von Dokumenten noch eine Tag-Menge für die Auszeichnung. XML ist eine Metasprache um Auszeichnungssprachen zu definieren, d.h. XML erlaubt die Definition eigener Tags und der strukturellen Beziehungen zwischen Tags. Die Regeln, welche XML-Elemente definiert sind und welche Bedeutung sie besitzen, sind in der begleitenden Document Type Definition (DTD) spezifiziert. Die Semantik eines XML-Dokuments wird über eine Anwendung oder ein Stylesheet festgelegt. Abb. 114: Grundstruktur einer XML-Datei XML ist also eine Methode, um strukturierte Daten in einer Textdatei darzustellen. Dabei definiert XML eine Menge von Regeln, Richtlinien oder Konventionen für die Erstellung von Textformaten für solche Daten, um eine leichte Generierung und Weiterverarbeitung durch Computer zu ermöglichen. XML sieht fast aus wie HTML, ist aber kein HTML. Die Tags werden nur zur Strukturierung der Daten verwendet. <? xml version="1.0" ? > <buch isbn="3879075174"> <titel>Informatik für Ingenieure</ titel> <autor> <name>Fischer-Stabel, Gollmer</ name> <hochschule>Trier</ hochschule> </ autor> <verlag>ukv</ verlag> <jahr>2016</ jahr> </ buch> Prolog Body <?page no="253"?> 254 7 Internet http: / / www.uvk-lucius.de/ informatik-ing Die Interpretation der Tags obliegt der jeweiligen Anwendung. XML ist lizenzfrei, plattformunabhängig und gut unterstützt. Anwendungsbeispiele finden sich in nahezu jedem Anwendungsfeld. Z.B. Weather Observation Definition Format (OMF) zum Austausch von Sensordaten in der Meteorologie, Geography Markup Language (GML) zum Austausch raumbezogener Objekte, Sensor Model Language (SensorML) als Dokumentenformat zur Beschreibung von Sensoren, oder auch XJustiz als Grundlage für den Austausch von Daten in Justizverfahren, um nur einige wenige zu nennen. 7.2.3 Skriptsprachen und CGI-Programmierung Im WWW werden nicht nur statische Informationen angeboten. Auch ein interaktiver, dynamischer Informationszugang ist unter Verwendung von Skriptsprachen sowie der entsprechenden Schnittstellen möglich. Abb. 115: Dynamisches Web mittels CGI-Programm Zentrale und allgemeine Schnittstelle zwischen Anwendungsprogrammen und HTTP-Server ist bei der serverseitigen Programmierung das Common Gateway Interface (CGI). In diesem Anwendungsfeld haben sich in der Vergangenheit Skriptsprachen wie z.B. Pearl und PHP etabliert. CGI-Programme <?page no="254"?> 7.3 Dienste und Anwendungen im Internet 255 http: / / www.uvk-lucius.de/ informatik-ing generieren dynamische HTML-Dokumente, indem sie die vom Anwender im Browser eingegebenen Daten weiter verarbeiten. Zudem ist über diese Sprachen auch eine direkte Unterstützung von Datenbankzugriffen realisierbar. Auch auf der Client-Seite kann Einfluss auf die Informationsverarbeitung und -darstellung genommen werden. Dies kann z.B. durch die Ausführung eines Skripts durch den Browser erfolgen. So können z.B. mit JavaScript „passive“ HTML- Dokumente mit zusätzlicher Funktionalität ausgestattet werden (dynamisches HTML). Für den Nutzer nachteilig ist hierbei jedoch die latente Gefahr, sich auf diesem Weg auch unerwünschte Funktionen oder Schadprogramme auf den lokalen Rechner zu laden (vgl. auch Kapitel IT-Sicherheit). 7.3 Dienste und Anwendungen im Internet Netzwerke und insbesondere auch das Internet stellen die Infrastruktur zur Übertragung von Daten her. Erst durch die Bereitstellung unterschiedlicher Dienste entsteht für den Anwender der eigentliche Nutzen einer Rechnerkommunikation. Nachfolgend werden ausgewählte Dienste im Internet beschrieben. Durch technologische Neu- und Weiterentwicklungen sowie durch Veränderungen im Nutzerverhalten wird das Angebot an Anwendungen im Internet ständig erweitert. 7.3.1 World Wide Web (WWW) 1989/ 1990 startete am CERN (Centre Européen pour la Recherche Nucléaire) unter der Leitung von Tim Berners-Lee ein Projekt zum Aufbau einer vernetzten Informationsstruktur, um den Austausch von Dokumenten zwischen Wissenschaftlern zu vereinfachen. Durch die Entwicklung des Transferprotokolls HTTP, der Textauszeichnungssprache HTML und von Web-Serverbzw. Web-Browser-Software war die Grundlage für die weltweite Verbreitung dieses neuen Informations- und Wirtschaftsbereichs geschaffen worden. <?page no="255"?> 256 7 Internet http: / / www.uvk-lucius.de/ informatik-ing In seinen Anfängen war die Internetnutzung für den informationstechnischen Laien nicht immer einfach. Nur wenige konnten selbst Inhalte für das Web erstellen, es gab Informationsanbieter und Informationskonsumenten (Web 1.0). Mit dem Web 2.0 veränderte sich ab etwa den 2000er Jahren Nutzung und Wahrnehmung des WWW. Webseiten, deren Inhalte die Nutzer nicht nur passiv ansehen, sondern selbst ändern und ergänzen können, wurden populär. Es handelt sich beim Web 2.0 also nicht um eine neue Technologie, sondern um ein geändertes Interaktionsverhalten der Nutzer (v.a. Benutzer erstellen und bearbeiten Inhalte selbst). Beispiele hierfür sind Blogs, Social Communities (Facebook, Xing, LinkedIn, Partnerbörsen …), Wikis, Foto- und Videoportale (YouTube, Flickr, Panoramio …) und vieles mehr. Das verfügbare Informationsangebot hat sich mit dem Aufkommen des Web 2.0 entsprechend vervielfacht, was geeignete Recherchestrategien und Werkzeuge für das Information Retrieval erforderlich macht (siehe hierzu Kapitel 8). Dem geänderten Interaktionsverhalten der Nutzer des Web 2.0 wurde auch durch die Verfügbarkeit einer neuen Gruppe von Software der Weg bereitet. Insbesondere durch das Aufkommen von Content Management Systemen (CMS) wurde es auch für Anwender ohne breite EDV-Kenntnisse möglich, Informationen ins Netz zu stellen (User Generated Content; Architektur des Mitwirkens). Mit dem Term Web 3.0 tritt der Begriff des „denkenden Web“ in den Vordergrund. Dabei ist das semantische Web nach Tim-Berners Lee eine Erweiterung des herkömmlichen Webs, in dem Informationen mit eindeutigen Bedeutungen versehen werden, um die Arbeit zwischen Mensch und Maschine zu erleichtern. Das Web 3.0 umfasst somit das semantische Web sowie Methoden der künstlichen Intelligenz und Wissensrepräsentation. <?page no="256"?> 7.3 Dienste und Anwendungen im Internet 257 http: / / www.uvk-lucius.de/ informatik-ing 7.3.1.1 Content Management Systeme (CMS) Digitale Informationen werden heute oft als Content (Inhalt) bezeichnet. Ein CMS ist demzufolge ein Anwendungsprogramm, das die gemeinschaftliche Erstellung und Bearbeitung des Inhalts (= Content) von Text- und Multimedia-Dokumenten ermöglicht und organisiert. Der Content kann als Datei vorliegen, die einzeln verarbeitet wird - oder auch in Form von zusammenhängenden verteilten Anteilen, wie z. B. für Webseiten die Formatierung via CSS- Datei und Content auf einer „normalen“ HTML-Seite. CMS unterscheiden sich von Portal-Systemen (diese steuern das Zusammenspiel zwischen den Benutzern und der Website) dahingehend, dass das System auch ohne Programmierkenntnisse bzw. Kenntnisse von HTML bzw. XML bedient und benutzt werden kann. I.d.R. ist eine medienneutrale Datenhaltung realisiert, d.h. dass der Inhalt auf Wunsch z.B. als PDF- oder als HTML-Dokument abrufbar ist. Aktuelle Systeme unterstützen barrierefreie Lösungen ebenso wie die Entwicklung von Webanwendungen im Responsive Design (Websites können auf die Eigenschaften des jeweils benutzten Endgeräts reagieren). Beispieltools: Typo3 ® , Plone ® , Joomla ® , WordPress ® etc. Ein Weblog Publishing System (Weblog-Publikationssystem) ist im Grunde ebenfalls ein CMS, dessen Schwerpunkt allerdings in der Erstellung von Weblogs liegt. Ein Weblog oder Blog (aus Web und Log zusammengesetzt) ist eine Webseite, die periodisch neue Einträge enthält. Neue Einträge stehen an oberster Stelle, ältere folgen in umgekehrt chronologischer Reihenfolge. Die Tätigkeit des Schreibens in einem Blog wird als Bloggen bezeichnet. Kommentarfunktionen werden ebenfalls zur Verfügung gestellt. Weblog-Software kann auf eigenem Webspace installiert werden oder als ASP-Dienst (= Application Service Provider: Anwendung wird dem Kunden als Dienstleistung übers öffentliche <?page no="257"?> 258 7 Internet http: / / www.uvk-lucius.de/ informatik-ing Netz angeboten) bei kostenlosen oder kostenpflichtigen Anbietern genutzt werden. Die Einträge in Blogs sind zum größten Teil auch per RSS- Newsfeed lesbar. RSS (=Really Simple Syndication) ist eine Technik zu Abonnement und Integration von Inhalten externer Seiten (z.B. Podcasts). 7.3.1.2 Wikis Unter Wikis verstehen wir Software, die es mehreren Autoren erlaubt, gemeinsam online Texte zu schreiben und zu kommentieren. Dies war eine der Voraussetzungen für das Web 2.0 (User Generated Content). Ob im Inter- oder Intranet - Wikis haben gezeigt, wie nützlich sie für verschiedene Zwecke der Informationsbereitstellung sein können. Es handelt sich bei Wikis um im World Wide Web verfügbare Seitensammlungen, die von den Benutzern nicht nur gelesen, sondern mit entsprechenden Bearbeitungsfunktionen auch online geändert werden können. Wie bei Hypertexten üblich, sind die einzelnen Seiten und Artikel eines Wikis durch Querverweise (Links) miteinander verbunden. Wikis zählen wie z.B. Blogs zur Gruppe der Social Software. Im Gegensatz zu Blogs (v.a. textuelle Informationen) sind Wikis auch mit Bildern, Videos etc. angereichert. Bekanntestes Anwendungsbeispiel ist die Enzyklopädie Wikipedia. Beispieltools: DokuWiki, FlexWiki, JSPWiki, MediaWiki etc. 7.3.1.3 Löschen von Web-Inhalten Daten im WWW können beliebig archiviert oder vervielfältigt und gestreut werden. So werden von unterschiedlichen staatlichen, aber auch von nichtstaatlichen Organisationen fortlaufend Sicherungskopien von Webinhalten angelegt. So archiviert www. archive.org seit 1996 sämtliche Internetseiten zu ausgewählten Zeitpunkten. <?page no="258"?> 7.3 Dienste und Anwendungen im Internet 259 http: / / www.uvk-lucius.de/ informatik-ing Demgegenüber steht das Konzept einer strukturierten Vorgehensweise zur Webarchivierung, welche dem Verlust von Daten zur Zeit- und Mediengeschichte entgegenwirken soll, erst am Anfang (z.B. Einsehbarkeit der Web-Entwicklung für künftige Generationen). Neben den erwähnten Organisationen, die Sicherungskopien von Webinhalten erstellen, speichern auch Suchmaschinen Inhalte von Webseiten oft in Zwischenspeichern. Diese Inhalte bleiben häufig weiterhin über eine gewisse Zeitspanne im Web verfügbar, auch wenn die betreffende Seite bereits physikalisch vom Netz genommen wurde. Als Fazit können wir festhalten, dass Webinhalte nur unter großem Aufwand wieder zu entfernen sind. Die Verwendung von Reinigungsservices von Suchmaschinenanbietern sowie den Archivierungsprojekten stellen hier eine (aufwändige) Möglichkeit dar, Webinhalte tatsächlich zu löschen. Eine wohlüberlegte Auswahl der zu publizierenden Informationen sollte vor deren Präsentation im WWW demzufolge selbstverständlich sein. 7.3.2 eMail-Dienste Einer der ersten und bis heute noch populärsten Dienste im Internet ist der eMail-Dienst. Der Aufbau einer eMail-Nachricht umfasst analog der klassischen Briefpost einerseits die zu einer erfolgreichen Zustellung erforderliche Adressinformation sowie den eigentlichen Inhalt des Briefes. Wie bei der traditionellen Briefpost muss die Sendung eine eindeutige Empfängeradresse besitzen und an einen Postdienst zur Beförderung übergeben werden. Ein eMail-System muss demzufolge folgende Funktionen erfüllen: Erzeugen einer Nachricht, z.B. Mithilfe eines Texteditors, inklusive der Generierung der erforderlichen weiteren Angaben, z.B. Adressangaben. Zustellung der Nachricht: Verbindungsaufbau zum Empfänger oder den beteiligten Zwischensystemen. <?page no="259"?> 260 7 Internet http: / / www.uvk-lucius.de/ informatik-ing Benachrichtigung über eine erfolgreiche oder gescheiterte Zustellung. Darstellung der Nachricht; Ausführung ggf. erforderlicher Formatierungen. Behandlung und Verwaltung eingegangener Nachrichten. Während für den Inhalt einer eMail keine Formatvorgaben einzuhalten sind, muss der Message-Header einem klar definierten Aufbau folgen. Die Einhaltung dieser Vorgaben wird i.d.R. vom eMail-System übernommen. Zwar unterliegt die Gestaltung des Nachrichteninhaltes grundsätzlich keinen Restriktionen, jedoch kann die Interpretation des Inhaltes bei unterschiedlichen Mailsystemen zu Problemen führen, insbesondere da mittlerweile über den Standard-7Bit- ASCII-Code hinausgehende Zeichensätze (z.B. Chinesisch) Verwendung finden. Mit der MIME-Spezifikation (Multipurpose Internet Mail Extension) konnte hier Abhilfe geschaffen werden. Die MIME- Erweiterungen in den Header-Angaben teilen dem Anwendungsprogramm (eMail-Programm) die Version der Codierung zur Verarbeitung bzw. Interpretation der Nachricht mit. Das für die Weiterleitung von eMail-Nachrichten im Internet verwendete Protokoll ist das Simple Mail Transfer Protocol (SMTP). Dieses setzt das Vorhandensein eines eMail-Servers voraus, der als Diensteanbieter eMails direkt via SMTP versenden und empfangen kann. Da in der Praxis die einzelnen Nutzer jedoch lediglich die Dienste eines eMail-Servers von Dritten (z.B. Hochschule, Firmen) nutzen, müssen die Nachrichten zum eMail-Server gesendet bzw. empfangen werden. Einfache Protokolle hierfür sind das Post Office Protocol (POP3) oder das Interactive Mail Access Protocol (IMAP). 7.3.3 Weitere Internetdienste Über die beiden vorgestellten Dienste hinaus existiert eine Vielzahl an weiteren Internetdiensten, deren Besprechung den <?page no="260"?> 7.4 Literatur 261 Rahmen der vorliegenden Publikation sprengen würde. Beispiele sind: Domain Name Service (DNS): Namensdienst, der eine Zuordnung der IP-Binäradressen zu eMail-Adressen oder URLs erlaubt. Dateitransferdienste, z.B. File Transfer Protocol (ftp). Remote Login: Einloggen und Nutzen eines Remote-Rechners. Streaming-Dienste: Erlauben eine Wiedergabe multimedialer Inhalte bereits während des Übertragungsvorgangs. Voice over IP: Realisiert Telefondienste auf der Internet- Infrastruktur. Details hierzu können der weiterführenden Literatur entnommen werden. 7.4 Literatur Meinel, C. & H. Sack (2004): WWW - Kommunikation, Internetworking, Web-Technologien. Springer Verlag Berlin Heidelberg Meinel, C. & H. Sack (2016): Web-Technologien - Grundlagen, Web-Programmierung, Suchmaschinen, Semantic Web. Springer Verlag Berlin Heidelberg Wolf, Jürgen (2015): HTML5 und CSS3: Das umfassende Handbuch. Rheinwerk Computing, Rheinwerk Verlag, Bonn <?page no="262"?> http: / / www.uvk-lucius.de/ informatik-ing 8 Information Retrieval Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: einen grundlegenden Einblick in den webbasierten Zugang zu Informationsquellen besitzen; elementare Funktionen von Suchwerkzeugen kennen; in der Lage sein, geeignete Strategien für eine thematische Suche zu entwickeln; die Qualität von Informationsressourcen abschätzen können. 8.1 Einführung Der Begriff „Information Retrieval“ bezeichnet im weitesten Sinne die Suche nach und das Auffinden von Informationen unter Verwendung von informationstechnischen Methoden. Die aufzuspürenden Informationen sind hierbei medienübergreifend zu betrachten und können Texte, Bilder, Datenbestände, Modelle, Videos, Audiodateien etc. umfassen. Sorgfältige, professionelle Informationsrecherchen sind fraglos eine wesentliche Grundlage wissenschaftlichen Arbeitens. Während hierfür in früheren Zeiten noch die klassische Recherche in Bibliothekskatalogen ausreichend war, sollten diese Wege der Informationsbeschaffung seit der Verfügbarkeit des WWW und hier insbesondere seit dem Aufkommen des Web 2.0 um weitere Werkzeuge ergänzt werden, zumal die verfügbaren Informationen sich im Zeitalter der Informationsgesellschaft und Informationswirtschaft exponentiell vervielfacht haben. <?page no="263"?> 264 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Dass mehr verfügbare Information nicht automatisch zu mehr Informiertheit führt, wurde bereits in den 1960er Jahren im USamerikanischen Weinberg-Report erkannt und beschrieben. Bereits zu damaliger Zeit wurde von einer Informationsexplosion gesprochen. Diese mache es erforderlich, sowohl Informationsexperten, als auch neue Methoden der Wissenserschließung zur Informationsbeschaffung einzusetzen. Betrachten wir den Versuch von Lyman et al. (2002) 23 , die weltweite jährliche Produktion von Information zu quantifizieren, wird ebenfalls deutlich, dass zur Informationserschließung neue Techniken unumgänglich sind. Unterstrichen wird dies zudem durch Prognosen zum Volumen der jährlich global generierten digitalen Datenmenge (vgl. nachfolgende Abbildung 116; Datenquelle: Int. Data Corporation 24 ). Abb. 116: Digitale jährliche Datenmenge in Exabyte (Prognose) Das Ziel unserer Informationsrecherche soll aber nicht darin bestehen, irgendwelche Informationen zu finden, sondern es soll das Finden der tatsächlich benötigten umfassenden Informationen in unserem Anwendungskontext ermög- 23 http: / / www2.sims.berkeley.edu/ research/ projects/ how-much-info- 2003/ index.htm 24 http: / / germany.emc.com/ leadership/ digital-universe/ 2014iview/ index.htm <?page no="264"?> 8.2 Internet-Suchmaschinen 265 http: / / www.uvk-lucius.de/ informatik-ing lichen. Intelligente Suchstrategien und auf die wissenschaftliche Recherche ausgerichtete Suchwerkzeuge können hier weiter helfen. 8.2 Internet-Suchmaschinen 8.2.1 Potential webbasierter Informationssysteme Das Internet als globales Kommunikationsnetz ermöglicht jederzeit und ortsunabhängig Zugang zu historischer und aktueller Information, die im Web abrufbar ist. Neben der Kommunikation von großen Informationsmengen werden zudem neue Formen synergetischer Zusammenarbeit auch ohne die Nutzung spezieller Hard- und Softwarekomponenten ermöglicht. Die Vorteile der Internetrecherche liegen im schnellen Zugriff vom Arbeitsplatz aus und der in vielen Fällen ausreichenden Lieferung von Überblicksinformation durch eine einfache Suchanfrage. Demgegenüber stehen aber auch zentrale Nachteile wie die häufig nicht frei zugängliche Information aus wissenschaftlichen Quellen (Schlagwort: Deep Web), sowie insbesondere die häufig fehlende Qualitätsbewertung der dargebotenen Information. Zudem können Internetrecherchen bei unprofessioneller Vorbereitung und Ausführung auch schnell zu Zeitfressern werden. 8.2.2 Suchmaschinen 8.2.2.1 Grundlagen Suchmaschinen sind Programme, die das World Wide Web durchsuchen und die gefundenen Seiten indizieren. Hauptbestandteile sind: Ein Crawler, der Links verfolgt, sich die Seiten merkt und ausgewählte Informationen zu diesen Seiten in Datenbanken speichert. <?page no="265"?> 266 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Der Index aller gespeicherten Seiten, der letztlich bei einer Suchanfrage durch den Anwender durchsucht wird. Suchmaschinen arbeiten automatisch. Spezielle Programme (sog. crawler, robots, spider) verfolgen autonom Links und schicken die gefundenen Seiten an die Heimatserver zur Analyse. Durch spezielle Algorithmen wird bestimmt, welche Websites wann und wie oft durchsucht werden und wie viele Seiten von jeder Website abgerufen werden. Die Webseiten werden schließlich im Index mit den entsprechenden Parametern in einer Datenbank gespeichert. Eine Recherche nach Informationen durch den Nutzer einer Suchmaschine wird letztlich auf dieser Index- Datenbank ausgeführt. Abb. 117: Generische Funktionsweise einer Suchmaschine Große Suchmaschinen indizieren derzeit hunderte Milliarden Seiten des Internets, wobei hier auch qualitative Unterschiede <?page no="266"?> 8.2 Internet-Suchmaschinen 267 http: / / www.uvk-lucius.de/ informatik-ing im Indexierungsprozess existieren. So besteht ein Unterschied, ob der gesamte Text gescannt wird, oder nur die ersten 20 Zeilen bzw. nur der Dokumententitel. Wir unterscheiden zwei Gruppen von Suchmaschinen: Allgemeine Suchmaschinen: Diese beliebten Recherchewerkzeuge decken das WWW soweit wie möglich ab. Teilweise erlauben sie auch umgangssprachliche Suchanfragen. Bsp: Google Scholar (wissenschaftl. Literatur); Meta-Suchmaschinen: Ermöglichen gleichzeitige Suche in mehreren Suchmaschinen. Die Suche muss nur einmal formuliert werden und wird an diverse Suchmaschinen weitergeleitet. Dabei werden Syntaxprobleme der verschiedenen Suchmaschinen automatisch gelöst. Die Ergebnisse aus den verschiedenen angefragten Suchmaschinen werden zusammengefasst präsentiert, Doubletten werden gelöscht. Nachteil: Die gleiche Anfrage wird an alle Maschinen weitergeleitet; d.h. die hohe Suchfunktionalität der verschiedenen Anbieter im Rahmen der Expertensuche wird häufig nicht genutzt. Beispiele: MetaGer, Ixquick Die Sortierung der Suchergebnisse erfolgt in der Regel nach betreiberspezifischen Kriterien, die nicht immer der Öffentlichkeit zugänglich sind. In der Regel: stehen Treffer, die alle Suchbegriffe enthalten, in der Ergebnisliste vor Treffern, die nur einzelne Begriffe beinhalten. sind Treffer mit dem Suchbegriff in der URL meist ganz weit vorne zu finden. werden Suchbegriffe am Anfang eines Dokuments (z.B. im Titel einer Veröffentlichung) stärker bewertet. Je öfter Begriffe auftauchen, desto höher ist die Bewertung. Zwar existieren mittlerweile effiziente Suchverfahren, jedoch durchsuchen Suchmaschinen bei einer Standard-Anfrage die Inhalte von Milliarden Informationsobjekten lediglich durch einfache Anfragewerkzeuge, die eine Liste von i.A. bis zu vier Suchbegriffen zulassen. <?page no="267"?> 268 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Im Ergebnis erhalten wir dann eine Liste mit hunderten Referenzen, jedoch keinen Zugang zu den gewünschten Ergebnissen in einem Schritt. Auf der anderen Seite kann es passieren, dass wir trotz Nutzung von Suchmaschinen und Milliarden von Informationsobjekten keinen Treffer erhalten. Eine Strategie zur Verbesserung des Informationszugangs besteht jedoch in der Nutzung der erweiterten Suchfunktionen. 8.2.2.2 Nutzung der erweiterten Suchfunktionalitäten Obwohl es nach mehr als zwei Jahrzehnten der Verfügbarkeit von Suchmaschinen (erste Entwicklungen waren seit der ersten Hälfte der 1990er Jahre auf dem Markt) selbstverständlich sein sollte, eine Suchstrategie unter Verwendung möglichst vieler Funktionalitäten einer Suchmaschine umzusetzen, ist die Verwendung der „Erweiterten Suchmöglichkeiten“ häufig immer noch keine Selbstverständlichkeit. Dabei ermöglichen gerade diese Funktionalitäten eine gute Umschreibung der gewünschten Informationsressourcen. Am Beispiel der erweiterten Suche von Google wollen wir uns die Möglichkeiten des Query Prozessors genauer ansehen. Wie in Abbildung 118 dargestellt, kann der Query Prozessor der Suchmaschine unterschiedliche Kriterien für eine Verfeinerung der Suche annehmen. Wesentliche Filtermöglichkeiten hierbei sind: Boolesche Suchoperatoren: Kombination bzw. Ausschluss von Suchbegriffen durch die Nutzung logischer Operatoren AND, OR und NOT. Phrasensuche: Worte müssen genau in der vorgegebenen Reihenfolge und Vollständig im Ergebnisdokument enthalten sein. Zeitbezogener Filter: Hierdurch werden Dokumente unter Berücksichtigung des Erstellungs- oder Änderungsdatums ausgewählt. Sprachfilter: Eingrenzung der Suche auf den ausgewählten Sprachraum. <?page no="268"?> 8.2 Internet-Suchmaschinen 269 http: / / www.uvk-lucius.de/ informatik-ing Abb. 118: Erweiterte Suchmöglichkeiten bei Google <?page no="269"?> 270 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Domainfilter: Dieser ermöglicht, bei der Suche bestimmte Top-Level-Domains auszuschließen bzw. die Suche auf ausgewählte Domain-Bereiche zu beschränken. Dateiformate: Diese Auswahloption beschränkt die Suche auf Ressourcen im angegebenen Dateiformat. Die Nutzung dieser Filtermöglichkeiten kann je nach Suchmaschine variieren. Details zur Nutzung können aber in jedem Falle den individuellen Nutzungsanleitungen bzw. den Syntaxbeschreibungen entnommen werden. In den bereitgestellten Begleitmaterialien finden Sie entsprechende Übungsbeispiele unter Verwendung verschiedener Suchmaschinen. 8.2.2.3 Suchmaschinenoptimierung Das Ergebnis einer Anfrage bei den Suchmaschinen wird in einer sortierten Ergebnisliste präsentiert. Diese ist insbesondere was die Rangbildung betrifft sowohl für den Suchenden als auch für einen Anbieter von Informationen von Bedeutung. Während beim ursprünglichen Ranking der Treffer („first generation“) lediglich die Häufigkeit und Position von Suchbegriffen im Dokument ausgewertet wurde (URL, Titel, Abstract etc.), spielt beim „second generation“-Ranking auch die Zahl der Verweise auf die Ressource eine Rolle. Auch können hier die Treffer thematisch geordnet werden. Da die verschiedenen Suchmaschinen individuelle Gewichtungsalgorithmen bei der Indexsuche einsetzen, kann durch Kenntnis der Funktionsweise von Suchmaschinen und entsprechende Anpassungen der eigenen Website die Relevanz (Position in der Trefferliste) verbessert werden. Die hier eingesetzten Verfahren werden auch unter dem Begriff der Suchmaschinenoptimierung (Search Engine Optimization (SEO)) zusammengefasst und dienen im kommerziellen Umfeld insbesondere einer Verbesserung der Erreichbarkeit der eigenen Website und somit auch der Herstellung eines Wettbewerbsvor- <?page no="270"?> 8.2 Internet-Suchmaschinen 271 http: / / www.uvk-lucius.de/ informatik-ing teils bzw. dem Erhalt der Wettbewerbsfähigkeit einer Unternehmung. Die Möglichkeiten der Suchmaschinenoptimierung sind mittlerweile recht vielfältig und reichen von einer einfachen Registrierung bei der jeweiligen Suchmaschine über das Platzieren von Keywords bis hin zur Inanspruchnahme kommerzieller Optimierungsdienste. Für weiterführende Informationen sei an dieser Stelle auf die entsprechende Fachliteratur verwiesen. 8.2.3 Bildersuchmaschinen Neben der Eingabe von Suchbegriffen erlauben neuere Entwicklungen im Information Retrieval auch die Verwendung von Bildmaterialien als Suchkriterium. Ein Programm zur Bildanalyse erstellt hierbei einen digitalen Fingerabdruck des Bildes (Prinzip: Verteilung heller und dunkler Bildanteile) und vergleicht es mit dem Bildmaterial in der Datenbank. Die Ergebnisse (Treffer) sind aktuell (2016) noch nicht ganz zufriedenstellend, jedoch werden neue Algorithmen auch hier das Matching künftig entscheidend verbessern. Ziel ist dabei aktuell nicht die Identifizierung von Personen auf dem Bildmaterial, sondern die Verwendung des Bildes als individuelles Medium in Web-Ressourcen. Insbesondere bei Fragen der Urheberrechtsverletzung spielen diese Bildersuchmaschinen für Fotografen, Bildagenturen, Gestalter etc. eine zunehmende Rolle. Teilweise sind bereits heute schon Filter für verschiedene Nutzungsrechte einsetzbar. Beispiele: Google Images, Tineye 8.2.4 Deep Web Unter dem Begriff „Deep Web“ (Synonym: Hidden Web, Invisible Web) verstehen wir den für die allgemeinen Suchmaschinen unsichtbaren Teil des WWW. Unsichtbar ist er für Suchmaschinen deshalb, weil Crawler diesen Bereich der <?page no="271"?> 272 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Informationsbereitstellung im Allgemeinen nicht erreichen und somit auch nicht indizieren können. Beispiele hierfür sind durch Zugangsbeschränkungen geschützte Datenbanken, Bibliothekskataloge oder auch Fachportale. Gerade dort verbergen sich oft Ressourcen von hoher Qualität. Es existieren unterschiedliche Schätzungen bzgl. des Umfangs der Informationen im Deep Web. Diese reichen vom 500-fachen bis hin zum 500 4 -fachen des sichtbaren Webs. Dies bedeutet für den Informationssuchenden, dass eine Informationsrecherche, welche sich ausschließlich der allgemeinen Suchmaschinen wie z.B. Google bedient, trotz der Vielfalt der zurückgelieferten Treffer für eine wissenschaftliche Quellenrecherche nicht ausreichend sein kann. Insbesondere die Nutzung von digitalen Katalogen und Fachdatenbanken oder auch von Spezialsuchmaschinen für wissenschaftlich relevante Informationen hilft hier weiter. 8.2.5 Bewertung von Internetressourcen Generell sollte jede Informationsquelle hinsichtlich ihrer Qualität kritisch hinterfragt werden, insbesondere aber jene aus dem Internet. Das Internet ist anonym und es findet bei vielen elektronischen Medien kein Review-Prozess statt, im Gegensatz zu gedruckten Publikationen oder auch Beiträgen in Fachdatenbanken. Zudem können Suchmaschinen bis heute noch keine Evaluierung hinsichtlich der Informationsqualität durchführen. Wie in den anderen Bereichen des täglichen Lebens, stehen uns auch hier verschiedene Kriterien zur Verfügung, anhand derer wir die Qualität und Seriosität einer Web-Ressource einschätzen können. Qualitätskriterien können insbesondere der Zweck der Veröffentlichung (z.B. Primär-, Sekundärquelle), Quellenangaben, die Tiefe und Breite der dargebotenen Information, die Verifizierbarkeit, aber auch die Aktualität (last update), sowie die angeführten Referenzen und die Links von und zu anderen Ressour- <?page no="272"?> 8.3 Digitale Bibliothek und Fachdatenbanken 273 http: / / www.uvk-lucius.de/ informatik-ing cen sein. Bei einer textbasierten Ressource kann auch der Schreibstil sowie der Grad an Objektivität Hinweise auf die Qualität der Quelle geben. Autorenangaben, der Typ der bereitstellenden Institution (Universität, Konzern, Freundeskreis, Kegelclub), sowie der Domain-Name sind weitere Möglichkeiten, an Hinweise zum Grad der Seriosität und Objektivität einer Ressource zu gelangen. Wenn wir Internetquellen als zitierwürdig erachten, sollte der eigene Quellennachweis schließlich folgende Bestandteile umfassen: Titel des Dokuments, Autor/ en und/ oder die Institution, das Erscheinungsdatum des Dokuments (wenn bekannt), die URL des Dokuments, sowie das Datum, an dem Sie (letztmalig) auf die Seite zugegriffen haben. Mittlerweile werden auch Digital Object Identifier (DOI´s) insbesondere bei der Identifikation von Online-Beiträgen aus wissenschaftlichen Fachzeitschriften verwendet. 8.3 Digitale Bibliothek und Fachdatenbanken Neben den frei zugänglichen Informationsressourcen im Internet existiert insbesondere im universitären Umfeld auch eine Vielzahl von Möglichkeiten, die Ihnen den Zugang zu lokalen, aber auch internationalen Informationsbeständen ermöglichen. Hier sind insbesondere die Bibliothekskataloge sowie die Fachdatenbanken zu erwähnen. Beide Konzepte verfügen über qualitätsgesicherte Informationen, welche u.a. durch Schlagwörter (Tags) erschlossen sind. 8.3.1 Kataloge Kataloge dienen der Erschließung des Bestandes einzelner (lokaler) Bibliotheken, unabhängig davon, ob es sich um Printmedien oder digitale Fassungen der Ressource handelt. <?page no="273"?> 274 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Als über den lokalen Bestand hinausgehende Kataloge sind Verbundkataloge (z.B. DigiBib, LITexpress) mittlerweile in jeder Hochschulbibliothek vorhanden. In Verbindung mit der Möglichkeit der Fernleihe und der Aufsatzbestellung erweitern die Verbundkataloge den recherchierbaren und zugänglichen Bestand entscheidend. Zeitschriftendatenbanken wie z.B. das Deutsche Digitale Zeitschriftenarchiv (digiZeitschriften), die Elektronische Zeitschriftenbibliothek (EZB) oder aber das Directory of Open Access Journals (DOAJ) erweitern die Recherchemöglichkeiten um Aufsätze und Publikationen in digital verfügbaren Zeitschriften. 8.3.2 Fachdatenbanken Fachdatenbanken existieren in Form von bibliographischen, Volltext- oder auch Faktendatenbanken. Das Datenbank- Informationssystem (DBIS) als ein kooperativer Service zur Nutzung wissenschaftlicher Datenbanken in Deutschland hat sich hierbei als zentrales Verzeichnis etabliert. DBIS listet sowohl freie als auch kostenpflichtige Datenbanken fachspezifisch auf und ermöglicht als Metasuchwerkzeug eine Stichwortsuche in den Metadaten der gelisteten Datenbanken. Falls Sie in ihrem Anwendungsgebiet verfügbare Datenbanken des deutschsprachigen Raumes suchen, ist DBIS eine fachbereichsübergreifend zu empfehlende Einstiegsadresse. Das “Directory of Open Access Repositories (OpenDOAR)” ist ein weiteres Meta-Suchwerkzeug zu fachspezifischen Datenbanken und Dokumenten. 8.4 Web2.0-Werkzeuge 8.4.1 Social Bookmarking Unter Social Bookmarking verstehen wir die von mehreren Nutzern gemeinsam auf einem Server im Internet oder im In- <?page no="274"?> 8.4 Web2.0-Werkzeuge 275 http: / / www.uvk-lucius.de/ informatik-ing tranet realisierte Nutzung von Lesezeichen (Bookmarks). Während auf einem lokalen Rechner abgelegte Bookmarks nur auf dem jeweiligen Rechner zur Verfügung stehen, können Online- Sammlungen von Bookmarks von jedem Ort aus genutzt werden. Online-Bookmarksammlungen können zudem öffentlich gemacht und somit für einen weiten Nutzerkreis einsehbar werden. Weitere Funktionen sind das Auffinden und Kontaktieren von Nutzern mit ähnlichen Interessen, die Gründung von Gruppen sowie die Erstellung gemeinsamer Bookmark-Verzeichnisse. Die Recherche in Social Bookmarking-Diensten liefert dabei ausschließlich Ergebnisse, die von Nutzern als so bedeutend erachtet wurden, dass diese den jeweiligen Sammlungen hinzugefügt wurden. Social Bookmarking kann man somit auch als eine Art des CrowdSourcing verstehen (gemeinschaftliches Indexieren von Internetquellen). Beispieldienste: Diigo, Delicious 8.4.2 Plattformen für Videos und Präsentationen Neben den klassischen Zugangswegen zu Informationsressourcen ist oft auch vertiefendes Lehr- und Lernmaterial zu unterschiedlichen Themen gefragt. Hier bietet eine Vielzahl von Dienste-Anbietern dem Interessenten Zugang zu geeigneten Informationsressourcen. Nachfolgend sind einige ausgewählte Dienste aufgelistet: LyndaCampus: Videoplattform für qualitativ hochwertige Online-Trainings und Lehrvideos. SlideShare: Plattform zum Hochladen und Teilen von Präsentationen zu beliebigen Themen. Da Slideshare didaktisch aufbereitete Ergebnisse in Form von Präsentationen liefert, können Sie diese auch zur Verfeinerung der weiteren Suche verwenden. <?page no="275"?> 276 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Abb. 119: Wiki-Mindmap zum Thema „Algorithmus“ <?page no="276"?> 8.4 Web2.0-Werkzeuge 277 http: / / www.uvk-lucius.de/ informatik-ing 8.4.3 MindMapping Mind-Mapping beschreibt eine kognitive Technik, die zur Erschließung und visuellen Darstellung eines Themengebietes genutzt werden kann. Hierbei soll das Prinzip der Assoziation helfen, Gedanken zu entfalten und die Bildung von zusammengehörenden Kategorien befördert werden. Der Dienst „Wiki-Mindmap“ bietet ein automatisiertes „Mind- Mapping“ an, welches unter Einbeziehung eines Nachschlagewerkes, z.B. der deutschen Version von Wikipedia, einen eingegebenen Themenbereich entsprechend aufbereitet. Dieser Ansatz ist jedoch nur geeignet, um schnell einen Überblick über ein neues Themengebiet zu erlangen. 8.4.4 Allgemeine Kriterien Zu Beginn einer zielgerichteten Recherche sollte ein Anforderungsprofil für die Suche erstellt werden. Folgende Fragen sind hierbei zu beantworten: Welche Art von Information benötige ich? Bsp. Nachrichten, Daten, wissenschaftliche Artikel, Hintergrundinformation. Welche Quelle brauche ich bzw. existiert ein spezifisches Angebot? Bsp. allgemeine Suchmaschine, Fachdatenbanken, Bibliothekskataloge. Wie detailliert sollen die Informationen beschrieben sein? Bsp. Kurzbeschreibung, populärwissenschaftlicher Text, technischer Report. Allgemeine Tipps für die Suche: Suchbegriffe und Themen festlegen (3-4 Worte). Geeignete Kombinationen bzw. Exklusion von Suchbegriffen wählen. Sprachraum eingrenzen bzw. erweitern durch die Nutzung von Fremdworten und Wörterbüchern. Synonyme, Plural/ Singular sowie verschiedene Schreibweisen verwenden. <?page no="277"?> 278 8 Information Retrieval http: / / www.uvk-lucius.de/ informatik-ing Verschiedene Suchmaschinen und Kataloge sowie deren erweiterte Funktionalitäten benutzen. In Bibliothekskatalogen auch mit Titel der Zeitschrift, ggf. Herausgeber bzw. Titel des Sammelwerks suchen. Möglichkeit der Rückwärts- und Vorwärtsverkettung bereits bekannter Quellen nutzen. Ein weiteres, sehr effizientes Recherchewerkzeug ist der Aufbau und die Nutzung eines persönlichen Informationsnetzwerkes. Kongress- und Tagungskontakte, die direkte Ansprache zu im jeweiligen Arbeitsgebiet tätigen Dozenten, Praktikern und Wissenschaftlern können insbesondere dort weiter helfen, wo Suchmaschinen und sonstige Recherchemittel versagen: beim Zugang zu hochaktuellen Informationen, bei der Einschätzung der Komplexität von Problemen, sowie der Eignung von verwendeten Lösungswegen. 8.4.5 Quellen für Informatiker und Ingenieure Nachfolgend finden Sie eine kurze Übersicht über aktuell verfügbare Quellen zum Einstieg in die Informationsrecherche im wissenschaftlichen Umfeld. Diese ist selbstverständlich nicht abschließend und lediglich als Einstieg in die verschiedenen Möglichkeiten zu verstehen. Auf die Angabe der entsprechenden URL wurde verzichtet. Diese kann unter Verwendung einer allgemeinen Suchmaschine in Erfahrung gebracht werden. Lokale Bibliothekskataloge und Verbundkataloge: Hinweise hierzu finden Sie auf der Bibliothekswebsite Ihres Hochschulstandortes. Wissenschaftliche Suchmaschinen: Google Scholar, Dandelon, Bielefeld Academic Search Engine (BASE), CiteSeerX (Fokus auf Informationstechnik). Meta-Suchwerkzeuge: Datenbank-Informationssystem (DBIS), Directory of Open Access Repositories (OpenDOAR), Elektronische Zeitschriftenbibliothek (EZB). <?page no="278"?> 8.4 Web2.0-Werkzeuge 279 http: / / www.uvk-lucius.de/ informatik-ing Fachinformationsportale und -datenbanken für Informatiker und Ingenieure: TEMA (Fachdatenbank Technik und Management), IEEE/ IEL Electronic Library (IEL), Technische Informationsbibliothek (TIB). Organe von Fachgesellschaften: VDI Nachrichten, Gesellschaft für Informatik. Da die Informationsrecherche im Informationszeitalter einen zentralen Bestandteil der allseits geforderten Informationskompetenz darstellt, erachten es die Autoren als sinnvoll, bereits zu Studienbeginn Überlegungen bezgl. einer persönlichen Recherchetechnik durchzuführen. Ebenso sollte auch ein Augenmerk auf die stetige Aktualisierung der Recherchetechnik gelegt werden. Das Schulungsangebot ihrer Hochschulbibliothek enthält sicher diesbezügliche Weiterbildungsmöglichkeiten. 8.4.6 Maschinenlesbare Datenquellen Neben den traditionellen Informationsressourcen stehen im Zeitalter des Internet der Dinge zunehmend auch maschinenlesbare Datenquellen zur Auswertung und Integration in Anwendungen bereit. Machine-to-Machine (M2M) steht dabei für den automatisierten Informationsaustausch zwischen Endgeräten wie z.B. Sensoren sowohl untereinander als auch mit einer zentralen Komponente (z.B. Leitstelle), in der Regel unter Nutzung der verschiedenen Netzwerktechnologien. Oftmals erfolgt hierbei eine strukturierte Informationsübermittlung in Form von XML-Dateien (vgl. Kapitel 7 Internet) oder alternativ auch als JSON-Files (JavaScript Object Notation). So können beispielsweise die Unwetterwarnmeldungen des Deutschen Wetterdienstes (DWD) über JSONP-Dateien hochfrequent abgerufen und ausgewertet werden. Die entsprechende URL (http: / / www.dwd.de/ DWD/ warnungen/ warnapp/ json/ warnings.json) wird z.B. mit einem HttpWebRequest aufgerufen, die Antwort des HttpWebRequest wird dann als JSON- String interpretiert und anschließend in ein JsonObject umgewandelt. Letzteres kann dann weiter verarbeitet werden (z.B. <?page no="279"?> 280 8 Information Retrieval Auswertung bezogen auf betroffene Landkreise; Integration in HTML-Seiten oder mobile Apps). Ein weiteres Beispiel zur Entwicklung von M2M-Anwendungen finden Sie bei der YQL-Plattform im Yahoo! Developer Network (https: / / developer.yahoo.com/ yql/ ). Dort können z.B. Wetterdaten von Stationen weltweit abgefragt, als XML-Datei (alternativ JSON) übergeben und weiter ausgewertet werden. Ein entsprechendes Anwendungsbeispiel findet sich im Kapitel 10 (Anwendungsbeispiele zum Internet der Dinge). Zentrale Stelle für den Sucheinstieg zu Schnittstellen (API´s) für die M2M-Kommunikation bildet derzeit sicher die Ressource http: / / www.programmableweb.com/ . Seit seiner Gründung im Jahre 2005 verfolgt diese Organisation die Entwicklungen der Programmierschnittstellen und Austauschformate für Webbasierte und mobile Anwendungen intensiv und kontinuierlich. ProgrammableWeb bezeichnet sich selbst als „de facto Journal of the API economy“ und kann als diesbezügliche up-to-date- Informationsressource dem Leser ausdrücklich empfohlen werden. Zudem finden sich bei der API-University eine Vielzahl an Tutorials und Best-Practice-Beispiele für API-Entwickler auf dem Gebiet der M2M-Kommunikation. 8.5 Literatur Lauber-Reymann, Margit (2010): Informationsressourcen: ein Handbuch für Bibliothekare und Informationsspezialisten. Bibliotheks- und Informationspraxis 42, de Gruyter, Berlin/ NewYork Müller, R., J. Plieninger & C. Rapp (2013): Recherche 2.0. Finden und Weiterverarbeiten in Studium und Beruf. Springer VS, Wiesbaden Niedermair, Klaus (2010): Recherchieren und Dokumentieren. Der richtige Umgang mit Literatur im Studium. UVK-Verlag, Konstanz/ München <?page no="280"?> http: / / www.uvk-lucius.de/ informatik-ing 9 IT-Sicherheit Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: einen grundlegenden Einblick in das Problemfeld der IT-Sicherheit haben; mit den Schutzzielen der IT-Sicherheit vertraut sein; die Vorgehensweise zur Erstellung eines IT-Sicherheitskonzeptes kennen; elementare Schutzmaßnahmen benennen und umsetzen können. 9.1 Einführung IT-Sicherheit 9.1.1 Grundlagen Der Begriff der Sicherheit bezeichnet allgemein betrachtet einen Zustand, der als gefahrenfrei bzw. frei von unvertretbaren Risiken angesehen werden kann. Neben einer Einsicht hinsichtlich einer potenziellen Betroffenheit bzw. Gefährdung sind zur Erlangung von Sicherheit Maßnahmen erforderlich, um Gefahren zu reduzieren, zu beseitigen und somit die eigene Existenz zu sichern. In Bezug auf die Informationstechnik hat der Gesetzgeber folgende allgemeine Beschreibung definiert: „Sicherheit in der Informationstechnik bedeutet … die Einhaltung bestimmter Sicherheitsstandards, welche die Verfügbarkeit, Unversehrtheit oder Vertraulichkeit von Informationen betreffen, durch Sicherheitsvorkehrungen [1] in informationstechnischen Systemen, Komponenten oder Prozessen, oder <?page no="281"?> 282 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing [2] bei der Anwendung von informationstechnischen Systemen, Komponenten oder Prozessen.“ 25 Sowohl die Anbieter als auch die Nutzer von informationstechnischen Systemen müssen sich mit dem Thema IT-Sicherheit auseinandersetzen. Am Beispiel von Fragen bei der Nutzung eines Online-Dienstes wird nachfolgend die Komplexität des Problems beschrieben: Ist der Dienst permanent verfügbar? (24h/ 7 Tage die Woche) (Gefahr: Angriffe auf Verfügbarkeit; Denial of Service) Kommuniziere ich tatsächlich mit dem gewünschten Dienst? (Gefahr: Verschleiern bzw. Täuschen, z.B. gefälschte Web- Auftritte, eMail-Adressen; Spoofing, Phishing) Können die Daten beim Transport mitgelesen werden? (Gefahr: Abhören) Sind meine Daten unverfälscht eingegangen? (Gefahr: Manipulation der Daten) Sind meine persönlichen Daten beim Online-Dienst gut geschützt oder werden sie weiter verarbeitet, verkauft? (Gefahr: Verstöße gegen den Schutz personenbezogener Daten) Kann durch die Nutzung des Dienstes Schadsoftware auf meinen Rechner geschleust werden? (Gefahr: z.B. Viren, Würmer, Trojanische Pferde) Wie wird die Rechtsverbindlichkeit bei Verträgen garantiert? (z.B. qualifizierte Digitale Signatur) Bestehen weitere Gefahren bei der Nutzung des Online- Dienstes durch mobile Geräte? (Gefahr: z.B. Sensory Malware) 25 Gesetz über das Bundesamt für Sicherheit in der Informationstechnik (BSI-Gesetz) <?page no="282"?> 9.1 Einführung IT-Sicherheit 283 http: / / www.uvk-lucius.de/ informatik-ing Abb. 120: Schwachstellen bei Online Diensten Zusammengefasst verstehen wir unter IT-Sicherheit folgendes: Keine Störung informationsverarbeitender Prozesse (Schutz der Verfügbarkeit). Zugriff zu Daten nur durch berechtigte Personen (Schutz der Vertraulichkeit). Keine Verfälschung von Daten (Schutz der Integrität). Im Kontext der (IT-)Sicherheit sind zudem zwei zentrale Begriffe relevant: Das Risiko als ein Maß für die Gefährdung, die von einer Bedrohung ausgeht (insbesondere die Wahrscheinlichkeit des Eintritts sowie die Höhe des Schadens), und (Schutz-)Maßnahmen, die das Risiko reduzieren (Beheben der Bedrohung sowie der der Schwachstellen, Reduzieren der Eintrittswahrscheinlichkeit). Beides muss individuell für die jeweilige Ausgangssituation betrachtet werden. So hat ein Forschungszentrum für Hochtechnologie ein anderes Risiko bzgl. eines Hackerangriffs als der heimische Spiele-PC und erfordert somit auch andere Schutzmaßnahmen bzw. ein anderes Sicherheitsniveau. <?page no="283"?> 284 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing Das Sicherheitsniveau gibt an, wie gut die Daten und ITsysteme gegen Angriffe und Störungen geschützt sind. Dabei sind auch Aspekte der Angemessenheit von Sicherheitsmaßnahmen wie Wirksamkeit (effektiver Schutz), Eignung (in Praxis umsetzbar), Akzeptanz (anwendbar für alle, z.B. barrierefrei) sowie Wirtschaftlichkeit (Kosten-/ Nutzen-Verhältnis) zu berücksichtigen. Ziel der Sicherheitsmaßnahmen ist es, einen sogenannten IT- Grundschutz zu erreichen. Dieser soll durch infrastrukturelle, organisatorische, personelle und technische Sicherheitsmaßnahmen helfen, ein Standard-Sicherheitsniveau aufzubauen, um geschäftsrelevante Informationen zu schützen. Unter dem Begriff „Hacker“ subsumieren wir Personen, die Schwachstellen in Systemen und Netzwerken suchen und ausnutzen. Ein Black-Hat-Hacker nutzt dabei die Schwachstellen zum Schaden Dritter, ein White-Hat-Hacker (ethischer Hacker) arbeitet demgegenüber mit der Absicht, Systeme oder Netzwerke zu schützen (Sicherheitsexperten; Vulnerability-Scans etc.). 9.1.2 Datenschutz personenbezogener Daten Die Sicherheit in der Informationstechnik und der Begriff des Datenschutzes sind untrennbar miteinander verbunden, wenngleich beide Begriffe auf unterschiedliche Bereiche zielen. Im Grundgesetz der Bundesrepublik Deutschland, dem Bundesdatenschutzgesetz sowie weiteren Werken ist das Recht auf informationelle Selbstbestimmung in Deutschland geregelt. Der Datenschutz soll laut Bundesdatenschutzgesetz „... den Einzelnen davor schützen, dass er durch den Umgang mit seinen personenbezogenen Daten in seinem Persönlichkeitsrecht beeinträchtigt wird.“ 26 (BDSG §1) Trotzdem existiert eine Vielzahl von bereichsspezifischen Gesetzen und Rechtsvorschriften, die eine Erfassung und Ver- 26 Bundesdatenschutzgesetz (BDSG) <?page no="284"?> 9.2 Gefährdungsklassen / Schutzmaßnahmen 285 http: / / www.uvk-lucius.de/ informatik-ing arbeitung personenbezogener Daten ermöglichen. Zudem stimmen wir häufig - bewusst oder unbewusst - einer Erfassung und Verarbeitung unserer Daten zu, z.B. bei Vertragsabschlüssen, der Annahme von allgemeinen Geschäftsbedingungen etc. Personenbezogene Daten sind dabei laut §3 BDSG Einzelangaben (keine summarischen oder statistischen Daten) über persönliche oder sachliche Verhältnisse (auch wenig sensible Daten, z.B. die Anschrift) einer bestimmten (z.B. durch die Personennummer) oder bestimmbaren (aufgrund individueller Merkmale) natürlichen Person (Betroffener). Einfache aber sehr effektive datenschutzfreundliche Strategien für personenbezogene Daten sind: Datensparsamkeit: so wenig personenbezogene Daten wie möglich erheben, speichern und verarbeiten. Datenvermeidung: soweit möglich keine personenbezogene Daten preisgeben. Um in Erfahrung zu bringen, welche personenbezogenen Daten eine speichernde Stelle verwaltet, garantiert das BDSG jedermann die diesbezügliche Auskunft (§19, §34). Das Auskunftsersuchen muss dabei schriftlich an die speichernde Stelle gerichtet werden. Weitere Rechte sind bei fehlerhafter Erfassung die Berichtigung (§20, §35) oder bei missbräuchlicher Datenhaltung die Löschung (§20, §35) der personenbezogenen Daten. 9.2 Gefährdungsklassen / Schutzmaßnahmen 9.2.1 Gefährdungsklassen IT-Sicherheit Das Bundesamt für Sicherheit in der Informationstechnik (BSI) beschreibt in seinen IT-Grundschutzkatalogen 27 die verschiede- 27 Bundesamt für Sicherheit in der Informationstechnik: IT-Grundschutz-Kataloge; https: / / www.bsi.bund.de/ DE/ Themen/ ITGrund schutz/ itgrundschutz_node.html <?page no="285"?> 286 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing nen Gefährdungen der IT-Sicherheit aber auch geeignete Schutzmaßnahmen. Die dort analysierten Gefährdungsklassen werden im nachfolgenden zusammengefasst vorgestellt. Neben elementaren Gefährdungen (z.B. Blitz, Feuer, Wasser, Umgebungsklima, elektromagnetische Störungen) und höherer Gewalt (z.B. Natur- & technische Katastrophen) spielen organisatorische Mängel (z.B. fehlende Wartung, unzureichende Dimensionierung der Komponenten, mangelhaftes Sicherheitsmanagement, ungenügende Dokumentation des Systems sowie der Zugriffe), technisches Versagen der verschiedenen Komponenten einer IT-Infrastruktur (z.B. Ausfall der Stromversorgung, Datenverlust, Störung von Netzkomponenten), menschliche Fehlhandlungen (z.B. Nichtbeachtung von Sicherheitsmaßnahmen, Fehlbedienung und fehlerhafte Konfigurationen, sowie vorsätzliche Handlungen (z.B. Abhören und Manipulation, unberechtigte Nutzung, Schadprogramme oder auch die Verhinderung von Diensten (Denial of Service)) eine wesentliche Rolle bei der Gefährdung der IT-Sicherheit. Abb. 121: Gefährdungsklassen IT-Sicherheit Bedrohungsklassen Organisatorische Mängel <?page no="286"?> 9.2 Gefährdungsklassen / Schutzmaßnahmen 287 http: / / www.uvk-lucius.de/ informatik-ing Der Business-Impact ist dabei - neben einer möglichen Beeinträchtigung der Aufgabenerfüllung - auch im Hinblick auf Verstöße gegen Gesetze und Verträge, finanzielle Auswirkungen, sowie in einer nachteiligen Beeinträchtigung von Ansehen und Vertrauen zu betrachten. 9.2.2 Schutzmaßnahmen Zum Erreichen eines IT-Grundschutzes sind zur Abwehr der oben angeführten Bedrohungsklassen geeignete Maßnahmen umzusetzen. Diese betreffen sowohl die Infrastruktur, die Organisation der Abläufe und Zuständigkeiten, die Auswahl und Schulung von Personal als auch die Konzeptionierung einer geeigneten Notfallvorsorge bereits im Vorfeld möglicher Störungen. Dabei sind folgende allgemeingültige Sicherheitsziele zu erreichen: permanente Verfügbarkeit der IT-Infrastruktur (Hardware, Software, Daten, Kommunikation), Integrität der Daten (z.B. Nicht-Manipulierbarkeit der Daten; richtige und vollständige Informationen; korrekte, originale Programme etc.), Vertraulichkeit (Schutz von Wissen und Werten; Die Vertraulichkeit ist gewährleistet, wenn nur autorisierte Subjekte (Mensch, System oder Funktion) auf als schutzwürdig definierte Objekte (System, Funktion oder Datenbestände) zugreifen. Adäquate Schutzmaßnahmen, welche die Geschäftsinteressen und die vorhandene IT-Infrastruktur eines Unternehmens bzw. einer Organisation berücksichtigen, müssen im Rahmen der Erstellung eines IT-Sicherheitskonzeptes individuell erarbeitet werden. Aufgrund der Vielfältigkeit der Anforderungen, aber auch der verfügbaren Schutzmaßnahmen sei an dieser Stelle auf die weiterführende Literatur verwiesen. Auf hohem Abstraktionsniveau sind nachfolgend elementare Schutzmaßnahmen genannt: <?page no="287"?> 288 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing Schutz vor unbefugter Nutzung: Zugangs- (physisch) und Zugriffsmechanismen (logisch), Authentifizierung (Identitätsfeststellung z.B. durch Schlüssel, Passworte, biometrische Merkmale), Autorisierung (z.B. Berechtigungsprüfung), Kontrolle des Datenverkehrs (z.B. Firewall) und ggf. Verschlüsselung (z.B. Einsatz von Kryptoverfahren), organisatorische Maßnahmen zur Schwachstellenvermeidung wie Härten der IT-Infrastruktur (Entfernung aller Softwarekomponenten und Funktionen, die zur Erfüllung der Aufgaben nicht erforderlich sind), Verwendung aktueller Antivirensoftware, Patch-Management, regelmäßige Sicherheitsüberprüfungen, Notfall- und Wiederherstellungsmanagement etc. 9.3 Erstellung eines IT-Sicherheitskonzeptes Abb. 122: Erstellung eines Sicherheitskonzepts (nach BSI) <?page no="288"?> 9.3 Erstellung eines IT-Sicherheitskonzeptes 289 http: / / www.uvk-lucius.de/ informatik-ing Das BSI schlägt eine abgestufte Vorgehensweise bei der Erstellung eines Sicherheitskonzeptes vor. Neben einer Analyse der aktuellen IT-Infrastruktur spielt die Feststellung des Schutzbedarfs der jeweiligen Komponenten und Anwendungen eine zentrale Rolle. Abbildung 122 zeigt die prinzipielle Vorgehensweise bei der Erstellung eines Sicherheitskonzeptes. Allen im Rahmen der IT-Strukturanalyse identifizierten Systeme und Anwendungen werden dabei individuelle Schutzbedarfs- Kategorien anhand der maximalen Schäden und Folgeschäden bei Verlust der Vertraulichkeit, der Integrität und der Verfügbarkeit zugeordnet. Da der Schutzbedarf meist nicht quantifizierbar ist, erfolgt die Einteilung in drei Kategorien. Diese reichen dabei von „niedrig bis mittel“ (begrenzte und überschaubare Schäden), über „hoch“ (beträchtliche Schäden möglich) bis „sehr hoch“ (existentiell bedrohliche, katastrophale Schäden möglich). Tabelle 31 zeigt ein Beispiel einer Schutzbedarfsfeststellung. Tab. 31: Schutzbedarfsfeststellung von IT-Anwendungen <?page no="289"?> 290 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing Nach abgeschlossener Analyse der IT-Infrastruktur (auch der Netzverbindungen, IT-Räume etc.) und der Feststellung des jeweiligen Schutzbedarfs erfolgt der Soll-Ist-Vergleich, anhand dessen nach Durchführung einer Risikoanalyse (u.a. Bewertung des Business Impact) die einzuleitenden Maßnahmen abgeleitet und umgesetzt werden. Abb. 123: Umsetzungsschritte und Soll-Ist-Vergleich Die Aufrechterhaltung der IT-Sicherheit erfordert aber auch nach erfolgreicher Realisierung eines IT-Grundschutzes eine kontinuierliche Betrachtung. Diese beinhaltet eine regelmäßige Überprüfung der IT-Sicherheitsprozesse bezüglich deren Effektivität und Effizienz. Dabei erfolgt die Schutzbedarfsfeststellung wie bereits mehrfach benannt immer hinsichtlich der Grundwerte Vertraulichkeit, Integrität und Verfügbarkeit. 9.4 IT-Sicherheit und Datenschutz im Home Office 9.4.1 Allgemeine Regeln Obwohl elementare Schutzmaßnahmen für jeden IT-Nutzer mittlerweile selbstverständlich zum Tagesgeschäft gehören, sei an dieser Stelle mit Nachdruck auf wesentliche Maßnahmen hingewiesen: Soll-/ Ist- Vergleich IT-Sicherheitskonzept: Umsetzung defizitärer Maßnahmen Maßnahmenempfehlungen realisierte Maßnahmen IT-Grundschutz- Modell Analyse des Ist- Zustands <?page no="290"?> 9.4 IT-Sicherheit und Datenschutz im Home Office 291 http: / / www.uvk-lucius.de/ informatik-ing Regelmäßige Aktualisierung von Betriebssystem und Anwendungssoftware (Patch-Management) zur Schließung bekannter Sicherheitslücken in System- und Anwendungssoftware. Routinemäßiger Einsatz einer Antiviren-Software einschließlich einer regelmäßigen, automatischen Aktualisierung. Erstellung eines Sicherungskonzeptes für Datenbestände und Durchführung von regelmäßigen (automatisierten) Datensicherungen. Webzugangssoftware sowie Browsereinstellungen bewusst wählen, z.B. keine Passwörter speichern, keine Skripts bzw. aktive Inhalte standardmäßig (z.B. PlugIn´s) zulassen, Cookies nur individuell und sitzungsbezogen erlauben, Tracking- Schutz aktivieren, Mechanismen zum Phishing- und Malware-Schutz (=schädliche Software) aktivieren, Chronik löschen etc. Bei der Rechnerkommunikation sichere Übertragungswege nutzen (SSL-Verschlüsselung, VPN zwischen verschiedenen Standorten). Verschlüsselung persönlicher oder vertraulicher Informationen auf Datenträgern (z.B. Truecrypt) sowie ausschließlich verschlüsselt über Netze weiterleiten (z.B. mit PGP/ GnuPG). Passwörter regelmäßig wechseln. Um unautorisierte Zugriffe über das Internet auf die lokale Infrastruktur zu erkennen bzw. zu verhindern ist der Einsatz von Firewall-Systemen sinnvoll. Unter einer Firewall verstehen wir eine Menge von speziell geschützten Software-Komponenten, die an einem Übergang zwischen zwei Netzen (bzw. zwischen Netz und Einzelplatzrechner) installiert sind, um den Übergang der Daten zu kontrollieren. Dabei müssen alle Daten das Firewall-System passieren. <?page no="291"?> 292 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing Abb. 124: Funktionsweise eines Firewall-Systems Trotz ihrer Nützlichkeit haben Firewall-Systeme aber auch Grenzen: Kein Schutz vor Angriffen von innen. Defensive Konfiguration hemmt die Produktivität (führt dann oft zum Aufweichen der Restriktionen). Selbst bei defensiver Konfiguration ist ein Überbrücken möglich (z.B. HTTP-Tunneling). Kein perfekter Schutz vor Viren und kein Schutz vor trojanischen Pferden. 9.4.2 HTTPS (Hypertext Transfer Protocol Secure) Im Zusammenhang mit Netzwerken sowie den Diensten im Internet haben wir bereits das Hypertext Transfer Protocol (HTTP) besprochen (vgl. Kapitel 6 Netzwerke, Kapitel 7 Internet). Aufgrund der zunehmenden Bedeutung einer sicheren Datenübertragung durch Netze, insbesondere auch aufgrund der zunehmenden Verwendung von offenem WLAN, ist es erforderlich, die Vertraulichkeit und Integrität der Kommunikation zwischen Client und Server herzustellen. Dies kann durch die Nutzung von Verschlüsselungs- und Authentifizierungstechniken geschehen. <?page no="292"?> 9.4 IT-Sicherheit und Datenschutz im Home Office 293 http: / / www.uvk-lucius.de/ informatik-ing Das HTTPS (Hypertext Transfer Protocol over Secure Socket Layer) dient in diesem Kontext dem geschützten Transfer von Hypermedia-Dokumenten. HTTPS verwendet dabei mittels Secure Sockets Layer (SSL) / Transport Layer Security (TLS) eine zusätzliche Verschlüsselungstechnik zur sicheren Datenübertragung. Hierbei findet zunächst unter Verwendung des SSL- Handshake-Protokolls eine geschützte Identifikation und Authentifizierung der Kommunikationspartner statt. Hierzu werden Zertifikate ausgetauscht und deren Gültigkeit mittels Prüfsumme (Secure Hash Algorithm z.B, SHA 1 bzw. aktuell SHA 2) überprüft. Anschließend erfolgt die Einigung auf einen gemeinsamen Schlüssel und schließlich die verschlüsselte Übertragung der Nutzdaten. Standard-Port für HTTPS-Verbindungen ist Port 443. Im Browser lässt sich eine verschlüsselte Verbindung am Schloßsymbol erkennen. Die letzte Version des SSL-Protokolls ist 3.0, danach wurde es unter dem neuen Namen TLS, beginnend mit Version 1.0, weiterentwickelt und standardisiert. Die meisten Server und Browser unterstützen TLS. Kritisch ist die unbedingte Vertrauenswürdigkeit der die Zertifikate ausstellende Institution. Bei unsicheren (gefälschten) Zertifikaten ist auch TLS anfällig für „Man-in-the-Middle“-Angriffe. Ist der Man-inthe-Middle vor der Übergabe des Schlüssels aktiv, kann er beiden Seiten seine Schlüssel vortäuschen und so den gesamten Datenverkehr aufzeichnen und/ oder manipulieren. Zur sicheren Datenübertragung unserer Sensorinformation aus der Übungsanwendung zum Internet der Dinge werden wir auf das HTTPS-Protokoll zurückgreifen (vgl. Kapitel 10.4.2) 9.4.3 Vermeidung von Datenspuren “On the Internet, nobody knows you're a dog” sagt in einer Karikatur von Peter Steiner in der NewYork Times aus dem Jahre 1993 ein Hund zu einem anderen, beide vor einem PC sitzend. 28 28 https: / / en.wikipedia.org/ wiki/ On_the_Internet,_nobody_knows _you're_a_dog <?page no="293"?> 294 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing Basierend auf den vielfältigen Datenspuren die wir mittlerweile im Internet hinterlassen ist es jedoch einfach geworden, durch eine intergierte Auswertung dieser Daten, den gläsernen Nutzer zu extrahieren. Der Weg dorthin führt hauptsächlich über: IP-Adressen: diese werden bei jeder Aktion im Internet mitgesendet; sie liefern Infos zu geographischer Information sowie dem Internet-Anbieter. Browserdaten: liefern Infos zum Endgerät des Nutzers, zur geographischen Position, sowie zu Benutzerinteressen (z.B. via Chronik). Suchmaschinen: Viele Suchmaschinen erfassen Suchanfragen und werten diese aus. Ergebnisse können so u.a. bei Google Trends eingesehen werden. Infos zu Google-Nutzern sind z.B. über Google Dashboard abfragbar. Cookies: sind Dateien mit Informationen, die von den besuchten Webseiten auf dem Endgerät des Nutzers abgelegt und bei nachfolgenden Besuchen ausgelesen und aktualisiert werden. Wer alle Cookies ausliest und auswertet, kann daraus ein Interessenprofil ableiten. Smartphone und Apps: Können ggf. unter anderem Positions-, Kontakt- und Kommunikationsdaten bereitstellen. Neben geeigneten Einstellungen z.B. im Browser oder in der Smartphone-Software kann auch durch die Wahl von datenschutzfreundlichen Werkzeugen die Datenspur verkleinert werden. 9.4.3.1 Datenschutzfreundliche Suchmaschinen Dass Suchmaschinen nicht unbedingt persönliche Nutzerdaten sammeln müssen, zeigen die Beispiele duckduckgo.com, startpage.com und ixquick.de. Hier erfolgt keine Speicherung von IP-Adressen oder personenbezogenen Daten. Lediglich anonyme Cookies werden im Maximalfall gesetzt. Ixquick ist dabei eine Metasuchmaschine, welche die Ergebnisse anderer Anbieter listet (z.B. Yahoo, die russische Such- <?page no="294"?> 9.4 IT-Sicherheit und Datenschutz im Home Office 295 http: / / www.uvk-lucius.de/ informatik-ing maschine Yandex, aber auch die Open-Source-Suche Gigablast). Neben den oben erwähnten Datenschutz-Maßnahmen können die Suchergebnisse zusätzlich über einen eigenen Proxy-Service aufgerufen werden, damit die Nutzer auch beim Verlassen der Suche anonym bleiben. Startpage läuft unter denselben Datenschutz-Einstellungen wie Ixquick, zeigt aber andere Suchergebnisse an, da es die Einträge von Google übernimmt. D.h. die bei Startpage eingegebenen Suchbegriffe werden anonymisiert an Google weitergeleitet; Google sendet die Ergebnisse dann an Startpage zurück, wo sie vom Nutzer schließlich eingesehen werden können. Ixquick und Startpage wurden im März 2016 zusammengeführt und sind nun unter dem Dach von Startpage zu erreichen. DuckDuckGo verschlüsselt die Datenübertragung via SSL und verspricht ebenso, keine personenbezogenen Nutzerdaten zu sammeln. So werden in der Standardeinstellung keine Cookies verwendet, kein Tracking betrieben und Suchbegriffe nicht an die Betreiber der Seiten weitergegeben. 9.4.3.2 Anonymes Surfen Bei der Identifikation von Internet-Nutzern spielt die IP-Adresse eine zentrale Rolle, zumal die IP-Adresse für jede an Transport und Routing beteiligte Instanz einsehbar ist. Selbst wenn die Daten an sich verschlüsselt sind, lassen sich über die IP- Adressen einige Informationen über die Kommunikationspartner ermitteln. Unter Anonymisierung verstehen wir in diesem Zusammenhang das Verschleiern des Start- und Zielpunktes einer Kommunikationsverbindung. Bei der Anonymisierung wird die richtige IP-Adresse durch eine andere ersetzt. Es existieren dabei verschiedene Möglichkeiten der Realisierung: Nutzung eines Proxys (= Stellvertreter): Der Proxy nimmt Anfragen von Clients entgegen und leitet sie stellvertretend an den Ziel-Server im Internet weiter. Dabei sieht der Server nur die IP-Adresse des Proxys und nicht diejenige des Clients. Auf dem umgekehrten Weg nimmt der Proxy die Datenpakete vom <?page no="295"?> 296 9 IT-Sicherheit http: / / www.uvk-lucius.de/ informatik-ing Server entgegen, tauscht die IP-Adresse aus und schickt sie an den Client weiter. Ein Proxy ist ein “Man in the Middle”, der zwar anonymisiert, dessen Betreiber man dafür aber entsprechend vertrauen muss. VPN-Dienste: Hierzu wird eine VPN-Software auf dem Client installiert, der den gesamten Datenverkehr an ein VPN-Gateway im Internet weiterleitet. Das Gateway tauscht dabei die IP- Adressen aus, so dass die Ziel-Server im Internet nur die IP- Adresse des VPN-Gateways sehen (Prinzip ähnlich Proxy). Der Datenverkehr zwischen Client und Gateway ist dabei verschlüsselt. Onion-Routing (Anonymisierungsnetzwerk Tor): Tor ist ein Netzwerk zur Anonymisierung von Verbindungsdaten. Basis ist die Idee des sogenannten Onion-Routings. Dabei installiert der Nutzer auf seinem Rechner einen Client, den sogenannten Onion-Proxy. Dieses Programm verbindet sich mit dem Tor-Netzwerk. Der Onion-Proxy wählt eine zufällige Route über die Tor- Server mittels einer verschlüsselten Verbindung. Diese Prozedur wiederholt sich so, dass eine Verbindungskette immer drei Tor- Server enthält. Jeder Server kennt seinen Vorgänger und seinen Nachfolger. Nachdem eine Verbindung aufgebaut wurde, werden über diese Server die Daten versandt. Der letzte Server tritt dabei als Endpunkt der Kommunikation auf. Er wird als Exit- oder Austritts-Server oder -Knoten bezeichnet. Beachte: Tor verschleiert lediglich die IP-Adresse des Nutzers, nicht seine Identität. Mix-Kaskaden: Hierbei sind mehrere Proxy´s hintereinander geschaltet. Die Daten werden dabei mehrfach verschlüsselt und durch unterschiedliche Rechner geleitet, wobei pro Rechner eine Verschlüsselung entschlüsselt wird. Erst am Ende der Mix- Kaskade werden die Daten lesbar. Da die Verbindungsdaten verschiedener Benutzer an jedem Glied der Kaskade neu gemischt werden, ist eine eindeutige Zuordnung schwierig (z.B. JonDonym). <?page no="296"?> 9.4 IT-Sicherheit und Datenschutz im Home Office 297 http: / / www.uvk-lucius.de/ informatik-ing Anonymes Surfen durch eine Verschleierung der IP-Adresse macht natürlich keinen Sinn, wenn die Gegenseite die Identität z.B. durch Zugangsdaten, mit aktiven Web-Inhalten, Cookies oder Browser-Fingerprints ermitteln kann. Da Anonymisierungsdienste und -netze i.d.R. nach dem Man-in-the- Middle-Prinzip arbeiten, besteht zudem die Gefahr, dass die übertragenen Daten trotzdem aufgezeichnet und ausgewertet werden. Deshalb sollten vertrauliche Daten auch bei der Verwendung von Anonymisierungsdiensten verschlüsselt werden. 9.4.4 Smartphone und Sensory Malware Die zunehmende mobile Nutzung von Internet-Diensten erfordert, auch aus Sicht der IT-Sicherheit, einen genaueren Blick auf die mobilen Geräte und Anwendungen zu richten. Dies insbesondere dann, wenn über diesen Weg auch die IT-Infrastruktur eines Unternehmens genutzt werden soll. Neben den bereits erwähnten klassischen Risiken (z.B. Abhören der Kommunikation, Ausspähung von Daten) hat sich durch die Verfügbarkeit und Nutzung der integrierten Sensorik eine zusätzliche Gefährdung entwickelt (Sensory Malware). So können durch eine Auswertung von Hintergrundgeräuschen bei Telefonaten, durch eine Analyse des Bewegungssensors oder auch mittels einer automatisierten Bilderfassung und Auswertung zusätzliche Informationen über den Nutzer und sein Umfeld gewonnen werden, auch ohne dessen Wissen. Die Ergebnisse entsprechender Analysen sind immer wieder aufs Neue überraschend. Da die Entwicklung der Sensory Malware erst begonnen hat, werden wir auf diesem Gebiet sicher noch die ein oder andere interessante Entwicklung beobachten können. Durch ein aktives Verhalten kann jedoch jeder einzelne sowohl seinen Datenschatten verringern als auch das Sicherheitsniveau bei der Nutzung mobiler Geräte anheben. Nachfolgend sind einige Maßnahmen hierzu exemplarisch aufgelistet: <?page no="297"?> 298 9 IT-Sicherheit AGB's durchlesen, ggf. Installation verweigern und einen anderen Anbieter gleicher App-Funktionalität wählen. GPS und WLAN nur bei Bedarf aktivieren. Zugriffsrechte von Apps ermitteln und ggf. entziehen (z.B. AppGuards, Permission Watcher). Analyse von Werbekanälen und Datenweitergabe (z.B. Ad- Network Scanner & Detector). Ad-tracking beschränken; Deaktivieren personalisierter Werbung. Privatsphäreneinstellungen in sozialen Netzwerken überprüfen. HTTPS aktivieren wo immer möglich. VPN-Tunnel verwenden. 9.5 Literatur BSI - Bundesamt für Sicherheit in der Informationstechnik (Hrsg.) (2003ff): IT-Grundschutz-Kataloge. Standardwerk zur Informationssicherheit. Bundesanzeiger Verlag Poguntke, Werner (2013): Basiswissen IT-Sicherheit. Das wichtigste für den Schutz von Systemen und Daten. 3. Auflage, W3L-Verlag, Herdecke, Witten Schneider, Jochen (2016): IT- und Computerrecht. 12. Auflage, Beck-Texte im dtv, Deutscher Taschenbuch Verlag, München <?page no="298"?> http: / / www.uvk-lucius.de/ informatik-ing 10 Anwendung: Internet der Dinge Lernziele Nach der Durcharbeitung dieses Kapitels sollten Sie: das Zusammenspiel der für eine einfache Messdatenverarbeitung notwendigen Komponenten erläutern und ein Datemmodell für die entsprechende Anwendung entwerfen können; die Umsetzung des Datenmodells in die Datenstrukturen einer Programiersprache beherrschen; die verschiedenen Möglichkeiten der Datenübertragung im Internet kennen und Vor- und Nachteile des Clientbzw. Serveransatzes erläutern können; Mechanismen zur sicheren Übertragung von Messdaten umsetzen können. Die bisherigen Kapitel haben die verschiedenen Facetten der Informatikanwendung in den Ingenieurwissenschaften ausführlich dargestellt. Am Beispiel eines internetfähigen Sensorsystems sollen die gelernten Zusammenhänge nun sukzessive vertieft werden. Dazu werden wir auf der Basis der vorliegenden Interfaceschaltung ein flexibles Messdatenerfassungssystem entwerfen und die Messdaten anschließend auf verschiedenen Wegen im Internet zugänglich machen. 10.1 Messdatenerfassung 10.1.1 Sensorik und Kalibrierung Nach der Erfassung der Sensorinformation in Form der Rohwerte (raw, r), müssen diese in die entsprechende physikalische Größe (phys, p) umgerechnet werden: offset raw gain phys + ⋅ = <?page no="299"?> 300 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing Abb. 125: Aufbau des Messdatenerfassungssystems Beim bereits bekannten Beispiel des lichtempfindlichen Widerstands LDR wird der vom Spannungsteiler erzeugte Rohwert (V) in die Beleuchtungsstärke (Lux) umgerechnet. Dies gilt übrigens auch für Sensoren, die bereits physikalische Größen liefern (wie die Temperatur und Feuchte des DHT-Sensors). Auch hier existieren gewisse Serienstreuungen der Sensoren, die durch eine Kalibrierung ausgeglichen werden können. In der Regel wird dazu die einfache Zweipunkt-Kalibrierung eingesetzt, bei der für zwei Punkte am oberen und unteren Messbereich die Rohwerte (r 1 , r 2 ) und die korrespondierenden physikalischen Werte (p 1 , p 2 ) ermittelt werden. Voraussetzung ist natürlich die genaue Kenntnis der Werte p 1 und p 2 z.B. mittels genauer Vergleichsmesstechnik. Aus diesen Kalibrierdaten lassen sich offset und gain zur Umrechnung der Rohwerte berechnen. Allerdings sind die eingesetzten Sensoren und der vorgeschlagene Spannungsteiler nichtlinear, so dass auch nach Kalibrierung ein systematischer Messfehler bleibt. Hier könnte später eine nichtlineare Umrechnungsfunktion eingeführt werden. <?page no="300"?> 10.1 Messdatenerfassung 301 http: / / www.uvk-lucius.de/ informatik-ing Abb. 126: Kalibrierung der Sensoren Aufbauend auf der bereits im Kapitel Interfacetechnik vorgestellten Schaltung werden die Sensoren zyklisch ausgelesen, umgerechnet und auf Verletzung von Alarmgrenzen überwacht. Im Alarmfall wird über einen digitalen Ausgang ein abschaltbares Meldesignal generiert. Die Speicherung des Prozessabbilds erfolgt mittels eines globalen Datenpools. Abb. 127: Datenmodell Messwerterfassung 10.1.2 Datenmodell Das Datenmodell besteht in der Grundversion aus den vier Messdatenkanälen für Temperatur, Feuchte, Beleuchtungsstärke und einem Schließkontakt, soll aber bei Bedarf auch leicht erweiterbar sein. Damit ergibt sich folgende Datenstruktur für jeden Kanal: Messdaten einlesen und umrechnen Alarmüberwachung Daten Visualisierung Internet- Anbindung Globaler Datenpool Sensoren Aktor Internet Terminal Rohwert (ADC) Physikalischer Messwert z.B. Lux Kalibrierpunkt 2 Kalibrierpunkt 1 r 1 =130 r 2 =900 p 1 =20 p 2 =50 gain offset 1 1 1 2 1 2 , r gain p offset r r p p gain ⋅ − = − − = <?page no="301"?> 302 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing Tab. 32: Datenmodell Messkanal Gruppe Funktion Bezeichnung Datentyp Default Kanalname text char[] Einheit unit char[] Messwerte Rohwert val.raw int physikalischer Wert val.phys float - Kalibrierdaten Verstärkung cal.gain float 1 Offset cal.offset float 0 Alarmdaten obere Grenze alarm.high Float 10 38 untere Grenze alarm.low float -10 38 Die Umsetzung der Datenstruktur erfolgt entsprechend als Verbundtyp: 1: typedef struct { / / Typdeklaration Messdaten 2: int raw; / / Rohwert aus Sensor 3: float phys; / / Physikalische Größe 4: }val_type; 5: 6: typedef struct { / / Typdeklaration Kalibrierdaten 7: float offset = 0.; / / Umrechnung raw in phys 8: float gain = 1.; / / phys = gain*raw+offset; 9: }cal_type; 10: 11: typedef struct { / / Typdeklaration Alarmverarbeitung 12: float high = 1e38; / / Obere Grenze 13: float low = -1e38; / / Untere Grenze 14: }alarm_type; 15: 16: typedef struct { / / Typdeklaration Messkanal 17: char text[20]; / / Name des Messkanals 18: val_type val; / / Messdaten 19: cal_type cal; / / Umrechnung raw in phys 20: alarm_type alarm; / / Alarmverarbeitung 21: }chan_type; Damit existiert ein neuer Datentyp chan_type, der alle Informationen zur Charakterisierung eines Messdatenkanals enthält. Dieser Datentyp kann im Programm zur Definition eines 4 Elemente (Kanäle) umfassenden Feldes genutzt werden: 22: #define CHAN 4 / / Erweiterbar für CHAN Kanäle 23: chan_type pool[CHAN]; / / globaler Datenpool 24: int pool_alarm_enable=1; / / Flag Alarmüberwachung an/ aus <?page no="302"?> 10.1 Messdatenerfassung 303 http: / / www.uvk-lucius.de/ informatik-ing Zusammen mit einem Flag zur Aktivierung der Alarmüberwachung (pool_alarm_enable) bildet das Feld den globalen Datenpool, auf den die weiteren Funktionen direkt arbeiten. Die Realisierung als globaler Pool hat den Vorteil, dass spätere Zugriffe aus dem Internet leicht umsetzbar sind. 10.1.3 Programmtechnische Umsetzung Die erste zu realisierende Funktionalität dient der Initialisierung des Datenpools und der Erfassung der Sensorik: 25: #include "DHT.h" / / Library DHT hinzufügen 26: #define DHT_PIN 2 / / Anschluss DHT11 an PIN GPIO2 27: #define DIN_PIN 4 / / Anschluss digitaler Eingang 28: #define AIN_PIN A0 / / Anschluss analoger Eingang 29: #define ALARM_PIN 5 / / Anschluss LED zur Signalisierung 30: DHT dht(DHT_PIN, DHT11); / / DHT Objekt anlegen 31: 32: void poolSetup() { / / Initialisierung Datenpool 33: strcpy(pool[0].text,"Kontakt "); / / Vorgabe Namen,Einheit 34: strcpy(pool[0].unit," on/ off "); 35: strcpy(pool[1].text,"Beleuchtung"); 36: strcpy(pool[1].unit," Lux"); 37: pool[1].cal.gain = 1020./ 1023.; / / Beleuchtung über ADC 38: pool[1].cal.offset =-6.0; / / mit Kalibrierung 39: pool[1].alarm.high = 850; / / und 40: pool[1].alarm.low = 50; / / Alarmüberwachung 41: strcpy(pool[2].text,"Temperatur "); 42: strcpy(pool[2].unit," Celsius"); 43: strcpy(pool[3].text,"Feuchte "); 44: strcpy(pool[3].unit," % "); 45: dht.begin(); / / Sensor DHT aktivieren 46: pinMode(ALARM_PIN,OUTPUT); / / Alarm- LED ist Ausgang 47: pinMode(DIN_PIN,INPUT_PULLUP); / / Pullup am Eingang 48: } 49: 50: void poolUpdate() { / / Datenerfassung 51: pool[0].val.raw = digitalRead(DIN_PIN); / / Rohwerte einlesen 52: pool[1].val.raw = analogRead(AIN_PIN); 53: for(int n=0; n<=1; n++) / / und umrechnen 54: pool[n].val.phys=pool[n].cal.gain*(float)pool[n].val.raw + 55: pool[n].cal.offset; 56: 57: float T = dht.readTemperature(); / / DHT schon physwert 58: float H = dht.readHumidity(); / / vom Sensor holen 59: 60: if (! isnan(T) && ! isnan(H)) { / / Wenn gueltiger Wert 61: pool[2].val.phys = pool[2].cal.gain*T + pool[2].cal.offset; 62: pool[3].val.phys = pool[3].cal.gain*H + pool[3].cal.offset; 63: } else Serial.println("Sensorfehler DHT"); 64: } <?page no="303"?> 304 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing Anschließend werden die Messwerte auf dem Terminal dargestellt, 65: void poolDisplay() { 66: String message = "\nMesswerte \n"; 67: for(int n=0; n<CHAN; n++) 68: message = message + " " + pool[n].text + ": " 69: + String(pool[n].val.phys) + "\n"; 70: Serial.print(message); 71: } und einer Alarmüberwachung unterzogen. 72: int poolAlarm() { / / Alarmgrenzen überwachen 73: int alarm = 0; 74: for(int n=0; n<CHAN; n++) { 75: if ((pool[n].val.phys > pool[n].alarm.high) || 76: (pool[n].val.phys < pool[n].alarm.low)) 77: alarm = 1; / / Grenzüberschreitung 78: } 79: if (alarm && pool_alarm_enable) / / Nur wenn globales Flag 80: digitalWrite(ALARM_PIN,HIGH); / / dann auch 81: else / / nach aussen melden 82: digitalWrite(ALARM_PIN,LOW); 83: return alarm; 84: } Diese wenigen Funktionsblöcke werden schließlich zur kompletten Messdatenerfassung kombiniert: 85: void setup(void) { / / Initialisierung 86: Serial.begin(9600); 87: poolSetup(); / / Initialisierung Datenpool 88: } 89: 90: void loop() { / / Endlos Messdatenerfassung 91: poolUpdate(); / / Daten einlesen 92: poolDisplay(); / / auf Terminal ausgeben 93: poolAlarm(); / / Alarme signalisieren 94: delay(5000); / / 5 s Zykluszeit 95: } Als Ausgabe erhalten wir kontinuierlich Information über die Prozessgrößen. Gleichzeitig wird das Überschreiten von Grenzwerten per Melder (LED) signalisiert. <?page no="304"?> 10.2 Machine to Machine Kommunikation (M2M) 305 http: / / www.uvk-lucius.de/ informatik-ing 10.2 Machine to Machine Kommunikation (M2M) Durch Anpassung der Funktion poolDisplay() kann die Ausgabe auch in einem besser maschinenlesbaren Format erfolgen (M2M). Statt des Terminal-Programmes in der Arduino- Umgebung würde dann eine andere PC-Software wie z.B. MATLAB ® oder LabView ® die Messdaten entgegennehmen und zur Weiterverarbeitung z.B. auf die Festplatte speichern oder visualisieren. Mit wenig Aufwand lässt sich so ein einfacher Datenlogger realisieren. Anwendungsbeispiel: MATLAB ®- Datenlogger Im folgenden Beispiel wird exemplarisch eine kommaseparierte Textausgabe zur Kommunikation genutzt. Der aktuelle Messwert eines jeden Kanals wird im ASCII-Text und durch ein Trennzeichen ', ' separiert ausgegeben. Die gesamte Nachricht wird wiederum durch einen Zeilenumbruch '\n' abgeschlossen. Anhand des Zeilenumbruchs (CR oder CR+LF) kann der Empfänger den Eingang des vollständigen Datensatzes erkennen (vergl. Kapitel Hardware serielle Schnittstellen). Abb. 128: Beispielprotokoll M2M-Kommunikation 1: void poolDisplayM2M() { / / Ausgabe aufs Terminal, maschinenlesbar 2: String message = "InInfoOV1: "; / / Kopf 3: for(int n=0; n<CHAN-1; n++) / / Kommaseparierte Liste 4: message = message + String(pool[n].val.phys) + ","; 5: message = message + String(pool[CHAN-1].val.phys) + "\n"; 6: Serial.print(message); 7: } <?page no="305"?> 306 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing In unserem Anwendungsfall geht es um den kontinuierlichen Datenaustausch der aktuellen Messwerte. Zur Sicherung der Übertragung beginnt ein Datensatz deshalb zusätzlich immer mit dem String "InfoIngOV1: ". Der Empfänger kann diesen Kopf (Header) z.B. zur Erkennung des verwendeten Protokolls nutzen. Das folgende Listing verdeutlicht die Vorgehensweise anhand eines MATLAB®-Skriptes. Dieses holt den vom Datenlogger gesendeten Textstring per fscanf-Befehl vom Eingangspuffer der seriellen Schnittstelle. Nach Überprüfung des Nachrichtenkopfes wird der neue Messwert in die Datenmatrix messwerte übernommen. 1: s1 = serial('COM53', 'BaudRate', 9600); % Baudrate einstellen 2: fopen(s1) % Schnittstelle öffnen 3: plotindex = 2; % Darstellung nur Kanal 2 4: kopf = 'InInfoOV1: '; % Erwarteter Kopf 5: for i=1: 100 % 100 Messwerte 6: message = fscanf(s1); % Nachricht einlesen 7: if length(message)>length(kopf) &&... % Sicherung (teste Kopf) 8: strcmp(message(1: length(kopf)),kopf) % Format erkannt 9: nutzdaten=message(length(kopf)+1: end); % Nutzudaten extrahieren 10: messwerte=[messwerte; str2num(nutzdaten)]; % und anfügen 11: plot(1: size(messwerte,1),messwerte(: ,plotindex),'-o'); % plot 12: xlabel('Abtastpunkt'); ylabel('Messwert Beleuchtung'); 13: else 14: disp(['unbekanntes Format: ' message]); % Fehlermeldung 15: end 16: end % 100 Messwerte komplett 17: fclose(s1) % Verbindung schließen Als Ergebnis lässt sich der zeitliche Verlauf des Messwertes für Kanal 2 (Beleuchtung) visualisieren. Abb. 129: Ausgabe MATLAB ® -Visualisierung <?page no="306"?> 10.3 Web-Server 307 http: / / www.uvk-lucius.de/ informatik-ing Auf der Ebene der Dateien existiert mit den CSV-Format (Comma Separated Values) ein ähnlicher Mechanismus um größere Mengen an Messwerten zwischen Systemen auszutauschen (auch im Internet z.B. über FTP-Protokoll). 10.3 Web-Server Die bisher umgesetzte Messdatenverarbeitung bildet die ideale Basis zur Realisierung einer kleinen Anwendung für das Internet der Dinge. Dazu sollen die erfassten Messdaten im Internet zugänglich gemacht und ggf. Steuerbefehle aus dem Internet entgegengenommen werden. Die einfachste Möglichkeit zur Bereitstellung der Netzwerkfunktionalität bietet das NodeMCU- Board mit der WLAN-Schnittstelle des ESP8266. Bei der Realisierung gibt es gemäß Client/ Server-Modell (Kapitel Internet) im Prinzip zwei Möglichkeiten: Realisierung als eigener Web-Server Realisierung als Client für den Zugriff auf eine bestehende Internet-Ressource (z.B. Thingspeak-Server, MQTT-Broker) Beide Möglichkeiten haben bestimmte Vor- und Nachteile, die anhand der folgenden exemplarischen Anwendung klar werden. 10.3.1 Server-Homepage Ein Web-Server soll bei Anfrage die aktuellen Daten in Form einer Tabelle ausliefern. Glücklicherweise bleibt ein Großteil der dazu nötigen Verwaltungsoperationen in den unteren Schichten des TCP/ IP-Protokolls verborgen. Unser Programm greift vielmehr auf eine die Anwendungsschicht nutzende Schnittstelle in Form einer vorher einzubindenden Bibliothek zu: 18: #include <ESP8266WiFi.h> / / WiFi Library dazuladen 19: #include <ESP8266WebServer.h>/ / Server Library dazuladen 20: ESP8266WebServer server(80); / / Web-Server auf Standardport 80 Damit wird ein Server-Objekt erzeugt, das applikationsspezifisch mit Leben zu erfüllen ist. Da der Server auf Anfrage mit einer Messwertausgabe im HTML-Format antworten soll, muss <?page no="307"?> 308 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing diese „Homepage“ in Form von HTML-Text generiert werden (vergl. Kapitel Internet): 1: void serverHomepage() { / / Homepage Messwertanzeige Tabelle 2: String html = "<html> 3: html = html + “<META HTTP-EQUIV=""refresh"" CONTENT=""5"">"; 4: html = html + "<head><title>InfoIngServer</ title></ head>"; 5: html = html + "<body>"; 6: html = html + "<h1>Messwerte InfoIng-Server: </ h1>"; 7: html = html + "<table>"; 8: for(int n=0; n<CHAN; n++) { 9: html = html + "<tr><td>" + pool[n].text + "</ td> <td>" + 10: String(pool[n].val.phys) + "</ td><td>"+pool[n].unit+ 11: " </ td></ tr>"; 12: } 13: html=html+"</ table>"; 14: html=html+"<br / ><a href=""alarm"">Alarmsteuerung</ a>"; 15: html=html+"</ body></ html>"; / / Seitenende 16: server.send(200, "text/ html", html); 17: } Dazu wird die Information aus dem globalen Datenpool in den Text einer HTML-Tabelle gewandelt und dann per server.send() an den Client ausgeliefert. Ähnlich wie bei der bereits bekannten Ausgabe auf die serielle Schnittstelle überträgt dieser Befehl die Nachricht über die Schichten des Protokolls hinweg zum anfordernden Client. Die zyklische Aktualisierung der Seite wird über einen META-HTLM-Tag abgewickelt. Der Vorteil ist, dass wir uns auf der Seite des Servers damit keine Gedanken um die Realisierung machen müssen. Das Kommando „refresh“ wird vom Browser des Clients ausgewertet. Dieser fordert die Seite daraufhin zyklisch alle 5 Sekunden neu vom Server an. Zur Steuerung der Alarmüberwachung ist eine weitere Seite vorgesehen, auf die unsere Homepage mit einem relativen Link <a href="alarm"> verweist. Ein Aufruf dieser Seite toggelt das globale Überwachungsflag pool_alarm_enable und damit die Ausgabe der Alarmmeldung auf dem Aktor: 1: void serverAlarmpage() { / / Alarmseite zum An-/ Abschalten 2: String html = "<html><head><title>InfoIngServer</ title></ head>"; 3: html = html + "<body>"; 4: if (pool_alarm_enable == 1) { 5: pool_alarm_enable = 0; 6: html=html+"<h1>Alarm ist ausgeschaltet ! </ h1>"; 7: } else { 8: pool_alarm_enable = 1; 9: html=html+"<h1>Alarm ist aktiviert ! </ h1>"; <?page no="308"?> 10.3 Web-Server 309 http: / / www.uvk-lucius.de/ informatik-ing 10: } 11: html=html+"<br / ><a href=""/ "">Zurück zur Homepage</ a>"; 12: html=html+"</ body></ html>"; 13: server.send(200, "text/ html", html); / / Seite ausliefern 14: } Unser Server ist somit in der Lage, zwei verschiedene HTML- Seiten auszuliefern. Im Setup der Serverinitialisierung müssen nur noch die jeweiligen URL-Angaben zur Seitensteuerung vorgegeben werden: 1: void serverSetup(void) { / / Konfiguriere Web-Server 2: server.on("/ ",serverHomepage); / / root zur Homepage 3: server.on("/ alarm",serverAlarmpage); / / alarm zur Alarmseite 4: server.begin(); / / Starte den Server 5: Serial.println("\n\nHTTP server started"); 6: } und fertig ist die Initialisierung des Web-Servers. 10.3.2 WLAN Zugang (Access-Point Modus) Vor Inbetriebnahme muss dieser noch in ein WLAN eingebunden werden. Dazu stehen prinzipiell zwei Betriebsmodi zur Verfügung (s. Kapitel Rechnernetze, WLAN): als Access-Point mit eigenem Netz oder als WLAN-Client an einem fremden Access-Point Im aktuellen Beispiel konfigurieren wir unsere Hardware als Access-Point mit eigener Netzkennung (Service Set Identifier SSID) und mindestens 8 Zeichen umfassenden Passwort (WPA2 gesichert). Dies hat den Vorteil, dass sich jedes in der Nähe befindliche Smartphone oder Notebook als Client in diesen Access-Point einwählen und den Server nutzen kann. Eine spätere Anwendung demonstriert die Einwahl in einen fremden Access-Point und damit die tatsächliche Möglichkeit des weltweiten Zugriffs. 1: #define AP_SSID "InfoIng" / / Name des Access-Point 2: #define AP_PASS "password" / / Passwort für Anmeldung 3: void WiFi_AP() { / / 4: WiFi.softAP(AP_SSID ,AP_PASS); / / AccessPoint aufspannen 5: Serial.println("\n\nBuild accesspoint: " + String(AP_SSID)); 6: Serial.print("IP address Server is: "); 7: Serial.println(WiFi.softAPIP()); / / Unter dieser IP ist unser 8: } / / Server später erreichbar <?page no="309"?> 310 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing Wichtig ist die Ausgabe der eigenen IP-Adresse unter der unser Server jetzt netzintern erreichbar ist (hier: 192.168.4.1.). Da die Reichweite des auf der NodeMCU verwendeten ESP-Moduls durch die verwendete Leiterplattenantenne sehr begrenzt ist, ist auch unser Server nur eingeschränkt sichtbar. Der Arduino-Sketch hat schließlich den folgenden Aufbau: 1: void setup(void) { / / Initialisierung 2: Serial.begin(9600); 3: poolSetup(); / / Initialisierung Datenpool 4: WiFi_AP(); / / eigenen Access Point aufbauen 5: serverSetup(); / / Server initialisieren 6: } 7: 8: void loop() { / / Endlosschleife Messdatenerfassung 9: poolUpdate(); / / Pool aktualisieren 10: poolDisplay(); / / Anzeige erfolgt jetzt auch im Browser 11: poolAlarm(); / / Alarmüberprüfung 12: for (int i=0; i<500; i++) { 13: server.handleClient(); / / ggf. web client abarbeiten 14: delay(10); 15: } / / nach 5 s geht es weiter 16: } Nach Initialisierung des Servers bleibt der Aufbau der Datenerfassungsschleife erhalten. Hinzu kommt lediglich die Bearbeitung eventuell eintreffender Client-Anfragen. Statt 5 Sekunden Zykluszeit an einem Stück zu warten, teilen wir diese Zeit in kleine Abschnitte und bedienen etwaige Anfragen damit sofort. Zum Test der Funktionalität kann sich ein beliebiger WLAN- Client in das aufgespannte Netzwerk "InfoIng" einwählen. Ist das erfolgt, so wird unser Server durch Angabe der IP-Adresse 192.168.4.1 im Browser des Clients erreicht: Abb. 130: Ausgabe Web-Server <?page no="310"?> 10.4 Thingspeak Web-Client 311 http: / / www.uvk-lucius.de/ informatik-ing Vorteil der vollständigen Realisierung des Servers auf unserer Hardware ist die damit verbundene Gewährleistung der Datenintegrität. Ein Nachteil ist allerdings die notwendige Verfügbarkeit der Applikation „rund um die Uhr“. Ein Szenario, welches sich bei später batteriebetriebenen Geräten aufgrund des Energiebedarfs eigentlich verbietet. Besser wäre eine Strategie, bei der sich das Gerät die meiste Zeit im Power-Down befindet. In Abhängigkeit von der Abtastperiode wird das Gerät geweckt, erfasst die Daten, schickt diese dann an einen Server im Internet und geht anschließend sofort wieder in den Ruhezustand. 10.4 Thingspeak Web-Client Zur Umsetzung wird statt des eigenen Servers ein Web-Client und als externer Kommunikationspartner ein hochverfügbarer Internetserver benötigt. Ein verbreiteter kostenloser Dienst, der diese Funktionalität für das Internet der Dinge anbietet, ist thingspeak.com. Zur Nutzung muss dort als erstes ein Account eingerichtet werden. Dazu werden für die vier Kanäle unserer Messdatenerfassung entsprechende Felder eines Thingspeak-Channels konfiguriert. Anschließend unbedingt den Write- API-Key des Channels notieren. Über diesen API-Key (API, Application Programming Interface) identifizieren wir den Thingspeak-Channel und sorgen dafür, dass nur autorisierte Nutzer (mit Kenntnis des Keys) Daten dort ablegen dürfen. Der lesende Zugriff zur Visualisierung kann jedoch durch Setzen des „Make Public“-Flags für Jedermann freigegeben werden. Nach erfolgreicher Konfiguration können die Daten mittels einfacher HTTP-GET Nachricht in der Datenbank des Servers abgelegt werden. Zum Test lässt sich diese GET-Nachricht von jedem Webbrowser aus generieren. Dazu im Browser die URL http: / / api.thingspeak.com/ update? api_key=D27I5FKEZSSGWIXU&field1=3.45 aufrufen, wobei der API-Key an den eigenen Kanal angepasst werden muss. Der Server (host) übernimmt die Daten (hier 3.45 für das erste Feld) und antwortet mit der laufenden Nummer des aktuellen Eintrags in seiner Datenbank. <?page no="311"?> 312 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing Abb. 131: Thingspeak-Konfiguration Bei unserem Messdatenerfassungssystem erledigt die folgende httpGET() Funktion die Abarbeitung der Anfrage: 1: int httpGET(String host, String cmd, String &antwort) { 2: WiFiClient client; / / Erstelle Client 3: String text = "GET http: / / " + host + cmd + "\r\n HTTP/ 1.1\r\n"; 4: text = text + "Host: " + host +"\r\n"; / / GET zusammenbauen 5: int ok = client.connect(host.c_str(),80); / / Connect, PORT 80 6: if (ok) { / / Connect erfolgreich 7: client.print(text); / / Kommando absetzen 8: for (int tout=1000; tout>0 && client.available()==0; tout--) 9: delay(10); / / warte 10 s auf Antwort 10: if (client.available() > 0) / / Antwort da 11: while (client.available()) / / Antwort auslesen 12: antwort = antwort + client.readStringUntil('\r'); 13: else ok = 0; / / keine Antwort, timeout 14: client.stop(); / / Kommunikation beenden 15: } 16: return ok; 17: } Nach erfolgreichem Verbindungsaufbau (Zeile 5+6) wird die Nachricht gesendet (Zeile 7) und im Timeout auf die vom Server zurückgelieferte Antwort gewartet (Zeile 8-12). Um die GET-Funktion möglichst flexibel zu gestalten, wird die Antwort direkt an den aufrufenden Programmteil zurückgeliefert. Dies ist eine sinnvolle Anwendung für den „call by reference“-Ansatz zur Parameterübergabe an Funktionen. Die aufrufende Funktion (hier thingspeakClient()) stellt einen String-Platzhalter für die generierte Antwort bereit (Zeile 3 in thingspeakClient()) und <?page no="312"?> 10.4 Thingspeak Web-Client 313 http: / / www.uvk-lucius.de/ informatik-ing bekommt diesen von der httpGET() Funktion gefüllt. Die spezifische Auswertung erfolgt also im aufrufenden Programm. 1: int thingspeakClient() { 2: int ok = 0; 3: String antwort; / / Platzhalter für Antwort (call by reference) 4: String host = "api.thingspeak.com"; / / host 5: String cmd = "/ update? api_key=D27I5FKEZSSGWIXU"; / / Key anpassen 6: for(int n=0; n<CHAN; n++) / / Zusammenbau des Kommandos alle Kanäle 7: cmd = cmd + "&field" + String((n+1)) + "=" + 8: String(pool[n].val.phys); 9: ok = httpGET(host,cmd,antwort); / / http-GET, warte auf Antwort 10: #if DEBUG >= 1 / / nur zur Debug-Zwecken 11: Serial.print("\nAntwort: "); Serial.print(antwort); 12: #endif 13: return ok; 14: } Zur Ablage der Messdaten im Thingspeak-Channel wird die GET-Funktion mit dem entsprechenden API-Kommando versorgt. Hierzu müssen der API-Key angepasst (Zeile 5) und die aktuellen Messwerte aus dem globalen Datenpool in den entsprechen Stellen eingesetzt werden (Zeile 6-8). Um den Code nicht unnötig zu verkomplizieren, verzichten wir auf die Auswertung der Antwort des Thingspeak-Servers und gehen davon aus, dass der Eintrag bei einem erfolgreichen Verbindungsaufbau auch ordnungsgemäß in der Datenbank abgelegt wurde. Zur visuellen Verifikation der Antwort enthält das obige Listing mit #if DEBUG >= 1 … #endif einen Präprozessorbefehl zur bedingten Übersetzung. Nur wenn im Kopf des Programmes ein Textmakro #define DEBUG 1 vereinbart wurde, übersetzt der Compiler die zwischen der #if und dem #endif liegenden Codezeilen. Dies ist eine allgemein übliche Vorgehensweise zum Test von Programmteilen. Ist der Code getestet, werden später mit #define DEBUG 0 die Testzeilen beim Übersetzen des Produktiv-Codes ausgelassen und belegen demzufolge keinerlei Ressourcen. Im Fehlerfall lässt sich die Testausgabe dagegen leicht wieder aktivieren. <?page no="313"?> 314 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing 10.4.1 Internet Zugang WLAN (Station Mode) Für den Zugriff auf den Thingspeak-Server ist natürlich eine erfolgreiche Anmeldung an einem bestehenden Internet-Access- Point notwendig. Dazu wird unser WLAN jetzt im Station- Mode betrieben: 1: #define STA_SSID "InfoIng" / / SSID angeben 2: #define STA_PASS "InfoIng" / / Passwort eingeben 3: void WiFi_STA() { / / Station-Mode 4: WiFi.begin(STA_SSID, STA_PASS); / / Anmelden 5: Serial.print("\nWait for WiFi-AccessPoint "); 6: while(WiFi.status()! =WL_CONNECTED){ / / Warte auf Anmeldung 7: Serial.print("."); 8: delay(500); 9: } 10: Serial.print("WiFi connected \n"); 11: } Diese Funktion wartet auf erfolgreiche Anmeldung am bestehenden Access-Point. Essentiell dafür ist die Anpassung der SSID und des Passwortes an die eigene Netzwerkinfrastruktur. Zur Realisierung des Thingspeak-Clients ergibt damit sich schließlich folgender Aufbau: 12: void setup(void) { / / Initialisierung 13: Serial.begin(9600); 14: poolSetup(); / / Initialisierung Datenpool 15: WiFi_STA(); / / Warte bis Internetzugang vorhanden 16: } 17: 18: void loop() { / / Endlosschleife Messdatenerfassung 19: poolUpdate(); / / Messdaten einlesen und umrechnen 20: poolDisplay(); / / aufs Display ausgeben 21: poolAlarm(); / / Alarmüberwachung 22: if (thingspeakClient()) { / / Übertrage Daten an Thingspeak 23: delay(15000); / / in 15 Sekunden nächstes update 24: } else { 25: Serial.print("Connecting failed, try again soon..."); 26: delay(1000); / / versuche es gleich noch einmal 27: } 28: } In der Praxis würde die Wartezeit im Tiefschlaf des Controllers erfolgen und nur einen Strom von wenigen µA erfordern. Der weitaus größte Energiebedarf entsteht beim WLAN-Zugang. Deshalb könnte eine verbesserte Programmvariante erst eine bestimmte Anzahl Messwerte in einem Puffer sammeln, sich erst dann am WLAN anmelden und alle Informationen in <?page no="314"?> 10.4 Thingspeak Web-Client 315 http: / / www.uvk-lucius.de/ informatik-ing einem Rutsch übertragen. Damit ist eine energieeffiziente Messdatenübertragung und Speicherung realisierbar. Die Daten können jederzeit und jederorts über das Internet abgerufen werden. Hierzu bietet thingspeak.com eine einfache Visualisierung per Webbrowser und die Möglichkeit, weitere Animationen zu erstellen oder die Daten zu exportieren: Abb. 132: Thingspeak Ausgabe der Messwerte 10.4.2 Sichere Verbindung mit HTTPS-Protokoll Um zu verhindern, dass Zwischenstationen auf dem Weg durch das Internet die vielleicht vertraulichen Sensorinformationen mitlesen bzw. manipulieren können, bedarf es neben dem WPA2verschlüsselten WLAN auch einer gesicherten Verbindung zum Thingspeak-Server. Hier bietet sich das bereits kennengelernte HTTPS-Protokoll auf Port 443 an. Dazu muss unsere http- GET()-Funktion um eine Verifikation des sogenannten SHA1- Fingerprints der Server-Site erweitert werden (Zeile 7). Dieser weist die Gegenstelle als zertifizierten Thingspeak-Server aus. Den individuellen SHA1-Schlüssel des Servers besorgt man sich am einfachsten über den Web-Browser am PC. <?page no="315"?> 316 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing 1: int httpsGET(String host,String cmd, String &antwort,String sha1){ 2: WiFiClientSecure client; / / Erstelle Client 3: String text = "GET https: / / " + host + cmd + "\r\n HTTP/ 1.1\r\n"; 4: text = text + "Host: " + host + "\r\n"; 5: int ok = client.connect(host.c_str(),443); / / Connect PORT 443 6: if (ok) { 7: ok = client.verify(fingerprint.c_str(), host.c_str()); 8: / / Zertifikat ok, der Rest läuft wie bei HTTP-GET… 9: } 10.4.3 Reaktionen: Tweets auslösen Nachdem die Daten auf dem Thingspeak-Server in der Cloud verfügbar sind, kann die weitere Intelligenz dorthin ausgelagert werden. Thingspeak bietet z.B. die komfortable Möglichkeit einer aufwändigen Messdatenverarbeitung mittels MATLAB ® - Skripten. Alternativ dazu besteht die Möglichkeit, einfache Aktionen der Form „wenn…dann“ auszulösen. In unserer Applikation eignet sich das unter Apps->React zu findende Tool ideal dazu, um z.B. eine Heizungsüberwachung bei Abwesenheit zu konfigurieren. Thingspeak meldet eine Grenzunterschreitung der Temperatur im verwaisten Eigenheim per Twitter-Message überall in die Welt. Abb. 133: Auslösen eines Tweets mittels React-App <?page no="316"?> 10.5 Zugriff auf aktuelle Wetterdaten 317 http: / / www.uvk-lucius.de/ informatik-ing 10.5 Zugriff auf aktuelle Wetterdaten Bei der Thingspeak-Anwendung haben wir die httpGET() Funktion zur Speicherung von Messdaten in der Cloud genutzt. Natürlich lassen sich umgekehrt auch Messdaten oder Steuerinformationen aus dem Internet für unsere IoT-Anwendung nutzen. Exemplarisch sei hier der Zugriff auf aktuelle Wetterinformationen des Anbieters yahoo.com dargestellt. Die API- Schnittstelle sieht auch hier ein HTTP-GET vor. Abb. 134: Kommunikation yahoo Wetterabfrage Als Antwort liefert der Dienst einen XML-Text mit Windrichtung und Geschwindigkeit für den gewünschten Standort. Zur Standortkennung (hier Berlin) dient eine weltweite Identifikationsnummer in der Anfrage (WOEID, Where On Earth Identifier). Die in der Antwort enthaltende Information läßt sich dank der komfortablen Arduino String-Befehle einfach aus dem XML-Text extrahieren. 1: float parseSensorInfo(String xml,String suchtext) { 2: float val = 0./ 0.; / / Rückgabewert NaN 3: String valStr; / / Hilfsstring 4: int start, ende; / / Index im Text 5: suchtext = suchtext+'='+'"'; / / Suchtext 6: start = xml.indexOf(suchtext); / / Suche Text 7: delay(10); 8: if (start > 0) { / / Item gefunden 9: start = start + suchtext.length(); / / hinter Item kommt Zahl 10: ende = xml.indexOf('"',start); / / Ende der Zahl 11: valStr = xml.substring(start,ende); / / Zahltext 12: val = valStr.toFloat(); / / Text in Float 13: } else / / Item nicht gefunden 14: Serial.print("error no such item: "+suchtext); <query yahoo: count="1" yahoo: created="2016-06-29T06: 53: 34Z„ yahoo: lang="de"> <results> <channel> <yweather: wind chill="61" direction="145" speed="7"/ > </ channel> </ results> </ query> gesuchte Windgeschwindigkeit http: / / query.yahooapis.com/ / v1/ public/ yql? q=select wind from weather.forecast where woeid=638242 Anfrage (HTTP-GET) Antwort (XML-Text) <?page no="317"?> 318 10 Anwendung: Internet der Dinge http: / / www.uvk-lucius.de/ informatik-ing 15: return val; 16: } Hierzu wird in Zeile 6 das erste Vorkommen des gesuchten Textes (z.B. speed=") ermittelt. Direkt hinter diesem Suchtext beginnt die eigentlich interessante Information, nämlich die Windgeschwindigkeit. Diese wird in Zeile 11 aus dem XML- Text herauskopiert und in den gewünschte float-Darstellung gewandelt (Zeile 12). Damit ist unsere kleine Wetterabfrage abgeschlossen und kann z.B. kontinuierlich in der loop() ausgegeben werden. 17: String host = "query.yahooapis.com"; 18: String cmd ="/ v1/ public/ yql? 19: q=select%20wind%20from%20weather.forecast%20where%20woeid=638242"; 20: String antwort; / / Platzhalter für Antwort) 21: int ok = httpGET(host,cmd,antwort); / / Antwort per reference 22: Serial.println(parseSensorInfo(antwort,"speed")); 23: Serial.println(parseSensorInfo(antwort,"direction")); 24: Serial.println(parseSensorInfo(antwort,"chill")); Antwort: 7.00 145.00 61.00 Durch Anpassung der bereits in Kapitel 10.1.3 beschriebenen poolUpdate() Funktion ließen sich die aus dem Internet bezogenen Informationen aber auch in einem eigenen Kanal unserer Messdatenverarbeitung speichern und vielleicht zur Steuerung externer Komponenten nutzen (z.B. Markise im Eigenheim bei Windgefahr einfahren). Die Bearbeitung langer xml-Antworten erfordert auf der Arduino-Plattform vergleichsweise viel Rechenzeit. In dieser Zeit kann das System nicht auf externe Anforderungen des WLAN- Protokolls reagieren, was letztendlich zum Systemcrash führen kann. Unser ESP8266 besitzt nämlich einen internen Watchdog-Timer (Zähler), der nach einer bestimmten Zeit ohne Aufruf der Netzwerkfiunktionen einen automatischen Reset auslöst. Abhilfe schaffen eingestreute delay(10) Anweisungen, innerhalb derer die Netzwerkfunktionalität bedient wird. Außerdem sollte bei derartigen Problemen die Geschwindigkeit der seriellen Ausgabe auf 115200 Baud erhöht werden. <?page no="318"?> 10.5 Zugriff auf aktuelle Wetterdaten 319 Als Fazit bildet die Hardware aus ESP8266, LED, LDR und DHT-Sensor einen wirklichen low-cost-Einstieg in die Welt des Internets der Dinge. Denkbare Anwendungen wären z.B. die Überwachung von Fensterstellungen (Reed-Kontakt), Temperatur und Beleuchtung im häuslichen Umfeld oder der Einsatz als Wetterstation beim Umwelt-Monitoring oder bei der Bewässerung des eigenen Gartens. Da sich beliebige weitere Sensoren schnell integrieren lassen, sind der eigenen Phantasie keine Grenzen gesetzt. 29, 30, 31 29 https: / / www.hackster.io/ esp/ products/ esp8266-esp-01 30 https: / / hackaday.io/ projects/ tag/ ESP8266 31 http: / / www.notey.com/ blogs/ esp8266 <?page no="320"?> http: / / www.uvk-lucius.de/ informatik-ing Index A Abtasttheorem 110 ADC 107 Addier-/ Subtrahierwerk 72 Adressbus 50 Adressierungsarten 88 Algorithmus 30, 141 Amdahlsches Gesetz 100 Analog-Digital-Wandler 107 Anforderungsspezifikation 136 Angewandte Informatik 26, 27 Anonymisierung 297 Anti-Aliasing-Filter 61 Anwendungsschicht 232 Anwendungssoftware 118 Arbitrierung 91 astabile Kippstufe 74 asynchrone Kommunikation 112 Ausnahmebehandlung 90 Aussagenlogik 44 Authentifizierung 290 Autorisierung 290 B Batch processing 124 Baudrate 113 Beacons 246 Befehlsblock 174 Befehlssatzarchitektur 97 Benchmark 94 benutzerdefinierte Bezeichner 174 Betriebssysteme 122 Bibliothekskataloge 280 Bildersuchmaschinen 273 bistabile Kippstufe 75 Bitcoins 85 Blog 259 Bluetooth ® 245 Boolesche Algebra 44 Bottom-Up Entwurf 162 Branch Prediction 96 Broadcast 241, 246 Browser 250 BSI-Gesetz 284 Bus-Topologie 229 C Cache 91 call by reference 205 <?page no="321"?> 322 Index http: / / www.uvk-lucius.de/ informatik-ing call by value 205 CAN-Bus 241 Carry 69 Cascading Style Sheets CSS 253 CGI-Programmierung 256 CISC 97 Client 233 Client/ Server-Prinzip 233 COM-Ports 113 Common Gateway Interface 256 Compiler 157 Complex Programmable Logic Device, CPLD 70 84 Computer Aided Design (CAD) 121 Computer Aided Manufacturing (CAM) 121 Content Management System 258 CPLD 70, 84 CPU 49 Crawler 267 CRC 113 CSMA/ CD 238 D DAC 105 Dateitransferdienste 263 Dateiverwaltung 129 Datenbus 50 Datenrichtungs-Register 105 Datenschutz 286 Datenverarbeitungssystem 30 De Morgansche Regel 68 Deep Web 273 define 213 Denial of Service 284, 288 Determinismus 142 Dezimalsystem 33 D-Flipflop 78 Dialogverarbeitung 124 Digital Input 104 Digital Object Identifier 275 Digital-Analog-Wandlung 105 Digitale Bibliothek 275 Direct Memory Access, DMA 91 Disjunktion 45 disjunktive Normalform (DNF) 68 Document Type Definition (DTD) 255 Domain Name Service 263 Drahtlosnetz 243 DRAM-Speicher 61 <?page no="322"?> Index 323 http: / / www.uvk-lucius.de/ informatik-ing Dualsystem 33 Durchlassbetrieb 62 duty-cycle 107 Dynamic Host Configuration Protocol, DHCP 237 E Echtzeitverarbeitung 93 EEPROM 51 Eingebettete Systeme (Embedded Systems) 54, 122 elektrische Leistung 56 elektrischer Strom 56 eMail-Dienste 261 embedded system 54, 122 Emergency call 248 Energie 56 Energy Harvesting 245 EnOcean ® 245 Ethernet 238 EVA-Prinzip 31 evolutionäres Software- Engineering 135 Extended Markup Language (XML) 254 F FCFS 128 Feldbus 227 Feldbussysteme 239 Field Programmable Gate Arrays, FPGA 70 Firewall 293 float 195 FLOPS 94 Flussdiagramme 151 Flussspannung 62 Flynn 101 FPGA 84 Funktionen 161 G Gateway 244, 246 Geographische Informationssysteme (GIS) 122 Gleitpunktdarstellung 40 Grafikprozessor, GPU 100 H Halbaddierer 68 Halbleiterdioden 62 Hardware 30, 118, 131 Hardwarebeschreibungssprachen 83 Hardware-Virtualisierung 132 Harvard-Architektur 93 Hazards 96 Hexadezimalsystem 36 High-Performance Computing 52 <?page no="323"?> 324 Index http: / / www.uvk-lucius.de/ informatik-ing HTML 253, 257 HTTP (Hypertext Transfer Protocol) 233, 252, 253, 257 HTTP-Tunneling 294 Hypertext Markup Language 253, 257 Hypertext Transfer Protocol (HTTP) 233, 252, 253, 257 Hyper-Threading 99 Hypervisor 132 I Implementierung 134 Individualsoftware 120 Industrie 4.0 25, 54 Information Retrieval 265 Informationsqualität 274 Infrastrukturmodus 246 Inkarnation 208 In-Order Execution 96 Integrität 289, 291 Interactive Mail Access Protocol 262 Interfacetechnik 102 Internet of Things, IoT 54 Internetprotokoll 232 Interpreter 157 Interrupt 89 Interrupt-Service-Routine 90 Interruptsignale 50 Intranet 249 IP-Adresse 236 IPv4 236 IT-Grundschutz 286 IT-Sicherheit 283 IT-Sicherheitskonzept 290 J Java 132 JavaScript 257 K Kalibrierung 302 Kapazität 61 kernel 126 Kernspannung 60 Kirchhoffsche Regeln 57 Knotenregel 58 Kommentarzeichen 174 Komplexität 147 Kondensatoren 60 Konjunktion 45 L Lastenheft 136 Leckstrom 59 Leckströme 64 LED 62 LIFO-Prinzip 90 Light Dependent Resistor, LDR 59 <?page no="324"?> Index 325 http: / / www.uvk-lucius.de/ informatik-ing Local Area Network, LAN 238 logische Ausdrücke 187 logische Fehler 178 logische Grundfunktionen 44 M M2M 248, 307 Maschenregel 58 Maschinencode 85 Maschinensprachen 131 Mehrbenutzerbetrieb 125 Mehrkernprozessoren 99 Mehrprogrammbetrieb 125 Mehrprozessorbetrieb 125 Memory-Mapped I/ O 89, 103 Meta-Suchmaschinen 269 Mikrocontroller 54 MIMD 101 MIME-Codierung 262 Minterm 68 MISD 101 Mobilfunk-Netz 247 Moore-Automat 82 Multiprocessing 125 Multitasking 123, 125 Multitasking Betriebssysteme 99 Multivibrator 74 N Negation 46 negative Logik 55 Netzwerk 227 Netzwerkprotokolle 230 NTC 59 O objektorientierte Programmierung 163 Onion-Routing 298 OSI-Referenzmodell 230 Out-Of-Order Execution (OOO) 97 P Parallelverarbeitung 100 Parity 113 Patch-Management 290 Pflichtenheft 137 Phasenmodell 134 Phishing 284 Pipeline-Verarbeitung 95 Polling 89 Port-Nummern 235 positive Logik 55 Post Office Protocol (POP) 233 Power-Management 56, 60 PPS 121 Präprozessorbefehl 213, 316 <?page no="325"?> 326 Index http: / / www.uvk-lucius.de/ informatik-ing Produktionsplanung 121 Programmcounter, PC 74, 86 Projektmanagement 120 Proxy 234, 297 Prozeduren 161, 199 Prozessleitsysteme (PLS) 52 Prozessverwaltung 126, 127 Pulsweitenmodulation (PWM) 107 Punkt-zu-Punkt 228 Q Query Prozessor 270 R Radio Frequency Identification 244 Rapid Prototyping 135 räumliche Lokalität 92 RC-Glied 61 Rechencluster 52 Refresh 61 Register 104 Rekursion 208 Rekursionsanker 209 Remote Login 263 Responsive Design 259 return 201 RFID-Tag 244 Ring-Topologie 229 Ripple-Carry Volladdierer 72 RISC 97 Risikoanalyse 292 ROM-Speicher 51 Round Robin Scheduling 128 Router 237 Routing 229, 237 RS-232 114 RS-Flipflop 76 RSS-Newsfeed 260 RxD 112 S Sample & Hold 108 SCADA 52 Schaltnetz 65 Schaltwerk 65, 74 Scheduler 127 Scheduling 96 Schlagwörter 275 Semantik 161 semantisches Web 258 Sensory Malware 284, 299 Seriell/ Parallel-Wandlung 78 Server 233 SHA1-Fingerprints 319 <?page no="326"?> Index 327 http: / / www.uvk-lucius.de/ informatik-ing Shortest Job First (SJF) 128 Sicherheitsniveau 286 SIMD 101 Simple Mail Transfer (SMTP) 233 Simple Mail Transfer Protocol 262 SISD 101 Skriptsprachen 256 Smart-Home 54 SoC 52 Software Engineering 27, 133 Software-Qualität 138 Sollkonzept 137 Speedup 96 Speicher 51 speicherprogrammierbare Steuerungen (SPS) 52 Speicherverwaltung 126 Sperrbetrieb 62 Spiralmodell 135 Spoofing 284 SRAM 75 Stack 90, 210 Stapelspeicher 90 Stapelverarbeitung 124 Stern-Topologie 228 Steuerbus 50 Steuerzeichen 181 Streaming-Dienste 263 Struktogramm 153 strukturierte Programmierung 161 Subroutinen 199 Suchmaschine 268 sukzessive Approximation 108 Superpipeline 96 superskalare Architektur 96 Switches 228 Syntax 160 Syntaxfehler 177 Systembus 50 Systemsoftware 122 T Task 98 TCP/ IP 249 TCP/ IP-Referenzmodell 232 Teletype-Network Protokoll (TelNet) 233 T-Flipflop 79 Thread 98 Time-Sharing-Verfahren 125 Top-Down-Entwurf 162 Topologie 228 <?page no="327"?> 328 Index Transaction processing 124 Transistor 63 Transmission Control Protocol (TCP) 236 Transmitter 244 Transponder 244 Twitter 319 TxD 112 U UART-Baustein 114 unidirektional 112 Unterprogramme 199 URL (Uniform Resource Locator) 234, 250 User Datagram Protocol (UDP) 236 User Generated Content 258 V V.24 114 Vertraulichkeit 289, 291 Very Long Instruction Word, VLIW 97 VHDL 83 virtuelle Maschinen 131 Voice over IP 263 Volladdierer 71 vollduplex 112 vollvermaschtes Netz 229 VPN-Dienste 298 W Wahrheitsfunktionen 45 Wahrheitstabellen 45 Wasserfallmodell 134 Web 2.0 258, 265 Web 3.0 258 Webarchivierung 261 Weblog 259 Weblog Publishing System 259 Widerstand 58 WiFi-Netz 245 Wikis 260 Wireless-Access-Point (WAP) 246 wissenschaftliche Suchmaschinen 280 WLAN 245 Wortbreite 50 WPAN-Systeme 244 X XML 253 XOR 66 Z Zähler 80 zeitliche Lokalität 92 Zell-Topologie 229 Zigbee ® 245 Zustandsautomat 81 <?page no="328"?> Notizen <?page no="329"?> www.uvk.de Ein Buch, das niemanden mehr ruhig schlafen lässt. Schöne neue Welt? Die Datensammelwut der Internetgiganten ist kein Geheimnis - und aufgrund dieser Datenbasis und neuer digitaler Produkte wie Haustechnik, Autoelektronik, Drohnen, digitaler Währungen etc. dringt die New Economy immer weiter in alle Systeme ein. Doch wie sieht eine Welt aus, in der Google, Facebook & Co. als gigantische globale Monopole agieren? Regieren sie längst die Welt? Arno Rolf und Arno Sagawe beschreiben den Weg in die digitale Welt - in die smarte Gesellschaft - und untersuchen auf spannende Weise, ob die digitale Transformation und stabile Gesellschaften überhaupt miteinander vereinbar sind. Arno Rolf, Arno Sagawe Des Googles Kern und andere Spinnennetze Die Architektur der digitalen Gesellschaft 2015, 278 Seiten, flex. Einb. ISBN 978-3-86764-590-4 <?page no="330"?> Notizen <?page no="332"?> Notizen <?page no="333"?> www.uvk-lucius.de/ schritt-fuer-schritt Keine Angst vor Excel Wer an Excel denkt, denkt oft an komplizierte Tabellen, Formeln und Funktionen. Viele schrecken davor zurück. Doch jeder Student der Wirtschaftswissenschaften wird sich im Laufe seines Studiums mit Excel auseinandersetzen müssen - sei es im Rahmen von Seminarbzw. Bachelorarbeiten oder im Praktikum. Dieses Buch im Großformat trainiert die wichtigsten Grund- und Spezialfunktionen sowie die Darstellung von Graphiken. Zahlreiche Abbildungen, Merksätze und Beispiele helfen dabei sich in den Menüs zurechtzufinden. Durch Übungsaufgaben mit Lösungen sehen die Leser, wie mit Excel effektiv gearbeitet werden kann. Am Ende der Lernabschnitte haben sie die Gelegenheit ihr neues Wissen anzuwenden: Anhand einer Investitionsrechnung aus dem Grundstudium entwickeln sie selbstständig eine komplexe Excel-Lösung. Zur Überprüfung stehen Musterlösungen mit einer Schritt-für-Schritt- Anleitung zur Verfügung. Sebastian Prexl Excel für BWLer Schritt für Schritt Arbeitsbuch 2016, 200 Seiten, Broschur ISBN 978-3-8252-8640-8 € (D) 24,99 <?page no="334"?> Notizen <?page no="335"?> Jens Starke-Wuschko Präsentieren im Studium 2014, 126 Seiten flexibler Einband ISBN 978-3-8252-4215-2 € (D) 9,99 www.uvk-lucius.de/ praesentieren Übung macht den Meister