# Twincat checkbounds



## mbaum (11 September 2009)

Hallo Leute,
 ich finde nicht die *.lib in der die Function CheckBounds enthalten ist.
Kann jemand bitte einen Tip geben

gruß mbaum


----------



## grosser_marco (11 September 2009)

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


----------



## muffensauser (29 November 2010)

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?


----------



## Mario_K (29 November 2010)

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


----------



## muffensauser (29 November 2010)

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.


----------



## Mario_K (29 November 2010)

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


----------



## trinitaucher (30 November 2010)

Noch nen programmiertechnischen Tipp:
Ich verwende für Arrays grundsätzlich Konstanten.

```
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.


----------



## Hendrik (8 November 2016)

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


----------



## MasterOhh (8 November 2016)

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=


----------

