ST Programmierung FB-aufruf

Bambam

Level-1
Beiträge
60
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich habe ein Problem mit dem Aufruf eines von mir programmierten Funktionsbaustein und brauche etwas Hilfe.

Den Quelltext habe ich zur besseren Übersicht stark verkürzt und nur das Wesentlichen drinnen gelassen.

Funktionsbeschreibung:
Wenn bVarX eingeschaltet ist, dann werden die anderen Bedingungen geprüft. Trifft eine zu wird der entsprechende Parameter an den FB übergeben.
Schalte ich nun bVarX ab, bleibt alles im FB so wie es zuletzt übergeben wurde.
Schreibe ich eine ELSE Bedinung wo ich die Werte für den FB wieder zurück setze, dann kann ich diese nicht mehr weiter anfassen. Die haben dann immer den Wert, weil bVarX in dem Fall immer FALSE wäre und immer die ELSE Bedingung zutrifft.
Jedoch möchte ich mit der Bedingung bVarY die Werte wieder verändern können.

Ich habe schon einiges ausprobiert aber irgendwie schaue ich gerade auf meinen Quelltext wie ein Schwein ins Uhrwerk. :confused:


Code:
fbFunktionsbaustein(rIstWert := rIstWertUnten , rSollWert:= rSollWertZpr);

bVarHNB    := fbFunktionsbaustein.bVarout;    
bVarHSB    := fbFunktionsbaustein.bVarout;    

bA12_SS1 := bHSB;
bA13_SS2 := bHSB;

bA14_SN1 := bHNB;
bA15_SN2 := bHNB;

 


IF    bVarX    THEN
    
        IF    ....   THEN
            IF  ....   THEN
                rSollWertZpr:= rSollWertTag;
            END_IF
            IF    ....   THEN                                     
                rSollWertZpr:= rSollWertNacht;              
            END_IF
        END_IF

        IF    ... THEN
            IF    ... THEN
                rSollWertZpr:= rSollWertTag;                
            END_IF
            IF    ... THEN
                rSollWertZpr:= rSollWertNacht;
            END_IF
        END_IF

        IF   ...   THEN
            rSollWertZpr:= rSollWertWE;                    
        END_IF
    END_IF


rIstSollDiff := rSollWertManuell - rIstWertUnten;

    IF    bVarYTHEN                              
        IF    bHNBAktiv    THEN
            bHNB := TRUE;
            IF    rIstSollDiff <= 0    THEN
                bHNB := FALSE;       
            END_IF
        ELSE
            bHNB := FALSE;
        END_IF

        IF    bHSBAktiv    THEN
            bHSB := TRUE;
       
            IF    rIstSollDiffManuell <= 0    THEN
                bHSB := FALSE;
            END_IF
        ELSE
            bHSB := FALSE;
        END_IF
    END_IF
Vielen DANK im Voraus.
 
Beim Formulieren meiner Frage ist meine Idee gekommen wie ich es noch lösen könnte. Ich hab mir das wie folgt überlegt:

Code:
fTrigTest(CLK:=bVarX);

IF fTrigTest.Q THEN
setze alles zurück
END_IF
Joa und es hat funktioniert.
Vielleicht hat ja noch jemand eine Idee wie man das ganze noch etwas eleganter lösen kann.

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
deine Problem-Beschreibung war für mich ein bißchen Kuddel-Muddel - sorry ...
Was ich aber da rausgelesen habe :
Es gibr nicht nur IF ... THEN und dann ELSE sondern es gibt auch ein ELS_IF. Du mußt dabei natürlich berücksichtigen, dass es trotzdem mit dem IF verriegelt ist. Wenn du aber machen willst :
Code:
IF myBool_1 then  
   tue dies
ELS_IF myBool_2 then
   tue jenes
ELSE
   tue ansonsten
EMD_IF ;
... dann wäre das ggf. deine Lösung.

Sehr schön ist aber auch noch die SELECT CASE - Geschichte ... das paßt aber eigentlich nicht zu BOOL's ...

Gruß
Larry
 
Sorry für meine verworrene Beschreibung, aber ich bin dir sehr dankbar für deine Antwort.

Das ganze mit Select Case hatte ich mir auch überlegt. Jedoch erschien es mir in diesem Fall etwas unpraktikabel, da ich mit den IF Bedingungen zuersten den Wochentage und anschließend die Uhrzeit (bzw. ein Zeitfenster) prüfe. Ich verwende Select Case meistens nur für Schrittketten.

Danke nochmal.


Viele Grüße
 
Naja ... für diese Sache würde sich m.E. das CASE-Konstrukt auch eignen. Im Ergebnis kommt aber nichts anderes, wie bei der IF-Geschichte dabei heraus - es ist also mehr eine Geschmackssache ... ;)

Gruß
Larry
 
Zurück
Oben