Was macht SFB4 wenn PT=0?

s3amdrer

Level-1
Beiträge
210
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen.

Was macht SFB4 wenn PT=0?

Ich habe ein SFB4 als Startverzögerung für ein Ventil eingesetzt.
Der SFB4 Eingang "In" wird mit einem Schrittmerker gesetzt.
Der SFB4 Eingang "PT" wird mittels Datentyp Time vom Bediengerät eingestellt.
Der SFB4 Ausgang "Q" schaltet den nächsten Schritt aktiv.
Schrittkettenprogramierung.

Stelle ich nun per Bediengerät am PT einen Wert =0 ein, so kommt der Ausgang Q nicht. Ist der Wert >0 (also auch schon bei 0,001s) so funktioniert alles einwandfrei.
Ist die Funktion so richtig?

Habe bis jetzt im Bediengerät die Grenzen auf min.=0.001 gesetzt.
Aber ich möchte, dass der Kunde auch 0 als Verzögerungzeit einstellen kann.
Des weiteren möchte ich nicht jede Übergangsbedingung der Schrittkette so programmieren, dass ich den PT Wert auf 0 überprüft.

Ideen?
 
Ich habe mir meine eigene Zeitfunktion geschrieben, da habe ich dann solche Probleme nicht.
 
nutz doch einfach die Zeitfunktion, du kannst doch die Eingabe überwachen.
Einmal kannst du das mit Grenzwerten am Panel, oder vor den Aufruf
kannst du einen Vergleicher machen.

Code:
      L SFB4.PT
      L 0
      ==D
      SPBN ENDE
      L L#1
      T SFB4.PT
ENDE: NOP 0
 
      call SFB4.Instanz
      ....
      ....
 
Danke, dass ist ne Idee um das im Panel zu vereinfachen.

Ist es denn richtig, wenn PT = 0 ist, dass dann Q nicht schaltet?

Das fände ich aber blöd (unsinnig), da der SFB4 mit dem Hochlaufen der Zeit beginnt, wenn IN auf 1 ist.
Ob der SFB4 nun erkennt, dass 1ms abgelaufen ist und PT gleich 1 ms parametriert wurde (funktioniert), oder das Ganze mit 0ms durchgeführt wird (funktioniert nicht).
 
OK, dass ist sehr blöd.
Da ich es höchstwahrscheinlich nicht ändern kann ;), so habe ich umso größeres Interessen an der Zeitfunktion von Paule!:)

Ist die Multiinstanzfähig?
 
Also wenn es Dir im 100 Millisekunden Takt reicht dann würde ich das so schreiben:

Code:
      U #Start
      SPBN Aus
      U #Taktmerker_von_ CPU
      SPBN Wart
      L #Zeit
      +1
      T #Zeit
Wart: L #Zeit
      L #Zeitwert
      >=I
      = #Zeit_abgelaufen
      SPA Ende
Aus:  L 0
      T #Zeit
Ende:NOP 0
Das ganze ist ein FB
Start , Taktmerker_von_ CPU, Zeitwert = Var IN
Zeit = Var STAT
Zeit_abgelaufen = OUT
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann auch den "defekten" SFB4 TON-Baustein in einen weiteren FB kapseln, den man dann so programmiert dass dieser auch mit T#0s klarkommt, bzw. die gewünschte Funktion ausführt.
Aufgrund der Problematik mit den 0s verwende ich den SFB4 auch nur wenn ein Benutzer die Zeiten als Parameter nicht verstellen kann.

Der TON bei Codesys setzt den Ausgang auch bei T#0s direkt. Fragt sich nur wer von beiden Herstellern sich an die Norm hält. Die Siemens-Hilfe behauptet zumindest dass ihr TON-Baustein IEC 1131-3 konform ist. Ich finde das Verhalten zumindest unlogisch.
 
Der Vorschlag von Paule ist gut aber da fehlt noch eine Flanke.
Ich würde das so machen:
Code:
         U #Schrittmerker1
         U #Taktmerker_10ms
         FP #Hilfsmerker_Flanke
         NOT
         SPB Jum1
         L int_Timer_Schrittkette
         L 1
         +I
         T int_Timer_Schrittkette
Jum1: Nop 0
         
         U #Schrittmerker1
         L int_Timer_Schrittkette
         L int_Zeitwerteingabe
         >=
         NOT
         SPB Jum2
         S #Schrittmerker1
         R #Schrittmerker1
         L 0
         T int_Timer_Schrittkette
Jum2: Nop 0
Das hat außerdem den Vorteil das du pro Schrittkette nur einen nachgebildeten Timer benötigst. Diesen setzt nach gebrauch immer wieder auf "0" und schon kannst du ihn im nächsten Schritt wieder gebrauchen. Der Zeitwert wird hier in 0,1sek über einen Integerwert vorgegeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
// Reset
      U      #Start
      SPB    nRes

      L     L#0
      T     #Wert
nRes: Nop   0

// Ablauf
      UN    #Start
      SPB   nCnt

      L     #Wert
      L     #Zyklus_Zeit / "Zyklus_Zeit"
      +D
      T     #Wert
nCnt: Nop   0

// Vergleich
      L     #Wert
      L     #Vorgabe
      >=D
      =     #Q
      U     #Q
      SAVE
Das ganze wahlweise im FC oder FB(Multiinstanzfähig).
Start als Bool (IN)
Q als Bool (OUT)
Vorgabe als DInt (IN)
Wert als DInt (IN_OUT) bei FB im STAT
#Zyklus_Zeit / "Zyklus_Zeit" ist ganz einfach die Länge des letzten Zyklus (OB1) wahlweise als IN / MW oder DBW übergeben
...
Simpel, Zykluszeitgenau und überall anwendbar ;)

PS: Sollten Fehler drin sein, so möge man mir verzeihen, hab das nur fix eingetippt :rolleyes:
 
Zurück
Oben