Timer (Einschaltverzögerung) im FB

eYe

Level-1
Beiträge
759
Reaktionspunkte
80
Zuviel Werbung?
-> Hier kostenlos registrieren
Nabend,

bin gerade dabei ein Projekt von Unity auf Step7 umzusetzen.
In Unity habe ich mir einen DFB (Derived Function Block) geschrieben und diesen dann ~400 mal für jeden Eingang aufgerufen (Geht um Alarme unterschiedliche Verzögeurngszeiten, etc haben).

Im DFB konnte ich halt einfach eine Einschaltverzögerung erstellen und diese wurde dann von der "angelegten" Variable bestimmt. Wenn ich nun aber einen FB in Step schreibe muss ich meiner Einschaltverzögeurng ja einem Timer (T0-Txxx) zuweisen. Wenn ich dies mache wird ja aber beim Aufruf des FBs der Wert immer wieder überschrieben und das Ganze geht sicherlich in die Hose?

Wie kann ich das Ganze nun schön und einfach in Step7 lösen?
(Der FB wird je nach Projekt zwischen 100 und 1000 mal pro Zyklus aufgerufen und es muss halt für jeden Aufruf eine eigene Zeit laufen...)


thx, eYe
 
Eine Siemens-FAQ zum Thema Multiinstanz findest Du hier:

ID18723826 Wie können Multiinstanzen erstellt und aktualisiert werden?

Ein Programmbeispiel für die Verwendung des SFB4 TON in einem FB als Multiinstanz findest Du hier:

http://www.sps-forum.de/showthread.php?t=18370

http://www.sps-forum.de/showpost.php?p=122573&postcount=31

Weiterhin sind bei der Verwendung des SFB4 TON und einer Vorgabe des Zeitwertes PT = T#0MS die beiden folgenden Threads zu beachten:

http://www.sps-forum.de/showthread.php?t=17257

http://www.sps-forum.de/showthread.php?t=24195

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe das ganze nun mit Hilfe der Zykluszeit in OB1 gelöst, finde ich irgendwie schöner als diesen "doffen" SFB ^^

OB1
Code:
      L     #OB1_PREV_CYCLE
      T     MD   400

      CALL  "Alarmbaustein" , "Alarm_1"
       Alarm_input :=M1.1
       Delay       :=T#1S
       Alarm_Status:=M2.1

      CALL  "Alarmbaustein" , "Alarm_2"
       Alarm_input :=M1.2
       Delay       :=T#2S
       Alarm_Status:=M2.2

      CALL  "Alarmbaustein" , "Alarm_3"
       Alarm_input :=M1.3
       Delay       :=T#3S
       Alarm_Status:=M2.3

FB111:
Code:
      L     MD   400
      L     #Timer_rest
      +D    
      T     #Timer_rest

      U     #Alarm_input
      SPB   J001
      L     0
      T     #Timer_rest
J001: NOP   0

      L     #Timer_rest
      L     #Delay
      >D    
      =     #Alarm_Status


Scheint bisher wunderbar zu funktionieren und bei 60s keine spürbare Abweichung zur Windowszeit. Längere Zeiten brauche ich eh nicht...
 
des MD400 im FB11 - da brauch ich mir noch nichmal nen finger in den hals stecken ...

... aber jeder nach seiner fasson :rolleyes:
 
Ja nervt mich auch, aber leider kann ich ja die #OB1_PREV_CYCLE nicht direkt im FB lesen, oder?

Hast du nee alternative? (Außer SFB)

Ansonsten finde ich es aber viel schöner als mit dem ollen SFB und bei 1000x aufrufen wird es wohl auch schneller sein, oder was denkst du?
 
@Vierlagig:
*ACK*, wenn Baustein mit Schnittstelle, dann ALLES übergeben... Alles andere hat keinen Wiederverwendungswert!

Ansonsten finde ich die Lösung mit der OB1-Zykluszeit gut, ich hab bisher die Systemzeit genommen. Da muss man allerdings bei 0:00 Uhr aufpassen.
 
Zuletzt bearbeitet:
Du hattest geschrieben, daß du das evtl. rund 400 Mal benötigst. Das sind dann 400 Instanz-DB. Das würde ich mir überlegen einen FC zu nehmen und die eine statische Variable als INOUT zu deklarieren. Ein globaler DB kann dann alle diese Timerwerte aufnehmen.

PS: Das mit der Zeit ist gar nicht dumm, ich nehme den 100ms-Impuls und zähle ihn in ein DW. Reicht von der Genauigkeit meißt aus, aber mit der Zeit bekommt man auch kleinere Zeiten als 100ms noch gebacken, so es die Zykluszeit der SPS hergibt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In Ahnlehnung an Ralles Vorschlag würde sich auch der Siemens Standardbaustein (FC) TONR anbieten:
Zufinden unter: Standard Library -> TI-S7 Converting Blocks -> FC80 TONR
 
Zurück
Oben