Wertetabelle erstellen

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich ich möchte eine wertetabelle erstellen. Habe eine Formel, an dieser soll nach jeder Berchnung ein wert um 1 erhöt werden. Das ergebinis soll in eine Array INT gespeichert werden. Es sollten ca 100 werte sein.

Mein Problem ist das ich nur FUP behersche. Gibt es da einen Baustein ?
Oder muss ich mit in AWL einen schreiben ? Wenn ja wie ?

 
In FUP ist das kaum möglich.
In AWL geht es.
Ich würde es in SCL lösen. Damit ist es deutlich einfacher als in AWL.

Gruß
Dieter
 
Mit SCl erstelltst du normale Bausteine, also FC oder FB. Die damit erstellten Bausteine kannst du ganz normal von FUP,KOP oder sonst was aufrufen und mit Parametern versehen.

Gruß
Dieter
 
Hallo habe einen scl erstelle. Leider funtioniert es nicht wenn die sps Anlauft. Kann es am array liegen ?
Rote Funktionen sind die einselnen Punkte um einen Graf zu erstellen.

Meine Berechnung geht aber nicht das übertragen der einzelnen Punktie in das Array


Hier mal das SCL
FUNCTION FC001 : INT

(*********************************************************
Lineare Funktion F(y)= m*x+b
***********************************************************)
VAR_INPUT
Y1 : INT;
X1 : INT;
Y2 : INT;
X2 : INT;
Ausentemp : REAL;

END_VAR

VAR_OUTPUT
Fy : REAL;
Wertetabelle : ARRAY [0..40] OF INT;


END_VAR

VAR
Y1R : REAL;
X1R : REAL;
Y2R : REAL;
X2R : REAL;
i :INT;
iR : REAL;
Ergebnis: REAL;

END_VAR

BEGIN

Y1R :=INT_TO_REAL (Y1);
X1R :=INT_TO_REAL (X1);
Y2R :=INT_TO_REAL (Y2);
X2R :=INT_TO_REAL (X2);


Fy:= (Y2R - Y1R)/(X2R - X1R)* Ausentemp +(Y1R - ((Y2R - Y1R)/(X2R - X1R))*X1R);


FOR i := 18 TO 100 BY +2 DO
Wertetabelle := i ;
iR :=INT_TO_REAL (i);
Ergebnis:= (Y2R - Y1R)/(X2R - X1R)* (iR+Y1R) +(Y1R - ((Y2R - Y1R)/(X2R - X1R))*X1R);
Wertetabelle :=REAL_TO_INT (Ergebnis);


END_FOR;


FC001 := 100;

END_FUNCTION

Hier der OB1
 

Anhänge

  • ob1.JPG
    ob1.JPG
    29,3 KB · Aufrufe: 19
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
das einzige was mir auf die schnelle auffällt, ist, dass deine FOR Schleife Grösser ist als dein Array.
Dein Array geht bis 40, deine Schleife bis 100.
Somit schreibst du über dein Array hinaus..

Gruss Andi
 
Da du dein Array als Out deklarierst, mußt du darauf achten, alle Elemente zu beschreiben. Die Elemente, die von deiner Schleife gar nicht beschrieben werden, sind undefiniert und können alle beliebigen Werte annehmen. Es macht also sinn, das Array entweder vorab mit 0 (oder einem anderen Wert) zu befüllen oder in der Schleife alle Elemente von 0 bis 40 zu berechnen und in das Array einzutragen. Ansonsten gilt natürlich, was im vorigen Beitrag bereits gesagt wurde, das Array ist zu kurz.

PS: wenn die Array-Elementt nicht unbedingt bei den Werten I-Werten liegen müssen, könnte man mit 2 Indizees arbeiten, einen für das Beschreiben des Arrays (0-40) und einen für die Berechnung (18-100 in Zweierschritten).
 
Zuletzt bearbeitet:
Hallo der Fehler mit der Array von 18 bis 100 habe ich vergessen zu ändern. Hatte erst 0-40 und als BY +1
Hat aber auch nicht funktoniert.

Wie beschreibe ich das komplette Array.

So habe ich es jetzt

FUNCTION FC001 : INT

(*********************************************************
Lineare Funktion F(y)= m*x+b
***********************************************************)
VAR_INPUT
Y1 : INT;
X1 : INT;
Y2 : INT;
X2 : INT;
Ausentemp : REAL;

END_VAR

VAR_OUTPUT
Fy : REAL;
Wertetabelle : ARRAY [0..40] OF INT;


END_VAR

VAR
Y1R : REAL;
X1R : REAL;
Y2R : REAL;
X2R : REAL;
i :INT;
iR : REAL;
Ergebnis: REAL;
END_VAR

BEGIN

Y1R :=INT_TO_REAL (Y1);
X1R :=INT_TO_REAL (X1);
Y2R :=INT_TO_REAL (Y2);
X2R :=INT_TO_REAL (X2);


Fy:= (Y2R - Y1R)/(X2R - X1R)* Ausentemp +(Y1R - ((Y2R - Y1R)/(X2R - X1R))*X1R);


FOR i := 0 TO 40 BY +1 DO
Wertetabelle := i ;
iR :=INT_TO_REAL (i);
Ergebnis:= (Y2R - Y1R)/(X2R - X1R)* (iR+Y1R) +(Y1R - ((Y2R - Y1R)/(X2R - X1R))*X1R);
Wertetabelle :=REAL_TO_INT (Ergebnis);

END_FOR;


FC001 := 100;

END_FUNCTION


Kann mir jemand einfüge was geändert werden muss??
 
Zuletzt bearbeitet:
ich woll doch erst das array mit 0 füllen ? das fehlt doch noch ?

Du hast doch jetzt die Anzahl der Schleifendurchläufe auf die Größe des Arrays korrigiert. Also werden auch alle Array-Elemente beschrieben.
Ob das nun jetzt programmiertechnisch sinnvoll ist oder nicht musst du schon selber wissen.

Ich würde auch mit Konstanten arbeiten, dann kommt man nicht mit den Array Indizes in Konflikt.
Also zum Beispiel ganz oben eine Konstante definieren:
Code:
CONST
    ARR_MAX := 40;
END_CONST

und dann bei VAR_OUTPUT
Code:
Wertetabelle : ARRAY [0..ARR_MAX] OF INT;
und in der For-Schleife
Code:
FOR i := 0 TO ARR_MAX BY +1 DO
 
Deinen Tip mit der Const werde ich noch umsetzen. Kannsz du mir nur kurz erklären für was das mit der const gut ist ? Habe noch keine erfahrung mit SCL
 
Deinen Tip mit der Const werde ich noch umsetzen. Kannsz du mir nur kurz erklären für was das mit der const gut ist ? Habe noch keine erfahrung mit SCL

Const ist eine Konstante, im gegensatz zu Variablen kann dieser Wert wenn das Programm läuft nicht mehr verändert werden.
Genau genommen wird beim Übersetzungsprozess alle Vorkommen von 'ARR_MAX' durch den entsprechenden Zahlenwert, in diesem Falle '40' ersetzt.

Hat den Vorteil, dass wenn du dein Array mal vergrößern willst, du nur an einer Stelle den Zahlenwert anpasst und dann automatisch der Funktionsparameter und die Anzahl der Schleifendurchläufe (oder wo man das sonst noch einsetzen kann) angepasst werden.
 
Zurück
Oben