Codesys
Neues vom Profiler
Ob regelmäßig, prophylaktisch oder sporadisch bei Bedarf ausgeführt: Untersucht man die Laufzeit seines IEC-61131-3-Projektes mit einem Profiler als Zusatztool, so ist der Aufwand dafür minimal, der Nutzen aber beträchtlich. Ein Plädoyer für diese Kategorie der Software-Tools.
Wer bei einem ‚Profiler‘ an Krimis denkt, ist auf der richtigen Spur: Solche Fallanalytiker suchen anhand von verfügbaren Fakten gezielt nach möglichen Mustern, um (Kriminal-)Fälle aufzuklären. In der Informatik sind Profiler ebenfalls zu finden. Gemeint sind Hilfswerkzeuge für die Programmierung. Vergleichbar zur Polizeiarbeit analysieren diese Werkzeuge die Fakten, konkret das Laufzeitverhalten von Software. Das Ziel: Aufdecken von Problembereichen, die zur Verlangsamung der Abarbeitung führen, Optimierung des Quellcodes durch strukturelle und algorithmische Verbesserungen sowie letztlich eine beschleunigte Code-Ausführung
„Ich messe erst, wenn Probleme auftreten!“ Viele SPS-Programmierer denken so. Treten keine Probleme auf, dann haben sie alles richtig gemacht. Schließlich kostet das prophylaktische Messen des Laufzeitverhaltens wertvolle Engineeringzeit, wenn es mit Bordmitteln durchgeführt wird: Dazu gilt es manuell im Quellcode vor dem Start und nach dem Ende des zu messenden Applikationsteils Zeitstempel zu setzen und deren Differenz zu berechnen. Vergleichbar zur Funktion LTIME im IEC-61131-3-Tool Codesys bieten die meisten SPS-Programmiertools eine hochauflösende Timerfunktion, um die Echtzeituhr der Steuerung mit µs- oder sogar ns-Auflösung auszulesen. Eine einfache Subtraktion und ein wenig zusätzlicher Programmcode, schon lassen sich Laufzeit sowie statistische Auswertungen der ausgeführten Routine ermitteln.
Wann sind Laufzeitmessungen erforderlich?
Generell sind Laufzeitmessungen nur erforderlich, wenn Probleme auftreten. Solche Probleme können sich dadurch bemerkbar machen, dass die reale Zykluszeit der SPS-Applikation und damit die Reaktionszeit auf ein Ereignis während des Projektverlaufs sprunghaft ansteigt. Grund dafür kann eine oft ausgeführte Schleife sein, die unnötige Abfragen enthält oder auf asynchrone Ereignisse wartet. Oder der Applikateur merkt, dass die ursprünglich vorgesehene Steuerung für das Projekt zu leistungsschwach ist, weil hinzugekommene Optionen deren Leistungsreserven aufgebraucht haben. Dann ist schnelle Reaktion gefragt.
Mit Laufzeitmessungen auf dem Zielsystem kommt der Programmierer den Ursachen auf die Spur: Er nimmt sich nach und nach verdächtige Programmbausteine vor und versucht die Ursache einzugrenzen. Hat er sie gefunden, dann muss er sie beseitigen. Je nach Ursache kann er Code optimieren, Applikationsteile auslagern oder sogar eine leistungsstärkere Steuerung verbauen. Tritt ein derartiger Zwischenfall kurz vor der Inbetriebnahme, währenddessen oder sogar erst im Produktivbetrieb einer Maschine oder Anlage auf, dann ist das für jeden Applikationsprogrammierer ein Super-GAU. Wären potenzielle Ursachen rechtzeitig identifiziert worden, dann wäre ein Notfalleinsatz jetzt gar nicht nötig. Zumindest ließen sich erforderliche Maßnahmen mit Bedacht treffen.
Ob vorab oder in einer Akut-Situation, die beschriebene Methode durch manuelle ‚Injektion‘ von zusätzlichem Code für die Messung ist in jedem Fall lästig, insbesondere dann, wenn der Code an mehreren Stellen im Projekt untergebracht werden muss. Schließlich muss der Code nach der Messung auch wieder entfernt werden, denn für den Betrieb ist er nicht mehr nötig. Er verbraucht ja einen Teil der verfügbaren Leistung.
Automatische Instrumentierung durch Zusatztools
In der Übersicht und im Detail: Der Profiler zeigt genau, welcher Code tatsächlich ausgeführt wurde.
© CodesysWerden die Messungen dagegen mit Zusatztools per Mausklick durchgeführt, dann können sie regelmäßig bereits während der Applikationsentwicklung erfolgen. Entsprechende Tools sind nicht nur für Hochsprachen wie C++ oder C# verfügbar, sondern auch für IEC-61131-3-Code im Codesys Development System. Der Codesys Profiler macht seinem Namen alle Ehre: Er untersucht den ‚Fall‘ mit unterschiedlichen Methoden und liefert so ohne manuellen Aufwand wertvolle Erkenntnisse in jeder Projektphase.
Mit der einfachsten Methode, der ‚Instrumentierung‘, wird zusätzlicher Code in die zu messenden Bausteine eingeschleust – genau wie beschrieben, aber eben automatisch. Das Resultat der Messung gibt dem Applikateur ein detailliertes Bild über Ausführungsdauer, Anteil am Gesamtprojekt sowie Aufruf-Häufigkeit eines jeden Bausteins. Weil sofort sichtbar ist, welche Bausteine für die Gesamtleistung kritisch sind, kann er sich bei der Optimierung genau auf diese Objekte konzentrieren. Die Messung der längsten Zykluszeit im Betrachtungszeitraum gibt Aufschluss über sporadisch auftretende Ausreißer. Mit weiteren Konfigurationsmöglichkeiten lässt sich die Messung dynamisch über boolesche Variablen starten. Dabei können der erste Initialisierungszyklus beziehungsweise einzelne Bausteine bewusst in die Messung ein- oder davon ausgeschlossen werden, der Anteil der Laufzeit durch Bibliotheksbausteine lässt sich ebenfalls berücksichtigen.
Die Momentaufnahme der Abarbeitungszeit sowie der Aufrufhäufigkeit wird pro Baustein angezeigt und lässt sich für eine spätere Nachverfolgung abspeichern.
© CodesysSolch eine instrumentierte Messung geht allerdings zu Lasten der Applikation, sprich, der Ausführungsdauer. Die zusätzliche Last kann im Einzelfall auch dazu führen, dass der Watchdog anspringt, dass also die Taskzeitüberwachung einen Fehler meldet. Gerade um die erwähnten Ausreißer zu erkennen, führt daran dennoch kein Weg vorbei. Es hat sich bewährt, die Laufzeitmessung zum Beispiel am Ende eines jeden Arbeitstages vorzunehmen, den Verlauf kontinuierlich zu beobachten und gegebenenfalls sprunghafte Veränderungen einzelner Bausteine sofort zu begutachten. Mit dem Abschalten des Profilers nach der Messung verschwindet der zusätzliche Code in jedem Fall, und damit auch seine Auswirkungen.
Sampling und Code-Abdeckung
Um langfristige Effekte mit deutlich geringerem Einfluss des Messcodes festzustellen, eignet sich das Sampling der Applikation. Dazu greift der Profiler in definierbaren Intervallen quasi von außen in den Programmablauf ein und ermittelt stichprobenartig den aktuellen Aufrufstapel (Call Stack), sprich den gerade abgearbeiteten Baustein, und von wem er aufgerufen wurde. Durch eine zunehmende Anzahl solcher Stichproben schärft sich der Eindruck davon, welche Bausteine mehr Zeit beanspruchen als andere. Der daraus errechnete statistische Mittelwert wird also umso genauer, je länger die Messung läuft.
Wie lässt sich so eine Messung in einem Tool wie Codesys realisieren? Durch
Nutzung der Multicore-Technologie: Eine vom Profiler generierte Samplingtask sowie dazugehöriger Messcode laufen dazu in einer eigenen Taskgruppe auf einem separaten CPU-Kern. Dieser Code tastet die Ausführung der eigentlichen Applikation in regelmäßigen Intervallen ab und misst daraus die Laufzeit. Dabei wird der laufende Applikationscode nicht verändert, auch sind die entstehenden Unterbrechungen der Applikation gering. Diese Messmethode wird keinen Watchdog auslösen. Ausreißer kann das Sampling allerdings nicht erfassen.
Eine zusätzliche Methode im Codesys Profiler liefert ebenfalls wertvolle Fakten zur Applikation: Mit der Überprüfung der Code-Abdeckung zeigt der Profiler die Code-Zeilen beziehungsweise Netzwerke an, die während der Messung durchlaufen werden. Der Anwender kann von der Ansicht auf das gesamte Projekt in einzelne Bausteine springen und das Ergebnis im Quellcode überblicken. Diese Information ist bei der Inbetriebnahme sowie beim Testen der Applikation sehr hilfreich und gibt Hinweise auf Fragen wie diese:
- Wurden alle Betriebsmodi bereits durchlaufen?
- Welcher Anteil des Codes ist verantwortlich für die Laufzeit des getesteten Betriebsmodus?
- Welchen Teil der Applikation muss ich noch gezielt testen oder in Betrieb nehmen
Übrigens lässt sich die Qualitätssicherung von Bausteinen mit zusätzlichen Tools zur Testautomatisierung wie dem Codesys Test Manager sehr gut dokumentieren.
Die Anwendung
Damit eine Messung im Codesys Development System vorgenommen werden kann, muss der Profiler zunächst installiert sein. Im Codesys Store steht ein entsprechendes Add-on-Package zur Verfügung, das zusammen mit vier anderen Tools als Jahresabonnement lizenziert wird. Zur Messung fügt der Applikationsprogrammierer den Profiler als Objekt in den Projektbaum ein und konfiguriert die Messmethode und deren Parameter. Mit dem Download der Applikation auf die Steuerung wird die Messung automatisch gestartet. Als Ergebnis werden alle ausgeführten Objekte sofort in verschiedenen Ansichten angezeigt: Hierarchisch gemäß dem Aufrufbaum, als Liste sortierbar nach unterschiedlichen Kriterien sowie in einer umgekehrten Darstellung des Aufrufbaums zur Rückverfolgung der Aufrufkette. Aus der Liste kann der Anwender direkt in die einzelnen Bausteine springen, um dort Optimierungen im Code vorzunehmen.
Zusätzlich steht eine Übersicht mit den Basisinfos zur Messung zur Verfügung. Wird das Mess-Ergebnis als Momentaufnahme im Projekt abgespeichert, so kann der Programmierer eine Dokumentation des Laufzeitverhaltens vornehmen und später dessen Verlauf nachvollziehen. Damit fällt es dann leicht, Sprünge in einzelnen Objekten sowie deren Ursachen nachzuverfolgen beziehungsweise zu beheben. Und weil es manchmal auch ausreicht, lediglich einen oder mehrere einzelne Bausteine zu überwachen, bringt der Profiler noch eine Art ‚Echtzeit-Ansicht‘ mit: Zieht der Anwender während der Programmausführung einen Baustein in die Profiler-Watchliste, so sieht er darin sofort dessen Ausführungszeit zusammen mit statistischen Informationen.


















