A
Anonymous
Guest
-> Hier kostenlos registrieren
Hallo zusammen,
ich baue mir gerade eine Haussteuerung mit einer S7-312C und versuche mir für die Rolladen folgende Ansteuerung zusammen zu bauen:
Taster 1: Rollo Rauf
Taster 2: Rollo Runter
Wird einer der Taster betätigt startet das Rollo für eine bestimmte Laufzeit z.B. 25sec in diese Richtung. Wird während der Laufzeit einer der Taster betätigt soll das Rollo stoppen. Danach ist wieder alles beim Alten.
Da das Rollo über zwei Relais angesteuert wird 1xPower und 1xRauf/Runter sollten die Relais zwar gleichzeitig einschalten aber möglichst zuerst das Power Relais ausschalten und z.b. 100msec später das Rauf/Runter Relais.
Ach ja und zu guter letzt sollte die Position des Rollos gespeichert werden, Oben/Mitte/Unten, wurde die vorgegebene Laufzeit beendet so ist das Rollo Oben wenn nach oben lief, entsprechend für Unten. Die Mitte ist immer bei einer Unterbrechung durch einen weiteren Tastendruck.
Ich habe alle zu verwendenden Merker / Zeiten / Eingänge in einem Datenbaustein pro Rollo abgelegt. Vom Prinzip her funktioniert auch alles schon ganz gut, aber die verzögerte Ausschaltung des Rauf/Runter Relais nach dem Power Relais kriege ich nicht hin und ich weiß nicht ob das was ich da geschrieben habe nicht ggf. was zu kompliziert ist.
Falls sich irgendeiner von Euch langeweilen sollte ;-) und eine Herausforderung sucht :shock:, wäre es echt toll wenn Er/Sie mir hier einen Tip geben könnte.
Besten Dank !
Hier meine geistigen Ergüsse....
VAR_INPUT
DB_Device : WORD ; //Device Nummer
END_VAR
VAR_OUTPUT
Aus_RaufRunter : BOOL ; //Ausgang Rauf / Runter
Aus_Power : BOOL ; //Ausgang Power
END_VAR
VAR_TEMP
DB_Device_Temp : WORD ;
TimerNr : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =Bestimmen des Device Bereiches
//Durch die übergebenen Device und Offset Parameter wird der zuverwendende
//Datenbaustein (DB_Device) und die Position im Datenbaustein (DB_Offset)
//bestimmt. Der Offset bestimmt somit die Array Position im Datenbaustein.
L #DB_Device;
T #DB_Device_Temp;
LAR1 P#0.0; // Zeiger mit Null in Adressregister laden
AUF DB [#DB_Device_Temp];
NETWORK
TITLE =Aufsetzten des Timer Merker
L DBW [AR1,P#2.0]; // Lade die Nummer des zu verwendenden Timers
T #TimerNr; // Transferiere die TimerNr in temp. MW
NETWORK
TITLE =Neustart nach zweitem Tastendruck verhindern
//Wurde zuvor durch einen zweiten Tastendruck oder durch Ablauf der Zeit
//abgebrochen, wird hier der Abbruchmerker zurückgesetzt
O( ;
O DBX [AR1,P#1.1]; // Taster rauf
O DBX [AR1,P#1.2]; // Taster runter
) ;
UN T [#TimerNr];
FN DBX [AR1,P#0.3];
R DBX [AR1,P#0.0];
NETWORK
TITLE =Erst nach fallender Flanke der Taste Up oder Down freigeben
//Nach dem Loslassen der Up oder Downtaste wird über den Merker (M2.0) angezeigt,
//dass der Motor gestartet wurde und die Funktion durch einen zweiten Tastendruck
//abbgebrochen werden kann
U( ;
O DBX [AR1,P#1.1];
O DBX [AR1,P#1.2];
) ;
UN DBX [AR1,P#0.0];
FN DBX [AR1,P#0.4];
S DBX [AR1,P#0.1];
NETWORK
TITLE =Bei erstem Tastendruck Zeit starten
//Mit dem ersten Tastendruck wird die Zeit gestartet
L DBW [AR1,P#18.0]; // Zeit die das Rollo laufen soll im Uhrzeit gesteuerten
O( ; // Modus kann diese kürzer als die maximale Laufzeit sein
O DBX [AR1,P#1.1]; // wird aber anschliessend auf maximale Laufzeit zurück-
O DBX [AR1,P#1.2]; // gesetzt
) ;
UN T [#TimerNr];
UN DBX [AR1,P#0.1];
SV T [#TimerNr];
L DBW [AR1,P#16.0]; // Laufzeit wieder auf maximale Laufzeit zurücksetzen
T DBW [AR1,P#18.0];
NETWORK
TITLE =Rechts oder Links
//Prüfen welche Taste betätigt wurde und entscheiden ob das Rauf / Runter Relais
//benötigt wird
U DBX [AR1,P#1.2]; // Taste Runter
UN DBX [AR1,P#1.1]; // Taste Rauf
U T [#TimerNr];
UN DBX [AR1,P#0.0];
UN #Aus_Power;
S #Aus_RaufRunter;
NETWORK
TITLE =Spannung An
//Bei Tastendruck Spannung an Motor anlegen
U( ;
U DBX [AR1,P#1.1];
UN DBX [AR1,P#1.2];
O( ;
UN DBX [AR1,P#1.1];
U DBX [AR1,P#1.2];
) ;
) ;
U T [#TimerNr];
UN DBX [AR1,P#0.0];
S #Aus_Power;
NETWORK
TITLE =Abbrechen beim zweiten Tastendruck
//Wenn der Merker (M2.0) gesetzt ist läuft der Motor und die Aktion kann durch
//einen zweiten Tastendruck beendet werden
O( ;
O DBX [AR1,P#1.1];
O DBX [AR1,P#1.2];
) ;
U DBX [AR1,P#0.1];
FP DBX [AR1,P#0.5]; //"FPStop"
S DBX [AR1,P#0.0];
NETWORK
TITLE =Abrechen wenn Zeit abgelaufen oder beim zweiten Tastendruck
//Hier wird die laufende Aktion abgebrochen wenn die Zeit abgelaufen oder ein
//zweites mal eine Taste (M2.1) gedrückt wurde. Die Position des Rollade wird
//duch
//3 Merker angezeigt. Wurde nicht durch einen Tastendruck abbgebrochen,
//entscheidet der Rechts_Links Ausgang über die Position. Bei einem Abbruch ist
//die Position nicht definiert (Mitte).
UN T [#TimerNr]; // wenn Zeit abgelaufen prüfen wo das Rollo steht
FP DBX [AR1,P#0.6];
S DBX [AR1,P#0.2];
U DBX [AR1,P#0.2];
U #Aus_RaufRunter; // Unten
R DBX [AR1,P#20.0]; // Rollo oben
R DBX [AR1,P#20.1]; // Rollo mitte
S DBX [AR1,P#20.2]; // Rollo unten
SPB ende;
U DBX [AR1,P#0.2];
UN #Aus_RaufRunter; // Oben
S DBX [AR1,P#20.0];
R DBX [AR1,P#20.1];
R DBX [AR1,P#20.2];
SPB ende;
U DBX [AR1,P#0.0]; // Bei zweitem Tastendruck innerhalb T0 -> Zustand unbekannt
R DBX [AR1,P#20.0];
S DBX [AR1,P#20.1];
R DBX [AR1,P#20.2];
ende: NOP 0; // alles in den Grundzustand zurücksetzen
R T [#TimerNr];
R #Aus_Power;
R #Aus_RaufRunter;
R DBX [AR1,P#0.1];
R DBX [AR1,P#0.2];
END_FUNCTION
ich baue mir gerade eine Haussteuerung mit einer S7-312C und versuche mir für die Rolladen folgende Ansteuerung zusammen zu bauen:
Taster 1: Rollo Rauf
Taster 2: Rollo Runter
Wird einer der Taster betätigt startet das Rollo für eine bestimmte Laufzeit z.B. 25sec in diese Richtung. Wird während der Laufzeit einer der Taster betätigt soll das Rollo stoppen. Danach ist wieder alles beim Alten.
Da das Rollo über zwei Relais angesteuert wird 1xPower und 1xRauf/Runter sollten die Relais zwar gleichzeitig einschalten aber möglichst zuerst das Power Relais ausschalten und z.b. 100msec später das Rauf/Runter Relais.
Ach ja und zu guter letzt sollte die Position des Rollos gespeichert werden, Oben/Mitte/Unten, wurde die vorgegebene Laufzeit beendet so ist das Rollo Oben wenn nach oben lief, entsprechend für Unten. Die Mitte ist immer bei einer Unterbrechung durch einen weiteren Tastendruck.
Ich habe alle zu verwendenden Merker / Zeiten / Eingänge in einem Datenbaustein pro Rollo abgelegt. Vom Prinzip her funktioniert auch alles schon ganz gut, aber die verzögerte Ausschaltung des Rauf/Runter Relais nach dem Power Relais kriege ich nicht hin und ich weiß nicht ob das was ich da geschrieben habe nicht ggf. was zu kompliziert ist.
Falls sich irgendeiner von Euch langeweilen sollte ;-) und eine Herausforderung sucht :shock:, wäre es echt toll wenn Er/Sie mir hier einen Tip geben könnte.
Besten Dank !
Hier meine geistigen Ergüsse....
VAR_INPUT
DB_Device : WORD ; //Device Nummer
END_VAR
VAR_OUTPUT
Aus_RaufRunter : BOOL ; //Ausgang Rauf / Runter
Aus_Power : BOOL ; //Ausgang Power
END_VAR
VAR_TEMP
DB_Device_Temp : WORD ;
TimerNr : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =Bestimmen des Device Bereiches
//Durch die übergebenen Device und Offset Parameter wird der zuverwendende
//Datenbaustein (DB_Device) und die Position im Datenbaustein (DB_Offset)
//bestimmt. Der Offset bestimmt somit die Array Position im Datenbaustein.
L #DB_Device;
T #DB_Device_Temp;
LAR1 P#0.0; // Zeiger mit Null in Adressregister laden
AUF DB [#DB_Device_Temp];
NETWORK
TITLE =Aufsetzten des Timer Merker
L DBW [AR1,P#2.0]; // Lade die Nummer des zu verwendenden Timers
T #TimerNr; // Transferiere die TimerNr in temp. MW
NETWORK
TITLE =Neustart nach zweitem Tastendruck verhindern
//Wurde zuvor durch einen zweiten Tastendruck oder durch Ablauf der Zeit
//abgebrochen, wird hier der Abbruchmerker zurückgesetzt
O( ;
O DBX [AR1,P#1.1]; // Taster rauf
O DBX [AR1,P#1.2]; // Taster runter
) ;
UN T [#TimerNr];
FN DBX [AR1,P#0.3];
R DBX [AR1,P#0.0];
NETWORK
TITLE =Erst nach fallender Flanke der Taste Up oder Down freigeben
//Nach dem Loslassen der Up oder Downtaste wird über den Merker (M2.0) angezeigt,
//dass der Motor gestartet wurde und die Funktion durch einen zweiten Tastendruck
//abbgebrochen werden kann
U( ;
O DBX [AR1,P#1.1];
O DBX [AR1,P#1.2];
) ;
UN DBX [AR1,P#0.0];
FN DBX [AR1,P#0.4];
S DBX [AR1,P#0.1];
NETWORK
TITLE =Bei erstem Tastendruck Zeit starten
//Mit dem ersten Tastendruck wird die Zeit gestartet
L DBW [AR1,P#18.0]; // Zeit die das Rollo laufen soll im Uhrzeit gesteuerten
O( ; // Modus kann diese kürzer als die maximale Laufzeit sein
O DBX [AR1,P#1.1]; // wird aber anschliessend auf maximale Laufzeit zurück-
O DBX [AR1,P#1.2]; // gesetzt
) ;
UN T [#TimerNr];
UN DBX [AR1,P#0.1];
SV T [#TimerNr];
L DBW [AR1,P#16.0]; // Laufzeit wieder auf maximale Laufzeit zurücksetzen
T DBW [AR1,P#18.0];
NETWORK
TITLE =Rechts oder Links
//Prüfen welche Taste betätigt wurde und entscheiden ob das Rauf / Runter Relais
//benötigt wird
U DBX [AR1,P#1.2]; // Taste Runter
UN DBX [AR1,P#1.1]; // Taste Rauf
U T [#TimerNr];
UN DBX [AR1,P#0.0];
UN #Aus_Power;
S #Aus_RaufRunter;
NETWORK
TITLE =Spannung An
//Bei Tastendruck Spannung an Motor anlegen
U( ;
U DBX [AR1,P#1.1];
UN DBX [AR1,P#1.2];
O( ;
UN DBX [AR1,P#1.1];
U DBX [AR1,P#1.2];
) ;
) ;
U T [#TimerNr];
UN DBX [AR1,P#0.0];
S #Aus_Power;
NETWORK
TITLE =Abbrechen beim zweiten Tastendruck
//Wenn der Merker (M2.0) gesetzt ist läuft der Motor und die Aktion kann durch
//einen zweiten Tastendruck beendet werden
O( ;
O DBX [AR1,P#1.1];
O DBX [AR1,P#1.2];
) ;
U DBX [AR1,P#0.1];
FP DBX [AR1,P#0.5]; //"FPStop"
S DBX [AR1,P#0.0];
NETWORK
TITLE =Abrechen wenn Zeit abgelaufen oder beim zweiten Tastendruck
//Hier wird die laufende Aktion abgebrochen wenn die Zeit abgelaufen oder ein
//zweites mal eine Taste (M2.1) gedrückt wurde. Die Position des Rollade wird
//duch
//3 Merker angezeigt. Wurde nicht durch einen Tastendruck abbgebrochen,
//entscheidet der Rechts_Links Ausgang über die Position. Bei einem Abbruch ist
//die Position nicht definiert (Mitte).
UN T [#TimerNr]; // wenn Zeit abgelaufen prüfen wo das Rollo steht
FP DBX [AR1,P#0.6];
S DBX [AR1,P#0.2];
U DBX [AR1,P#0.2];
U #Aus_RaufRunter; // Unten
R DBX [AR1,P#20.0]; // Rollo oben
R DBX [AR1,P#20.1]; // Rollo mitte
S DBX [AR1,P#20.2]; // Rollo unten
SPB ende;
U DBX [AR1,P#0.2];
UN #Aus_RaufRunter; // Oben
S DBX [AR1,P#20.0];
R DBX [AR1,P#20.1];
R DBX [AR1,P#20.2];
SPB ende;
U DBX [AR1,P#0.0]; // Bei zweitem Tastendruck innerhalb T0 -> Zustand unbekannt
R DBX [AR1,P#20.0];
S DBX [AR1,P#20.1];
R DBX [AR1,P#20.2];
ende: NOP 0; // alles in den Grundzustand zurücksetzen
R T [#TimerNr];
R #Aus_Power;
R #Aus_RaufRunter;
R DBX [AR1,P#0.1];
R DBX [AR1,P#0.2];
END_FUNCTION