Compiler Optimierung

Für schnelle Lösungen und „mal eben zeigen“ in Workshops und Schulungen verwende ich schnell die unbedachte Kompilierung von Quellcode mit GCC, G++, COBC oder NASM. Das sollte man sich in größeren Projekten abgewöhnen. Compiler Option sind mächtig und bringen viel (Link).

Nehmen wir den berühmten „Hello World“ Code als Beispiel (Link). In C und C++ innerhalb der Funktion „main“ ein simples printf bzw. std::out und in COBOL, in der „Procedure Division“, ein „DISPLAY“. Übersetzen wir alle Sources in Assembler und erzeugen ein ausführbares Programm.

Liste der erzeugten Code

Ohne Optimierung fällt einiges auf. „helloc“ und „test-03.s“ sind die Produkte aus dem C Source Code. Das daraus generierte Assembler ist 8,2k gross. Das Assembler aus dem C++ Code wiegt 18k und 41k bringt das Assembler aus dem COBOL Source auf die Speicher-Waage. Fertig kompiliert sind alle drei ausführbaren Programme 22k bzw. 23k groß.

Schreiben wir „Hello World“ einmal in Assembler

Assembler

und übersetzen, verlinken es mittels „nasm -felf64 helloa.asm && ld -o helloa helloa.o“

Kompilierung des Assemblercode

Wir sehen, da ist wahnsinniges Optmierungspotential. 352 Byte Quellcode und 4,8k für das ausführbare Programm. Ohne genaue Kenntnisse über den Compiler würde man in realen Projekten unter gehen – wir reden da durchaus über Mega- oder Giga-Byte die so verschwendet und zu einem Bottleneck in der Prozessierung werden kann.

Keep on Coding

Automationstechnik in Faktura

Sehr viel Spass hatte ich an einem Projekt, in dem ich eine betriebswirtschaftliche Anwendung entwickelte, diese auch Meßwerte auslesen und Maschinen steuern

8085 Assembler
8085 Assembler

soll. Vorher hatte ich nur im Labor Kontakt mit der Steuerungsprogrammierung und das geschah seiner Zeit mit der Programmiersprache Assembler ( üblicher Prozessor war der 8085 ). Heute benutze ich Phyton, Cobol, Basic oder Pascal – Assembler, C oder Fortran ist mir zu technisch und wende ich nur für systemnahe oder zeitkritische Programme an. In dem besonderen Fall, im Zusammenspiel von Linux-Server und SPS Anlage, war C die Programmiersprache der Wahl. Ich fand mich mit der Siemens S5 SPS Anlage schnell zurecht und bediente mich der OpenSource Bibliothek LIBNODAVE.

Das Programm ist einfach zu kompilieren und funktioniert sehr zuverlässig. In meiner Anwendung, werden die Anforderungen zur Meßwerterfassung und Schaltbefehle in einer SQL Datenbank gesammelt – als chronologischen Dienst sorgt das in C geschriebene Programm für die Umsetzung. Angesteuert wird die S5 über die serielle Schnittstelle ( /dev/ttyS0 ).

Schwierig war, das in der Simatic S5, Zähler ( in dem Fall Verbrauchsmesser ) mit unterschiedlichen Faktoren eingebaut werden konnten. So hat ein

( dc = daveNewConnection(di,plcMPI,0,0); )
/* Deklarationen lasse ich hier mal weg */
Ergebnis = daveReadS5Bytes(dc, daveDB, atoi(DBNr),atoi(WasserDW), 2);

Programmierung in C
Programmierung in C

Zaehler = daveGetU16(dc);

nicht zwingend auf jeder DBNr das gleiche Zahlenverhältnis ( Verhältnisfaktor 1, 10 oder 100 zum Zähler) auch wenn die Art identisch ist. In der Programmierung musste dann auch der Typ des S5 Moduls berücksichtigt werden und das Meßergebnis durch

fZaehler = (float) Zaehler * atof(Faktor);

korrigiert werden. Unproblematisch hingegen das schreiben, also das Ein/Aus schalten von Relais, mit daveWriteS5Bytes(dc, daveDB, 4, 2, 2, &a);.