TIA FB Bibliothekskonform

Credofire

Level-1
Beiträge
640
Reaktionspunkte
35
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe folgenden Code, abgeschrieben zur Übung aus einem Buch:
Code:
(*Trenderkennung*)

#i_Differenz := ABS(IN := #i_Messwert - #i_MWAlt); (* Vergleich Vergangenheit zu Gegenwart *)
#x_Hysterese := #i_Differenz > #i_Hysterese; (* Differenz größer als Hysterese? *)

IF #x_Hysterese THEN (* Ist die Diefferenz steigend oder fallend? *)
    IF #i_Messwert > #i_MWAlt THEN
        #x_MWSteigend := TRUE;
        #x_MWFallend := FALSE;
    ELSE
        #x_MWFallend := TRUE;
        #x_MWSteigend := FALSE;
    END_IF;
    #i_MWAlt := #i_Messwert; (* Nachführung der vergangenheit *)
END_IF;

IF #x_Reset THEN (* Löschen des Archivs *)
    #usi_Schreibpointer := 5; (* Festlegen wo das Archiv beginnt *)
    FOR #si_PointerLoesch := 5 TO #si_Arraygroesse BY 1 DO (* Löeschvorgang mit FOR *)
        #Messwerte[#si_PointerLoesch] := 0;
    END_FOR;
END_IF;

(* Schreiben bei Trendwechsel in das Archiv *)
IF (NOT #x_MWFallend AND #x_HMTRFall) OR (NOT #x_MWSteigend AND #x_HMTRSteig)
    AND NOT #x_Speichervoll THEN
    #Messwerte[#usi_Schreibpointer] := #i_Messwert;
    #usi_Schreibpointer := #usi_Schreibpointer + 1;
END_IF;

(* Nachführung der Flankenmerker *)
#x_HMTRFall := #x_MWFallend;
#x_HMTRSteig := #x_MWSteigend;

(* Setzen Bit Meldearchiv ist voll*)
#x_Speichervoll := (#usi_Schreibpointer > 24);

(* Bestimmung des MinWertes: 
Hier muss noch anwendungsbezogen eine Verzögerung eingestellt werden,
 damit nicht beim Start der Wert "0" eingetragen wird  - realisiert durch FirstScan??? *)
IF NOT #x_FirstScan THEN
    #i_MinWertAk := 30000;
ELSIF
    (#i_Messwert < #i_MinWertAk) AND #x_MWFallend THEN
    #i_MinWertAk := #i_Messwert;
END_IF;

(* Bestimmung des Max-Wertes *)
IF #i_Messwert > #i_MaxWertAk THEN
    #i_MaxWertAk := #i_Messwert;
END_IF;

(* Statistik - Übertragung *)
#Messwerte[0] := #i_Messwert;
#Messwerte[1] := #i_Hysterese;
#Messwerte[2] := #i_MinWertAk;
#Messwerte[3] := #i_MaxWertAk;
#Messwerte[4] := #i_AnzMess;

(* Ausgabe Min / Max - Werte *)
#i_MinWert := #i_MinWertAk;
#i_MaxWert := #i_MaxWertAk;

unter Eigenschaften des Bausteins sagt mir TIA nun, das ich auf eine globale Variable zugreife. Meiner Meinung nach tue ich das aber nicht, ausser man zählt normale Zahlen dazu.

Könnt ihr mal bitte durchsehen und sagen welches Variablen TIA da meint?

Vielen Dank!
 
Tia missinterpretiert gerne mal Anführungszeichen schlusszeichen selbst wenn sie in Kommentaren eingeklammert sind. Lösch die mal raus und probierts nochmal.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
auf die Schnelle finde ich da auch nix. Kopiere den Baustein doch in ein blankes Projekt, dann müsste er dir beim Übersetzen ja sagen, welche Variable ihm fehlt -> das müsste dann deine globale Variable sein.
 
Ach, ich denke ich weis nun. Ich habe als Eingang für die Messwerte als array [0..TrendArray] of int deklariert.
Kann man das irgendwie umgeneh, wenn ich array dynamisch halten möchte?
 
Du kannst ein unspezifiziertes Array anlegen mit array
[*] of int und dann mit CountOfElements(array) die Länge für bspw. ein Schleife ermitteln.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Howard
ich habe das heute früh mal geändert, aber ich bekomme Fehlermeldung, dass ungültige Zuweisung

Fehler Messwert.jpg

Hatte davor die Variable vergessen, ändert aber an dem Fehler nix.
 
Moin,
dir fehlt in deinem Beispiel auf jeden Fall der Rückgabewert.
Code:
[TABLE="class: table_sourcecode, width: 100%"]
[TR]
[TD]AnzahlElemente := CountOfElements(Messwerte);
[/TD]
[/TR]
[TR]
[TD]
[/TD]
[/TR]
[/TABLE]
Aternativ kannst du auch mit Lower_Bound und Upper_Bound arbeiten. Das ist meist noch flexibler, wenn man nicht sicherstellen kann, dass die Arrays immer bei 0 anfangen.
 
@Howard
ja, das ist was ich meinte mit vergessen. Ich hatte es nach dem Screenshot eingefügt, aber es ändert leider nichts an der Fehlermeldung

Fehler Messwert 1.jpg

p.s. Ich habe jetzt der Variable Messwerte den Typ Variant zugeordnet statt Array. So scheint es zu funktionieren. Nur funktionieren dann meine Array-Zugriffe nicht mehr.

Da ich die Variable für die Arraygröße sowieso in dem Baustein reinbringe, kann ich das Array
[*] of int das * dann als Anweisung ersetzen? Also Quasi die Variable im Text deklarieren?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, mein Fehler. Bei CountOfElements muss ein Variant übergeben werden (Dieser kann dann außen am Baustein wieder ein Array sein).
Dann musst du in deinem Fall mit Upper_Bound und Lower_Bound arbeiten, was ich persönlich eh bevorzugen würde.
 
Zurück
Oben