IEC Timer

coglione

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Ich schlage mich seid einigen Tagen mit IEC Timern rum. Irgend wie bin ich in einer Sackgasse :(
Im Forum finde ich gute Ansätze, aber sehe keine Lösung für mein Problem. (Ok ich bin noch nicht lange als SCL Programmer tätig).

Ich möchte Alarme zeitverzögert anzeigen lassen. Da es sich um Rund 300 Stk. handelt, wollte ich mit Multiinstanzen arbeiten.Ich denke 300 db's nur für Alarme ist dann doch etwas viel :)

Das hab ich :

Code:
 FUNCTION_BLOCK Tim_FB
 
 VAR_INPUT
 on           : BOOL;      //Timer Starten
 runtime      : DINT;  // Laufzeit des Timers
 END_VAR
 
 VAR_OUTPUT
 timerOut        : BOOL;   //Timerausgang bool
 END_VAR
  
 VAR
   IecTimer  : TON; 
END_VAR
BEGIN 

  IecTimer (IN := on ,PT := (DINT_TO_TIME(runtime)) ); 
           timerOut := IecTimer.Q;
END_FUNCTION_BLOCK

 DATA_BLOCK Tim_DB Tim_FB   //Multiinstanz DB bezogen auf FB999
BEGIN
END_DATA_BLOCK
Das Ziel ist es dann im Programmablauf anstatt mit den S5Time, den IEC aufzurufen, Werte übergeben (Zeit, start) und ausführen lassen.

Wie muss ich jetzt vorgehen. Soll ich jetz irgendwie 300 instanzen machen in einem neuen FB, oder im bestehenden? oder irgendwie immer diesen öffnen.
Es kann ja vorkommen das mehrere Events gleichzeitig anstehen. Dann mus ja der Timer pararell mehrfach ablaufen.

Ich danke für jegliche Hilfe :)
 
Möchtest du nur eine Einschaltverzögerung basteln?

Was spricht gegen den Einsatz des SFB4 TON? Der ist nach IEC 61131.

EDIT: Ich hab jetzt gesehen, dass du den in deinem Baustein ja sowieso aufrufen möchtest. Dann macht das ganze ja noch weniger Sinn. Ruf den SFB doch gleich als Multiinstanz auf.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ja, ich möchte nur eine Einschaltverzögerung. bis jetz wird dies mit den S5Time gemacht.
Nun möchte ich auf die TON (SFB4) "umsatteln".
Oben im Code habe ich nun Eingangs und Ausgangvariabeln deklariert, und diese dann auf eine Instanz von TON "Verknüpft".
Bis dahin gehts, aber wie mache ich jetzt, dass dieses Teil überall und jederzeit, und auch pararell mehrmals aufgerufen und abgearbeitet wird.
 
Warum willst Du 300 Alarme einzeln verzögert anzeigen lassen?
Macht es vielleicht Sinn Alarme zu gruppieren und mit einer Hirachie zu versehen?
Z. B. Wenn NOT-AUS, dann brauch ich keine Störung vom Frequenzumrichter, da diese Sekundär ist!
 
Hallo,
Ja, ich möchte nur eine Einschaltverzögerung. bis jetz wird dies mit den S5Time gemacht.
Nun möchte ich auf die TON (SFB4) "umsatteln".
Oben im Code habe ich nun Eingangs und Ausgangvariabeln deklariert, und diese dann auf eine Instanz von TON "Verknüpft".
Bis dahin gehts, aber wie mache ich jetzt, dass dieses Teil überall und jederzeit, und auch pararell mehrmals aufgerufen und abgearbeitet wird.

Überall und jederzeit geht nicht. Hast du dir schon mal das Thema Multiinstanzen angeschaut. Da wirst du feststellen das das ein (S)FB-Aufruf aus einem FB heraus ist. Und die Instanz des aufgerufenen FB´s liegt in der des aufrufendne FB´s. Den SCL-Zauber den du da veranstaltest kannst du dir sparen. Multiinstanzen haben nix mit SCL zu tun, das geht genau so in AWL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
vielleicht solltest du uns mal das "Warum" erklären.
Das dein aktueller Ansatz sehr Resourcen-fressend ist hast du ja wohl schon selbst erkannt. Vielleicht würde dich aber ein anderer Ansatz weiter bringen ...

Gruß
Larry
 
Du könntest die Daten einer TON-Instanz in ein Array ablegen, und die Daten denn vor dem Aufruf in die TON-Instanz kopieren, und nach dem Bearbeiten wieder in ein Array zurückkopieren.
Bei SCL muss man diesen Umweg gehen, weil keine Arrays mit FB aufgerufen werden können (bei Codesys geht das z.B.)

Darum braucht man erstmal einen Typ mit den Instanzdaten einer TON-Instanz (evtl. werden später nicht alle benötigt, wie z.B. PT):
Code:
TYPE TON_INSTANZ_t
//
// Typbeschreibung einer TON-Instanz
//
    STRUCT
        IN : BOOL;  //IN
        PT : TIME;  //IN
        Q : BOOL;   //OUT
        ET : TIME;  //OUT
        STATE : BYTE;//STAT
        STIME : TIME;//STAT
        ATIME : TIME;//STAT
    END_STRUCT
END_TYPE

Wenn du dann beispielsweise 128 digitale Meldungen verzögern willst, würde das so gehen:
Code:
FUNCTION_BLOCK ARRAY_VERZ

VAR_INPUT
    IN_ARR : ARRAY[0..127] OF BOOL; // Störungseingänge
    T : TIME := T#1s;               // Verzögerungszeit
END_VAR

VAR_OUTPUT
    OUT_ARR : ARRAY[0..127] OF BOOL; // Verzögerte Störungsausgänge
END_VAR

VAR_TEMP
    I : INT;
END_VAR

VAR
    TON_ARRAY : ARRAY[0..127] OF TON_INSTANZ_t;
    TON_T : TON;
END_VAR

BEGIN        
    FOR I := 0 TO 127 DO
        // Array Daten in TON Instanzdaten kopieren
        TON_T.IN    := IN_ARR[I];
        TON_T.PT    := T;
        TON_T.Q     := TON_ARRAY[I].Q;
        TON_T.ET    := TON_ARRAY[I].ET;
        TON_T.STATE := TON_ARRAY[I].STATE;
        TON_T.STIME := TON_ARRAY[I].STIME;
        TON_T.ATIME := TON_ARRAY[I].ATIME;
        // Timer aufrufen
        TON_T();
        // Daten in Array zurückkopieren
        TON_ARRAY[I].IN    := TON_T.IN;
        TON_ARRAY[I].Q     := TON_T.Q;
        TON_ARRAY[I].ET    := TON_T.ET;
        TON_ARRAY[I].STATE := TON_T.STATE;
        TON_ARRAY[I].STIME := TON_T.STIME;
        TON_ARRAY[I].ATIME := TON_T.ATIME;
        OUT_ARR[I] := TON_T.Q;
    END_FOR;
END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Vielen Dank für die Vielen Ansätze. Ich werde heute mal mit der Idee von Thomas "basteln" :)
Vielleicht zur Frage warum. von Larry.
Es handelt sich nicht nur um Alarme. Mein Baustein soll generell für alle Timer - Dinge genutz werden. Ich möchte einen einfachen, schnellen Timerbaustein, dem ich die Laufzeit und das Startbool übergebe, er zählt und gibt den Ausgnag zurück. ganz simpel eigendlich :) Da es sich um ein grösseres bestehendes Projekt handelt, weiss ich nicht wieviele Zähler gleichzeitig laufen können. Ich weiss lediglich das die bestehende S5Time Funktion rund 300 mal aufgerufen wird.
Ich möchte auch jetzt herausfinden, ob die TON - Lösung schneller ist als die S5Time, bezüglich Zykluszeit.
Das ganze ist rein experimentell und dient rein dem Lerneffekt. Ich bin ein bisschen eingerostet und hatte damals nur ein wenig FUP und AWL gelernt. Nun gilt der Neueinstieg in SCL :)
 
Zuletzt bearbeitet:
Je nach Genauigkeit, kannst Du das doch dann auch mit 'nem Taktmerker und einem eigene Zähler machen, ganz ohne IEC-Timer! Vielleicht ist der SFC64 (TIME_TCK) für Dich interessant!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
bei einer eigenen Geschichte, wo ich auch n Zeitauswertungen machen wollte habe ich es recht ähnlich wie von MCerv beschrieben ausgeführt.
Ich meinen Projekten gibt es immer einen Baustein, der mir die Systemzeit (u.A.) als globale Variable zur Verfügung stellt. Die geannte Zeit lösst in Millisekunden auf.Ist meine Zeitauswertung nun aktiv so erhöhe ich den "Timer" meines Timer-Array's immer um die Differenz zum Systemzeitwert des letzten Aufrufs. Das kann man natürlich genauso gut auch mit der OB1_Zykluszeit machen - ich hatte mich hier halt so entschieden. Das ist auf jeden fall Resourcen-sparender als das Arbeiten mit einem ARRAY_of_SFB4 (was man so nebenher ja auch nur über den von Thomas dargestellten "Umweg" machen kann).

Gruß
Larry
 
Zurück
Oben