TIA SR bzw. RS Glied nach IEC in SCL

SPS_Step

Level-2
Beiträge
88
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Ich soll einen Code von einer alten Steuerung (Sucosoft S40) nachbilden. Dieser ist in AWL:

Code:
LD  Input_1
S    Output_1

LDN  Input_2
R    Output_1

Ich wollte zur Sicherheit einmal nachfragen, ob ich mit dieser Lösung richtig liege (SCL Anfänger, sonst nur FUP):

SR-Glied:

Code:
IF
Input_1 // Taster Start
THEN
Output_1 := TRUE // Motor Ein
ELSIF
NOT Input_2 // Taster Stopp
THEN
Output_1 := FALSE // Motor Aus
END_IF;

Wäre der Code so richtig übertragen?

____________________________________________________________________________________________

Und stellt dieser Code dann das Gegenstück, das RS-Glied da?

RS-Glied:

Code:
IF
NOT Input_2 // Taster Stopp
THEN
Output_1 := FALSE // Motor Aus
ELSIF
Input_1 // Taster Start
THEN
Output_1 := TRUE // Motor Ein
END_IF;


Vielen Dank!

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und wenn der Code so wäre:

Code:
LDN Input_2
R Output_1

LD Input_1
S Output_1

Wäre die Ausgabe dann

Code:
Output:= NOT Input_2 AND (Output OR Input_1);

oder bringe ich die Unterschiede durcheinander?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@SPS_Step,
Überleg' mal, was bei Deinem Code jeweils Vorrang hat, wenn beide Bedingungen WAHR sind und wie das dann zu SR bzw. RS passt.
;)

Code:
LD Input_1
S Output_1

LDN Input_2
R Output_1

(* Rücksetzdominant *)

Code:
IF
NOT Input_2 // Taster Stopp
THEN
Output_1 := FALSE // Motor Aus
ELSIF
Input_1 // Taster Start
THEN
Output_1 := TRUE // Motor Ein
END_IF;

(* Rücksetzdominant *)


Code:
Output:= (Output OR Input_1) AND NOT Input_2;

(* Rücksetzdominant *)


Code:
IF
Input_1 // Taster Start
THEN
Output_1 := TRUE // Motor Ein
ELSIF
NOT Input_2 // Taster Stopp
THEN
Output_1 := FALSE // Motor Aus
END_IF;

(* Setzdominant *)

Ist das richtig?

Das SR und RS bei Siemens und bei der IEC unterscheiden sich ja von der Bezeichnung, aber das ist ja nur auf die fertigen FUP Bausteine zu beziehen oder ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das heißt zusammengefasst:

Code:
LD Input_1
S Output_1

LDN Input_2
R Output_1

(* Rücksetzdominant *)

=>

Code:
IF
Input_1 // Taster Start
THEN
statOutput_1 := TRUE // Motor Ein
END_IF;

IF
NOT Input_2 // Taster Stopp
THEN
statOutput_1 := FALSE // Motor Aus
END_IF;

Output_1 := statOutput_1;

// Ohne den Static Teil meckert TIA und unterstreicht die Variable Gelb

(* Rücksetzdominant *)

ODER

Code:
IF
NOT Input_2 // Taster Stopp
THEN
Output_1 := FALSE // Motor Aus
ELSIF
Input_1 // Taster Start
THEN
Output_1 := TRUE // Motor Ein
END_IF;

(* Rücksetzdominant *)

ODER

Code:
Output:= (Output OR Input_1) AND NOT Input_2;

(* Rücksetzdominant *)

_____________________________________________________________________________________________

Code:
LDN Input_2
R Output_1

LD Input_1
S Output_1

(* Setzdominant *)

=>

IF
NOT Input_2 // Taster Stopp
THEN
statOutput_1 := FALSE // Motor Aus
END_IF;

IF
Input_1 // Taster Start
THEN
statOutput_1 := TRUE // Motor Ein
END_IF;

Output_1 := statOutput_1;

// Ohne den Static Teil meckert TIA und unterstreicht die Variable Gelb

(* Setzdominant *)

ODER

Code:
IF
Input_1 // Taster Start
THEN
Output_1 := TRUE // Motor Ein
ELSIF
NOT Input_2 // Taster Stopp
THEN
Output_1 := FALSE // Motor Aus
END_IF;

(* Setzdominant *)


Bei dem Setzdominanten Verhalten gibt es keine "Einzeiler" Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, wenn man es in einer Zeile und einfach haben möchte, ist rücksetzen immer dominant.
Achso, also so:

Code:
LD Input_1
S Output_1

LDN Input_2
R Output_1

(* Rücksetzdominant *)

=>

Code:
Output_1:= (Output_1 OR Input_1) AND NOT Input_2;

(* Rücksetzdominant *)

__________________________________________________________________________________________

Code:
LDN Input_2
R Output_1

LD Input_1
S Output_1

(* Setzdominant *)

=>
Code:
Output_1:=(Output_1 AND NOT Input_2) OR Input_1;
 
LDN Input_2
R Output_1

LD Input_1
S Output_1

(* Setzdominant *)

=> Output_1:=(Output_1 AND NOT Input_2) OR Input_1;
Das Rücksetzten erfolgt, wenn der Rücksetzeingang unterbrochen wird (Öffner).
Und der Ausgang bleibt auf 1, wenn der Rücksetzeingang geschlossen also WAHR ist.

Daher ist das von Dir eingefügte NOT an der Stelle falsch!
;)
 
Das Rücksetzten erfolgt, wenn der Rücksetzeingang unterbrochen wird (Öffner).
Und der Ausgang bleibt auf 1, wenn der Rücksetzeingang geschlossen also WAHR ist.

Daher ist das von Dir eingefügte NOT an der Stelle falsch!
;)

Stimmt, dankeschön!

Code:
LDN Input_2
R Output_1

LD Input_1
S Output_1

(* Setzdominant *)

=> Output_1:=(Output_1 AND Input_2) OR Input_1;


Wenn nicht in jedem Zyklus eine Zuweisung vor dem ersten Lesen einer Variable erfolgt, muss der Wert halt irgendwo gespeichert werden.
;)

Aber es wird doch in jedem Zyklus die Zuweisung erfolgen oder nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber es wird doch in jedem Zyklus die Zuweisung erfolgen oder nicht?
In allen Zyklen, in denen weder Input_1 sagt 'Setzen' noch Input_2 sagt 'Rücksetzen', wird nichts zugewiesen, sondern der vorherige Zustand soll beibehalten werden. Dies bezieht sich auf das AWL-Programm.

In der SCL-Variante wird allerdings der vorherige Zustand erneut zugewiesen. Deshalb die erforderliche Speicherung in Output_1.
Dies funktioniert aber nur, wenn Qutput_1 als IN_OUT-Variable oder als statische Variablen deklariert ist.
 
Zuletzt bearbeitet:
Das heißt schlussendlich so wäre der richtige Code umgesetzt:

(* Ansteuerung der Pumpe *)

Code:
LD       Start_Umpumpen
S         Pumpe

LDN    Freigabe
ORN    Pumpstation_bereit
ORN    Stopp_Umpumpen
ORN    Max_Fuellstand_Tank_5     (* 0= Füllstand erreicht *)
ORN    Min_Fuellstand_Tank_4    (* 0= Tank leer *)
OR       Oeltank_5_Voll
ORN    Trockenlauf_Pumpe_4    (* 0= Tank leer *)
OR       HM_Pumpzeitueberschreitung
R          Pumpe

=>



(* Ansteuerung der Pumpe *)

Code:
 #statPumpe := (#statPumpe OR #Start_Umpumpen)
AND #Freigabe
OR #Pumpstation_bereit
OR #Stopp_Umpumpen
OR #Max_Fuellstand_Tank_5(* 0= Füllstand erreicht *)
OR #Min_Fuellstand_Tank_4(* 0= Tank leer *)
OR NOT #Oeltank_5_Voll
OR #Trockenlauf_Pumpe_4(* 0= Tank leer *)
OR NOT #HM_Pumpzeitueberschreitung;

#Pumpe := #statPumpe;[CODE]
 
Zuletzt bearbeitet:
Und dieser:

Code:
LD    TR_Pumpzeitbegrenzung.OutputControl
S      HM_Pumpzeitueberschreitung


LD    Reset_Pumpstation
R      HM_Pumpzeitueberschreitung

=>

Code:
#statHM_Pumpzeitueberschreitung :=
(#statHM_Pumpzeitueberschreitung OR #Einschaltverzögerung.Q) AND NOT #Reset_Pumpstation;

HM_Pumpzeitueberschreitung := #statHM_Pumpzeitueberschreitung
 
Zurück
Oben