Flankenwechsel als Startereignis für Zähler erzeugen...

rs-plc-aa

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

ich bin ein wenig genervt...


Ich möchte in Step7 AWL in einem Weckalarm (OB 35 - 250ms) einen FB aufrufen.

Dieser FB soll aber im gegensatz zu den anderen nur jedes n-te mal des Weckalarms aufgerufen werden.

Ich dachte ich nehme einen Zähler um den Aufruf zu überspringen bis der Zählwert wieder passt, und setze diesen dann wieder zurück.

Geht aber irgendwie nicht :(


Ich habe in der Hilfe nachgelesen, aber die Beispiele beziehen sich immer auf Eingänge oder Merker mit denen Flankenwechsel erzeugt werden um die Zähler zu aktivieren.

Kann ich aber so nicht brauchen.


Geht das auch irgendwie anders ?? (ohne auf einen Eingang zu hören z.B.)
 
Kenne deinen Code nicht, aber setzt du vielleicht den Zaehler zurück, bevor du die Aktion ausführst?
So sollte es gehen:
Code:
L Zaehler // irgendein Merker- oder Datenwort (keineLokaldaten!!)
L 1
+I
T Zaehler

L Vergleichswert
<I 
SPB =M001
[deine Aktion]
L 0
T Zaehler
M001: NOP 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn es ein Zähler sein soll, dann müsstest du den Zahler im OB35 zweimal aufrufen, einmal mit VKE=0 und einmal mit VKE=1. Dann hat er die Flanke, die er braucht.


Gruss, Onkel
 
geht no kürzer...

Code:
L Zaehler // irgendein Merker- oder Datenwort (keineLokaldaten!!)
INC 1 
T Zaehler

L Vergleichswert
<I
SPB =M001
[deine Aktion]
L 0
T Zaehler
M001: NOP 0

spart eine Zeile code durch INC 1 statt l1 und +I
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

danke für die schnellen Antworten !

Das mit der Byteinkrementierung kannte ich bereits - warum ich es nicht nahm weiß ich nicht...

Meine Frage zielte eher in Richtung der fest verankerten Zähler (Z0-Zx) in Step7.

Also mit zähle vorwärts/rückwärts, lade Zählwert und setze/rücksetze Zähler...

Genau die gleiche Problematik hatte ich mit den Timern in AWL auch schon.



Ein Ansatz (der nicht funktionierte) sah so aus:

Code:
// Netzwerk x im OB 35...

L Z 1
L 2
==I
SPBN a000

CALL FB111,DB111

R Z1
SPA ende

a000: Nop 0

ZV Z1

ende: NOP 0

Im OB 100 sollte dann vielleicht noch der Zähler entweder auf 0 oder auf den Sollvergleichswert gesetzt werden - falls beim ersten Aufruf der FB gleich aufgerufen werden soll.

Jetzt fehlen quasi nur noch die Flankenwechsel vor "R Z1" und "ZV Z 1".

Einen digitalen Eingang kann und will ich nicht nehmen da er damit nix zu tun hat, und CLR gefolgt von SET hat auch nicht funktioniert...

Ich möchte einfach ohne viel Heckmeck zählen...

Aber das war mir bei den Timern auch schon nicht vergönnt... (was ich da gemacht habe zeige ich hier lieber nicht...).
 
Auf die Schnelle,
versuche doch mal vor dem R Zxy U VKE1.

Es gibt immer / häufig Probleme, weil Timer / Zähler nicht zyklisch durchlaufen werden...
 
Hallo
Der OB35 wird doch alle x ms einmal durchlaufen.
Kann man dann nicht einfach ein mw hochzählen?
Code:
l mw100
l 1
+i
t mw100

l 2
==I
spbn weit
call fb1,db1
l 0
t mw100
weit: nop

Gruß

Znarf
 
Ok, habe ich dann missverstanden.
Probier folgendes:

Code:
      UN    M    120.0
      =     M    120.0

      U     M    120.0
      ZV    Z     10

      L     Z     10
      L     10
      >=I   
      SPBN  weit
     call fb1, db1
      SET   
      R     Z     10
weit: NOP   0

Gruß

Znarf

Edit: ich habe bei einem Aufrufintervall von 100ms ein Rücksetzen des Z10 ca alle 2s. D.h. du musst den Vergleichswert halbieren, da ja der OB35 einmal mit m120.0 als true und beim nächsten mal mit false aufgerufen wird.
 
Hallo,

o.k. ich hab jetzt zwei Lösungen die funktionieren.

Die Erste - Zähler:

Code:
      UN    M    720.0
      =     M    720.0

      U     M    720.0
      ZV    Z      0

      L     Z      0
      L     2
      >=I   
      SPBN  weit

      CALL  FB   111 , DB111

      SET   
      R     Z      0

weit: NOP   0


Die zweite - Byteinkrementierung:

Code:
      L     MB   700
      L     3
      ==I   
      SPBN  a000

      CALL  FB   111 , DB111

      L     0
      T     MB   700
      SPA   a001

a000: NOP   0
      L     MB   700
      INC   1
      T     MB   700

a001: NOP   0


Was dabei aber auffällt:

Bei der Zählervariante nehme ich als Umschaltpunkt den Stand 2

Bei der Byteinc. nehme ich 3

Und es kommt bei beiden das selbe Ergebnis raus --> Ein Aufruf pro Sekunde bei einem Weckalarmzyklus von 250ms.


Somit lässt sich die Variante 2 ein wenig feiner einstellen...


Ich werde diese auch nehmen - ich bin eben nur mal wieder über die Zähler / Timer gestolpert....

Ach so noch etwas:


Heinz schrieb:

Auf die Schnelle,
versuche doch mal vor dem R Zxy U VKE1.

Geht das überhaupt --> U VKE1 ??

Ich sehe nur "rot"...



Danke euch für die Beiträge !
 
Hallo
Die unterschiedlichen Vergleichswerte kommen wohl daher, das bei der gewünschten Zählervariante erst erhöht und dann verglichen wird und bei der Bytevariante wird erst verglichen und dann erhöht. D.h. es gibt dort die Durchläufe 0,1,2 und 3(4x250ms). Bei der Zählervariante gibt es die Durchläufe 1 und 2 (2x2x240ms, wobei die zweite 2 vom Nulldurchlauf des Merkers kommt).

Einen schönen Tag noch

Znarf
 
Hallo,

Die unterschiedlichen Vergleichswerte kommen wohl daher, das bei der gewünschten Zählervariante erst erhöht und dann verglichen wird und bei der Bytevariante wird erst verglichen und dann erhöht. D.h. es gibt dort die Durchläufe 0,1,2 und 3(4x250ms). Bei der Zählervariante gibt es die Durchläufe 1 und 2 (2x2x240ms, wobei die zweite 2 vom Nulldurchlauf des Merkers kommt).

Ja genau - deshalb habe ich mich nun auch für die Bytevariante entschieden, da sie feiner einzustellen ist.


OK das war zu einfach geschrieben.
mit VKE 1 war der Einsmerker gemeint.
Als Alternative gibt es den Befehl "SET"

Alles klar...


Einen schönen Tag noch


Wünsche ich dir und allen anderen auch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

rs-plc-aa schrieb:
Hallo,

o.k. ich hab jetzt zwei Lösungen die funktionieren.

Die Erste - Zähler:

Code:
      UN    M    720.0
      =     M    720.0

      U     M    720.0
      ZV    Z      0

      L     Z      0
      L     2
      >=I   
      SPBN  weit

      CALL  FB   111 , DB111

      SET   
      R     Z      0

weit: NOP   0

Dein Zähler bekommt nur bei jeden zweiten OB35-Aufruf eine positive Flanke. Probier's doch einfach mal so:

Code:
CLR                           // Aufruf mit VKE=0
ZV    Z      0
SET                           // Aufruf mit VKE=1
ZV    Z      0

..usw

Dadurch hast du bei jeden OB35-Aufruf einen Flankenwechsel an dem Zähler/Timer.


Gruss, Onkel
 
Zurück
Oben