Programmteile nur 1 mal beim Start ausführen.

redseadiver28

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

habe als Neuling im Thema SPS mal ne grundsätzliche Frage zum Systemstart.

Ich habe mir mit einem Beckhoff BC9100 eine Lichtsteuerung gebaut. Die Grundfunktionen funktionieren schon mal ganz ok.

Nun zu meiner Frage:
Ich möchte beim Start des Controllers einen Codeteil haben, der genau 1mal ausgeführt wird. Grundsätzlich wäre das mit einer einfachen boolschen VAR und einer IF-Abfrage ja einfach zu lösen. Gibt es hierzu bestimmte Herangehensweisen wie solche Initialisierungsroutinen "fachmännisch" abgebildet werden oder ist hierfür einfach die oben angesprochenen IF-Lösung die richtige.

Vielen Dank im Voraus für die Führung eines "Babys" bei den ersten Gehversuchen

lg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Alternative ist die boolsche Variable "SystemTaskInfoArr[1].firstCycle" aus der TcSystem.lib. Diese gibt dir ein TRUE zurück, solange die Steuerung im ersten Zyklus ist.
 
Eine Alternative ist die boolsche Variable "SystemTaskInfoArr[1].firstCycle" aus der TcSystem.lib. Diese gibt dir ein TRUE zurück, solange die Steuerung im ersten Zyklus ist.
Die gibt es aber nur bei PC's. Bei BC's muss man das dann doch selbst machen.
Ich schreibe dafür in meinen PRG's und FB's eine eigene Aktion "Init". Die boolesche Variable für den ersten Zyklus brauche ich dann nur im Hauptprogramm abfragen, um "Main.Init" aufzurufen. "Main.Init" ruft dann die Init-Aktionen der weiteren PRG's auf, diese wiederum die Init-Aktionen der FB's.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Kode lautet dann so:

Code:
VAR 
  init : boolean := True;
END_VAR

IF init THEN
  bla bla
  init := False;
END_IF;

Jede Variable wird beim ersten Ausführen des Blockes initialisiert. Die Initialisierung wird hier mit True festgelegt. Damit ist es kein Problem einen Init-Run durchzuführen.
 
Zuletzt bearbeitet:
Vorsicht

Dieser Code funktioniert aber wirklich nur beim allerersten Mal nach Start von TwinCAT! Wenn man das Programm z.B. über PLC-Control stoppt und danach wieder startet funktioniert das nicht mehr.

Zudem darf (wie im Code richtig dargestellt) die Variable auf keinen Fall PERSISTENT sein.

Für den Zweck FirstScanRun hat mir einmal ein Beckhoff Mitarbeiter einen Code geschrieben. Generell vermisse ich die Systemvariablen üblicher SPS-Systeme schon ein wenig. (Systemtakte etc.) Sicher kann man alles selber machen, aber man muss es leider halt auch.

LG
 
Dieser Code funktioniert aber wirklich nur beim allerersten Mal nach Start von TwinCAT! Wenn man das Programm z.B. über PLC-Control stoppt und danach wieder startet funktioniert das nicht mehr.

Das stimmt so nicht. Es funktioniert nach einen gewöhnlichen Boot und wenn man das Programm nach einem Stopp über PLC-Control startet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

war letzte Woche leider verhindert, aber trotzdem vielen Dank für die Hilfe.

Ich weiß jetzt, dass ich grundsätzlich nicht ganz falsch liege. Das mit der TCSystem.lib klingt auch spannend, ur halt wieder nicht mit nem BC. :-(

@drfunfrock: vielen Dank für dein Beispiel

lg

redseadiver28
 
Cx

Das stimmt so nicht. Es funktioniert nach einen gewöhnlichen Boot und wenn man das Programm nach einem Stopp über PLC-Control startet.

Habe das nun mit einem CX getestet, zumindest hier funktioniert das nicht! (wie ich schon beschrieben hatte) Hättest mich fast verunsichert...
Vielleicht verhält sich aber der BC anders, aber bei einem CX hätte das u.U. fatale Auswirkungen.

Ein ähnliches Verhalten gibt es auch bei den Konstanten. Will man die z.B. später einmal ändern, genügt es nicht dies im Code zu tun, man muss die SPS neu initialisieren oder den neuen Wert online eingeben. Konstanten sind genaugenommen nur Variablen mit einem Initialwert.

LG
 
Habe das nun mit einem CX getestet, zumindest hier funktioniert das nicht!
Man muss zwischen PLC-Stop und PLC-Reset unterscheiden. Bei einem Stop bleiben die Variablenwerte erhalten, bei einem Reset wird dagegen neu initialisiert, und dann funktioniert auch ein selbstgebauter "FirstCycle"-Merker.

Ein ähnliches Verhalten gibt es auch bei den Konstanten. Will man die z.B. später einmal ändern, genügt es nicht dies im Code zu tun, man muss die SPS neu initialisieren oder den neuen Wert online eingeben. Konstanten sind genaugenommen nur Variablen mit einem Initialwert.
Im PLC-Control unter "Projekt/Optionen/Übersetzungsoptionen" den Punkt "Konstanten ersetzen" anwählen. Dann sind es keine initialisierten Variablen mehr, sondern der Compiler trägt die Konstanten-Werte in den Code ein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man muss zwischen PLC-Stop und PLC-Reset unterscheiden. Bei einem Stop bleiben die Variablenwerte erhalten, bei einem Reset wird dagegen neu initialisiert, und dann funktioniert auch ein selbstgebauter "FirstCycle"-Merker.
Meine Rede. Aber dieser feine Unterschied macht es eben aus, und laut drfunfrock sollte es nach einem Stop ja auch gehen.

Im PLC-Control unter "Projekt/Optionen/Übersetzungsoptionen" den Punkt "Konstanten ersetzen" anwählen. Dann sind es keine initialisierten Variablen mehr, sondern der Compiler trägt die Konstanten-Werte in den Code ein.

Man lernt eben nie aus!

Danke und LG
 
Meine Rede. Aber dieser feine Unterschied macht es eben aus, und laut drfunfrock sollte es nach einem Stop ja auch gehen.



Man lernt eben nie aus!

Danke und LG


Sorry mein Fehler. Aber warum sollte man eine SPS stoppen wollen? Bei zustandsgesteuerten Automaten kommt man in Teufelsküche, wenn z.B. eine pneumatische Achse dann an der falschen Position steht, weil infolge des Stops die Ventile geschlossen wurden.
 
Zurück
Oben