Timer hängen nach dem "ersten Mal"

rs-plc-aa

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

bin gerade etwas konfus...

Ich möchte etwas ganz simples tun - bekomme es aber irgendwie nicht auf die Reihe - aber na ja seht selbst:


Aufgabe:

Ein Merker soll für 1s "1" sein und danach für 10s "0".

Verknüpft werden soll nur der Merker selbst - keine E/A

Mein Lösungsansatz funktioniert aber nur ein Mal --> also 10s "0", dann 1s "1" und danach läuft die 10s Zeit nicht mehr ab.

Step7 Code:

Code:
      U     M     50.6
      SPB   m001
      L     S5T#10S
      SE    T     98                    //Pause
      U     T     98
      S     M     50.6
      SPA   ende
m001: NOP   0
      L     S5T#1S
      SE    T     99                    //Impuls
      U     T     99
      R     M     50.6
ende: NOP   0

könnte mir vorstellen daß die Timer nach dem Ablauf für den nächsten Lauf "freigegeben" (FR Tx) werden müssen - aber wo und von was abhängig wird das hier im Beispiel gesetzt ?

Oder liegt´s doch an was ganz anderem ?
 
Hallo,

hab´s gefunden...

Der Verdacht war wohl schon richtig.

Es musste allerdings nicht nur die Freigabe (mit dieser allein ging´s noch nicht) sondern auch ein Reset des jeweiligen Timers (mit diesem allein ging´s ebenfalls nicht) programmiert werden.

Step7 Code:

Code:
      U     M     50.6
      SPB   m001
      L     S5T#10S
      SE    T     98                    //Pause
      U     T     98
      S     M     50.6
[B]     R     T     98[/B]
[B]     FR    T     98[/B]
      SPA   ende
m001: NOP   0
      L     S5T#1S
      SE    T     99                    //Impuls
      U     T     99
      R     M     50.6
[B]     R     T     99[/B]
[B]     FR    T     99[/B]
ende: NOP   0

Na ja...

hauptsache "s" funktioniert.
 
;) tja, zeit ist geld. ;)

aber besser macht man das so.
von wegen, zeiten laufen unabhängig vom zyklus. hatte wir schon mal.
in diesem fall allerdings völlig unerheblich

Code:
UN M50.6 //<-------
L S5T#10s
SE T98
U   T98 
= M50.6
L S5T#1s
SE T99
 
Hallo,

HAMMER !

Aber da drängt sich mir nun die Frage auf:

Warum geht es scheinbar doch ohne Reset und Freigabe ???

Ich scheine wohl nicht genau genug zu wissen wie so eine CPU im inneren "tickt"...


Könnte das freundlicherweise mal jemand erklären (anhand dieses Beispiels am besten) ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich habe nun (erst) beide Beispiele ausprobiert.

Das von Volker läuft bei mir aber nicht...
Dort bleibt der T99 stehen und m 50.7 blinkt bestenfalls mal kurz auf (soll aber immer 1sec "1" sein...)

Das von Rolf geht so wie das welches ich geschrieben hatte.


Ich habe alle 3 versionen mal in 3 versch. Netzwerke gesetzt und die Timer und den Merker einfach umbenannt - also quasi M 50.5/T94+95 usw.


Mein Ansatz und der von Rolf laufen zunächst scheinbar synchron - aber mit der Zeit wird die Abweichung immer größer (bei vorherigem synchronen Stp/Run der CPU).

Kann es das sein was Volker gemeint hat daß die Timer vom Zyklus beeinflusst werden ?

Ach so - der Code ist in einer FC welche im OB1 aufgerufen wird (falls relevant).
 
hast recht meins war nicht ganz richtig.
der merker stand an der falschen stelle.

der m50.6 ist nur 1 zyklus 1-signal und nur für den takt verantwortlich.
wenn man im programm diesen merker nicht nimmt, sondern die zeit direkt, kann es passieren, dass ein teil des programms das nicht mitbekommt.

Code:
      UN    M     50.6
      L     S5T#5S
      SE    T     98
      U     T     98
      L     S5T#1S
      SE    T     99
      U     T     99
      =     M     50.6
      U     T     98
      UN    M     50.6
      =     M     50.7 //1 sek high
 
rs-plc-aa schrieb:
Hallo,

HAMMER !

Aber da drängt sich mir nun die Frage auf:

Warum geht es scheinbar doch ohne Reset und Freigabe ???

Ich scheine wohl nicht genau genug zu wissen wie so eine CPU im inneren "tickt"...


Könnte das freundlicherweise mal jemand erklären (anhand dieses Beispiels am besten) ?

Der Timer startet immer mit einem Low-High-Übergang am Start-Eingang.
Rücksetzen und Freigabe muß man also nicht nutzen.
 

Anhänge

  • SE_Timer.jpg
    SE_Timer.jpg
    46,7 KB · Aufrufe: 33
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

test01:

http://www.sps-forum.de/attachment.php?attachmentid=777&stc=1&d=1148374268

Habe das mal 20 durchläufe laufen lassen...

Am Stand von T99 und T95 nach CPU Stp wird deutlich daß nach 20 Läufen die Abweichung bereits ca. 2sec beträgt...

Nun für diesen Zweck ist das wohl nicht ganz so erheblich - aber mir geht´s jetzt mal grundsätzlich um´s Verständnis der Sache.

>>Wie tickt die CPU?<<

oder

>>Warum ist mein Code langsamer?<<
 

Anhänge

  • Test01.jpg
    Test01.jpg
    112,7 KB · Aufrufe: 31
Hallo,

@Volker:

habe die Korrektur mit eingebunden --> funktioniert...

Test02:
http://www.sps-forum.de/attachment.php?attachmentid=779&stc=1&d=1148376620

(Ich war vorhin nur mit meiner Antwort zu langsam)

Der zweite Test zeigt jetzt aber daß der (neue) Code von Volker (mitte) und meiner (oben) nach diesmal nur 10 Läufen fast identisch sind (1ms Abweichung), und der von Rolf (unten) wieder um das selbe Verhältnis wie vorher "schneller" ist...

Das einzige was mir jetzt aber an meinem (im Vergleich zu Volker´s) Code besser gefällt: Es wird kein Hilfsmerker benötigt --> Die nehme ich nicht so gerne...

Die Laufzeit scheint ja fast identisch (na ja gut- nach ein paar Tagen weicht natürlich alles ab) wo ist also der Knackpunkt ?

// edit: Habe das Spiel nun noch mal genau 10min laufen lassen --> Abweichung Ich<>Volker immer noch exakt 1ms = Das Ergebnis ist also gleich, nur der Weg anders... // ende edit

Mein Beispiel läuft allerdings nicht ohne die Freigabe und den Reset --> das würde ich gerne besser verstehen.
 

Anhänge

  • Test02.jpg
    Test02.jpg
    110 KB · Aufrufe: 24
Zuletzt bearbeitet:
volker schrieb:
aber besser macht man das so.
von wegen, zeiten laufen unabhängig vom zyklus. hatte wir schon mal.

volker schrieb:
der m50.6 ist nur 1 zyklus 1-signal und nur für den takt verantwortlich.
wenn man im programm diesen merker nicht nimmt, sondern die zeit direkt, kann es passieren, dass ein teil des programms das nicht mitbekommt.

Code:
      UN    M     50.6
      L     S5T#5S
      SE    T     98
      U     T     98
      L     S5T#1S
      SE    T     99
      U     T     99
      =     M     50.6
      U     T     98
      UN    M     50.6
      =     M     50.7 //1 sek high

Hier noch einmal zu der von Volker angesprochenen Problematik mit den Timern:

http://www.sps-forum.de/showthread.php?t=7550&highlight=timer+zyklus

http://www.sps-forum.de/showthread.php?t=7441&highlight=timer+zyklus

http://www.sps-forum.de/showthread.php?t=393&highlight=timer+zyklus

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ok - habe die anderen Beiträge gelesen.

Aber eine Antwort fehlt mir trotzdem noch:

Wieso läuft der Code von Rolf "schneller" ab als der von Volker und mir ???

Ich meine ich hab´s zwar ein wenig umständlicher - aber das Ergebnis entpricht exakt dem von Volker - nur Rolf´s Ansatz überholt uns sozusagen während der Laufzeit.

Welche Lösung ist nun die "bessere" ?
 
Code:
Code:
 
[LEFT]     UN    M     50.6
     L     S5T#5S
     SE    T     98
     U     T     98
     L     S5T#1S
     SE    T     99
     U     T     99
     =     M     50.6
     U     T     98
     UN    M     50.6
     =     M     50.7 //1 sek high[/LEFT]

Das SPS-Programm arbeitet sequenziell, also Zeile für Zeile.
Ein Timer läuft aber immer ab, das heißt, wenn er an 3 verschiedenen Stellen in einem Programm abgefragt wird, kann er an der 1. Stelle noch LOW sein, an der 2. und 3. aber High.

Wenn also das Programm gerade hinter der Zeile

= M 50.6

steht und der Timer läuft ab, dann wird sich das bei Rolf im nächsten Zyklus auswirken, bei dem Programm mit dem Merker erst im übernächsten, da ja erst nocheinmal die Zeile

= M 50.6

durchlaufen werden muß, um den Zustand diees Merkers zu ändern.

Ufffffffff, hoffentlich ist das noch verständlich :ROFLMAO: :rolleyes:
 
Hallo,

also wenn man mein Beispiel in KOP schreibt und sich das dann
in AWL ansieht, fällt auf, dass vor dem 2. Timer eine eindeutige
Erstabfrage steht. Das erscheint etwas 'sauberer'.

Code:
 UN    T    101
      L     S5T#5S
      SE    T    100
      NOP   0
      NOP   0
      NOP   0
      U     T    100
      =     L     20.0
      U     L     20.0  // Erstabfrage auf VKE1 
      L     S5T#2S
      SE    T    101
      NOP   0
      NOP   0
      NOP   0
      NOP   0
      U     L     20.0
      BLD   102
      =     M    100.1




mfg.
Rolf
 

Anhänge

  • Blink.jpg
    Blink.jpg
    42 KB · Aufrufe: 27
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
hatte das Timerproblem auch vor kurzen. Man vergisst die Funktion irgendwann und braucht dann wieder bis es verinnerlicht ist.
Gecheckt habe ich es wieder als ich mir meine alten Assembler Unterlagen durchgesehen habe.

Die CPU funktioniert gleich wie Assembler.
Das beste verständniss hierfür biertet der FUP
Die CP'U läuft immer wie beim lesen eines Buches von links oben jede Zeile durch, ausser sie hat ein Sprungbefehl, einen Unterprogrammaufruf oder der Baustein weird nicht aufgerufen.
 
Hallo,

Ufffffffff, hoffentlich ist das noch verständlich :ROFLMAO: :rolleyes:

Ja ist es...

@RolfB: Bei der KOP-Variante ist aber der Vorteil weg daß die Erkennung einen Zyklus schneller ist --> läuft also dann gleich "langsam" wie die anderen Beispiele.


Letzte Frage (nachdem nun alle Unklarheiten beseitigt sind):

Kann es in irgendeiner Form von Nachteil sein (aufhängen, nicht gestartet werden oder so was...) wenn die erste Version von Rolf verwendet wird - also die "schnelle" ?

Zumindest hätte die den Vorteil daß sie am wenigsten "Leerlauf" hat - weil sie einen Zyklus schneller triggert. Und dieser Leerlauf würde ja dann proportional zur tatsächlichen Zykluszeit anwachsen und somit die Genauigkeit der realen Impuls-/Pausendauer verfälschen.

So zumindest habe ich die Erklärung von Ralle verstanden...
 
Hallo rs-plc-aa
was hälst du von der Variante, hier brauchst nur 1 Timer


UN T 98
L 100
ITB
L W#16#1000
OW
SV T 98
L T 98
L 10
<=I
= M 116.0


gruß georg
 
Zurück
Oben