TIA Einschaltverriegelung mit TIA

Reckers

Level-2
Beiträge
73
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich stehe momentan etwas auf dem Schlauch und komme nicht weiter.
Ich möchte mit dem TIA Portal und SCL eine Art Einschaltverriegelung erstellen.
Ich habe zwölf Motoren, die entweder mit einem FU oder per Stern-Dreieck angelassen werden.
Diese lassen sich theoretisch gleichzeitig einschalten.
Da dies natürlich nicht darf, möchte ich diese zeitlich verzögert einschalten, sprich:

Motor1 bekommt das Einschaltsignal, 1s später kommt der Befehl gleichzeitig für Motor3 und Motor4.

Die Startreihenfolge soll sich dann in etwa so abspielen:
Motor1 --- 15s warten --- Motor3 ---15s warten --- Motor4 ---15s warten usw...

Also sobald ein Motor den Befehl bekommt, zu starten, werden alle anderen für 15s "gesperrt", kommen während dieser Zeit
weitere Einschaltbefehle anderer Motoren, kommen diese der Reihe nach dran.

Kann mir da jemand weiterhelfen ?
Vielen Dank im Vorraus!

Gruß, Reckers
 
Hallo Reckers,

Ist es immer der gleiche Reihenfolge?
Dann wäre ein Schrittkette ein gute Wahl.

Und die Verrieglung der 15s kannst im Schrittkette machen, oder als Freigabe am Motor. z.b.

Code:
#MOTOR_1_START := #CMD_MOTOR_1_START AND #MOTOR_2_KEIN_START AND #MOTOR_3_KEIN_START AND #MOTOR_4_KEIN_START AND #MOTOR_5_KEIN_START;

Wie stellst du dir die Verriegelung FU und Releaisbetrieb vor?
ist die schon da? Hardverdrahtet vielleicht?

Bram
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erste frage wieso SCL? ( Nur meine persönliche Meinung)

Jedem Motor eine Einschaltverzögerung Parallel schalten und miteinander verknüpfen.

Ein zweiter Ansatz wäre eine Art Verriegelungsbit das jedesmal wenn ein Motor am hochlaufen ist dieses setzt. Und solange dieses gesetzt ist kann kein anderer Motor gestartet werden...
 
Hallo Reckers,

es könnte so funktionieren (noch nicht bis zum bitteren Ende durchdacht ;o) ):
Ein Array anlegen, in dem Du die Einschaltbefehle aller Motore speicherst.
Dieses Array durchläufst Du. Sobald Du einen Einschaltbefehl findest, startest Du den entsprechenden Motor und machst einen Timer TOF, den Du mit einem Impuls startest.
Das ist Dein Blockiersignal. So lange dieser Timer ON ist, verarbeitest Du das Array nicht. Nach jedem ausgeführten Befehl beendest Du die Schleife und löschst den Befehl aus dem Array.
Ist der Timer abgelaufen, durchläufst Du wieder das Array und findest den nächsten Einschaltbefehl... Spiel beginnt von vorne.


Zu bedenken:
15s sind schon eine gewisse Zeit, in denen Gefährdungen auftreten können. Je nach Art der Motoren (was sie antreiben), sollte signalisiert werden, daß ein Befehl ansteht.
Außerdem könnte es sein, daß jemand einen Einschaltbefehl gibt und sich wundert, daß nichts passiert. Der letzte Motor läuft ja erst fast 3 Minuten später an. Also schonmal den Elektriker rufen "Mein Motor funktioniert nicht"... Es sollte an der Befehlsstelle signalisiert werden, daß der Befehl akzeptiert wurde aber noch blockiert wird. Sowas wie "Motor in Warteschleife"...

Gruß
JS
 
Vielen Dank für die schnellen Antworten!

Ist es immer der gleiche Reihenfolge?

Nein, die Reihenfolge ist immer eine unterschiedliche, je nach Bedarf.

Wie stellst du dir die Verriegelung FU und Releaisbetrieb vor?
ist die schon da? Hardverdrahtet vielleicht?
Es handelt sich dabei um 6 FU-angetriebene Motoren und um 6 mit Stern-Dreieck-Anlauf.

Erste frage wieso SCL? ( Nur meine persönliche Meinung)

SCL ist mein Favorit beim programmieren, andere Sprachen gehen natürlich auch :wink:

Ein zweiter Ansatz wäre eine Art Verriegelungsbit das jedesmal wenn ein Motor am hochlaufen ist dieses setzt. Und solange dieses gesetzt ist kann kein anderer Motor gestartet werden...

Dies habe ich schon versucht, jedoch hat jedoch nicht wirklich geklappt.

Zu JS:
So in der Art habe ich mir das auch gedacht, dein Ansatz ist dabei schonmal auf jeden Fall besser durchdacht als meiner :D

Zu deinen Bedenken:
Es ist nicht so, das alle 12 Motoren gleichzeitig eingeschaltet werden, sondern nach Bedarf. Einzelne Motoren können immer wieder hinzu und weggeschaltet werden. Automatische Anläufe gibt es nur bei 6 Motoren, die anderen 6 müssen per Hand eingeschaltet werden. Während des "Wartens" erfolgt eine Meldung bei jedem Motor "Bitte Warten". "Motor in Warteschleife" ist natürlich auch nicht schlecht :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, die Reihenfolge ist immer eine unterschiedliche, je nach Bedarf.

Dann könntest Du in das Array statt Bits auch Integer reinschreiben. Also anstatt daß das Array-Element die Motornummer ist, speicherst Du die Motornummer und das Array-Element ist nur die Warteschleifenposition.
 
Code:
FUNCTION_BLOCK "MotorReihe"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      An : Bool;
      Zeit : Time;
   END_VAR
   VAR_OUTPUT 
      Out_01 : Bool;
      Out_02 : Bool;
      Out_03 : Bool;
      Out_04 : Bool;
      Out_05 : Bool;
      Out_06 : Bool;
      Out_07 : Bool;
      Out_08 : Bool;
      Out_09 : Bool;
      Out_10 : Bool;
      Out_11 : Bool;
      Out_12 : Bool;
   END_VAR
   VAR 
      Takt {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
      i : Int;
      impuls { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
   END_VAR

BEGIN
 #Takt(IN:=NOT #impuls, PT := #Zeit, Q=>#impuls);
 
 IF #An THEN
     IF #impuls AND #i < 12 THEN
         #i := #i + 1;
     END_IF;
 ELSE
     #i := 0;
 END_IF;
 
 #Out_01 := #i >=  1;
 #Out_02 := #i >=  2;
 #Out_03 := #i >=  3;
 #Out_04 := #i >=  4;
 #Out_05 := #i >=  5;
 #Out_06 := #i >=  6;
 #Out_07 := #i >=  7;
 #Out_08 := #i >=  8;
 #Out_09 := #i >=  9;
 #Out_10 := #i >= 10;
 #Out_11 := #i >= 11;
 #Out_12 := #i >= 12;
 
 
END_FUNCTION_BLOCK

Edit: Sorry Frage nicht ganz gelesen
 
Zuletzt bearbeitet:
Ich würde ein zweispaltiges Array mit Motornummern anlegen, um die Reihenfolge beliebig festlegen zu können (Spalte 1 = Motornummer) und den Einschaltzeitpunkt in Sekunden (Spalte 2). (Format Time würde auch gehen)

Eine Zählvariable zählt z.b. jede Sekunde um 1 hoch. Mit dem Zählimpuls läuft man jedes Mal in einer Schleife durch das Array und schaut nach, ob einer der Einschaltzeitpunkte gleich dem Zählwert ist. Ist das der Fall, setzt man eine Variable, die der Motornummer des zu startenden Motors entspricht. Mit dieser Variable macht der Motor selbständig in seinem Baustein seine Hochlaufsequenz.

Wird die Anlage abgeschaltet, dann wird die Zählvariable auf 0 gesetzt und es kann bei Einschalten von vorn losgehen.

Möglichkeiten gibt es insgesamt viele, aber mit einem Array ist man recht flexiebel und kann das in der HMI ganz nett gestalten.
 
Zurück
Oben