# Programmteile nur 1 mal beim Start ausführen.



## redseadiver28 (8 Mai 2011)

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


----------



## peppi (8 Mai 2011)

Taskkonfiguration->Systemereignisse->Start->Programmaufruf


----------



## Cerberus (9 Mai 2011)

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.


----------



## StructuredTrash (9 Mai 2011)

Cerberus schrieb:


> 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.


----------



## Cerberus (9 Mai 2011)

StructuredTrash schrieb:


> Die gibt es aber nur bei PC's. Bei BC's muss man das dann doch selbst machen.


 
Okay, das wusste ich nicht!


----------



## drfunfrock (9 Mai 2011)

Der Kode lautet dann so: 


```
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.


----------



## MarkusP (14 Mai 2011)

*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


----------



## drfunfrock (15 Mai 2011)

MarkusP schrieb:


> 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.


----------



## redseadiver28 (15 Mai 2011)

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


----------



## MarkusP (16 Mai 2011)

*Cx*



drfunfrock schrieb:


> 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


----------



## StructuredTrash (16 Mai 2011)

MarkusP schrieb:


> 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.



MarkusP schrieb:


> 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.


----------



## MarkusP (16 Mai 2011)

StructuredTrash schrieb:


> 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.



StructuredTrash schrieb:


> 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


----------



## drfunfrock (16 Mai 2011)

MarkusP schrieb:


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




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.


----------

