Zähler zählt zu schnell

Deep Blue

Level-2
Beiträge
431
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

mein Kollege und ich wollen uns nun disziplinieren, und kommende Projekte indirekt adressieren. Dazu haben wir uns ein Übungsprojekt erstellt wo einfach mal mit einem Taktmerker bei Eingang "1" hochgezählt wird und ein Reset noch möglich ist. Alles soweit klasse...Nun rufen wir diesen FC 3 jeweils 1 x im FC 1 und FC 2 auf, wo Sie mit unterschiedlichen Adressen versehen werden (anderer Taktmerker, anderer Starteingang + Reset). Diese beide FC´s rufen wir nun im OB 1 auf. Und da hängt es nun. Sollange wir nur 1 FC aufrufen im OB 1, zählt unser Zähler schön im Takt. Rufen wir im OB 1 aber beide FC´s auf, zählt einer im Takt und der andere zyklisch. Was machen wir hier falsch machen?

Code:
//Addieren
      U     #Start_Add
      U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      SPBN  Max
      U     #HilfsFlanke
      L     1
      L     #DatenBst
      +D    
      T     #DatenBst
//Nullen
Max:  U     #Reset
      SPBN  Kurt
      L     0
      T     #DatenBst
Kurt: NOP   0
 

Anhänge

  • Zähler.JPG
    Zähler.JPG
    63,3 KB · Aufrufe: 42
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Deep Blue,

schau mal auf Deinen #Flanke. Als Temp-Variable nützt er Dir leider nicht viel.
Nimm dort eine IN_OUT-Variable.

Grüße
Gebs

[Edit] Helmut war mal wieder schneller! [/Edit]
 
U ...
L ...
L ...

funtioniert nicht.

Da must du mit Sprüngen arbeiten

den Sprung hat er doch an der Blauen Anweisung. Die Rote
Anweisung bewirkt erst mal nichts, stört aber auch nicht.
Die kann gelöscht werden

Code:
//Addieren
      [COLOR=blue]U     #Start_Add[/COLOR]
[COLOR=blue]     U     #Sek_TM[/COLOR]
[COLOR=blue]     FP    #Flanke[/COLOR]
[COLOR=blue]     =     #HilfsFlanke[/COLOR]
[COLOR=blue]     SPBN  Max[/COLOR]
     [COLOR=red]U     #HilfsFlanke[/COLOR]
      L     1
      L     #DatenBst
      +D    
      T     #DatenBst
//Nullen
Max:  U     #Reset
      SPBN  Kurt
      L     0
      T     #DatenBst
Kurt: NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Rote
Anweisung bewirkt erst mal nichts, stört aber auch nicht.
Die kann gelöscht werden

Code:
//Addieren
      [COLOR=blue]U     #Start_Add[/COLOR]
[COLOR=blue]    U     #Sek_TM[/COLOR]
[COLOR=blue]    FP    #Flanke[/COLOR]
[COLOR=blue]    =     #HilfsFlanke[/COLOR]
[COLOR=blue]    SPBN  Max[/COLOR]
     [COLOR=red]U     #HilfsFlanke[/COLOR]
      L     1
      L     #DatenBst
      +D    
      T     #DatenBst
//Nullen
Max:  U     #Reset
      SPBN  Kurt
      L     0
      T     #DatenBst
Kurt: NOP   0
Gerri hat trotzdem Recht, mit dem #HilfsFlanke soll ja hochgezählt werden. Solange aber die Bedingung vor "SPBN Max" nicht erfüllt ist, wird jeden Zyklus hochgezählt. Darum gehts doch, das zu schnell gezählt wird.
 
Gerri hat trotzdem Recht, mit dem #HilfsFlanke soll ja hochgezählt werden. Solange aber die Bedingung vor "SPBN Max" nicht erfüllt ist, wird jeden Zyklus hochgezählt. Darum gehts doch, das zu schnell gezählt wird.

Jetzt sollte man natürlich mal die Zeilen vorm SPBN checken ... ach ja richtig das VKE ist eine Flanke ... und was macht eine Flanke ... auch richtig ....
 
Gerri hat trotzdem Recht, mit dem #HilfsFlanke soll ja hochgezählt werden. Solange aber die Bedingung vor "SPBN Max" nicht erfüllt ist, wird jeden Zyklus hochgezählt. Darum gehts doch, das zu schnell gezählt wird.

jetzt hast du mich aber verunsichert Approx, habe es mal in PLCSIM reingehackt, nur mit Merkern in den OB1....Funktioniert wunderbar.

zähler.JPG

wenn ich richtig mitgelesen habe, steht auch nirgendwo das mit der Hilfsflanke hochgezählt werden soll, ich denke mehr mit den Taktmerker "Sek_TM"
 
Zuletzt bearbeitet:
*ACK*
Ich habs mir noch mal genauer angesehen, die Flanke hat ja nur einen Zyklus das VKE=TRUE, also hätte es doch gefunzt, weil ja SPBN (springe bei VKE=FALSE). Problem war wirklich nur die Temp-Variable, statt der Stat-Variable.
Trotzdem :s12:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Deep Blue,

schau mal auf Deinen #Flanke. Als Temp-Variable nützt er Dir leider nicht viel.
Nimm dort eine IN_OUT-Variable.

Grüße
Gebs

[Edit] Helmut war mal wieder schneller! [/Edit]

Danke Gebs, das war es!

U ...
L ...
L ...

funtioniert nicht.

Da must du mit Sprüngen arbeiten

Mmmmh...das versteh ich nicht. Sehe ich es denn falsch, das wenn ich:
Code:
L 1
L 2
+I
schreibe, in der SPS folgendes passiert...

Sie lädt die 1 ins Akku 1, lädt die 2 ins Akku 1 und schiebt die 1 ins Akku 2 und addiert danach die 2 Werte im Akku als Integer. Bis jetzt hat es jedenfalls immer so funktioniert. Aber ich will mich da nicht so weit aus dem Fenster lehnen :ROFLMAO:
 
Mmmmh...das versteh ich nicht. Sehe ich es denn falsch, das wenn ich:
Code:
L 1
L 2
+I
schreibe, in der SPS folgendes passiert...

Sie lädt die 1 ins Akku 1, lädt die 2 ins Akku 1 und schiebt die 1 ins Akku 2 und addiert danach die 2 Werte im Akku als Integer. Bis jetzt hat es jedenfalls immer so funktioniert. Aber ich will mich da nicht so weit aus dem Fenster lehnen :ROFLMAO:
Genau das macht sie! :D
Nur das sie zuerst Akku 1 in Akku 2 schiebt und dann ladet! Sonst würde sie den Wert ja vor dem schieben überschreiben. :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
U ...
L ...
L ...

funtioniert nicht.

Da must du mit Sprüngen arbeiten

Wie Gerri schon schrieb, sind Lade- und Transferfunktionen VKE-Unabhängig! Das bedeutet, es ist egal was für ein Zustand das Bit vor dem Laden hat. Geladen wird immer. Deswegen ist das U... auch sinnlos.

Du hättest
Code:
         U ...
         SPB = NEXT
         SPA = ENDE
NEXT: L ...
         L ...
         T...
ENDE: usw.
Machen müssen. Dann wird nur zum Laden gesprungen, wenn vor dem SPB ein VKE=TRUE ansteht.
 
Das Elend geht nun weiter,

jetzt haben wir Blut geleckt und wollten doch mir nichts - dir nichts auch noch subtrahieren. Aber da ist wieder unser erstes Problem, das der Zähler im Zyklus hoch zählt. Was ist denn nun falsch?
Code:
//Welche Operation soll ausgeführt werden ?
      U     #Start_Add
      SPB   Plus
      U     #Start_Sub
      SPB   Minu
      SPA   Rese
//Addieren
Plus: U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      U     #HilfsFlanke
      L     1
      L     #DatenBst
      +D    
      T     #DatenBst
      SPA   Rese
//Subttrahieren
Minu: U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      U     #HilfsFlanke
      L     1
      L     #DatenBst
      -D    
      T     #DatenBst
//Nullen
Rese: U     #Reset
      SPBN  Ende
      L     0
      T     #DatenBst
Ende: NOP   0
 

Anhänge

  • Zähler 2.JPG
    Zähler 2.JPG
    56,9 KB · Aufrufe: 6
Code:
//Welche Operation soll ausgeführt werden ?
      U     #Start_Add
      SPB   Plus
      U     #Start_Sub
      SPB   Minu
      SPA   Rese
//Addieren
Plus: U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      U     #HilfsFlanke //der gleiche Fehler wie vorhin
[COLOR=blue]SPBN Minu[/COLOR]
      L     1
      L     #DatenBst
      +D    
      T     #DatenBst
      SPA   Rese
//Subttrahieren
Minu: U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      U     #HilfsFlanke
[COLOR=blue]SPBN Rese[/COLOR]
      L     1
      L     #DatenBst
      -D    
      T     #DatenBst
//Nullen
Rese: U     #Reset
      SPBN  Ende
      L     0
      T     #DatenBst
Ende: NOP   0
 
ich muß gerri schon wieder recht geben

@tiefblau
wenn du die Blaue Anweisung wegläst durchläuft die CPU die grünen Anweisungen, egal ob der Sprungmerker "1" oder "0" ist. Die
grünen Anweisungen werden dann auch ausgefürhrt, es besteht keine Abänigkeit vom Verknüpfungsergebnis.

Code:
[INDENT]U Merker_springe
[COLOR=blue]SPBN ziel[/COLOR]
[COLOR=seagreen]L zähler[/COLOR]
[COLOR=seagreen]l 1[/COLOR]
[COLOR=seagreen]+i[/COLOR]
[COLOR=seagreen]T zähler[/COLOR]
[/INDENT]ziel: nop 0
 
Das Elend geht nun weiter,

jetzt haben wir Blut geleckt und wollten doch mir nichts - dir nichts auch noch subtrahieren. Aber da ist wieder unser erstes Problem, das der Zähler im Zyklus hoch zählt. Was ist denn nun falsch?
Code:
//Welche Operation soll ausgeführt werden ?
      U     #Start_Add
      SPB   Plus
      U     #Start_Sub
      SPB   Minu
      SPA   Rese
//Addieren
Plus: U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      [COLOR=red]U     #HilfsFlanke // das ist Käse[/COLOR][COLOR=red]![/COLOR]
      L     1
      L     #DatenBst
      +D    
      T     #DatenBst
      SPA   Rese
//Subttrahieren
Minu: U     #Sek_TM
      FP    #Flanke
      =     #HilfsFlanke
      [COLOR=red]U     #HilfsFlanke // das ist Käse ![/COLOR]
      L     1
      L     #DatenBst
      -D    
      T     #DatenBst
//Nullen
Rese: U     #Reset
      SPBN  Ende
      L     0
      T     #DatenBst
Ende: NOP   0

@Deep Blue
Hier ein Auszug aus der Step7-Hilfe:
Die Lade- und Transferoperationen ermöglichen es Ihnen, den
Informationsaustausch zwischen Ein- oder Ausgabebaugruppen und
Speicherbereichen oder zwischen Speicherbereichen zu programmieren. Die CPU
führt diese Operationen in jedem Zyklus als unbedingte Operationen aus, d. h. sie
werden vom Verknüpfungsergebnis einer Operation nicht beeinflußt.
Folgende Lade- und Transferoperationen stehen Ihnen zur Verfügung:


L Lade
L STW Lade Statuswort in AKKU 1
LAR1 Lade Adreßregister 1 mit Inhalt von AKKU 1
LAR1 <D> Lade Adreßregister 1 mit Pointer (32 Bit-Format)
LAR1 AR2 Lade Adreßregister 1 mit Inhalt von Adressregister 2
LAR2 Lade Adreßregister 2 mit Inhalt von AKKU 1
LAR2 <D> Lade Adreßregister 2 mit Ganzzahl (32 Bit)


T Transferiere
T STW Transferiere AKKU 1 in Statuswort
TAR Tausche Adreßregister 1 mit 2
TAR1 Transferiere Adreßregister 1 in AKKU 1
TAR1 <D> Transferiere Adreßregister 1 nach Zieladresse (32-Bit-Pointer)
TAR1 AR2 Transferiere Adreßregister 1 in Adreßregister 2
TAR2 Transferiere Adreßregister 2 in AKKU 1
TAR2 <D> Transferiere Adreßregister 2 nach Zieladresse (32-Bit-Pointer)
 
Zurück
Oben