Timer darstellen s7-200 WinCC flexible

blaupille29

Level-1
Beiträge
65
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe eine S7-200 CPU 224 programmiert.
Bediengerät ist mein PC (über WinCC flexible Advanced programmiert)
Das Programm funktioniert jetzt soweit.

Folgendes Problem:

Ich habe in dem Programm verschiedene Timer (TOF/TON) die ich über ein E/A Feld anzeigen lassen will.

Die Zeit soll als Minuten Sekunden runterlaufen. Also 2,00 Min 1,59 Min , 1,58 Min........

Hab eine Denkblockade und komme nicht weiter.

Kann mir jemand helfen und hat vielleicht gleich passend die AWL däfür ?
 
Sry, ich kenn mich mit der 200er nicht aus.
Was ich aber gerade aus dem Systemhandbuch herausgelesen habe gibt es IEC-Timer
An dessen Ausgang ET kann man eine Variable anschnürln die solange raufzählt bis PT erreicht ist, die Interpretation dieses Werte ist jedoch von der Timernummer- wie mir scheint-abhängig (1ms, 10ms oder 100ms).
Wenn Du nun PT-ET rechnest erhältst Du die Restzeit (vorbehaltlich einer Änderung an PT).
Systemhandbuch S7 200:
http://support.automation.siemens.c...eus&objaction=cssearch&searchinprim=&nodeid99=

Wird halt noch ein bissel eine Rechnerei bis Du auf x.yz Min kommst.

S7 200 = öde!
 
Dein Timer gibt die Zeit in 0,1s als INT an.

Du mußt also als Erstes mal durch 10 teilen, damit Du die vollen Sekunden hast.
Dann mußt Du den Wert durch 60 teilen für die vollen Minuten und der Rest ergibt die restlichen Sekunden.
Du erhältst also zwei Variablen.

Eine Bibliothek mit Modulo findest Du hier. Weiß grad nicht, ob Du die brauchst. Bin auf dem Sprung ins Kino. Danach kann ich mir das ja noch mal ansehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab' die oben verlinkte Bibliothek mal ein bißchen angepaßt und eingedeutscht:
Code:
[FONT=Courier New]SUBROUTINE_BLOCK MOD_W:SBR50[/FONT]
[FONT=Courier New]TITLE=[/FONT]
 
 
[FONT=Courier New]VAR_INPUT[/FONT]
[FONT=Courier New]Wert:WORD;[/FONT]
[FONT=Courier New]Teiler:WORD;[/FONT]
[FONT=Courier New]END_VAR[/FONT]
 
[FONT=Courier New]VAR_OUTPUT[/FONT]
[FONT=Courier New]Quotient:WORD;[/FONT]
[FONT=Courier New]Rest:WORD;[/FONT]
[FONT=Courier New]DoR:BOOL;[/FONT]
[FONT=Courier New]Fehler:BOOL;[/FONT]
[FONT=Courier New]END_VAR[/FONT]
 
[FONT=Courier New]VAR[/FONT]
[FONT=Courier New]Produkt:WORD;[/FONT]
[FONT=Courier New]END_VAR[/FONT]
 
 
[FONT=Courier New]BEGIN[/FONT]
 
[FONT=Courier New]Network 1 // Reset[/FONT]
[FONT=Courier New]// Alle Ausgangsvariablen rücksetzen[/FONT]
[FONT=Courier New]LD     SM0.0[/FONT]
[FONT=Courier New]FILL   0, LW4, 3[/FONT]
 
[FONT=Courier New]Network 2 // Division[/FONT]
[FONT=Courier New]// Ganzzahligen Anteil bestimmen und als Quotient ausgeben[/FONT]
[FONT=Courier New]// oder Fehler ausgeben und SUB abbrechen[/FONT]
[FONT=Courier New]LD     SM0.0[/FONT]
[FONT=Courier New]MOVW   LW0, LW4[/FONT]
[FONT=Courier New]UENO[/FONT]
[FONT=Courier New]/I     LW2, LW4[/FONT]
[FONT=Courier New]UENO[/FONT]
[FONT=Courier New]NOT[/FONT]
[FONT=Courier New]=      L8.1[/FONT]
[FONT=Courier New]CRET[/FONT]
 
[FONT=Courier New]Network 3 // Multiplikation[/FONT]
[FONT=Courier New]// Gegenrechnung: Produkt von Teiler und ermittelten Quotient bestimmen[/FONT]
[FONT=Courier New]LD     SM0.0[/FONT]
[FONT=Courier New]MOVW   LW2, LW9[/FONT]
[FONT=Courier New]*I     LW4, LW9[/FONT]
 
[FONT=Courier New]Network 4 // Subtraktion[/FONT]
[FONT=Courier New]// Gegenrechnung: Differenz vom Wert und Produkt der Gegenrechnung bestimmen und als Rest ausgeben[/FONT]
[FONT=Courier New]LD     SM0.0[/FONT]
[FONT=Courier New]MOVW   LW0, LW6[/FONT]
[FONT=Courier New]-I     LW9, LW6[/FONT]
 
[FONT=Courier New]Network 5 // Division ohne Rest DoR[/FONT]
[FONT=Courier New]// Wenn kein Rest, Ausgang setzen (SM1.0 wird im vorigen Netzwerk gesetzt, wenn das Ergebnis=0)[/FONT]
[FONT=Courier New]LD     SM1.0[/FONT]
[FONT=Courier New]S      L8.0, 1[/FONT]
 
[FONT=Courier New]END_SUBROUTINE_BLOCK[/FONT]

Damit kannst Du das z.b so einsetzen:
Timer wandeln.jpg

PS: Ich hoffe, es haben sich keine Fehler eingeschlichen. Hatte keine Lust, das jetzt noch zu testen, aber das Prinzip sollte auf jeden Fall klar werden.
Bei anderen Timern mußt Du eventuell den ersten Teiler anpassen.
Die Nummer des SBR hab' ich mal auf 50 gesetzt, in der Hoffnung, den gibt's bei Dir noch nicht.
 
Danke für die Antwort.
Sieht gut aus.
Ich habe allerdings nicht :Quotient,Rest,DoR und Fehler in den Bausteinen stehen.
Wo kriege ich diese her ?
Bei mir steht nur DWR und Out
 
...
Ich habe allerdings nicht :Quotient,Rest,DoR und Fehler in den Bausteinen stehen.
Wo kriege ich diese her ?
Bei mir steht nur DWR und Out
Du benutzt die Bibliothek aus meiner ersten Antwort.

Schau mal von hier zwei Post höher über das Bildchen. Da hab ich Dir den angepaßten Code zitiert, bei dem hast Du dann diese Ein-/Ausgänge.
Den schreibst (kopierst) Du in eine .txt-Datei, die Du neu anlegst und deren Datei-Endung Du anschließend von .txt auf .awl änderst.

Wenn Dir die Nummer des Unterprogramms nicht gefällt, die Zahl hinter SBR in der ersten Zeile ändern (max. 63). Geht natürlich auch noch nach dem Importieren unter Eigenschaften des Unterprogramms. Nur vor dem Importieren darauf achten, daß es die Nummer noch nicht gibt, denn MicroWin fragt bei bereits vorhandenem Unterprogramm mit dieser Nummer nicht nach, sondern überschreibt es einfach!

Danach kannst Du diese .awl-Datei mit einem Rechtsklick auf den Ordner Programmbaustein in Dein Projekt importieren.


Das Bild oben zeigt Dir dann ein Beispiel für die Anwendung des von mir geposteten, angepaßten Unterprogramms.


PS: Hab' Dir mal die .awl-Datei noch angehangen:
 

Anhänge

  • Modulo.rar
    531 Bytes · Aufrufe: 20
Zuviel Werbung?
-> Hier kostenlos registrieren
...
PS: Ich hoffe, es haben sich keine Fehler eingeschlichen. Hatte keine Lust, das jetzt noch zu testen, ...
Hab' mal meine Test-Anlage rausgekramt und das nachgeholt. Bei mir läuft's so wie gepostet.

Gut zu beobachten ist beim TON-Timer der Umsprung der Ausgabe von 59 auf 100.
Komma-Verschiebung im HMI/WinCC flex dann nicht vergessen.
 
Sorry,ich habe vergeblich versucht das Programm zu importieren.
Wenn ich es importiert habe ist SBR50 auch da.
Wenn ich dann aus der Bibliothek den Mod_w rausziehe sieht er wie auf Ihrem Bild aus.
Allerdings gibt es dann Fehler nach der Bearbeitung beim überspeielen in die CPU.
Der SBR50 nach importieren sieht ganz anders aus wie auf Ihrem Bild
Ich weiß aber nicht wohin mit meinen 2 Variablen.T101 und als EA Feld VW101.

Ich habe wohl vergessen zu erwähnen das ich nur gelegentlich programmiere.
 
Sorry,ich habe vergeblich versucht das Programm zu importieren.
Wenn ich es importiert habe ist SBR50 auch da.
Wenn ich dann aus der Bibliothek den Mod_w rausziehe sieht er wie auf Ihrem Bild aus.
Allerdings gibt es dann Fehler nach der Bearbeitung beim überspeielen in die CPU.
Der SBR50 nach importieren sieht ganz anders aus wie auf Ihrem Bild
Ich weiß aber nicht wohin mit meinen 2 Variablen.T101 und als EA Feld VW101.

Ich habe wohl vergessen zu erwähnen das ich nur gelegentlich programmiere.
OK - Grundlagen:
Was Du da von mir importierst ist keine Bibliothek, sondern ein reines Unterprogramm (SBR).
Die vorher eingefügte Bibliothek am Besten komplett wieder aus Deinem Projekt löschen, die hat nämlich noch den gleichen Namen (Symbolik) wie mein angepaßtes Unterprogramm, deshalb wahrscheinlich der Fehler.

T101 hab' ich ja schon benutzt.
Dein VW101 hab' ich jetzt mal eingefügt, das stellt die #Ausgabe dar.
Allerdings ist VW101 eine eigentlich schlechte Wahl, auch wenn's funktioniert. Das erste Variablenwort ist VW0 und geht über VB0 und VB1. Wenn man dann weiter zählt, landet man irgendwann bei VW100, das über VB100 und VB101, sowie VW102, das über VB102 und VB103 geht. VW101 würde jetzt über VB101 und VB102 gehen. Das ist zwar nicht weiter tragisch, aber eben auch nicht üblich. Deswegen würd' ich mir an Deiner Stelle sowas gar nicht erst angewöhnen.

Ich poste Dir mal mein Testprogramm. Dann öffnest Du MicroWin ein 2. Mal und öffnest mein Testprogramm darin.
Danach kannst Du die Netzwerke mit dem Aufruf des Unterprogramms einfach in Dein Projekt kopieren und die Variablen anschließend anpassen.

Kannst ja auch das Testprogramm erst mal auf Deine CPU laden und das Ganze dann beobachten, um zu sehen, ob es überhaupt das ist, was Du willst.

Anhang anzeigen Modulo.rar


PS: Kannst mich ruhig dutzen, ist im Internet bzw. in Foren allgemein so üblich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,klappt nicht.
Bei mir taucht immer das Bild wie im Anhang zu sehen auf(SBR50)
Wenn ich die Runtime starte läuft das Programm ab so wie es soll,nur das EA Feld startet nicht.Es wird nur die Anfangszeit des Timers angezeigt ohne das er sich verändert.
Es soll mal so sein das ich den Timer starte und das EA Feld rückwärtslaufen die Restzeit anzeigt: starten zb bei 2,00 Min 1,59 , 1,58 .... bis auf Null.Dann wird der Timer zurückgesetzt.
 

Anhänge

  • 1.JPG
    1.JPG
    157,1 KB · Aufrufe: 15
Du postest mir da einen Ausschnitt meines Unterprogramms von oben. Da weiß ich, wie das aussieht. Interessanter wäre Dein Aufruf dieses Unterprogramms. Der sollte ähnlich dem Bildchen von oben aussehen.

Rückwärtslaufen des Timers erfordert allerdings ein paar Zusatzrechnungen, da der Timer selbst immer vorwärts läuft.
Hab' mal mein (Test-)Programm entsprechend angepaßt.
Ruf' Dir das mal auf und schau', ob Du das nachvollziehen kannst.

An dem Unterprogramm mußt Du nichts anpassen, nur an Deinem Aufruf.
Vlt. postest Du mal Dein Programm oder schickst es mir per PN, dann würde ich Dir den Aufruf auch 'reinbauen.

Wenn Du das mehrfach brauchst, würd' ich noch ein zweites Unterprogramm machen, das den Timer- und Vorgabewert in Deine Ausgabe umwandelt und Du dieses mehrfach aufrufen kannst.



PS: Muss jetzt zum Geburtstag, kann Dir also erst morgen früh (oder vlt. irgendwann in der Nacht) weiter helfen.
 

Anhänge

  • Rückwärtszähler.rar
    8,5 KB · Aufrufe: 2
Hab' mal noch fix das 2. Unterprogramm erstellt (meine Frau meckert schon), vlt. fällt es Dir so leichter das Ganze einzubinden.
 

Anhänge

  • Rückwärtszähler.rar
    9,5 KB · Aufrufe: 3
Zuviel Werbung?
-> Hier kostenlos registrieren
Bibliothek Timerwert

Hab' Dir mal 'ne Bibliothek erstellt, mit der Dir der Aufruf vlt. einfacher fällt,

[EDIT]die aber leider einen Fehler enthielt[/EDIT]
 
Zuletzt bearbeitet:
Boah,supi,
genau das was ich gesucht habe.
Ich danke dir für diese Lösung.
Wenn es dieses Forum nicht geben würde hätte ich es drangegeben.
 
Fehlerbereinigung und Optimierung

Sorry, erst mal ist mir in der Bibliothek oben ein Fehler beim Einfügen einer globalen Variable eingeschlüpft, den ich nicht bemerkt habe.
[EDIT]Noch einen Fehler entdeckt und behoben.[/EDIT]

Und außerdem gibt's beim CountDown noch etwas, was ich vorher nicht bedacht habe:
Wenn z.B. bloß noch 0,9 Sekunden übrig sind, zeigt die Ausgabe bereits 0 an. Ist das so bei Dir gewünscht?

Ich hab' deshalb die Bibliothek noch mal etwas modifiziert:

Dieses Unterprogramm wandelt einen Timerwert in die Ausgabe 'Minuten Sekunden' um.
Tritt ein Fehler bei der Umwandlung auf, wird der Ausgang Fehler gesetzt, während die Ausgabe auf 0 bleibt.
Über den Modus kann die Art der Ausgabe eingestellt werden.
Bei korrigiertem CountDown wird eine angefangene Sekunde noch als volle angezeigt (0,1s = 1s).
Soll die Anzeige genullt werden, werden negative CountDown-Werte oder Timer-Werte größer als die Timer-Vorgabe als 0 angezeigt.
Code:
INTERFACE:
 
[FONT=Courier New]Timer         INT      umzuwandelnder Timer[/FONT]
[FONT=Courier New]PT            INT      voreingestellter Zeitwert (PT) des Timers[/FONT]
[FONT=Courier New]Auflösung     BYTE     Auflösung des Timers in 1, 10 oder 100ms[/FONT]
[FONT=Courier New]Modus         BYTE     0 = CountUp[/FONT]
[FONT=Courier New].                      1 = CountUp   genullt[/FONT]
[FONT=Courier New].                      2 = CountDown[/FONT]
[FONT=Courier New].                      3 = CountDown genullt[/FONT]
[FONT=Courier New].                      4 = Countdown korrigiert[/FONT]
[FONT=Courier New].                      5 = Countdown korrigiert und genullt[/FONT]
 
[FONT=Courier New]Ausgabe       INT      Ausgabe des Timers in 'Minuten Sekunden'[/FONT]
[FONT=Courier New].                      (Komma muss im HMI verschoben werden)[/FONT]
[FONT=Courier New]Fehler        BOOL     Fehler bei der Umsetzung des Timers[/FONT]
[FONT=Courier New].                      (falsche Auflösung, falscher Modus oder[/FONT]
[FONT=Courier New].                       Fehler bei Berechnung)[/FONT]
 
 
[FONT=Courier New]BEISPIEL:          _____________________[/FONT]
[FONT=Courier New]|                 |      TIMERWERT      |[/FONT]
[FONT=Courier New]|     SM0.0       |                     |[/FONT]
[FONT=Courier New]|-----|   |-------| EN                  |[/FONT]
[FONT=Courier New]|                 |                     |[/FONT]
[FONT=Courier New]|                 |                     | [/FONT]
[FONT=Courier New]|          T101 --| Timer       Ausgabe |-- VW100[/FONT]
[FONT=Courier New]|           VW0 --| PT           Fehler |-- M0.0[/FONT]
[FONT=Courier New]|           100 --| Auflösung           |[/FONT]
[FONT=Courier New]|             5 --| Modus               |[/FONT]
[FONT=Courier New]|                 |_____________________|[/FONT]
 

Anhänge

  • Timerwert.rar
    5,2 KB · Aufrufe: 13
Zuletzt bearbeitet:
Zurück
Oben