Step 7 Fehler in SCL-Code

Satanios

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

ich brauche Hilfe bei diesem SCL-Code. Ich konnte mittlerweile fast alle, ausser zwei Fehlern, ausmerzen. Könnt ihr mal drüberschauen, ich übersehe mit Sicherheit irgendwas und das macht mich kirre.
Ich habe Screenshoots von den Fehlern gemacht und die fehlerhaften Zeilen sind markiert. Den Code habe ich von einem fertigen Baustein aus TIA übernommen und in Step 7 neu geschrieben und für mich an manchen Stellen angepasst. :confused::confused:

Ich konnte über die Suchfunktion im Forum keinen ähnlichen Fall finden der mir geholfen hat, daher habe ich diesen Thread aufgemacht.


FUNCTION_BLOCK FB13


VAR_INPUT
Wert : INT; //Eingabewert als Int
Modus : INT; //Default Modus =1(getriggert); Modus =2(Zyklisch)
Wertebereich : INT; //Anzahl der zu erfassenden Werte
Trigger : BOOL; //Auslösetrigger
Reset : BOOL; //Reset für Baustein
END_VAR

VAR_OUTPUT
Mittelwert : INT; //Mittelwertausgabe als Integer
WertefensterErreicht: BOOL; //--
Error : BOOL; //"0" = kein Fehler; "1" = Fehler
Status : WORD; //Status und Fehlercodes
END_VAR


VAR
statCounter : INT;
statTrigger: BOOL;
statValues : ARRAY[0..100] OF INT;
statValuesSum : INT;
statWindowSizeOld: INT;
END_VAR

VAR_TEMP
tempTrigger: BOOL;
tempArithmeticAverage : INT;
tempCounter : INT;
tempIndex : INT;
END_VAR

CONST
// Konstanten
vMAX := 100;
vMIN := 0;
MODE_1 := 1; //Trigger
MODE_2 := 2; //Zyklisch
NO_ERROR := 16#0000;
NO_MODE := 16#8201;
WRONG_WINDOW_SIZE := 16#8202;
END_CONST

Begin
//Fehler auf "0" setzen//
Error := False;//////////
Status := NO_ERROR;//////
/////////////////////////

//Berechnung Zurücksetzen///////////////
IF Reset THEN///////////////////////////
Mittelwert := 0;/////////////////////
statCounter := 0;////////////////////
statValuesSum := 0;//////////////////
WertefensterErreicht := false;///////
statWindowSizeOld := Wertebereich;///
RETURN;//////////////////////////////
END_IF;/////////////////////////////////
////////////////////////////////////////

//Prüfen ob Wertebereich sich geändert hat//
IF Wertebereich <> statWindowSizeOld THEN///
Mittelwert := 0;/////////////////////////
statCounter := 0;////////////////////////
statValuesSum := 0;//////////////////////
WertefensterErreicht := false;///////////
statWindowSizeOld := Wertebereich;///////
END_IF//////////////////////////////////////
////////////////////////////////////////////

//Wertebereich prüfen
IF ((Wertebereich > vMIN) AND (Wertebereich <= vMAX)) THEN

CASE Modus OF //Prüfen des gewählten Modus 1 oder 2
MODE_1:
//Dieser Programm-Code prüft ob der Trigger eine steigende Flanke aufweist,
//wenn TRUE, dann steigende Flanke vorhanden.
tempTrigger := Trigger AND NOT statTrigger;
statTrigger := Trigger;

//Schreibt den Wert in das Array #statValues
IF tempTrigger THEN //Wenn steigende Flanke am Eingang "Trigger", berechne Array-Zähler
tempCounter := statCounter MOD Wertebereich;
//Schritt 1 Array mit Werten füllen
IF (statCounter < Wertebereich) THEN
tempIndex := tempCounter;
statValues[tempIndex] := Wert;
//Werte zusammenrechnen
statValuesSum := statValuesSum + Wert;
//Inkrement Zähler
statCounter := statCounter + 1;
//Berechne Mittelwert
tempArithmeticAverage := statValuesSum / statCounter;
ELSE
WertefensterErreicht := True;
//Ersten Werte schieben
IF (tempCounter = 0) THEN
//Werte zur Summe Addieren
statValuesSum := statValuesSum + Wert - statValues[0];
//Wert Addieren
tempIndex := 0;
statValues[tempIndex] := Wert;
//Inkrement Zähler
statCounter := Wertebereich + 1;
//Berechne Mittelwert
tempArithmeticAverage := statValuesSum / Wertebereich;
ELSE
//Definiere Index
tempIndex := tempCounter;
//Wert addieren
statValuesSum := statValuesSum + Wert - statValues[tempIndex];
//Wert einfügen
statValues[tempIndex] := Wert;
//Inkrement Zähler
statCounter := statCounter +1;
//Mittelwert berechnen
tempArithmeticAverage := statValuesSum / Wertebereich;
END_IF;
END_IF;
//Ausgang schreiben
Mittelwert := tempArithmeticAverage;
END_IF;

//------------------------------------------------------------------------------------

MODE_2:
//Berechne Array Zähler
tempCounter := statCounter MOD Wertebereich;
//Schritt 1 Array mit Werten füllen
IF (statCounter < Wertebereich) THEN
//Werte addieren
tempIndex := tempCounter;
statValues[tempIndex] := Wert;
//Wert zur Summe addieren
statValuesSum := statValuesSum + Wert;
//Inkrement Zähler
statCounter := statCounter + 1;
//Mittelwert berechnen
tempArithmeticAverage := statValuesSum / statCounter;
ELSE
WertefensterErreicht := True;
//Ersten Wert schieben
IF (tempCounter = 0) THEN
//Wert addieren
statValuesSum := statValuesSum + Wert - statValues[0];
//Wert addieren
tempIndex := 0;
statValues[tempIndex] := Wert;
//Inkrement Zähler
statCounter := Wertebereich +1;
//Mittelwert berechnen
tempArithmeticAverage := statValuesSum / Wertebereich;
ELSE
//Index definieren
tempIndex := tempCounter;
//Wert addieren
statValuesSum := statValuesSum + Wert - statValues[tempIndex];
//Wert schieben
statValues[tempIndex] := Wert;
//Inkrement Zähler
statCounter := statCounter + 1;
//Mittelwert berechnen
tempArithmeticAverage := statValuesSum / Wertebereich;
END_IF;

END_IF;
//Ausgang beschreiben
Mittelwert := tempArithmeticAverage;

//---------------------------------------------------------------------------------

//Falls kein Modus gewählt wurde, Fehler erzeugen
ELSE
Error := True;
Status := NO_MODE;
Mittelwert := 0;
Return

END_CASE;
ELSE
//Falls ein falscher Wertebereich gewählt wurde
Error := True;
Status := WRONG_WINDOW_SIZE;
Mittelwert := 0;
END_IF;

END_FUNCTION_BLOCK
 

Anhänge

  • Fehler1_SCL.JPG
    Fehler1_SCL.JPG
    16,3 KB · Aufrufe: 44
  • Fehler2_SCL.JPG
    Fehler2_SCL.JPG
    139,3 KB · Aufrufe: 54
Vielen vielen Dank ihr beiden. Ich hab den Wald vor lauter Bäumen nicht mehr gesehen. Ich habe jetzt keine Fehler mehr. :sm24:
 
Zurück
Oben