singulärer Programmaufruf

BZ-REX

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
als Neuling hier und in der SPS-Steuerung soll ich eine Anlage Betreiben. Die SPS soll mit CoDeSys programmiert werden.
Um mich der Aufgabe von bekanntem Terrain zu nähern habe ich die die Struktur wie für eine höhere Programmiersprache (C++) geschrieben.
Die Objektorientierung wollte ich durch Funktionsblocks und unterProgramme realisieren.

Das Hauptprogramm soll die einzelnen Unterprogramme aufrufen. Einige Porgrammteile (bspw. Hochfahren) sollen aber nur einmal ausgeführt werden. Das heißt ich benötige eine Ende-Funktion am Ende des Programms.
Darüber hinaus habe ich Programmteile denen die Idee der schrittweisen Abarbeitung der Programmzeilen zugrunde liegt. So muss eine Zeile beendet sein, bevor eine weitere aufrufe. Derzeit behelfe ich mir mit dem Ablaufplan um -insb. eine Warten-Funktion- zu realisieren. Leider wird mein Programm zunehmend komplex und ich stoße an die Grenzen dieser Idee (verschachtelte If-Bed:).

Der entscheidende Unterschied zu CoDeSys scheint mir im Programmablauf zu liegen. In CoDeSys wird jedes Programm als Dauerschleife ausgeführt, was sich für mein Pogramm als Schwierigkeit erweist.

Nun die Fragen:
1. Gibt es eine Endefunktion bspw. im Ablaufplan, dass ich nicht zu einem Punkt zurückspringen muss oder im ST am Ende des Programms?
2. Gibt es die Möglichkeit Programme nur einmalig aufzurufen?
3. Wie realisiert ihr das Hochfahren?
4. Gibt es die Möglichkeit ein Programm Zeilenweise abzuarbeiten und so eine Warten-funktion zu integrieren?

Für Hilfe und konstruktive Kritik bin ich sehr dankbar
 
Normalerweise legt man sich Variablen oder Structs an, die dann ensprechend genutzt werden.

1. Man setzt am Ende des Programms eine Variable auf True, die nennt man z.B. PRG_Fertig, damit kann man dann arbeiten.
2. Ja, man setzt am Ende eines Programmes ene Variable z.B. PRG_bearbeitet auf True, am Anfang des Programmes fragt man diese Variable ab. Ist sie True, springt man ans Ende dieses Programmes oder ruft den Baustein nicht mehr auf.
3. Bei Start der SPS setzt man alle Variablen auf False (auch die aus 2.). Dafür gibt es in vielen SPS eine Routine (S7 --> OB 100, OB101) oder bereits eine Variable, die nur im ersten Zyklus True ist.
Mit der letzten Anweisung im SPS-Programm setze ich mit i.A. eine Variable auf True, die besagt, dass der 1. Zyklus abgelaufen ist. Ist diese Variable nicht da, n´bin ich also im ersten Zyklus und kann damit arbeiten.
4. Na ja, es gibt wie immer mehrere Möglichkeiten. Eine davon ist eine Schrittkette und auch für Schrittketten gibt es viele Möglichkeiten. In deinem Fall könnte ich mit vorstellen mit Case zu arbeiten.
Man nimmt eine INT, diese wird in einer Case-Anweisung genutzt. Im Schritt 1 steht dies Variable auf 1, man springt in der Case-Anweisung zu Punkt 1. Ist dieser fertig abgearbeitet, erhöht man die Variable um 1, beim nächsten Mal wird dann also zu Punkt 2 gesprungen. Man kann auch dazwischen Freiräume lassen (immer um 10 erhöhen), um Schritte einfügen zu können. Pausen realisiert man mit Timern oder man schafft sich einen etwas komplexeren Schrittkettenbaustein, den man aus der Schrittkette heraus mit Variablen steuern kann.
Eine weitere gute und recht einfache Möglichkeit, besonders, wenn man anfängt wäre, die Schrittketten in Ablaufsprache zu schreiben. (Das ist extra für Schrittketten da und Bestandteil von Codesys, siehe also Hilfedateien von Codesys)

Ich empfehle dringenst, dir Bücher über SPS-Programmierung zu besorgen und diese zu lesen, denn aus meiner Erfahrung heraus, enden Programmmierversuche von PC-Programmierern bei SPS-Programmen in üblen Code-Katastrophen. das ist nicht abwertend gemeint, aber die Herangehensweise ist sehr sehr unterschiedlich und man muß komplett umdenken, was mir beim PC-Programmieren dann auch oft schwer fällt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich empfehle dringenst, dir Bücher über SPS-Programmierung zu besorgen und diese zu lesen, denn aus meiner Erfahrung heraus, enden Programmmierversuche von PC-Programmierern bei SPS-Programmen in üblen Code-Katastrophen. das ist nicht abwertend gemeint, aber die Herangehensweise ist sehr sehr unterschiedlich und man muß komplett umdenken, was mir beim PC-Programmieren dann auch oft schwer fällt.

Den Ratschlag kann ich nur beistimmen und noch um folgenden Rat ergänzen:
Wenn du als PC-Programmierer mit SPS anfängst, dann lass die Finger weg von ST oder Anweisungsliste. Versuch deine Aufgaben mit KOP/FUP und ohne Sprünge zu lösen.
So bekommst du am schnellsten ein Gespür für die Arbeitsweise einer SPS.

Gruß
Dieter
 
Den Ratschlag kann ich nur beistimmen und noch um folgenden Rat ergänzen:
Wenn du als PC-Programmierer mit SPS anfängst, dann lass die Finger weg von ST oder Anweisungsliste.

und warum ist das so? Also warum hat man eigentlich als Programmierer, der ja verschiedene Programmierarten, wie logikorientiertes Programmieren, objektorientiertes Programmieren, funktionales Programmieren, etc. erlernt hat, hier Probleme und scheitert? Oder ist das nur bei "nicht-studierten" Programmierern der Fall? Zu welchem Programmierstil ist die SPS-Programmierung unterzuordnen?
 
Ursprünglich sollte eine SPS eine Schützschaltung ersetzen. Sie konnte sehr viel komplexer sein, lies sich ohne Schraubenzieher ändern, brauchte weniger Platz und geht seltener kaputt. Man könnte das noch weiter fortsetzen...
Das wichtigste daran ist aber: Eine Schützschaltung hat kein "ENDE". So ein Schaltschrank arbeitet immer. Fährt ein mit einer SPS gesteuerter Aufzug nach oben und das Programm bleibt stehen, ist zu Ende oder muss erst noch auf etwas "warten", dann geht der Aufzug durch die Decke. Klar soweit?
Von daher sind C++ und eine SPS etwas anderes.
Das ändert nichts daran, dass man mit beiden die gleichen Aufgaben lösen kann.
Grüße
Tom
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und warum ist das so? Also warum hat man eigentlich als Programmierer, der ja verschiedene Programmierarten, wie logikorientiertes Programmieren, objektorientiertes Programmieren, funktionales Programmieren, etc. erlernt hat, hier Probleme und scheitert?
Weil eine SPS völlig anders arbeitet als eine Software auf einem PC-Betriebssystem.
Weil Abstürze oder undeterministisches Verhalten absolut nicht tolerierbar sind.

Weil eine SPS immer zu einem kontrollierten Ergebnis kommen muß, insbesondere bei Fällen, die der Programmierer nicht vorhergesehen hat. Und da sind Hochsprachen wie ST oder SCL prädestiniert, Programmierkonstrukte mit unvollständiger Logik zu erlauben oder einmal errechnete Entscheidungen nachträglich und schwer findbar wieder unwirksam zu machen. Gerade "studierten" Programmierern geben ST/SCL das Gefühl, Programmieren von SPS wäre kinderleicht und sie könnten einfach losprogrammieren... und beim Testen wird dann für jedes festgestellte Fehlverhalten eine Spezial-Behandlung hinterherprogrammiert, was dann zu den erwähnten Code-Katastrophen führt.

Und weil bei Software-Fehlern in SPS Menschen verletzt werden können.

Harald
 
und warum ist das so?
Ein Computerprogramm wird nur einmal komplett durchlaufen und soll normalerweise nicht zum Ende kommen.

Das SPS-Programm soll dagegen in einer sehr kurzen Zeit zum Ende kommen und nirgendwo zwischendurch stehen bleiben, weil es dann nach Aktualisierung der Aus- und dem Einlesen der Eingänge von Neuem gestartet wird. (Dafür gibt es in der Regel auch eine Überwachung.)

Mit diesem Unterschied tun sich Hochsprachenprogrammierer am Anfang oft schwer.


Die Abarbeitung ist immer zeilenweise, aber z.B. Wartefunktionen erfolgen anders, als in einem Computerprogramm. Das Programm darf nicht an dieser Wartestelle stehen bleiben, sondern nur die Funktionen, die mit der Wartezeit verzögert werden sollen, werden übersprungen, damit das Programm zum Ende kommen kann. Die Wartezeit findet also nicht in einem einzelnen sondern über mehrere Programmdurchläufe hinweg statt.
 
Ich denke auch, heutzutage ist es vor allem dieses deterministische, vereinfacht auch zeilenweises Abarbeiten von Code, das lernt vielleicht keiner im Studium, das gilt vielleicht bei Dozenten als primitiv?
Mir sagte mal ein Professor für Automatisierungstechnik an einer Uni auf NAchfrage zu Step7 etc. ganz stolz (oder eher hochmütig?): "Wir machen alles in C !". Dabei saß er vor seiner Sun-WS und ich wußte, weil ich ihn von meinem Studium her noch kannte, der hatte noch nie wirklich ein Programm für eine Industriemaschine geschrieben. Die machen heute Industrie 4.0, was auch immer das ist.
Events, Callback-Funktionen usw. sind ja anscheinend langsam (zu meinem Leidwesen) ein wenig im Kommen, zumindest zeigt ja Codesys V3 wo man gerne hinwill.
Es wird dann wie bei Windows-Programmen, man programmiert Events und wartet darauf, wenn das BS mal eben einen verschluckt, weil gerade beschäftigt, oder zu spät reagiert, weil gerade anderweitig beschäftigt, dann fließt der radioaktive Müll in den Fluß und nicht in den Tank, wen juckt das, Hauptsache inovative Technik. Aber Spaß beiseite, mir ist es lieber, eine SPS-Programm ist hinreichend "primitiv", aber nachvollziehbar und ganz klar deterministisch. Das ist nicht immer einfach hinzubekommen und auch ganz deutlich nicht das, was ein normales PC-Programm machen muß.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke auch, heutzutage ist es vor allem dieses deterministische, vereinfacht auch zeilenweises Abarbeiten von Code, das lernt vielleicht keiner im Studium, das gilt vielleicht bei Dozenten als primitiv?
Mir sagte mal ein Professor für Automatisierungstechnik an einer Uni auf NAchfrage zu Step7 etc. ganz stolz (oder eher hochmütig?): "Wir machen alles in C !". Dabei saß er vor seiner Sun-WS und ich wußte, weil ich ihn von meinem Studium her noch kannte, der hatte noch nie wirklich ein Programm für eine Industriemaschine geschrieben. Die machen heute Industrie 4.0, was auch immer das ist.
Events, Callback-Funktionen usw. sind ja anscheinend langsam (zu meinem Leidwesen) ein wenig im Kommen, zumindest zeigt ja Codesys V3 wo man gerne hinwill.
.

Es ist ein Problem unserer Hochschulen, dass es hier keinen verbindlichen Lehrplan gibt.
Jeder Prof. kann im Prinzip machen was er will.
So gibt es ganz heftige Unterschiede im KnowHow der Absolventen.
 
Es ist ein Problem unserer Hochschulen, dass es hier keinen verbindlichen Lehrplan gibt.
Jeder Prof. kann im Prinzip machen was er will.
So gibt es ganz heftige Unterschiede im KnowHow der Absolventen.

Ich hab auch schon öfters mal drüber nachgedacht, ob es sinnvoll ist, an den Hochschulen einen verbindlichen Lehrplan einzuführen. Aber ich denke nein. Dazu ist u.U. das Fachgebiet der Elektrotechnik oder auch Automatisierungstechnik viel zu breit aufgestellt. Da sollen sich die Hochschulen schon unterscheiden, worin sie ihren Schwerpunkt sehen.
Aber sinnvoll wäre eine "Qualitätskontrolle" der Profs! Es gibt einfach viel zu viele Profs welche eine grottenschlechte Lehre machen. Sei es daher weil sie vom Thema zu wenig verstehen, sie zu stark auf abgehobene "Theorien" versteifen, einfach schlechte Pädagogen sind oder sich einfach mehr um ihre Forschung kümmern als um die Lehre...

Aber zurück zum Thema Informatiker in der SPS-Programmierung: Wie oben schon geschrieben sollten SPSn ursprünglich Schützschaltungen ersetzten. Daher sollte jetzt auch ein einfacher "Elektriker" diese neuen SPS-Schaltungen entwickeln können, ohne großartiges Informatikstudium. Das erklärt vielleicht auch die andere Herangehensweise an ein SPS-Programm.
Im einfachsten Fall schreibst Du einfach einen UND-Befehl A0.0:=E0.0 AND E0.1; in den OB1 und das Programm macht schon etwas. Und um es noch übersichtlicher zu gestalten eben in FUP oder KOP.

Naja mittlerweile werden die Programme immer komplexer und die Arbeitgeber gehen dazu über, studierte Informatiker einzustellen. Und je nach deren Hoch- oder Übermut wollen die abundzu das Rad neu erfinden ;)

Mein alter Prof. an der Hochschule wollte auch nie verstehen, warum man eine mehrtägige Step7-Schulung benötigt... Aber der hatte auch nie eine Industriemaschine programmiert.

Gruß.
 
und warum ist das so? Also warum hat man eigentlich als Programmierer, der ja verschiedene Programmierarten, wie logikorientiertes Programmieren, objektorientiertes Programmieren, funktionales Programmieren, etc. erlernt hat, hier Probleme und scheitert? Oder ist das nur bei "nicht-studierten" Programmierern der Fall? Zu welchem Programmierstil ist die SPS-Programmierung unterzuordnen?

Also aus meiner Erfahrung, meist sind die "nicht-studierten" die Leute welche´die besseren SPS Programme schreiben :D
Das primäre Problem liegt wohl meist darin, das viele nicht verstehen wie die

a) zyklische Abarbeitung wirklich funktioniert
b) Zusammenhänge zwischen der SPS (Programmfunktionen) und Mechanik sowie Fluid verhalten
c) Ergonomisches Programmdesign auf den Bediener zu gestalten
 
oh alles klar, vielen Dank für die zahlreichen ausführlichen Erklärungen. Da steckt natürlich mehr dahinter, als es zunächst den Anschein hat, die erfahrenen unter euch, wissen was ich meine. Insofern ist das aber schade, denn es gibt mittlerweile so viele verschieden INformatik-Richtungen an den Unis (Medizinische Inf., Technische Inf., Wirtschaftsinf., Medieninf., und und und...), also irgendeine sollte doch in Richtung SPS doch zumindest eine Grundlage darstellen, oder nicht? Wenn ich die Kommentare so lese, ist das anscheinend überhaupt nicht der Fall, was irgendwo schade ist...
 
Ralle, vielen Dank.
Im weiteren Verlauf der Diskussion kommt deutlich heraus, wie die SPS eigentlich gedacht ist, ich muss aber tortzdem das Hochfahren realisieren.
Deine Idee habe ich gut verstanden, bei der Umsetzung scheitere ich aber noch.

Der Ablaufplan endet normalerweise mit einem Sprung. Nun kann ich vor den Sprung eine Transition FALSE setzen, dann sollte es nie zum Sprung kommen. Davor setze ich eine Wiederholvariable = 0, sodass das Programm beim nächsten Durchlauf gar nicht mehr aufgerufen wird. Dies führt im Betrieb nicht zu Problemen? Ich hab zwar nicht Informatik studiert aber nach meinem Gefühl ist so ein dead-end nicht die optimale Lösung.
Kann ich im FUP einfach eine Var setzen und diese in der ersten Zeile abfragen? Das hat bei mir nicht geklappt.

Dann noch eine dumme Frage zur Abarbeitung:
Wenn ich das Hauptprogramm geschrieben habe wird es zeilenweise abgearbeitet. Wenn ich nun Netzwerke konstruiere die nur im ersten Durchlauf aktiv sind, setze ich ab dem 2. Durchlauf einen Sprung über diese Netzwerke (mit der genannten Var). In einer ersten Simulation hat dies aber nicht geklappt.
Da nicht gewartet wird, werden nur alle Netzwerke zeilenweise gestartet oder wie muss ich mir das vorstellen?

Gruß

BZ-REX
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kommt nun ein wenig darauf an, mit welcher Sprache du hauptsächlich programmierst.
Springen kannst du immer, in KOP, FUP, AWL und auch in SCL/ST, wobei da Sprunge m.E. nicht genutzt werden sollten, sondern If .. then - Anweisungen.

In KOP/FUP/AWL nutzt man bei SIemens z.B. Anweisungen wie SPB (Springe bedingt):

Code:
UN #bMyVar //boolsche Variable
SPB M001

... //Code, der nur bei bMyVar = True ausgeführt wird

M001: NOP 0

In SCL/ST sieht das dan so aus:

Code:
If bMyVar Then

... //Code, der nur bei bMyVar = True ausgeführt wird

END_IF;

Wenn ich Ablaufsprache nutzte, dann mache ich so einen STOP nicht am Ende des Bausteins, der Ablauf kann und sollte da ganz normal enden., es wird eine globale Variable gesetzt, die dann auch überall wieder abgefragt werden kann.
Entweder du sorgst beim Aufruf des Bausteins dafür, dass der Ablauf nicht mehr gestartet wird oder du hast im Ablauf als erstes eine Transition, die deine Boolsche Variable abfragt und dann nicht weitermacht. So kann man dann auch bestimmen, was bei einem Neuanlauf der SPS passieren soll, u.U. will man ja den entsprechenden Ablauf auch dann nicht starten.
 
1000 Dank Ralle, für die stets schnell und gute Antwort!
Inzwischen habe ich eine bessere Vorstellung wie das funktionieren kann.
Leider konnte ich mein Programm noch nicht testen, aber das folgt baldmöglichst. Die meisten meiner Probleme habe ich mit dem Ablaufplan gelöst und einer Transition "FALSE".
Es fehlt nurnoch eine verschachtelte Bedingung in der die Physik und Programm synchronisiert werden müssen, vlt. werde ich da die Ableitung bemühen oder ich werde die CASE-Lösung versuchen...
In jedem Fall sehe ich jetzt Licht am Ende des Tunnels, danke!
 
Im Grunde ist ein nur einmaliger Programmdurchlauf ganz einfach zu realisieren mit einem "Merker" (STAT... oder DBX... oder M..., je nach Zweck remanent oder nicht-remanent) der nach Programmausführung auf TRUE gesetzt wird:
Code:
IF bBedingung AND NOT bFunktion_wurde_ausgefuehrt THEN

  ... //Code, der nur einmal ausgeführt werden soll

  bFunktion_wurde_ausgefuehrt := TRUE;
END_IF;

Harald
 
Zurück
Oben