Step 7 SE Timer in bedingt aufgerufenen FC

AndiF

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

ich stehe zur Zeit vor folgendem Problem.


Es wird ein FC bedingt aufgerufen, in diesem FC will ich einen SE Timer starten.

(Auszug aus FC)

U E 1.0
L S5T#5S
SE T 1

U T 1
= M 1.0


Ist nun der E1.0 schon "1" bevor der FC aufgerufen wird, startet mein Timer nicht, da dieser auf einen Flankenwechsel wartet.

Wie kann ich dies am geschicktesten Lösen?

Leider kann ich an der Grundstruktur des Programmes nicht viel verändern, da es ein Muster eines unserer Kunden ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soll der Timer nur gestartet werden oder wird der FC dann bis zum Ablauf des Timers immer aufgerufen?

Wenn der Baustein das erste mal aufgerufen wird, dann den Timer zuerst einmal mit VKE=0 aufrufen oder die Operation "FR T1" benutzen. Oder den Timer-Aufruf mit sich selber negiert verknüpfen ("UN T1").

Denkbar wäre auch das Aufrufen oder zumindest Rücksetzen des Timers außerhalb des FC (mit der FC-Aufrufbedingung verknüpfen).

Was ist denn überhaupt an dem E1.0 dran? Vielleicht ist es sowieso nicht ganz richtig, die Signalverzögerung an E1.0 erst zu starten wenn auch der FC aufgerufen wird. Vielleicht ist es besser, die Signal-Vorverarbeitung unabhängig außerhalb des FC zu machen.

Harald
 
Der FC wird solange aufgerufen, dass der Timer ablaufen kann.
Es befinden sich in diesem FC noch weitere Anweißungen die erst nach ablauf des Timers gestartet werden.

An dem Eingang hängt ein Sensor, wenn nun dieser schon belegt ist wenn der FC aufgerufen wird, wird T1 nicht gestartet und das Programm bleib in dem Schritt "stehen".

Habe es mit FR T1, und UN T1 versucht, klappt leider nicht.

Den Timer in einen dauerhaft aufgerufenen FC auszulagern habe ich mir auch schon überlegt, wäre meine "Notlösung"
 
Wie wäre es wenn du nur den Timer im FC dauernd aufrufst und dann den Rest überspringst...

Code:
U E 1.0
 L S5T#5S
 SE T 1

  U T 1
 SPB ... //Überspringe restlichen Code....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie wäre es wenn du nur den Timer im FC dauernd aufrufst und dann den Rest überspringst...

Code:
U E 1.0
 L S5T#5S
 SE T 1

  U T 1
 SPB ... //Überspringe restlichen Code....


Das geht leider nicht, da ich mich an die Vorhandene Software Struktur halten muss. Und diese sieht vor, dass dieser FC nur bei einer bestimmten Funktion aufgerufen wird.
 
Naja ... irgendeinen Tod mußt du aber nun sterben ...
Eine bedingte Bearbeitung eines flankengesteuerten Befehls (TIMER, COUNTER, TON, TOF, etc.) ist immer so eine Sache und kann "lustige" Ergebnisse bringen. Am Besten, man macht es gar nicht erst. Ansonsten muß man zusehen, dass dieser "flankengesteuerte Befehl" immer beide Flanken (also -> True und -> False) mitbekommt ...

Gruß
Larry
 
Es wird ein FC bedingt aufgerufen, in diesem FC will ich einen SE Timer starten.

(Auszug aus FC)

U E 1.0
L S5T#5S
SE T 1

U T 1
= M 1.0


Ist nun der E1.0 schon "1" bevor der FC aufgerufen wird, startet mein Timer nicht, da dieser auf einen Flankenwechsel wartet.

Wie kann ich dies am geschicktesten Lösen?
Du könntest von der Bedingung, die den FC aufruft, die positive Flanke dieser Bedingung bilden.
Wenn Du die Timer-Bedingung dann mit der negierten Abfrage dieser Flanke verknüpfst, ist immer im ersten Zyklus, in dem die FC nach einer Abschaltung wieder aufgerufen wird, der Timer-Eingang auf 0 und bekommt somit auf jeden Fall eine neue Flanke:

Code:
[FONT=Courier New]
//Aufruf:
      U     #FC_Bedingung
      FP    #FM_Merker
      =     M      1.1

      U     [/FONT][FONT=Courier New]#FC_Bedingung[/FONT][FONT=Courier New]
      SPBNB _001
      CALL  "FC"
_001: NOP   0


//FC:
      U     E      0.1
      UN    M      1.1
      L     S5T#5S
      SE    T      1

      U     T      1
      =     M      1.0
[/FONT]

Aber wirklich geschickt ist in meinen Augen was anderes.


Ich persönlich würde einen eigenen EN-Eingang in der FC erstellen und den originalen immer mit High beschalten, damit der Timer in der FC in jedem Zyklus durchlaufen wird. Und dann ähnlich wie Ronin es vorgeschlagen hat.
Wie Larry schon sagte, an der bestehenden Struktur muss auf jeden Fall was geändert werden und dann würde ich lieber verbessern als den Murks noch zu vergrößern, was z.B. mit meinem Beispielcode auch der Fall wäre.
 
Leider kann ich an der Grundstruktur des Programmes nicht viel verändern, da es ein Muster eines unserer Kunden ist.
Dem Kunden besser beibringen dass sowas ein schei... Programmierstil ist und einen nur in Teufels Küche bringt.

Bei solchen Anwendungen musst du bei jeder Zeile im FC aufpassen ob es dann wohl funktioniert wenn du ihn plötzlich nicht mehr aufrufst
Das trifft dich nicht nur bei den Timern, sondern auch bei Flankenauswertungen und jeder anderen Routine wo der Zustand des letzten Aufrufs wichtig ist.
Da vertut man sich sooo schnell.

Sonst würd ich so wie hucki schon vorgeschlagen hat eventuell eine positive Flanke des Aufrufs als IN-Paramter übergeben und drinnen zumindest eine defnierte First-Scan-Funktion ausführen... aber trotzdem...

Blockmove hat das schon ganz gut auf den Punkt gebracht... :D

[EDIT]
In deinem Beispiel ist alles direkt adressiert. Heißt das dass dieser FC nicht mehrmals verwendet wird? Nicht für mehrfache Verwendung programmiert?
Dann kannst du warscheinlich eh ohne größeren Aufwand, irgendwie ein First-Scan Ereignis an den FC übergeben und drinnen mal eine kleine Initialisierungsroutine abfahren lassen...
Wenn er nur einmal vorkommt wärs zumindest nicht soo schlimm...
[/EDIT]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
eine positive Flanke des Aufrufs als IN-Paramter übergeben
...
[EDIT]
In deinem Beispiel ist alles direkt adressiert.
...[/EDIT]
Deshalb hab' ich das "tolle" :rolleyes: Beispiel auch direkt adressiert und nicht mit IN-Parameter gepostet.
Das hat mir allerdings noch mehr widerstrebt, als der Hinweis auf einen solchen First-Scan selbst.
 
@Hucki

Das mit dem "tollen Beispiel" war nicht persönlich gegen dich gerichtet.
Wenn die Zeitfunktion notwendig ist und durch irgendwelche Sprünge oder bedingte Aufrufe in dieser Form halt nicht funktioniert, da muss ich sie eben ausserhalb aufrufen.
Wenn man das dem ursprünglichen Programmierer / Kunden nicht vermitteln kann, dann soll er sich halt selber um das Problem kümmern.

Gruß
Dieter
 
Hab' ich auch nicht persönlich aufgefasst. :)

Und Du hast es ja noch besser ausgedrückt, als ich in meinem Statement unterm Code. Deswegen hab' ich Deine Wortwahl gern wiederholt.
:ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin zwar auch kein Freund von Timern in bedingt aufgerufenen Bausteinen, doch wenn es unbedingt sein muß, dann ist das durchaus "ordentlich" machbar. Die Erkennung des Erstaufrufs macht man am einfachsten außerhalb des FC und signalisiert das dem FC über einen IN-Parameter:
Code:
      U     #FC_Bedingung
      FP    #Flankenmerker
      =     #F_FC_Bedingung

      U     #FC_Bedingung
      SPBNB _001
      CALL  "FC"
       IN_xFirstCall:=#F_FC_Bedingung
_001: NOP   0

Wenn der Baustein das erste mal aufgerufen wird, dann den Timer zuerst einmal mit VKE=0 aufrufen oder die Operation "FR T1" benutzen.

Das funktioniert z.B. so:
Code:
      U     #IN_xFirstCall
      SPBN  m11

      CLR
      L     S5T#5S
      SE    T      1

m11:  U     E      1.0
      L     S5T#5S
      SE    T      1

      U     T      1
      =     M      1.0

... und mit "FR T1" funktioniert es so:
Code:
      U     #IN_xFirstCall
      R     T      1
      FR    T      1

      U     E      1.0
      L     S5T#5S
      SE    T      1

      U     T      1
      =     M      1.0

So simpel funktioniert es ebenfalls, dauert aber 1 Aufruf länger bis der Timer abgelaufen ist, wenn E1.0 schon beim ersten Aufruf TRUE ist:
Code:
      UN    #IN_xFirstCall
      U     E      1.0
      L     S5T#5S
      SE    T      1

      U     T      1
      =     M      1.0



PS: Das Folgende funktioniert allerdings NICHT, obwohl es laut Beschreibung der Operation "FR Freigabe Timer" in der Step7-AWL-Dokumentation eigentlich funktionieren müßte:
Code:
[COLOR="#FF0000"]      CLR
      FR    T      1
      U     #IN_xFirstCall
      FR    T      1[/COLOR]

      U     E      1.0
      L     S5T#5S
      SE    T      1

      U     T      1
      =     M      1.0
Vermutlich muß man zwischen zwei Operationen "FR Freigabe Timer" mindestens einmal die Timer-Operation (SE) aufrufen, damit FR wie beschrieben wirkt, was aber nicht in der Dokumentation steht.

Harald
 
Danke für die vielen Antworten.

Ich lagere den Timer in einen dauerhaft aufgerufenen FC aus und starte diesen vom bedingt aufgerufenen FC.
 
Zurück
Oben