-> Hier kostenlos registrieren
Guten Abend zusammen,
da SCL für mich völlig neu ist, ich aber nicht länger darauf verzichten möchte, bin ich (lerne gerade VBA in der Technikerschule) dabei mich in die Materie einzuarbeiten.
Wir haben in VBA ein kleines Programm geschrieben um Mittelwerte zu berechnen. Zu erst wird man gefragt wie viele Werte eingegeben werden sollen. Der Wert wird dient der For/Next Schleife und anschließend beim dividieren der Summe aller Werte.
In SCL möchte ich die Mittelwertbildung möglichst flexibel halten. D.h. n-Werte lege ich als Input Operand an, ebenso eine Zeit.
Mit der Zeit generiere ich einen Takt. Ist die Zeit z.B. 10ms, kommt mein Timer_1 nach 10ms und nach weiteren 10ms geht er wieder, da er vom Timer_2 unterbrochen wird. Dieser Zyklus(müssten 50Hz sein) läuft solange wie von Außen der Start anliegt.
Dieses Taktsignal Timer_1.Q werte ich als Positive Flanke aus. Den Flankenmerker nutze ich in meiner For/ Next Schleife als Bedingung wann der Wert auf die vorherige Summe addiert werden soll.
Nachdem die For/ Next Schleife durchlaufen ist, teile ich den Wert und gebe ihn aus. Meinen i Parameter für die For/ Next Schleife setze ich dann auf Null und die While Schleife soll erneut durchlaufen werden, solange der Start anliegt.
So weit die Theorie...
Beim Übersetzen kommt es zu Fehlermeldungen die ich nicht interpretieren kann. Vielleicht könnt ihr mir dabei behilflich sein.
FUNCTION_BLOCK FB500
TITLE = 'Mittelwert aus n-Werten'
VERSION : '1.0'
AUTHOR : xxxxx
NAME : SCL
FAMILY : xxxxx
// Bausteinparameter
VAR_INPUT
I_Start :BOOL; //Start der Funktion
I_n_Werte :INT; //Anzahl der Werte
I_Wert :REAL; //Wert aus dem der Mittelwert gebildet werden soll
I_Takt_Zeit :TIME; //Taktzeit für den Aufzeichnungs-Timer
END_VAR
// Ausgangsparameter
VAR_OUTPUT
O_Mittelwert :REAL;
END_VAR
// Durchgangsparameter
VAR_IN_OUT
END_VAR
// Temporäre Variablen
VAR_TEMP
END_VAR
// Statische Variablen
VAR
Timer_1 :SFB4; //TON Timer
Timer_2 :SFB4; //TON Timer
i :INT; //Parametervariable für For/Next Schleife
n :INT; //Parametervariable für For/Next Schleife
L_Wert :REAL; //Summenvariable
Edge_Flag_Pos :BOOL; //Hilfsvariable Flankenbildung
FP :BOOL; //Flanke Aufzeichnungstakt
END_VAR
///////////////////////// Zuweisen & Initialisieren ///////////////////////
IF NOT I_Start THEN
n:=I_n_Werte;
i:=0;
END_IF;
////////////////////////////////////////////////////////////////////////////
//////////////////////////////// Timer //////////////////////////////////
Timer_1(IN:=(I_Start AND NOT (Timer_1.Q)), PT:=I_Takt_Zeit);
Timer_2(IN:=(Timer_1.Q), PT:=I_Takt_Zeit);
////////////////////////////////////////////////////////////////////////////
////////////////////////////// Pos. Flag ////////////////////////////////
FP := Timer_1.Q AND NOT Edge_Flag_Pos;
Edge_Flag_Pos := Timer_1.Q;
//////////////////////////////// Schleife //////////////////////////////////
WHILE (I_Start = True) DO
FOR i:= 1 TO n BY 1 DO
IF (FP = True) THEN
L_Wert:=(I_Wert+L_Wert);
END_IF;
END_FOR;
O_Mittelwert:=(L_Wert/n)
i:=0
END_WHILE;
END_FUNCTION_BLOCK
Vielen Dank im Voraus und einen schönen Abend noch;-)
Mikraka
da SCL für mich völlig neu ist, ich aber nicht länger darauf verzichten möchte, bin ich (lerne gerade VBA in der Technikerschule) dabei mich in die Materie einzuarbeiten.
Wir haben in VBA ein kleines Programm geschrieben um Mittelwerte zu berechnen. Zu erst wird man gefragt wie viele Werte eingegeben werden sollen. Der Wert wird dient der For/Next Schleife und anschließend beim dividieren der Summe aller Werte.
In SCL möchte ich die Mittelwertbildung möglichst flexibel halten. D.h. n-Werte lege ich als Input Operand an, ebenso eine Zeit.
Mit der Zeit generiere ich einen Takt. Ist die Zeit z.B. 10ms, kommt mein Timer_1 nach 10ms und nach weiteren 10ms geht er wieder, da er vom Timer_2 unterbrochen wird. Dieser Zyklus(müssten 50Hz sein) läuft solange wie von Außen der Start anliegt.
Dieses Taktsignal Timer_1.Q werte ich als Positive Flanke aus. Den Flankenmerker nutze ich in meiner For/ Next Schleife als Bedingung wann der Wert auf die vorherige Summe addiert werden soll.
Nachdem die For/ Next Schleife durchlaufen ist, teile ich den Wert und gebe ihn aus. Meinen i Parameter für die For/ Next Schleife setze ich dann auf Null und die While Schleife soll erneut durchlaufen werden, solange der Start anliegt.
So weit die Theorie...
Beim Übersetzen kommt es zu Fehlermeldungen die ich nicht interpretieren kann. Vielleicht könnt ihr mir dabei behilflich sein.
FUNCTION_BLOCK FB500
TITLE = 'Mittelwert aus n-Werten'
VERSION : '1.0'
AUTHOR : xxxxx
NAME : SCL
FAMILY : xxxxx
// Bausteinparameter
VAR_INPUT
I_Start :BOOL; //Start der Funktion
I_n_Werte :INT; //Anzahl der Werte
I_Wert :REAL; //Wert aus dem der Mittelwert gebildet werden soll
I_Takt_Zeit :TIME; //Taktzeit für den Aufzeichnungs-Timer
END_VAR
// Ausgangsparameter
VAR_OUTPUT
O_Mittelwert :REAL;
END_VAR
// Durchgangsparameter
VAR_IN_OUT
END_VAR
// Temporäre Variablen
VAR_TEMP
END_VAR
// Statische Variablen
VAR
Timer_1 :SFB4; //TON Timer
Timer_2 :SFB4; //TON Timer
i :INT; //Parametervariable für For/Next Schleife
n :INT; //Parametervariable für For/Next Schleife
L_Wert :REAL; //Summenvariable
Edge_Flag_Pos :BOOL; //Hilfsvariable Flankenbildung
FP :BOOL; //Flanke Aufzeichnungstakt
END_VAR
///////////////////////// Zuweisen & Initialisieren ///////////////////////
IF NOT I_Start THEN
n:=I_n_Werte;
i:=0;
END_IF;
////////////////////////////////////////////////////////////////////////////
//////////////////////////////// Timer //////////////////////////////////
Timer_1(IN:=(I_Start AND NOT (Timer_1.Q)), PT:=I_Takt_Zeit);
Timer_2(IN:=(Timer_1.Q), PT:=I_Takt_Zeit);
////////////////////////////////////////////////////////////////////////////
////////////////////////////// Pos. Flag ////////////////////////////////
FP := Timer_1.Q AND NOT Edge_Flag_Pos;
Edge_Flag_Pos := Timer_1.Q;
//////////////////////////////// Schleife //////////////////////////////////
WHILE (I_Start = True) DO
FOR i:= 1 TO n BY 1 DO
IF (FP = True) THEN
L_Wert:=(I_Wert+L_Wert);
END_IF;
END_FOR;
O_Mittelwert:=(L_Wert/n)
i:=0
END_WHILE;
END_FUNCTION_BLOCK
Vielen Dank im Voraus und einen schönen Abend noch;-)
Mikraka