Wo sollen denn die Informationen zu den Array-Grenzen eines "herkömmlichen" Arrays "simpel" in der SPS hinterlegt werden? Die müssten ja in einem zusätzlichen Speicherbereich als "Meta"-Daten gespeichert werden oder bei jedem Zugriff als unsichtbarer zusätzlicher Parameter mitgegeben werden.

Ja, das ist sicherlich ein Problem, wenn man sich darüber zur Einführung der Arrays noch keine Gedanken gemacht hat.
Zu S5-Zeiten gab es einen DB0, der eine BausteinListe enthielt und in dem stand, welcher Baustein wo abgelegt ist. Das finde ich durchaus vergleichbar. Eine ArrayListe muss aber entsprechend mehr Informationen enthalten, wenn diverse Informationen nicht direkt "vor Ort" beim Array abgelegt werden sollen.
Wenn in einem FC für ein A(*)-Array je Dimension die Werte von LowerBound und UpperBound abfragbar sind, dann müssen diese Informationen aber doch vorhanden oder zumindest rekonstruierbar sein. Und zwar für alle Arrays, denn das A(*)-Array existiert für mein Verständnis gar nicht, sondern ist lediglich der "Multiplexer", mit dem man auf eines der "real existierenden" Arrays zugreifen kann.
Als nächstes kommt dann
die Forderung der dringende Wunsch, daß jegliche Zugriffe auf Arrays prüfen sollen, ob die Zugriffe innerhalb der Grenzen sind, weil "das Programm kennt doch LOWER_BOUND/UPPER_BOUND". Solche Prüfungen sind aber so ressourcenfressend, daß der Check z.B. in
Codesys extra aktiviert werden muß.
Joa. Warum nicht, Harald? Zumindest bei SchreibZugriffen auf Arrays wäre das doch schon sehr hilfreich, um unbeabsichtigte DatenSabotage zu verhindern. Ressourcen- und Perfomance-fressend ist das natürlich. Aber wir reden ja hier über SPS-Programme und die sollten ja vorrangig "sicher" funktionieren.
Andererseits, wenn man mittels LowerBound und UpperBound selbst in die Hand nehmen kann, an welchen Stellen im Programm man solche VorbeugeMaßnahmen gegen BereichsVerletzungen vornehmen möchte und an welchen nicht, wäre das doch Ressourcen- und Performance-schonend gegenüber generell im Programm wirksamen, ständigen Überprüfungen.
Vielleicht wären Hinweise auf Ressourcen-Bedarf und Performance-Einbuße bei den Funktionen LowerBound und UpperBound sinnvoll.
Man muss ja nicht an jeder Stelle im Baustein die Funktionen benutzen (= erneut aufrufen), an denen man auf die Werte zurückgreifen will.
Einmal am BausteinAnfang und in TempVariablen gespeichert, greift man dann nur noch auf die Temps zu.
Für die TestPhase von neuentwickelten von Bausteinen finde ich LowerBound und UpperBound sowie die Prüfung auf BereichsVerletzung nicht verkehrt (, aber auch nicht unerlässlich).
ProgrammierFehler der Art ...
Code:
FOR ix := UpperBound(aktuellesArray, 1) TO LowerBound(aktuellesArray, 1) BY -1 DO
aktuellesArray[ix + 1] := aktuellesArray[ix] ;
END_FOR ;
... also, dass der "geprüfte" IndexBereich doch noch durch z.B. ix +1 verfälscht wird, sind vermutlich die häufigsten. Aber man muss sie nur oft genug gemacht haben, dann achtet man schon automatisch darauf.
