nicht genügend Timer in der SPS

andyecht

Level-1
Beiträge
59
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

vielleicht habt ihr eine Idee, wie ich es realisieren kann. Problem:

Ich benötige bei meiner CPU mehr als 255 Timer (314C-2DP).
Problem:
Ich möchte überwachen, ob ein Ausgang länger als 3 Minuten angesteuert wird. Zu überwachen sind 64 Ausgänge, jedoch habe ich nicht mehr genügend Timer der CPU frei.
Am elegantesten wäre es natürlich, wenn ich einen Timer hätte, den ich immer wieder nutzen kann.
Die z.Zt. aktuelle Zykluszeit liegt bei 90-100ms.

Habt ihr eine Idee, oder so etwas schon mal realisiert? Meine Idee wäre es, die Zykluszeit einzulesen, und den Timer über einen Counter zu realisieren. So kann ich die Zykluszeit bei jedem Zyklus hochzählen, und den programmierten Timer dann setzen, wenn die aufsummierte Zykluszeit grösser die zu überwachende Zeit ist. Auf eine Sekunde soll es mir demnach bei dem Timer nicht ankommen.

Ich werde mir heute Abend auch nochmal etwas dazu einfallen lassen.
Wenn ihr eine Idee habt, bin ich an eurem Vorschlag interessiert. Vielleicht geht es noch eleganter, als wie ich es mir Überlegt habe.
Gruss und danke,

Andy
 
Wenn Sie in de HW eine Taktmerker deifnieren kontte sie met eine FP eine merker machen die jede sec ein cyclus hoog ist. Mit dieser Merker kontte sie zb ein DW mit 1 erhogen wenn die Ausgang hoog ist. zb

Taktmerkerbyte = 199
U M 199.5 // Taktmerker 1sec
FP M 197.5
= M 198.5 // Puls 1 sec

U A 1.0
SPB M1
L 180
T DB20.DBW0
SET
R M 10.0 //A 1.0 > 3 MIN HOOG
SPA M1A
M1: U M198.5
SPBN M1A
L DB20.DBW0
L 1
-I
T DB20.DBW0
SPP M1A
SET
S M10.0
M1A:NOP 0
 
Klassiker von "wozu einfach, wenn's auch mit S(iemens)tep 7 geht".
Aber auch meines Wissens ist die Zahl der IEC-Timer nicht limitiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klassiker von "wozu einfach, wenn's auch mit S(iemens)tep 7 geht".
Aber auch meines Wissens ist die Zahl der IEC-Timer nicht limitiert.

Da hast du grundsätzlich zwar recht, aber der Speicher und Ressourcenhunger der IEC-Timer,
ist mit Sicherheit nicht als gering zu bezeichnen.

Mfg
Manuel
 
Hallo,

nimm den Sekundentakt aus der CPU und zähl damit eine Integer hoch.
Dann noch vergleichen auf >180 und schon hast du es.

MfG
So ähnlich mache ich das auch immer.

Ich habe mir einen Zeit-FC gebastelt der vom Sekundentakt der CPU gespeist wird und einen Wert aufaddiert. Nach 60 Takten wird die Minute hochgezählt, danach Stunde etc.
 
+

Die Sprungbefehle sollten eigentlich aus dem STEP7 Befehlssatz entfernt werden.
Wenn das Zeug exzessiv eingesetzt wird, kann einem das arme Schwein,
das später mal mit dem Code arbeiten muss, leid tun.
 
Das mit den Taktmerkern die ein ein Merker- oder Datenwort hochzählen funktioniert zwas wird aber dem System S7 nicht gerecht. Dann Programmiert doch lieber weiter S5!

Also IEC Timer TON(SFB4), TOF(SFB5) wären ein gutes Mittel.

Man kann auch zu dem TONR(FC80) aus der TI-S7 Lib greifen.

Und wenn schon aufaddieren dann den OB1_Prev_Cycle (und kein schwulen Taktmerker).
 
Das mit den Taktmerkern die ein ein Merker- oder Datenwort hochzählen funktioniert zwas wird aber dem System S7 nicht gerecht. Dann Programmiert doch lieber weiter S5!
Ich z.B. würde das gern, aber was soll ich machen wenn doch die S5 als Neuware nicht mehr erhältlich ist.:confused:

Also ich finde das gut dass sich die S7 wenigstens noch so annähernd im S5-Stil programmieren lässt.;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und wenn schon aufaddieren dann den OB1_Prev_Cycle (und kein schwulen Taktmerker).
Wie soll das funktionieren ? Laut Siemens bedeutet diese Funktion "Zeit des vorherigen Zyklus feststellen".
Das wird dann ja eine beliebige Zeit sein, die sich sicherlich auch je nach Programmabarbeitung verändern kann.

Ich finde die Taktmerker gar nicht so "schwul". Man kann je nach Anwendungsfall mal eben schnell die Takt ändern.

Ganz wichtig ist auch, das ein "0815" Elektriker mit S7-Grundkenntnissen das Programm halbwegs auch versteht.
Denn nachdem die Programmierer ihre Anlage abgeliefert haben, müssen die Betriebselektriker damit klar kommen. Ich habe keine Lust Nachts um 3Uhr auf der Matte zu stehen, nur weil die Anlage nicht mehr läuft und der Schichtelektriker eine Funktion nicht versteht.
Deshalb versuche ich alles möglichst Anwenderfreundlich in FUP zu programmieren.
 
Wie soll das funktionieren ? Laut Siemens bedeutet diese Funktion "Zeit des vorherigen Zyklus feststellen".
Das wird dann ja eine beliebige Zeit sein, die sich sicherlich auch je nach Programmabarbeitung verändern kann.

Ich finde die Taktmerker gar nicht so "schwul". Man kann je nach Anwendungsfall mal eben schnell die Takt ändern.

Ganz wichtig ist auch, das ein "0815" Elektriker mit S7-Grundkenntnissen das Programm halbwegs auch versteht.
Denn nachdem die Programmierer ihre Anlage abgeliefert haben, müssen die Betriebselektriker damit klar kommen. Ich habe keine Lust Nachts um 3Uhr auf der Matte zu stehen, nur weil die Anlage nicht mehr läuft und der Schichtelektriker eine Funktion nicht versteht.
Deshalb versuche ich alles möglichst Anwenderfreundlich in FUP zu programmieren.

Schau Dir mal den TONR(FC80 aus der TI-S7 Lib) an. Der ist von Siemens und macht das so.

Ob man sich jetzt einen Baustein baut der einen Taktmerker zählt und diesen Wert dann auswertet. Oder die Dauer des letzten OB1 Zyklus aufaddiert ist ja vom Aufwand her vergleichbar.

Das aufaddieren der OB1 Zykluszeit ist dabei viel Genauer und auch an eine Zeiteinheit gebunden und keinen gewählten Takt. Wenn ich so was lese: "Man kann je nach Anwendungsfall mal eben schnell die Takt ändern.", frag ich mich ob Du das wirklich für einfacher empfindest. IMHO wäre es doch viel einfacher eine andere Zeit als Sollwert anzugeben.

Am besten verwendet man Standard Bausteine die eh schon in der Hilfe erklärt sind.

Zitat von Ralle: "Es ist nie zu früh, sich einen sauberen Programmierstil anzugewöhnen".
 
Zuletzt bearbeitet:
Timer mittels Weckalarm

Hallo Andy

Die S7 kennt Weckalarme. Diese werden z.B. alle 100ms (Intervall je nach Weckalarm OB30..38). Darin kannst du die Zustände der zu überwachenden Ausgaben z.B. mittels einem FB bzw. im IDB auswerten und Wort-Zähler im IDB hochzählen.

Ich mache dies bei einer SPS-Fernsteuerung, um Kommandos die über eine Serielle Schnittstelle empfangen werden, sowie deren Ausgänge an den Prozess, zeitlich zu begrenzen. Die Ausgaben werden mittels 100ms Weckalarm auf ein max von 3 sec. begrenzt. Bleibt ein Ausgang hängen, wird dieser auf ein vordefinierbaren (aus einem Konfig-DB) Wert gesetzt. Ein nicht ausgeführtes Kommando wird aus dem Kommando-Stack gelöscht.

Dieses Verfahren ist für mich ausreichend genau und man kann eigentlich beliebig viele Timer (bzw. 100ms-Zähler) realisieren. Wenn man den FB geschickt ausprogrammiert, ist dieser auch Anwendungsunabhänig verwendbar (z.B. ohne Merker)

Gruss Hansruedi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt hats mich wohl erwischt!

Schöner Mist!
Hab heute den ganzen Tag im schwülwarmen Schalthaus vor der S5 (155U) gehockt und nu gehen mir die Ideen aus.
Es geht um folgendes:
Eine Filteranlage mit 36 Filterkammern á 12 Abreinigungsventilen (=432 Ventile) macht grad etwas Zicken mit der Druckluftversorgung. Die CPU (945) ist ziemlich ausgelutscht, was Merker und Zeiten angeht. Zeiten hab ich gar keine mehr frei. Die Ventile werden mittels S-Merker angesteuert, die dann über eine IM308B an die Peripherie geschaufelt werden.
Es steht die Vermutung im Raum, das einige Abreinigungsventile zu lange angesteuert werden und die Druckluft somit entweichen kann. Dies kann man auch anhand der Druckluft-Durchflussmessung der Anlage sehen.
Alle Abreinigungsventile einer Filterkammer sind in einem S-Merkerwort zusammengefasst.
Nu hab ich gedacht, vergleiche ich fix die entsprechenden 36 Stück S-Merkerworte auf >< 0 und gucke, wie lange der Zustand ansteht.
Und nun stehe ich da mit meinem kurzen Hemd.... Ohne Timer weiß ich grad nich weiter...

Für Tipps / Ideen bin ich euch dankbar!
Greez Appro
 
Dann haben wir früher Zähler eingesetzt, die wir mit einem 100ms-Impuls hochgezählt oder von einem festen Wert (max. Laufzeit z.Bsp.) runtergezählt haben. Davon hat ja die S5 auch noch einmal eine ganze Menge. :D
 
Ja, das mit dem Zählen hab ich in diesem Thread auch schon gelesen. Das Prob ist ja, daß ich mir ne Einschaltverzögerung (SE) wünsche... Muss ich wohl mal sehen, wie ich das mit ner Zählerei hinbekomme. Das Runterzählen einer "Max-Zeit" ist ein Ansatz...
Wobei die 'normale' Ansteuerungszeit eines Ventils nur je 0,25s beträgt.


Vielleicht so (nicht so genau auf den Syntax schauen):

Code:
L KC 20    // Zähler mit 2 Sekunden vorbelegen
S Z1
U(
L SW123   //Mein S-Merkerwort
L KF+0
><F
)
U 100msTakt  //mal sehen ob es den gibt
ZR Z1
 
UN Z1
blabla

Problem wird sein, das der Zähler auch bei normaler Ansteuerung der Ventile runterzählt. :neutral:
Gruß Approx
 
@ zotos:

Schau Dir mal den TONR(FC80 aus der TI-S7 Lib) an. Der ist von Siemens und macht das so.
Super Tipp!

Wo rufst du den FC80 denn dann auf? Im OB1 oder irgendwo in einem anderen Baustein? Man müsste ja dann die temp Variable
Code:
OB1_PREV_CYCLE
im OB1 in eine Lokale speichern um diese dann am FC80 benutzen zu können?

Sehe ich das so richtig?
 
@ zotos:


Super Tipp!

Wo rufst du den FC80 denn dann auf? Im OB1 oder irgendwo in einem anderen Baustein? Man müsste ja dann die temp Variable
Code:
OB1_PREV_CYCLE
im OB1 in eine Lokale speichern um diese dann am FC80 benutzen zu können?

Sehe ich das so richtig?
aufgeregt? - na, na, na, cool bleiben ...

und ja: natürlich! OB1_PREV_CYCLE wird bei mir z.B. im OB1 in ein Merkerbyte verfrachtet und dann überall in meinem Programm verwendet.

Auch OB1_SCAN_1 wird bei mir im OB1 ausgewertet und als Globalvariable sämtlichen Prozessen zur Initialisierung zur Verfügung gestellt. Die Anlauf-OB benutze ich dafür nicht, um die Maschine beim Netzwiederkehr in einen definierten Zustand zu bringen.
 
Zurück
Oben