Fb in SCL

Werner1

Level-1
Beiträge
48
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich bin scl Neuling habe vorher mit CoDeSys gearbeitet. Ich wollte ein Fb mehrmals aufrufen wie ich es auch in codesys mache, dieses funktioniert aber leider nicht in scl. Ich hoffe ihr könnt mir sagen wo der Fehler liegen könnte. Hier mal mein Programm



ORGANIZATION_BLOCK OB1
VAR_TEMP
// reserviert
info : ARRAY[0..19] OF BYTE;
// temporäre Variablen
Flanken_merker : BOOL;
END_VAR
BEGIN
Flanke := M100.1 AND NOT Flanken_merker;
Flanken_merker := M100.1;

//----1 Aufruf------

FB1.DB3(AUF :=AUF // IN: BOOL
,AB :=AB // IN: BOOL
);
Fuellstand:= DB3.Fuellstand; // OUT: INT

//----2 Aufruf------
FB1.DB4(AUF :=AUF_1 // IN: BOOL
,AB :=AB_1 // IN: BOOL
);
Fuellstand_1:= DB4.Fuellstand; // OUT: INT

;
END_ORGANIZATION_BLOCK

----------------------------------------------------------------
FUNCTION_BLOCK FB1
VAR_INPUT
// temporäre Variablen

AUF: BOOL;
AB: BOOL;
END_VAR
VAR_OUTPUT
// statische Variablen
Fuellstand :INT;
END_VAR
begin
CTUD.DB2(CU := AB AND Flanke // IN: BOOL
,CD :=AUF AND Flanke // IN: BOOL
// ,R := // IN: BOOL
// ,LOAD := // IN: BOOL
// ,PV := // IN: INT
);
// := DBxxx.QU; // OUT: BOOL
// := DBxxx.QD; // OUT: BOOL
Fuellstand:= DB2.CV; // OUT: INT

;
END_FUNCTION_BLOCK


Nun habe ich folgendes Problem das Fuellstand1 und Fuellstand2 immer den gleichen Wert haben.
Wäre für eine Antwort sehr dankbar!!!

Danke​
 
ORGANIZATION_BLOCK OB1
VAR_TEMP
// reserviert
info : ARRAY[0..19] OF BYTE;
// temporäre Variablen
Flanken_merker : BOOL;
END_VAR​
[OT] Täglich grüßt das Murmeltier [/OT]

Hallo Werner,
dein Flanken_merker sollte eine Statische Variabel sein.

PS: Das mit dem Murmeltier hat nichts mit dir zu tun. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider ist es nicht zulässig eine statische Variable in ein OB zu benutzen.

Bei Aufruf eines FB´s funktioniert der Fuellstand tadellos. Nur beim Aufruf des zweiten FB´s ist der Fuellstand_1 immer gleich Fuellstand 1.
Also kann das Programm die beiden FB´s nicht unterscheiden und gibt immer den selben Wert aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
An den Merker liegt es glaub ich auch nicht, weil ja bei ein Aufruf des FB's ja tadellos funktioniert. Ich gehe davon aus das etwas mit dem Aufruf des FB's nicht passt, eventuell DB falsch oder so. Habe aber auch schon einmal andere DB's dafür eingesetzt.
 
Hallo Werner,

so müsste es funktionieren:
Du legst den Baustein CTUD in den statischen Bereich des FB1, somit wird dein FB1 zur Multiinstanz und die Daten liegen dann jeweils im DB3 und DB4:

Du weißt was ich meine wie das geht mit dem Aufruf?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FUNCTION_BLOCK FB1
VAR_INPUT
AUF: BOOL;
AB: BOOL;
END_VAR

VAR_OUTPUT
Fuellstand :INT;
END_VAR

VAR
CTUD : SFB2;
End_var

begin
CTUD(CU := AB AND Flanke // IN: BOOL
,CD :=AUF AND Flanke // IN: BOOL
// ,R := // IN: BOOL
// ,LOAD := // IN: BOOL
// ,PV := // IN: INT
);
// := DBxxx.QU; // OUT: BOOL
// := DBxxx.QD; // OUT: BOOL
Fuellstand:= DB2.CV; // OUT: INT

;
END_FUNCTION_BLOCK


Ich hab den FB jetzt so geändert, aber nun zählt er überhaupt nicht. Ich vermute dass, das DB2 bei CV Probleme macht.
 
Ich hab den FB jetzt so geändert, aber nun zählt er überhaupt nicht. Ich vermute dass, das DB2 bei CV Probleme macht.
Hast du den DB3 / DB4 neu generiert und übertragen?
Sprich den Aufruf vom FB1 erneuert.
Die DB's müssen frisch erzeugt werden da sie ja jetzt das Gedächnis vom CTUD mit übernehmen müssen.
 
Und wenn es dann immer noch nicht geht würde ich den Füllstand des FB1 mal auf den IN_OUT legen.

Letzter Schritt dann für mich: Ich müsste es selber probieren. ;)
 
Danke jetzt läuft es.
Gibt es eigentlich eine Schnellauswahl der Variablen oder müssen diese immer per Hand eingegeben werden. Bei Codesys geschieht dies unter F2
 
Zurück
Oben