Bausteinaufrufe mit mehreren Zyklen Laufzeit

Thruser

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

ich programmiere zwar gerade hauptsächlich mit CoDeSys 2.3 (Wago), aber ich denke die Frage bezieht sich auf ein grundsätzlichen Problem.

Wie arbeitet ihr mit Funktionen/Funktionsbausteinen die über mehrere Zyklen laufen. z.B. Kommunikationsbausteine

Konkret habe ich hier einen Kommunikationsbaustein mit dem ich auf einen Bus schreibe. Mit positiver Flanke am Enable Signal fängt der Baustein an zu senden. Wenn alle Daten gesendet sind, erfolgreich oder nicht, wird das Ausgangsignal auf True gesetzt. Dabei können während der Ausführung mehrere Zyklen vergehen, bis der Ausgang gesetzt wird. Danach muß das Enable Signal auf False gesetzt werden, damit mit einer neuen positiven Flanke erneut gesendet werden kann.

Da ich mehrere Datensätze zur Initialisierung hintereinander schreiben muß, muß der Baustein mehrmals aufgerufen werden.

Wie geht ihr dabei vor? Ich muß das ganze ja in den zyklischen Aufruf der SPS unterbringen. Ich kann den Bausteinaufruf ja nicht in eine Schleife packen und warten bis der Baustein erfoglreich abgearbeitet ist. Das würde ja die ganze SPS/ den ganzen Task blockieren. Verwendet ihr da Schrittketten?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thruser,

was für einen WAGO-Controller verwendest du? Handelt es sich um ein 32Bit Controller (750-88X, 750-841), so hast Du die Möglichkeit in der Registerkarte Ressourcen => Tasksystem eine zusätzliche zyklische Task mit einem Aufrufintervall und einer Priorität anzulegen (z.B. Priorität 2, Intervall t#20ms). Tasks werden dann so abgearbeitet, dass höher priorisierte Tasks (dezimale Wertigkeit kleiner) nieder priore Tasks unterbrechen. Bei Kommunikationsbausteinen empfiehlt es sich diese in einer hoch priorisierten Task mit relativ kleinem Aufrufintervall einzubinden. Die Flanke für die Abarbeitung des Bausteins jedoch nur so häufig wie nötig zu triggern.
Konkret würde ich je nach Vorhaben, das Hauptprogramm in einer Task mit der Priorität 1 und die Kommunikation in einer Task mit der Prioriät 2 abarbeiten lassen.

Gruß Informer
 
Hallo,

das mit den Tasks ist mir bekannt und würde ich generell auch so machen.

Hier habe ist jetzt aber das Problem, das ich einen Sensor erst parametrieren muß, damit er mir die richtigen Werte schickt. Dazu müssen bestimmte Befehlsfolgen in der richtigen Reihenfolge an den Sensor geschickt werden. Auch möchte ich unter Umständen später über die Bedienoberfläche noch bestimmte Parameterwerte ändern.

Man könnte es ja so machen:
Sende Sequenz 1
Warte solange bis Senden abgeschlossen.
Sende Sequenz 2
Warte solange bis Senden abgeschlossen.
Sende Sequenz ...

Das Warten kann ich ja jetzt nicht z.B. mit einer while Schleife machen
Code:
WHILE NOT SEND.CONFIRM DO
  SEND();
END_WHILE
da dann der ganze Task blockiert wäre

Gruß
 
Hallo Thruser,

wenn ich das richtig verstehe, dann willst Du zuerst den Sensor in einer definierten Reihenfolge parametrieren und dann soll erst das restliche Programm abgearbeitet werden in dem die Daten vom Sensor verarbeitet werden.
In diesem Fall würde ich in einer separaten Task (Init_PRG) die sequenzielle Abarbeitung der Parametrierung ablaufen lassen. Das aufgerufene Programm würde ich dann so schreiben, dass die ersten Daten an den Sensor geschickt werden, dann wird gewartet bis die Triggervariable am Baustein fällt, dann werden erst die nächsten Daten geschickt... so lange bis die Parametrierung fertig ist. Das Hauptprogramm läuft in einer weiteren höher prioren Task, jedoch wird die eigentliche Datenverarbeitung in diesem Programm über ein

IF (xInitReady) then
Code für die eigentliche Datenverarbeitung
END_IF

blockiert, dieses in dem Init_PRG erst nach erfolgreicher Sensorparametrierung auf TRUE gesetzt wird.
So wird keine Task blockiert und der Sensor kann zunächst in alle Ruhe sequenziell parametriert werden bevor die Datenverarbeitung beginnt.

Gruß Informer
 
Zurück
Oben