Twincat V2.x Programm oder FB erstellen

shrimps

Level-1
Beiträge
422
Reaktionspunkte
49
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
nach dem ich nun recht viel ausprobiert habe, ergibt sich eine Frage:

Ist es ein Unterschied ob ich meine "Teilprogramme" als Programm oder als FB schreibe ?

Mein letzter Stand war, das ein FB lediglich den Vorteil einer Instanzierung und daher mehrfacher Gebrauch darstellt !?

Wenn ich nur einmal eine Sache benötige, so bietet sich doch ein Programmsegment an oder ?

Allerdings habe ich seit gestern seltsame Phänomene bei meiner BC9000 festgestellt und bin mir nun nicht mehr sicher
ob ich das richtig verstanden habe.

Kann es sein, das die "einzelnen" Programme ein total anderes Ablaufschema zeigen als wenn ich einen FB erzeuge ?

GGf. stelle ich alsbald einen Codeausschnitt hier rein um mal eine Expertenmeinung zu bekommen...

Danke
Shrimps
 
Jop der größte Unterschied zw. einem Programm und einen Funktionsblock ist die Instanzierbarkeit. Ein Programm kannst du global im ganzen Projekt aufrufen (außer in Funktionen). Bei Mehrfach-Aufrufen werden die Werte im Programm immer überschrieben.

Was du nun einsetzt ist größtenteils Geschmackssache. Ich kenne Projekte die aus vielen Programmen bestehen. Nicht mein Geschmack, aber man kann es machen. Ich habe idR nur ein Programm pro Task und arbeite von da aus mit Funktionsblöcken, auch wenn es nur eine Instanz davon gibt.
 
Hallo,
besten Dank für die Antworten.
Dann lag ich ja richtig...
Ist also nur eine Frage der Vorlieben...

@georg28:
Du liegst leider falsch: Ein Programm kann genau wie ein FB arbeiten und exakt alles identisch machen, also var_in_out, var_in, var_out etc.
Das war unter anderem eines meiner Probleme: Eine reine Funktion kann nur einen Rückparameter liefern !


Dann gehts also weiter...

Bye
Shrimps

Nachfolgend der Code eines kleines Programms welches ich nicht als Funktion hinbekommen hatte...

Code:
PROGRAM FoerderTakt
VAR_INPUT
    rProzent        : REAL    := 50;        (* Max benötigte Leistung 50-100 *)
    rSollMenge        : REAL;                (* Vorgabe der Foerdermenge *)
END_VAR
VAR_TEMP
    rBrennwert         : REAL     := 4.8;        (* KWh / Kg *)
    rKW                : REAL    := 16.0;    (* Max Brennerleistung *)
    rSchnecke_pro_h    : REAL     := 19500;    (* Wieviel g pro h fördert die Schnecke *)
    rObergrenze_s    : INT     := 36;        (* Maximale Laufzeit pro Takt bei 100% in 1/10s *)
    rMaxSekunden    : REAL;                (* Wieviel Sekunden Summe Förderdauer *)
    iArbeitstakt    : INT;
    iPausenTakt        : INT;
    rTakte            : REAL;
END_VAR
VAR_OUTPUT
    tArbeitstakt    : TIME;
    tPausenTakt        : TIME;
END_VAR

rMaxSekunden     := (rKW * 3600 * 1000 * rProzent) / (rBrennwert * rSchnecke_pro_h * 100);

iArbeitstakt     := REAL_TO_INT(rObergrenze_s * rProzent / 100);

rTakte             := rMaxSekunden * 10 / iArbeitstakt;

iPausenTakt     := REAL_TO_INT((36000 / rTakte ) - iArbeitstakt);

tArbeitstakt     := INT_TO_TIME(iArbeitstakt * 100);

tPausenTakt        := INT_TO_TIME(iPausenTakt * 100);

IF rSollMenge > 0 THEN
    tArbeitstakt := REAL_TO_TIME(3600 * rSollMenge / rSchnecke_pro_h) * 1000;
END_IF


############### Aufruf in einem anderen Programmteil: ##################
CASE Schritt OF

brenner_init:;

    FoerderTakt(rProzent:= 100,
                rSollMenge:= 60,
                tArbeitstakt=>tFoerderZeit1 ,
                tPausenTakt=> );

############ etc #########
 
Der Zugriff auf ein PRG ist von überallher möglich. Nicht nur sein Aufruf, sondern auch der Zugriff auf die VAR_INPUT/OUTPUT-Schnittstelle. Beim FB ist der Zugriff dagegen auf die instanziierende POU beschränkt, für mich die bessere Variante.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachfolgend der Code eines kleines Programms welches ich nicht als Funktion hinbekommen hatte...

Das liegt sicherlich daran, dass du verschiedene deiner im TEMP-Bereich deklarierten Variablen eigentlich als Konstanten verwendest. Du kannst in einer Funktion (wegen dem fehlenden Gedächtnis / Instanz) keine Variablen mit einem Wert vorbelegen. Du deklarierst diese Variablen also entweder als Konstanten oder du weißt sie am Code-Anfang mit dem gewünschten Grundwert zu - oder machst dir einen FB ...

Gruß
Larry
 
Hallo Larry,
so ganz verstanden habe ich das nicht:
mein Proggie funktioniert ja einwandfrei.
Ein Gedächtniss brauche ich ja nicht...
Und als Funktion geht es doch nicht, weil ich ja zwei Rückgabewerte benötige ?!
Oder bringt es technisch einen Unterschied ob ich die Vorgaben als Constant definiere ?

LG
Shrimps
 
Code:
VAR_TEMP
    rBrennwert         : REAL [COLOR=#FF0000]    := 4.8;  [/COLOR]      (* KWh / Kg *)
    rKW                : REAL    [COLOR=#FF0000]:= 16.0; [/COLOR]   (* Max Brennerleistung *)
    rSchnecke_pro_h    : REAL     [COLOR=#FF0000]:= 19500; [/COLOR]   (* Wieviel g pro h fördert die Schnecke *)
    rObergrenze_s    : INT    [COLOR=#FF0000] := 36;  [/COLOR]      (* Maximale Laufzeit pro Takt bei 100% in 1/10s *)
    rMaxSekunden    : REAL;                (* Wieviel Sekunden Summe Förderdauer *)
    iArbeitstakt    : INT;
    iPausenTakt        : INT;
    rTakte            : REAL;
END_VAR

... ich meinte das rot markierte ...
Wenn du diesen Baustein als Funktion erstellen wolltest dann würde das nicht funktionieren - das müßten dann Konstanten sein.

Ich bezog mich auf deine Aussage, dass du den Code nicht als Funktion hinbekommen hattest (wie zitiert).

Gruß
Larry
 
Zurück
Oben