Programmteile durch SCHEDULER seltener abarbeiten lassen?

Begonnen von Richardt, 10. März 2011, 17:53:43

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Richardt

Ich Programmiere gerade ein umfangreiches SPS-Programm in dem viele REAL-Variablen verwendet werden. Daher habe ich die Sorge, dass meine Beckhoff CX9010 nicht Leistungsfähig genug ist. Nun habe ich mir überlegt gewisse Teile meines Programms seltener abarbeiten zu lassen um dadurch die Last zu verringern. Bei diesen Programmteilen handelt es sich meist um einfache IF-Anweisungen oder einfache Berechnungen.

Da ich mit dem SPS-Programm mehrfach die gleiche Aufgabe ausführen muss, habe ich daraus ein Funktionsbaustein gemacht und rufe diesem mehrfach mit unterschiedlichen Parametern auf. Dies führt dazu, dass ich keine unterschiedlichen Tasks, mit unterschiedlichen Zykluszeiten, für die Programmteile einrichten kann. Sonst könnte ich ja keinen einzigen Funktionsblock daraus machen und ich müsste diese viele kleine Funktionsblöcke mehrfach aufrufen und die Kommunikation untereinander parametrieren. Also viel zu aufwendig.

Daher überlege ich statt den Tasks in jedem Programmteil, der seltener Abgearbeitet werden muss, einen Funktionsbaustein SCHEDULER zu verwenden. Jeder SCHEDULER wird mit leicht unterschiedlichen Zeiten parametriert (z.B. T#1s80ms und T#1s115ms), sodass es selten zu gleichzeitigen Ausführungen kommt und somit die CPU-Last sinkt.

Ist das sinnvoll? Oder verschwenden die ganzen Instanzen von SCHEDULER mehr Ressourcen, als dass sie einsparen? Was meint ihr?

MfG
Richardt

hugo

exakt solche bausteine gibt es bereits in der oscat
schau dir mal scheduler und scheduler 2 an

Richardt

Ja, hatte diesen Baustein bereits gefunden. Nachteilig ist, dass ich bei der Verwendung von dem Funktionsbaustein SCHEDULER_2 die Programmteile mit diesem SCHEDULER (Q1, Q2, Q3, ...) verknüpfen muss. Dies bedeutet etliche Querverbindungen über die verschiedenen Instanzen und den vielen SUB-Funktionsbausteinen zu parametrieren. Daher meine einfachere Idee mit den unterschiedlichen Zeiten. So kann ich den Funktionsbaustein einfach irgendwo instanzieren, Zeit vorgeben und fertig.

Allerdings geht es mir hier eher darum, ob dieses Vorgehen sinnvoll ist und Ressourcen schont. Oder die vielen SCHEDULER-Instanzen mehr Ressourcen verbrauchen als sie einsparen.

hugo

innerhalb der oscat lib nutzen wir nehrfach folgendes:

ein modul das komplexe und aufwendige berechnungen macht wie zum beispiel die sonnenstandsberechnung beginnt wie folgt:

tx := t_plc_ms()
if tx - last_exec >= exec_time then
   auszuführender code
   hier kann man natürlich auch ganze programmteile aufrufen
else
   return
end_if;

Richardt

Das klinkt doch schon mal gut. Werde aber die IF-Anweisung anders aufbauen, da ich über mehrere Codeseiten verschachtelte IF-Anweisungen vermeiden will:


tx := t_plc_ms()
if tx - last_exec < exec_time then
  (* eventuell müssen hier noch die VAR_OUT auf die alten Werte gesetzt werden *)
  return;
end_if;

hier der auszuführende Code eingefügt


Dies geht natürlich nur, wenn der gesamte Rest des Funktionbausteins nach dieser Anweisung nicht mehr abgearbeitet werden soll.