bkizilkaya
Level-1
- Beiträge
- 93
- Reaktionspunkte
- 1
FUNCTION_BLOCK "Baustein_1"
VERSION : 0.1
VAR_INPUT
schalter_0 : Bool;
schalter_1 : Bool;
schalter_2 : Bool;
schalter_3 : Bool;
END_VAR
VAR_OUTPUT
ausgang_0 : Bool;
ausgang_1 : Bool;
ausgang_2 : Bool;
ausgang_3 : Bool;
besetzt : Bool;
END_VAR
VAR
Schalterzustände { S7_HMI_Visible := 'False'} : Array [0 .. 3] of Bool;
END_VAR
VAR_TEMP
x : Int;
y : Int;
END_VAR
BEGIN
// Schalterzustände ins Array abspeichern
#Schalterzustände [0] := #schalter_0;
#Schalterzustände [1] := #schalter_1;
#Schalterzustände [2] := #schalter_2;
#Schalterzustände [3] := #schalter_3;
WHILE #y <> 2 DO
FOR #x := 0 TO 3 BY 1 DO
IF #Schalterzustände[#x] = 1 THEN
#y := #y + 1;
END_IF;
END_FOR;
END_WHILE;
IF #y = 2 THEN
#besetzt := 1;
END_IF;
// Ausgänge definieren
#ausgang_0 := #Schalterzustände [0];
#ausgang_1 := #Schalterzustände [1];
#ausgang_2 := #Schalterzustände [2];
#ausgang_3 := #Schalterzustände [3];
END_FUNCTION_BLOCK
Das war wohl hier (mit Vorspiel "2 aus 4" bis Post #30) und mit der LOGO! m.M.n. etwas schwieriger bzw. nur mit Kompromissen umzusetzen.Guten Tag Forum
In einem Thread in eurem Forum habe ich eine Spannende Aufgabe gesehen. Ich weiss leider nicht mehr wo es ist, deshalb kann ich euch den Link angeben.
Ich habe 5 Ausgänge und 5 Schalter.
Die Ausgänge funktionieren Abhängigkeit von den Schaltern
es dürfen nur immer 2 Leuchten d.h. wen
wenn ich jetzt zum Beispiel Schalter 1 betätige und Schalter 2 betätige dann sollten die beiden Ausgänge leuchten, aber wenn ich jetzt Schalter 3 Betätige dann darf mir der Ausgang 3 nicht leuchten, weil schon 2 betätigt sind. Wenn ich jetzt zum Beispiel Schalter 1 deaktiviere dann leuchtet automatisch der Ausgang 3, weil es ja in der Warteschlange zu Oberst war.
Ja!sein oder hab ich was vergessen? Irgendwie kommt es mir so vor als würd ich was hier nicht richtig kapieren....
FUNCTION_BLOCK Stabel_Puffer_2_von_5
[COLOR=#333333]
VAR_INPUT
Schalter_1 : BOOL ;
[/COLOR][COLOR=#333333] Schalter_2 : BOOL ;
[/COLOR][COLOR=#333333] Schalter_3 : BOOL ;
[/COLOR][COLOR=#333333] Schalter_4 : BOOL ;
[/COLOR][COLOR=#333333] Schalter_5 : BOOL ;
[/COLOR][COLOR=#333333]END_VAR
VAR_OUTPUT
Lampe_1 : BOOL ;
[/COLOR][COLOR=#333333] Lampe_2 : BOOL ;
[/COLOR][COLOR=#333333] Lampe_3 : BOOL ;
[/COLOR][COLOR=#333333] Lampe_4 : BOOL ;
[/COLOR][COLOR=#333333] Lampe_5 : BOOL ;[/COLOR][COLOR=#333333]
END_VAR
VAR_TEMP
i , j : INT ;
Plaziert , Entfernt : BOOL ;
END_VAR
VAR
[/COLOR][COLOR=#333333] Stabel : ARRAY[1..5] of INT ; [/COLOR][COLOR=#333333]// Stabelpuffer mit 5 Ebenen. [/COLOR][COLOR=#333333]
[/COLOR][COLOR=#333333] Schalter_Zustand : ARRAY[1..5] of BOOL ;[/COLOR][COLOR=#333333]
Schalter_Flanke : ARRAY[1..5] of BOOL ;
[/COLOR][COLOR=#333333] Schalter_Flanke_Speicher : ARRAY[1..5] of BOOL ;[/COLOR][COLOR=#333333]
[/COLOR][COLOR=#333333] Lampe_Zustand : ARRAY[1..5] of BOOL ;[/COLOR][COLOR=#333333]
END_VAR
[/COLOR][COLOR=#333333]//Wenn eine Schalter aktiviert wird,
[/COLOR][COLOR=#333333]Schalter_Zustand[1] := Schalter_1 ;[/COLOR][COLOR=#333333]
[/COLOR][COLOR=#333333]Schalter_Zustand[2] := Schalter_2 ;
[/COLOR][COLOR=#333333]Schalter_Zustand[3] := Schalter_3 ;
[/COLOR][COLOR=#333333]Schalter_Zustand[4] := Schalter_4 ;
[/COLOR][COLOR=#333333]Schalter_Zustand[5] := Schalter_5 ;
[/COLOR][COLOR=#333333]
[/COLOR][COLOR=#333333]FOR i:=1 TO 5 BY 1 DO
[/COLOR][COLOR=#333333]Schalter_Flanke[i] := [/COLOR][COLOR=#333333]Schalter_Zustand[i] AND NOT [/COLOR][COLOR=#333333]Schalter_Flanke_Speicher[/COLOR][COLOR=#333333][i] ;
[/COLOR][COLOR=#333333] Schalter_Flanke_Speicher[/COLOR][COLOR=#333333][i] := [/COLOR][COLOR=#333333]Schalter_Zustand[i] ;
[/COLOR][COLOR=#333333] IF [/COLOR][COLOR=#333333]Schalter_Flanke[i] THEN
[/COLOR][COLOR=#333333]// [/COLOR][COLOR=#333333]wird das dazugehörige Nummer zu den ersten freien Ebene hingefügt.[/COLOR][COLOR=#333333]
Plaziert := FALSE ;
[/COLOR][COLOR=#333333] FOR j:=1 TO 5 BY 1 DO
IF Stabel[j]=0 AND NOT Plaziert THEN
[/COLOR][COLOR=#333333]Stabel[j] :=i ;
[/COLOR][COLOR=#333333] Plaziert := TRUE ;
END_IF ;
END_FOR ;
END_IF ;
END_FOR ;
[/COLOR]
[COLOR=#333333]// Wenn eine Schalter deaktiviert wird, wird es von den Puffer entfernt, und die Werte in die obere Ebenen fallen einen Ebene runter.
[/COLOR][COLOR=#333333]FOR i:=1 TO 5 BY 1 DO[/COLOR]
[COLOR=#ff0000](*
Nun habe ich kein Zeit mehr.
Aber ich denke du kapierst den Idee.
*)[/COLOR]
[COLOR=#333333]// Nur Ebenen 1 und 2 aktiviert eine Lampe.[/COLOR]
Lampe_Zustand[1] := FALSE ;[COLOR=#333333]
[/COLOR]Lampe_Zustand[2] := FALSE ;
Lampe_Zustand[3] := FALSE ;
Lampe_Zustand[4] := FALSE ;
Lampe_Zustand[5] := FALSE ;[COLOR=#333333]
[/COLOR]Lampe_Zustand[Stabel[1]] := TRUE ; [COLOR=#ff0000]// Hier fehlt es ein abfangen von wenn eine ebene Leer ist (Stabel[1] = 0)[/COLOR]
Lampe_Zustand[Stabel[2]] := TRUE ;
Lampe_1 := Lampe_Zustand[1] ;
Lampe_2 := Lampe_Zustand[2] ;
Lampe_3 := Lampe_Zustand[3] ;
Lampe_4 := Lampe_Zustand[4] ;
Lampe_5 := Lampe_Zustand[5] ;
END_FUNCTION_BLOCK
Nein brauchst du nicht.und jetzt beim deaktivieren muss ich halt die negative flanke auswerten.
// Puffer eintrag löschen
FOR #x:=1 TO 5 BY 1 DO
IF #Schalter_zustand[#x] = 0 THEN
// wird die Schalter_ID in der entsprechenden Zelle gelöscht und die eins höhere Zelle wird dann verschoben in die tiefste Zelle
#Entfernt := false ;
FOR #y:=1 TO 5 BY 1 DO
IF #Puffer[#y] < 0 AND NOT #Entfernt THEN
#Puffer[#y] := #Puffer[#y + 1] ;
#Entfernt := TRUE ;
END_IF ;
END_FOR ;
END_IF ;
END_FOR ;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?