CODESYS 3.5 und Speichersicherheit bei Arrays

RaspiUser

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich programmiere gelegentlich in ST in CODESYS 3.5, in der Regel mit der Laufzeitumgebung für Raspberry PI, aber nachdem ich natürlich kein perfekter Mensch bin, passieren mir Fehler.

Leider ist es mir in letzter Zeit 2x passiert, dass ich in Funktionsblöcken bei der Verwendung von Arrays versehentlich ein Element außerhalb des deklarierten Bereichs beschrieben habe, z. B.
Code:
var
test: ARRAY[0..9] OF REAL;
end_var

Dann habe ich durch einen Programmfehler beispielsweise
Code:
test[10]:=12345;
geschrieben.

Das führte dann dazu, dass andere Variablen, z. B. der Array-Index noch weiter abwichen, dann beim nächsten Schreibzugriff wurde der Fehler noch größer, bis irgendwann die Laufzeitumgebung stoppte. In anderen Fällen lief es weiter, aber in unterschiedlichen Bereichen des Programms (völlig unabhängig von dem fehlerhaften Funktionsblock) passierten seltsame Dinge.
Das hat mich jedes mal extrem viel Zeit bei der Fehlersuche gekostet, was schlecht ist.
Noch schlimmer wäre es gewesen, wenn mir diese Fehler nicht aufgefallen wären.

Nun, es ist ja nicht so ungewöhnliches, dass solche Fehler passieren. In anderen Programmiersprachen, mit denen ich arbeite, beendet sich in solchen Fällen das Programm mit einem Fehler, also in dem moment, in dem ein Programmteil in einen nicht für sich selbst deklarierten Speicherbereich zu schreiben versucht, oder es ist zumindest konfigurierbar, dass so ein Abbruch passiert.
(Es sei denn, man arbeitet in C und mit Pointern, aber mehrere Dekaden von Sicherheitslücken und Programmfehlern durch Pointer sollte die meisten Programmierer von dieser Last befreit haben) ;)

Leider finde ich in CODESYS keine besagte Option, wie man Speichersicherheit zur Laufzeit erzwingen kann. Gibt es da sowas?
Oder gibt es in CODESYS andere Möglichkeiten, dass einem sowas "definiert um die Ohren fliegt", anstatt wie bei mir zu irgendeinem Zeitpunkt die Laufzeitumgebung zu beenden, weil sich der Fehler so stark fortgepflanzt hatte oder anstatt dass falsche Werte plötzlich in anderen Programmteilen auftreten?

Zugegebenermaßen hat mich das aktuelle Standardverhalten von CODESYS doch sehr stark "verwundert" oder eher irritiert.
 
Hallo,
soweit ich es gerade in Erinnerung habe, dürfte es bei konstantem Index - sprich [10] - einen Compilefehler geben. Zur Laufzeit hilft CheckBounds, zumindest für grobe Fehlgriffe ausserhalb des Arrays.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank, @Fx64 !
Nur um sicher zu sein, das mit [10] war nur exemplarisch, da steht statt der [10] bei mir in mind. 99 % der Fälle eine Variable drin.

Aber als Lösung im Prinzip jeden Arrayzugriff während der Laufzeit selber überwachen. Das ist natürlich aufwändig, aber die Fehlersuche war noch aufwändiger.
Falls hier doch noch irgendein Leser eine Idee hat, wie man diese unbequeme Arbeit an die Runtime übertragen kann, nur her damit! :)
 
Danke euch beiden, ich glaube, jetzt habe ich es kapiert.
Ich dachte, das ist eine Funktion, die ich schreiben muss und vor jedem einzelnen schreiben in ein Array anwenden muss, also quasi mit den Arrayparametern.

Wenn ich das richtig kapiert habe, muss die Funktion lediglich existieren. Ich muss sie nicht verwenden. Das passiert automatisch bei jedem Array. Ist das korrekt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst die „CheckBounds“ bzw. Implizite-Prüfung normalerweise mit Rechtsklicks hinzufügen.
Lösen diese dann aus, hast du einen Ausnahmefehler und das Programm hält an.
Zudem ist dadurch die Fehlerquelle relativ gut zu finden. Dafür steht ein Tab zu Verfügung, dieser heißt glaube ich „Aufruf“. Der Tab wird sichtbar in dem du in unter „Ansicht“ einblendest.
Diese CheckBounds brauchen ein wenig Performance, kann unter Umständen relevant sein.


Siehe
Codesys - Hilfe
 
Zuletzt bearbeitet:
Zurück
Oben