S7-200 CPU 222, Step 7 MicroWIN 4 SP7: Zeitglied im Unterprogramm

K

Kallemann

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe einen SD-Anlauf in einem Unterprogramm gekapselt. Dieses Unterprogramm wird nur dann aufgerufen, wenn es benötigt wird und es "schaltet" seinen Aufruf selbst ab, wenn es durchgelaufen ist. Wird nun aber der Aufruf während des SD-Anlaufes durch den Benutzer abgebrochen (z.B. durch Abschaltung), dann bleibt scheinbar die bereits abgelaufene Zeit im Timer gespeichert und wird nicht auf 0 gesetzt. Laut Beschreibung des Zeitgliedes soll das wohl so sein; daher meine Frage: Kann man die abgelaufene Zeit eines Zeitgliedes explizit auf 0 setzen?

Vielen Dank für Eure Hilfe.

VG Carsten
 
Naja,
da wird Dir wohl nix anderes übrigbleiben als die Zeit aus dem Unterprogramm herauszunehmen, ich habe ähnliche Probleme z.B. mit Schrittketten.
Und mal Hand aufs Herz, dieses kleine aber sehr feine Automatisierungssystem ist nun weißgott nicht teuer - da kann man mit solchen Ausnahmen leben....

Gruß
Mario
 
Hallo,
das mit der Teufellösung hatte ich zwar auch im Hinterkopf, ich sehe das Problem aber dahingehend, das wenn die Zeit ausgelöst hat, das Unterprogramm aber nicht aktiv ist?
Für mich ist das kein sauber abgefangener Zustand, ich denke das sollte man nicht tun.

Gruß
Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo mariob.

Hallo,
das mit der Teufellösung hatte ich zwar auch im Hinterkopf, ich sehe das Problem aber dahingehend, das wenn die Zeit ausgelöst hat, das Unterprogramm aber nicht aktiv ist?
Für mich ist das kein sauber abgefangener Zustand, ich denke das sollte man nicht tun.

Ich weiß nicht, ob ich Deine Bedenken richtig verstehe. Das Unterprogramm ist so konstruiert, dass der Merker, der den Dreieck-Betrieb speichert, "erst" in Netzwerk 1 des Unterprogramms gesetzt wird. Das heißt, das Unterprogramm wird nach Setzen von A0.1 (Dreieck-Schütz) noch ein weiteres Mal aufgerufen und in diesem letzten Zyklus wird die Zeit wieder auf 0 gesetzt.

Meinst Du etwas anderes?

VG Carsten
 
Hallo,
@Carsten, ich hatte das so verstanden, das Deine Zeit im Unterprogramm welches sich selbst abschaltet definiert und gesteuert wird. Das kann unter Umständen nach hinten losgehen.
Genaueres kann man nach Sichtung des Quelltextes sagen.

Gruß
Mario
 
Hallo Mario.

Hier habe ich 'mal das Unterprogramm aufgeschrieben.



Unterprogramm "SDAnlauf1"

Netzwerk 1 Rückmeldung Dreieck-Betrieb Motor1

Wenn das Netz-Schütz K11 von Motor 1 eingeschaltet ist und das Dreieck-Schütz K12 von Motor 1 eingeschaltet ist, dann wird der Merker RunM1 gesetzt.
HINWEIS:
Der Merker RunM1 muss hier in Netzwerk 1 gesetzt werden, damit dieses Unterprogramm einen Zyklus länger durchlaufen wird und dadurch die abgelaufene Zeit des Zeitglieds K12T wieder auf 0 gesetzt wird.


LD K11
U K12
S RunM1, 1


SymbolAdresseKommentar
K11
A0.0
Motor1 Netz-Schütz
K12
A0.1
Motor1 Dreieck-Schütz
RunM1
M1.0
Motor1 ist in Dreieck-Betrieb




Netzwerk 2 Einschaltung Stern-Schütz Motor1

Wenn das Netz-Schütz K11 von Motor 1 ausgeschaltet ist und das Dreieck-Schütz K12 von Motor 1 ausgeschaltet ist, dann wird das Stern-Schütz K13 von Motor 1 eingeschaltet und in Selbsthaltung gebracht.


LDN K11
UN K12
S K13, 1

SymbolAdresseKommentar
K11
A0.0
Motor1 Netz-Schütz
K12
A0.1
Motor1 Dreieck-Schütz
K13
A0.2
Motor1 Stern-Schütz




Netzwerk 3
Zeitverzögerung Netz-Schütz Motor1

Wenn das Stern-Schütz K13 von Motor 1 eingeschaltet ist, dann wird ein Zeitglied gestartet, das nach Erreichen der eingestellten Zeit das Netz-Schütz K11 von Motor 1 einschaltet und in Selbsthaltung bringt.

LD K13
TON K11T, 10
Symbol
Adresse
Kommentar
K11T
T37
Motor1 Einschaltverzögerung Netz-Schütz
K13A0.2Motor1 Stern-Schütz





Netzwerk 4 Einschaltung Netz-Schütz Motor1

Wenn das Zeitglied K11T die eingestellte Zeit erreicht hat, wird das Netzschütz K11 von Motor 1 eingeschaltet und in Selbsthaltung gebracht.


LD K11T
S K11, 1

Symbol
Adresse
Kommentar
K11
A0.0
Motor1 Netz-Schütz
K11T
T37
Motor1 Einschaltverzögerung Netz-Schütz




Netzwerk 5 Anlaufzeit Motor1

Wenn das Netz-Schütz K11 von Motor 1 eingeschaltet ist und das Dreieck-Schütz K12 von Motor 1 NICHT eingeschaltet ist, dann wird ein Zeitglied gestartet, das nach Erreichen der eingestellten Zeit das Stern-Schütz K13 von Motor 1 abschaltet.


LD K11
UN K12
TON K12T, 100

Symbol
Adresse
Kommentar
K11
A0.0
Motor1 Netz-Schütz
K12A0.1Motor1 Dreieck-Schütz
K12T
T38
Motor1 Anlaufzeit Stern





Netzwerk 6 Abschaltung Stern-Schütz Motor1

Wenn das Zeitglied K12T die eingestellte Zeit erreicht hat, wird das Stern-Schütz K13 von Motor 1 abgeschaltet.


LD K12T
R K13, 1

Symbol
Adresse
Kommentar
K12T
T38
Motor1 Anlaufzeit Stern
K13
A0.2
Motor1 Stern-Schütz





Netzwerk 7 Einschaltung Dreieck-Schütz Motor1

Wenn das Zeitglied K12T die eingestellte Zeit erreicht hat und das Netz-Schütz K11 von Motor 1 eingeschaltet ist und das Stern-Schütz K13 von Motor 1 ausgeschaltet ist, dann wird das Dreieck-Schütz K12 von Motor 1 eingeschaltet und in Selbsthaltung gebracht.


LD K11
UN K13
U K12T
S K12, 1

Symbol
Adresse
Kommentar
K11
A0.0
Motor1 Netz-Schütz
K12
A0.1
Motor1 Dreieck-Schütz
K12T
T38
Motor1 Anlaufzeit Stern
K13
A0.2
Motor1 Stern-Schütz



Die Abschaltung der Netz- und Dreieck-Schütze erfolgt im Unterprogramm "Nachlauf1", falls erforderlich im Hauptprogramm bei Fehlern oder so.
Die explizite Rücksetzung der Zeiten von T37 und T38 erfolgt im Hauptprogramm, sofern der Motor gerade in Stern-Betrieb anläuft und währendessen eine Fehler auftritt oder vorsätzlich abgeschaltet wird.

Da kann doch eigentlich nichts nach hinten losgehen, oder?

VG Carsten
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Carsten,
hmm, bitte jetzt nicht böse sein, aber das was Du oder ich da programmieren ist nicht der Nabel der Welt. Ich hole mal ein wenig aus, also eine SPS hat ein Betriebssystem, welches im Hintergrund aus unserem Geschreibsel viele Dinge macht, die Dir offensichtlich so nicht bewußt sind.
Du definierst eine Zeit in einem Unterprogramm welches ab und zu mal läuft und gleichzeitig greifst Du von ganz anderer Stelle auf diese unter Umständen nicht laufende Definition zu. Dir ist bewußt wieviele Flags, Register und Bits da unter Umständen nicht mit gesetzt/geschrieben werden?
Wenn ich der Compiler wäre würde ich Dir solchen Code um die Ohren schlagen:). Das ist das Gegenteil von dem was man robusten Code nennt, und Du kannst mir glauben, wenn man solche Fehler bewußt oder unbewußt macht, die Suche nach der Ursache kann grausam sein.
Das ist genauso schlimm wie unkommentierter Quelltext oder Knoffhoffschutz.

Sorry, so sehe ich das leider
Mario
 
Hallo Mario.

Deswegen bin ja nicht böse. Aber wenn Du meinen Code nicht robust findest, dann zeig' mir doch, wie ich ihn robust machen kann und hilf mir, besser zu werden.

VG
Carsten
 
Hallo Carsten,
ich bin zur Zeit auch auf Arbeit dabei dem Kollegen (Elektriker, aber ein ganz lieber) etwas zu schubsen. Dann erst merkt man wieviel Grundlagenwissen man vorrausetzt, was der arme Kerl nicht hat.
Ich schrob schon durch die Blume, das Du eine Zeit teilweise undefiniert verwendest (durch das sich abschaltende Unterprogramm).
Die logische Schlußfolgerung sollte für Dich sein, nie irgendwo im Programm einen undefinierten Zustand zu hinterlassen. Du mußt also lediglich den Umkehrschluß ziehen und entweder sagen das Unterprogramm läuft ständig oder die Zeitdefinition in einen immer laufenden Programmteil auslagern. Der Rest ist Phantasie.
Im übrigen, wozu schaltest Du das Unterprogramm überhaupt ab und warum verwendest Du keine Übergabeparameter? Was Du vorhast klingt nicht so als ob man das nicht könnte.
Ich würde den Sterndreieckkram sauber in ein SBR kapseln und gut wäre es. Effekte sind bessere Übersichtlichkeit, man kann die Bibliothek erweitern und dann gut den Guttenberg machen (in anderen Projekten).
Meine erste Devise heßt ich bin faul und das macht mich fleißig:ROFLMAO:.

Gruß
Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mario.

Obwohl ich verstehe, was Du meinst, hardere ich doch immer noch sehr damit, das Unterprogramm ständig mit aufrufen zu lassen. Darüber nachzudenken hat mich am Wochenende einige Stunden beschäftigt.
Also: Ich schalte den Aufruf des Unterprogramms ab, weil ich bis dato den Gedanken habe, dass es überflüssig ist, eine Stern-Dreieck-Anlauf-Prozedur aufzurufen, sofern der betreffende Motor schon im Dreieck-Betrieb läuft.

Du sagst: Als Compiler würdest Du mir den Code um die Ohren hauen. Ich sage: Als SPS würde ich mich fragen, warum ich ständig diesen Umweg gehen muss, obwohl ich dort keine Aufgabe erfüllen kann.

Nun mag es sein, dass ich das völlig falsch sehe und man mich für dusselig hält, aber das Risiko muss ich jetzt eingehen: Ich betrachte das Unterprogramm als Funktionsbaustein, den ich nicht instanziieren kann.
Die Anlage verfügt über zwei Motoren, die in Abhängigkeit von der Anzahl der eingeschalteten Eingänge gesteuert werden. Das bedeutet, ich brauche ein zweites Unterprogramm für den zweiten Motor, weil ich beide Unterprogramme "parallel" betreiben muss. Daher habe ich auf die Verwendung von Übergabeparametern verzichtet und "schalte und walte" direkt im Unterprogramm.

Der Hinweis zur Bibliothek ist natürlich ein sehr guter; das werde ich auf jeden Fall weiterverfolgen.

VG
Carsten
 
Hallo,
@Carsten, der Mensch denkt emotional und intuitiv, die SPS arbeitet stur und streng logisch die aneinandergereihten Befehle ab.
Ich sage: Als SPS würde ich mich fragen, warum ich ständig diesen Umweg gehen muss, obwohl ich dort keine Aufgabe erfüllen kann.
Diese Frage stellt sich deswegen nicht, es gibt für das Optimieren eigentlich einen einzigen Grund: Die Zykluszeit. Das sollte in Deinem und vielen anderen Fällen nicht kritisch sein. Und selbst dann ist es notwendig Definitionen im Programm eindeutig zu halten was im Falle Deiner Programmvariante nicht unbedingt gewährleistet ist. Es ist aber auch nicht verboten, ich habe nur so meine Erfahrungen und die sprechen eine eindeutige Sprache.

Gruß
Mario
 
...
Im übrigen, wozu schaltest Du das Unterprogramm überhaupt ab und warum verwendest Du keine Übergabeparameter? Was Du vorhast klingt nicht so als ob man das nicht könnte.
Ich würde den Sterndreieckkram sauber in ein SBR kapseln und gut wäre es.
...
...
Die Anlage verfügt über zwei Motoren, die in Abhängigkeit von der Anzahl der eingeschalteten Eingänge gesteuert werden.
...
Das schreit doch aber geradezu nach einer gekapselten SBR, wie mariob es vorgeschlagen hat.
Eine SBR für x Motoren. Startbedingungen/Zeiten am Aufruf definiert. Immer sauber durchlaufen und Ausgänge (Schütze) durch Zuweisung (=), statt Setzen/Rücksetzen.

Hab' Dir mal ein Beispiel angehangen:
 

Anhänge

  • Stern-Dreieck-Anlauf.zip
    9,1 KB · Aufrufe: 3
Zurück
Oben