TwinCat 2.11 (2228) persisentes Variablen Phänomen

Zuviel Werbung?
-> Hier kostenlos registrieren
kannst du mir das bitte bissl näher erklären oder nen guten link geben ? ^^
so tief in der fehlersuche war ich bisher zum glück noch nie

btw ... angenehmenes wochenende :ROFLMAO: auch wenns sauwetter is
 
Die Funktion Checkbound funktioniert wie folgt:
- Du legst eine Funktion mit den Namen Checkbounds an und kopierst den Code (wie du Ihn bereits gepostet hast) in die Funktion mit der Variablendeklaration.
- Im Code würde ich jeweils bei den beiden "Fehler-IFs" entweder je eine globale boolsche Variable setzen oder je eine INT-Variable hochzählen lassen.
-> Übersetzen und ausprobieren, weiter musst du nichts machen (Die Funktion muss NICHT aufgerufen werden, das macht TwinCAT selbst)

Bitte beachte, dass die Auslastung massiv und sprunghaft steigen kann, was im schlimmsten Fall zu Zykluszeitüberschreitungen führen kann! Deshalb nur mit Vorsicht an realer Hardware ausprobieren. Solange die Funktion mitübersetzt wird (also nicht "vom Übersetzen ausschliessen" -> grüne Schrift) ist sie scharf...

Code:
IF index<lower THEN  
   CHECKBOUNDS := lower;
   -> giCheckBoundsLower := giCheckBoundsLower + 1;  
ELSIF index>upper THEN  
  CheckBounds := upper;
   -> gbCheckBoundsUpper = TRUE; 
ELSE
    CHECKBOUNDS := index; 
END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Moin von der Front xD

Also hab jetzt mal nen globalen Zähler probiert

Code:
 IF index<lower THEN
 	   CHECKBOUNDS 	:= lower;
     igLow			:=igLow+1;
 ELSIF index>upper THEN
 	   CHECKBOUNDS 	:= upper;
     igHigh			:= igHigh+1;
 ELSE
 	  CHECKBOUNDS := index;
 END_IF

Bekomme als Ergebnis igLow = 1 !
Ich deute das jetzt so, dass ich Bereichsverletzung nach unten habe (Vermutlich irgendein [1...xy] array, was mit 0 initialisiert wird)7
würde jetzt erstmal per hand auf die array schauen und dann ggf mal anfangen durchzutippen und zu schauen, wo der zähler auf 1 springt

hoffe mal dass ich dann anhand der array grenzen die es mir bei low- und highindex ausgibt ich das array schneller finden kann
 
Setze doch einfach einen Breakpoint... Dann bleibt die Steuerung im Fall der Unterschreitung stehen und du kannst alle Arrayadressen prüfen!
 
Habs ^^ Sowas dummes xD

Der Index für den Zugriff auf mein [1..2] Array wird durch harte Ini's bestimmt:

Code:
	IF i1S9901 THEN
 	A 	:= 1;
 	B	:= 2;
	ELSIF i1S9902 THEN
 	A	:= 2;
 	B	:= 1;
	END_IF

Und dieses Array wurde scheinbar eher geschrieben als die Variablen A / B schon definiert waren.
Die Frage welches die beste Lösung ist ...

* Hab die Abfrage der Ini's nun mit in die globalen Signale genommen (2. FB der in der Main aufgerufen wird) - so scheints zu gehen.
* Die Zwei Index-Variablen A & B vordefinieren (könnte aber dazu führen, dass am Anfang das falsche Nest beschrieben wird)


Jedenfalls kann ich endlich erstmal meine pers.Variablen speichern :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es wirklich sicher sein soll, musst Du den Fall, dass beide Inis =0 sind, abfangen. Z. B. A und B vor dem Arrayzugriff auf Gültigkeit prüfen. Oder gibt es vielleicht noch mehr, was nicht laufen darf, solange die Position nicht eindeutig bestimmt ist?
 
Ne, die Position ist ja sowieso durch Arretierungen etc vorhanden und bis Druckluft vorhanden ist, weiß sie ihjre Position mit Sicherheit.

Habe gerade nochmal den harten Gegentest gemacht und die Ermittlung der Indexvariablen auf den alten Stand gebracht - 152 Fehler bei LowIndex lol
also hab ich spassenhalber mal das Array, welches Schuld ist, von [1..2] auf [0..2] erweitert mit Ergebnis LowIndex - 0 Fehler :ROFLMAO:

mach mir jetzt noch ne Hilfsvariable für die SChreibzugriffe, die abfragt ob (A=1 & B=2) ODER (A=2 & B=1) ... damit dürfte das Problem gelöst sein

Danke für euer Geduld xD war mein erstes mal mit Checkbounds - aber muss sagn, gefällt die die Funktion :cool:
 
Zurück
Oben