S7-300 Selbst reseten

Meiers

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
S7-300 Timer selbst reseten

Hallo,
ich bin neu hier und habe auch gleich mal eine Frage.
Ich muss über meine S7 ein 300Hz Signal zählen. D.h. die positiven Flankenwechsel werden mit hilfe des SFB47 gezählt und in einen DB eingetragen.
Allerdings soll das Signal nicht endlos gezählt werden, sondern nur 5sek lang. Nach den 5sek soll der gezählte wert in den DB eingetragen werden und das zählen soll neu starten.
Der SFB47 hat ein Tor das bei TRUE den Zählvorgang starten und bei FALSE beendet. Der Zählwert bleib erhalten bis wieder TRUE ansteht, dann beginnt er bei 0 wieder neu zu zählen.
Einen Timer mit 5sek vor das Tor zu schalten ist ja nicht das problem. Nur wie resete ich diesen dann wieder, so das mir kein Flankenwechsel verloren geht? Also quasi innerhalb von 1-3ms.
Ich hoffe es war verständlich und ihr könnt mir helfen.
MfG: Meiers

Edit: CPU-313C, SIMATIC S7 v5.4
 
Zuletzt bearbeitet:
Einfach den Zähler weiterlaufen lassen, mit

JOB_ID (W#16#0001) nen neuen Zählwert schreiben
und mit
JOB_REQ den Auftrag anstoßen (positive Flanke)

(Wert in JOB_VAL)

Siehe auch S7-Hilfe zu SFB47
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde den Zähler überhaupt nicht antasten,
sondern immer aktuell mit dem letzten Absolutwert die Differenz berechnen,
und diesen Wert als "Basis" hernehmen.

Egal was du mit dem SFB47, es kostet alles Zeit ...

Mfg
Manuel
 
@nberger:
Ja würde schon gehen nur ist immernoch das Problem das es ja in einem 5sek intervall passieren muss und ich somit alle 5sek den Job starten muss. Nur wie realisiere ich das?

@MSB:
Wäre sicherlich besser, aber irgenwann läuft auch mal ein DINT über...
 
Mit dem Ausgang des Timers als UN an den Eingang des Timers legen.
Wenn der Timer abgelaufen ist, resetet er sich somit selbst.
Das Timer-Signal liegt dann aber nur einen SPS-Zyklus an, sollte
aber für deine Zwecke dann reichen.

Code:
UN T1
SE T1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@MSB:
Wäre sicherlich besser, aber irgenwann läuft auch mal ein DINT über...

Wenn du 300Hz für 5s zählst sinds nie mehr als 1500 Signale, da reicht selbst ein Integer.

Ich Würds so lösen:

Code:
        U     IN_COUNT_UP
        FP    FLANKE_P
        SPBN  CNT
        l     STAT_COUNTER
        l     1
        +I
        T     STAT_COUNTER
CNT:    UN    STAT_STORE
        L     S5T#5s
        SE    TIMER
        U     TIMER
        =     STAT_STORE
    
        U     STAT_STORE
        SPBN  LOAD
        L     STAT_COUNTER
        T     DB

        L     0
        T     STAT_COUNTER
LOAD:   NOP 0
 
Zuletzt bearbeitet:
@Krumnix:
Der Timer setzt sich jetzt zwar zurück aber die Zeit reicht nicht um den Wert in den DB zu übertragen und dann den Job auszuführen.

@vecoplaner:
MSB meinte ich soll den Zähler dauerhaft hochzählen lass und die differenz zum vorherigen wert als aktuell gezählt in den DB schreiben. Da das Programm aber 24h und 7 tage die Woche läuft würde ein DINT nach 82,9 Tagen überlaufen. :ROFLMAO:
 
@vecoplaner:
MSB meinte ich soll den Zähler dauerhaft hochzählen lass und die differenz zum vorherigen wert als aktuell gezählt in den DB schreiben. Da das Programm aber 24h und 7 tage die Woche läuft würde ein DINT nach 82,9 Tagen überlaufen. :ROFLMAO:


Ich glaube er hatte auch im sinn gehabt bei einem Überlauf zu reagieren zB:

Code:
    L     IN_ZÄHLWERT
    L     STAT_ALT_ZÄHLER        
    -I
    T     DB
    
    L     IN_ZÄHLWERT
    T     STAT_ALT_ZÄHLER 

    U     OV
    SPBN  UEL
    L     0
    T     IN_ZÄHLWERT
UEL:    NOP 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@MSB:
Wäre sicherlich besser, aber irgenwann läuft auch mal ein DINT über...

Sicher richtig, aber wenn du den Fall des Überlaufs entsprechend berücksichtigst,
letzten Endes auch vollkommen egal ...

Du kennst ja den exakten Wert bei dem der Überlauf stattfindet ... der Rest ist nur ein Wenig "Plus und Minus" ...
 
Überlaufen des DINT-Zählers macht nichts, der Zähler bleibt ja nicht stehen, sondern beginnt wieder bei 0.

Solange der Meßzyklus kürzer als ~41 Tage (halber Zählumfang) ist, gilt:
Wenn der Zähler endlos vorwärts zählt, dann ist die Differenz Zählerstand_jetzt - Zählerstand_vorher immer >= 0
(also nie negativ), auch bei Überlauf, weil die DINT-Differenzberechnung -D dann ebenfalls überläuft.
Man braucht garnichts beachten, das Ergebnis der Differenzberechnung ist immer richtig.

Gruß
Harald
 
Ich glaube er hatte auch im sinn gehabt bei einem Überlauf zu reagieren zB:

Code:
    L     IN_ZÄHLWERT
    L     STAT_ALT_ZÄHLER        
    -I
    T     DB
    
    L     IN_ZÄHLWERT
    T     STAT_ALT_ZÄHLER 

    U     OV
    SPBN  UEL
    L     0
    T     IN_ZÄHLWERT
UEL:    NOP 0
Ich fürchte, dieser Code bringt in die Zählerstands-Differenzberechnung mehr Fehler rein, als wenn man garnichts unternimmt ...

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich habs jetzt folgendermaßen gelöst:
Tor ist dauerhaft TRUE und zählt damit dauerhaft.
Timer läuft 5sek, nach ablauf der Zeit wird Zählwert in DB übertragen und über den Job im SFB47 auf 0 gesetzt. Dann hab ich mir den Instanz-DB vom SFB47 angeschaut und hab mir den Statusbit von JOB_REQ genommen. Damit steuer ich den Timer. Sobald er den Job bekommt geht das Signal am Timer auf 0 und dadurch setzt sich auch JOB_REQ wieder auf 0 und der Timer läuft wieder....
Funktioniert wunderbar.
Vielen dank für eure hilfe!
 
@meiers
Ich bin mir jetzt ja wahrlich nicht 100% sicher, aber für die Variante benötigst du im günstigsten Fall 3 SPS-Zyklen.
Wenn ich nun von einer Zykluszeit von ca. 2 ms ausgehe, was für eine 313C echt schnell ist...

Wie war die obige Zeitforderung nochmal?

Mfg
Manuel
 
Ach wäre ja auch zu schön gewesen...aber du hast natürlich recht, so geht das nicht.
Nunja dann muss ichs eben unendlich zählen lassen und den alten vom neuen wert subtrahieren.
Das Problem ist nur das der SFB47 bei überlauf nicht auf -214....... sonder auf 0 geht und somit die differenzberechnung käse ergibt.
Noch eine kleine zusatzfrage. Die CPU-313C ist ja nicht erweiterungsfähig. Da das Programm allerdings im EX-bereich laufen muss brauche ich eine EX baugruppe und die kann ich da nicht einbauen. Welche CPU kann denn noch zählen und ist erweiterbar? Kann die 314C erweitert werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche Baugruppe brauchst du denn?
Normale S7-300 Baugruppen kannst du schon anbauen.

Also im Falle des Überlaufs, zu erkennen, das dein Differenzwert negativ wird,
musst du 2147... - "Alten Wert" + neuen Wert rechnen, und hast so exakt die korrekte Differenz.

Mfg
Manuel
 
Ja gut soweit ist mir das schon klar. Jetzt muss ich eben jedesmal prüfen ob der neue wert kleiner ist als der alte und wenn ja so rechnen wie du gesagt hast. Aber das ist ja kein Problem. Soweit bekomm ich das hin.

Die EX Baugruppe ist ein Digitaler Input und nennt sich "SM321-7RD00-0AB0"

Normale S7-300 Baugruppen kannst du schon anbauen.
Ja normale. Die 314-2DP konnte ich problemlos erweitern, die 313C will nicht.
 
Also ich weiß nicht was du machst, aber die genannte Baugruppe kannst du problemlos an der 313C verwenden.

Wo scheiterst du denn?

Mfg
manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oh mein Gott wie peinlich...
Augen auf und schon gehts :ROFLMAO:
Sorry.

Gut ich werde morgen mal weiter schauen und alles soweit fertig programmieren. In 2Wochen kommt mein Kollege wieder der schmeißt dann sein Fernwirkprogramm drauf und wir werden mal schauen ob dann noch alles in akzeptabler Zeit funktioniert.
Vielen dank für die nette Unterstützung.
 
Differenzberechnung

Nunja dann muss ichs eben unendlich zählen lassen und den alten vom neuen wert subtrahieren.
Das Problem ist nur das der SFB47 bei überlauf nicht auf -214....... sonder auf 0 geht und somit die differenzberechnung käse ergibt.
Also gut, dann nochmal aufdringlich:

Wenn ein Zählkanal der CPU313C in der HW-Konfig auf "Endlos zählen" eingestellt ist und die HW-Konfig in die
CPU übertragen wurde, dann springt der Zähler beim Vorwärtszählen nach der oberen Zählgrenze +2.147.483.647
auf die untere Zählgrenze -2.147.483.648. Die Zählgrenzen sind auf den maximalen Zählbereich fest eingestellt.

Beispiel: Vorwärtszählen über die obere Zählgrenze hinweg (Überlauf)
Code:
                      Differenz_Jetzt = Zaehlerstand_Jetzt - Zaehlerstand_Start
Impuls:  Zählerstand   |
                       v
  0:  +2.147.483.643  D= 0  -> als Zaehlerstand_Start merken
 +1:  +2.147.483.644  D=+1
 +2:  +2.147.483.645  D=+2
 +3:  +2.147.483.646  D=+3
[COLOR="Blue"] +4:  +2.147.483.647  D=+4     <- obere Zählgrenze
 +5:  -2.147.483.648  D=+5     <- untere Zählgrenze[/COLOR]
 +6:  -2.147.483.647  D=+6
 +7:  -2.147.483.646  D=+7
 +8:  -2.147.483.645  D=+8
 +9:  -2.147.483.644  D=+9  -> Zaehlerstand_Jetzt
Nach 9 Zählimpulsen über Zähler-Überlauf hinweg:
Differenz_Jetzt = Zaehlerstand_Jetzt - Zaehlerstand_Start = -2.147.483.644 - +2.147.483.643 = +9
Code:
      L    "Zaehlerstand_Jetzt"  // -2.147.483.644
      L    "Zaehlerstand_Start"  // +2.147.483.643
      -D
      T    "Differenz_Jetzt"     // +9
Die Differenzberechnung ergibt immer sofort das korrekte positive Ergebnis. Eine Korrektur ist nie nötig.
Bei mehr als 2.147.483.647 Impulsen im Meßzeitraum ergibt sie scheinbar ein negatives Ergebnis. Das liegt daran,
daß bei DINT größere Zahlen als "negativ" vereinbart sind. Das Ergebnis muß als "unsigned" DINT betrachtet
werden. Addieren von 2.147.483.648 würde zu einem falschen Ergebnis führen.

Der SFB47 wird bei der Differenzmethode bei freilaufendem Endlos-Zähler nur zum Öffnen des SW-Tores benötigt.
Es werden keine Aufträge/Jobs benötigt.

Gruß
Harald
 
Achso ok danke.
Das zählen klappt jetzt, nur hab ich jetzt das Problem wenn ich das alles an die neue Baugruppe hänge und beim SFB47 die E/A-Adresse auf die der neuen Baugruppe anpasse, wird nichtmehr gezählt.
Egal welchen der 4 kanäle des SM321 ich benutze, er zählt nicht.
HW-Konfig hab ich selbstverständlich aktualisiert.
Und ein test (eingang des SM321 = Ausgang) hat gezeigt das die adressierung auch stimmt.
Kann ich mit dem SM321 garnicht zählen?
 
Zurück
Oben