Daniel Brenndörfer
Level-1
- Beiträge
- 9
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Hallo zusammen,
beim Programmieren in TwinCAT ist es ja problemlos möglich, z.B. ein Array [1..5] zu erstellen und dann was in Array[7] reinzuschreiben, was dann irgendwas im Speicher überschreibt und zu völlig unvorhersehbarem Verhalten führt. Das würde ich mir gern verhindern.
Wenn auf ein Element außerhalb des Arrays zugegriffen wird, möchte ich am liebsten, dass die SPS sofort im Debugger an der richtigen Stelle anhält. Anderswo würde man dann ein Throw_exception machen, aber das scheint bei SPS unüblich? Ich habe jedenfalls keine Möglichkeit dazu gefunden.
Und nein, ich möchte nicht, dass die SPS in dem Fall weiterläuft. Ich habe einen Prozess, bei dem korrekter Ablauf extrem wichtig ist und den Prozess nach Fehlerbehebung neu zu starten völlig akzeptabel.
Eine Idee für eine Lösung wäre ein Function Block, den ich bei Aufruf eines Arrayelementes nutzen müsste - so nach dem Motto statt
x := aTestarray[15];
zu schreiben
x := aTestarray[fbSafe.M_test(15)]
Das hat aber auch einige Probleme:
beim Programmieren in TwinCAT ist es ja problemlos möglich, z.B. ein Array [1..5] zu erstellen und dann was in Array[7] reinzuschreiben, was dann irgendwas im Speicher überschreibt und zu völlig unvorhersehbarem Verhalten führt. Das würde ich mir gern verhindern.
Wenn auf ein Element außerhalb des Arrays zugegriffen wird, möchte ich am liebsten, dass die SPS sofort im Debugger an der richtigen Stelle anhält. Anderswo würde man dann ein Throw_exception machen, aber das scheint bei SPS unüblich? Ich habe jedenfalls keine Möglichkeit dazu gefunden.
Und nein, ich möchte nicht, dass die SPS in dem Fall weiterläuft. Ich habe einen Prozess, bei dem korrekter Ablauf extrem wichtig ist und den Prozess nach Fehlerbehebung neu zu starten völlig akzeptabel.
Eine Idee für eine Lösung wäre ein Function Block, den ich bei Aufruf eines Arrayelementes nutzen müsste - so nach dem Motto statt
x := aTestarray[15];
zu schreiben
x := aTestarray[fbSafe.M_test(15)]
Das hat aber auch einige Probleme:
- Es verbessert nicht gerade die Lesbarkeit des Codes
- Der FB muss für jedes Array einzeln instanziert werden, damit er die richtigen Grenzen hat, was es noch unübersichtlicher macht (also nicht einfach fbSafe.M_test(15), sondern fbSafe_aTestarray.M_test(15)
- FB und Array müssen beide bei Compilierung angelegt werden; ich kann also nicht den FB nutzen, um die Arraygrenzen zu erzeugen. Die Arraygrenzen kann ich später glaube ich auch nicht mehr aus dem Array auslesen? Das bedeutet, ich muss die Arraygrenzen an zwei verschiedenen Stellen angeben, was wieder fehleranfällig ist.