Hilfe Funktionsaufruf IF Funktion !!

elektrowurm

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo

Ich murxe mittlerweile seit ein paar Monaten immer wieder kleiner Programme für die Wago 750 zusammen. Klappt auch schon ganz gut, nur jetzt komm ich nicht mehr weiter .

Aufgabe: Über Einen Boolschen wert eine Rechnung auslösen ( 1x Division und 1x Multiplikation ) und gut is :) ich bings aber nicht zum laufen :-(

Lösungsansatz von mir:

Funktion erstellt
und diese von einem Funktion Block aufrufen lassen

Inhalt
Funkion in FUP

wert1------/ DIV /-----------/ MUL /-----wert raus
wert2------/____/......100---/____ /



das ganze soll von dem ausgelöst werden
Funktion Block in ST

IF uerbernahme=TRUE
THEN rechnung();
END_IF;

frage warum geht es nicht ?? und was müsste in den () stehen ??

ich hoffe ihr habt mich verstanden und könnt mir helfen :s18:

mfg
Michi
 
Zuletzt bearbeitet:
Hi

Toll funktioniert einwandfrei :) :TOOL::TOOL:
DANKE !!!

Aber noch mal ne frage wie spreche ich dann einen Funktionsbock an wenn der z.b in FUP ist ????

mfg
Michi
 
In der Variablendeklaration deines Funktionsblocks definierst Du Ein- und Ausgangsvariablen. Diese werden dann beim Aufruf von Dir beschrieben bzw. bekommst Du von der Funktion zurück.

Bsp.:

FUNCTION_BLOCK Multiplikation

VAR_INPUT
Faktor_1:WORD;
Faktor_2:WORD;
END_VAR

VAR_OUTPUT
Ergebnis:WORD;
END_VAR

Im Variablendeklarationsbereichs des Baustein definierst Du Ein- und Ausgangsvariablen. Dann programmierst Du den Baustein nach Deinen Vorstellungen mit den definierten Variablen. Zum Beispiel:

Ergebnis := Faktor_1 * Faktor_2;

Beim Aufruf des Bausteins übergibst Du deine globalen Variablen an die Lokalvariablen des aufgerufenen Bausteins. In etwa so:

Multiplikation(Faktor_1:=erste_Zahl, Faktor_2:=zweite Zahl, Ergebnis=>Ergebnis_Mul )

Die Variablen "erste_Zahl", "zweite_Zahl" und "Ergebnis_Mul" hast Du natürlich global schon deklariert. :)
Es ist beim Aufruf meines Wissens nicht relevant in welcher Sprache die Funktion/der Funktionsblock geschrieben ist.
 
hi
Danke für deine Bemühungen.
Ich steig da noch nicht ganz durch beim Baustein Aufruf
habe ich folgendes verwendet
Code:
rechnung();
(das funst aber nicht )

da ich ja in dem Baustein nur mit Globalen-variablen arbeite.
Wenn ich jetzt dein Beispiel verwende muss ich Globale Variablen und interne Variablen anlegen oder ist das ein muss???
wenn das so wäre kann es ja mal sein das ich da 20 oder mehr Variablen eintragen muss


mfg
Michi :ROFLMAO:

P.s Cool neue Forenoptik:TOOL:
 
Zuletzt bearbeitet:
Ein FB muss im Programm deklariert im Code aufgerufen werden.

Angenommen du erstellst einen Baustein "Rechnung":
Baustein:
Code:
FUNCTION BLOCK Rechnung
VAR_INPUT
   Wert1 : REAL;
   Wert2 : REAL;
   Ergebnis : REAL;
END_VAR
VAR_OUTPUT
END_VAR
-------------------
Ergebnis  := Wert1  * Wert2 ;

Im Programm dann:
Code:
VAR
   myRechnung : Rechnung;  (* Deklaration des FB *)
   ErgebnisProgramm: REAL;
   Zahl1: REAL;
   Zahl2: REAL;
END_VAR
---------------
myRechnung(Wert1:= Zahl1,Wert2:= Zahl2, Ergebnis => ErgebnisProgramm);    (* Aufruf des FB *)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was denn nu?

Hallo,

Function oder Funtions Block
elektrowurm schrieb:
Ja
Rechnung soll ne Funktion sein aber ich weiß nicht was ich (da) rein schreiben soll??
Also erstmal so ganz im allgemeinen, inherhalb eines FBs oder einer Function sollten schon mal gar keine Globalen Variablen verwendet werden.

Und wenn wir jetzt mal bei einer Function bleiben (alles andere macht hier mal keinen Sinn). da kannst du ja mal ganz gepflegt die Standard Operanden MUL & DIV verwenden.
Hier mal in FUP:
Rechnung.jpg


Wenn du dir jetzt immer noch eine eigene Function schreiben möchtest, musst Du dir auf jeden Fall mal Eingänge declarieren, an denen Du die Werte für die Berechnung übergibst.
Dass könnte dann so aussehen:
Code:
FUNCTION Rechnung : REAL
VAR_INPUT
 i_Zahl1  :REAL;
 i_Zahl2  :REAL;
 i_Operation :BYTE; (*bestimmt die Rechenoperation:
      0 = Multiplizieren,
      1 = Dividieren
      2 = Addieren
      3 = Subtrahieren *)
END_VAR
(*Implementierung*)
CASE i_Operation OF
 0: Rechnung:=i_Zahl1*i_Zahl2;
 1: IF i_Zahl2 > 0 THEN
       Rechnung:=i_Zahl1/i_Zahl2;
    END_IF
 2: Rechnung:=i_Zahl1+i_Zahl2;
 3: Rechnung:=i_Zahl1/i_Zahl2;
END_CASE
Inklusive der Auswahl für die Rechenoperation und nem Schutz gegen "Division by zero". Irgend nen Sinn muß es ja haben.


Im Programm könnte der Aufruf dann so aussehen (FUP):
RechnungFun.jpg
oder so in ST:
Code:
ErgebnisMul:=Rechnung(Wert1,Wert2,0);
ErgebnisDiv:=Rechnung(Wert1,Wert2,1);
ErgebnisAdd:=Rechnung(Wert1,Wert2,2);
ErgebnisSub:=Rechnung(Wert1,Wert2,3);

Aber wenn du eine eigene Function schreibst mußt du dich auf Datentypen festlegen (im Bsp: REAL). Die Standard operanden sind kompatible mit allen nummerischen Datentypen.
 
Zuletzt bearbeitet:
Zurück
Oben