Twincat checkbounds

Definiere eine Funktion mit Namen CHECKBOUNDS, Eingangsvariablen und Rückgabewert wie unten gezeigt. Dann implementiere, was die Funktion machen soll, dieses Beispiel von Beckhoff korrigiert Bereichüberschreitungen automatisch auf den maximal bzw. minimal möglichen Index.
Die Funktion muß nur definiert werden, du musst sie nicht aufrufen! Sie überprüft automatisch alle Arrayzugriffe in deinem Projekt und greift ggf. ein!

FUNCTION CHECKBOUNDS : DINT
VAR_INPUT
index, lower, upper : DINT;
END_VAR
VAR
END_VAR

IF index<lower THEN
CheckBounds := lower;
ELSIF index>upper THEN
CheckBounds := upper;
ELSE
CHECKBOUNDS := index;
END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

der Thread ist zwar schon etwas älter, aus gegebenem hab ich zur checkbounds Funktion eine Frage.
Ich habe festgestellt, dass es in unserem Projekt Bereichsverletzungen sowohl nach oben, als auch nach unten gibt. Lasse jeweils einen Zähler hochzählen. Das Problem ist, dass mit vielen Arrays gearbeitet wird und die Zähler sehr schnell ansteigen. Das Problem ist jetzt herauszufinden, an welcher Stelle der falsche Speicherzugriff erfolgt.
Alles von Hans nachzuschauen, oder einezlen FB,FC ab- und zuzuschalten gestaltet sich doch als sehr langwierig.
Hat also jemand eine Idee, wie ich herausfinde, von welcher Stelle der Zugriff erfolgt ist?
 
Hallo muffensauser,

wenn du während dessen online sein kannst setzt doch einfach Breakpoints bei "CheckBounds := lower;" und "CheckBounds := upper;" dann kannst du unter Online -> Ablaufhierarchie nachsehen wo das Prog. gestoppt wurde.

Grüße
 
Hi Mario,

Breakpoints möchte ich nach Möglichkeit vermeiden. Wir hatte vor zwei Monaten das Problem, dass ein Lieferant einen Breakpoint gesetzt hatte und sich bei erreichen dessen die ganze PLC so zerschossen hat, dass die persistenten Daten nicht korrekt geschrieben wurden und die ganze Anlage nach dem Neustart von Hand parametriert werden musste.
Deshalb ist es mir ein bißchen zu heikel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi muffensauser,

dann wirst du das Problem nicht mit dem CHECKBOUNDS erschlagen können. Der Baustein selbst weiß nicht von aus er aufgerufen wurde und daher kannst du das intern auch nicht auswerten.

Das einzige was du tun kannst ist den Baustein um die Funktion ADSLOGSTR erweitern, dann kannst du wenigstens erfassen ob das Array zu klein oder zu groß war.

Um dein Problem selbst einzugrenzen solltest du vielleicht deine Arrays selbst mit SIZEOF auf die Größe und Plausibilität prüfen.

Grüße
 
Noch nen programmiertechnischen Tipp:
Ich verwende für Arrays grundsätzlich Konstanten.
Code:
VAR
  myArray: ARRAY [ARRAY_BEGIN .. ARRAY_END] OF INT;
  i : INT;
END_VAR
VAR CONSTANT
  ARRAY_BEGIN : INT := 0;
  ARRAY_END : INT := 20;
END_VAR
------------
 
FOR i := ARRAY_BEGIN TO ARRAY_END DO
   ...
END_FOR

So begrenzt man das Fehlerpotenzial.
 
Moin Community,

wie kann ich CheckBounds bei TC3 einbinden? habe es wie bei TC2 versucht leider ohne Erfolg. Gibt es die Funktion nicht mehr bei TC3 - habe leider im Infosys nichts Verwertbares gefunden.

MfG
Hendrik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stichwort "POU für implizite Prüfung".
Einfach einen neuen POU einfügen und dann aber POU für implizierte Prüfung (POU for implicit checks) anwählen. Dann bekommst du ein Auswahlmenü in dem dir alle verfügbaren Überwachungsbausteine angezeigt werden (Bereichsüberwachung, Div/0 etc. pp.)
Hier noch der Link zum Infosys : =LINK=
 
Zurück
Oben