Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 8 von 8

Thema: Impuls_Pause_Repeat_in FC/FB

  1. #1
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    wollte mir einen Baustein (FC/FB) erstellen, in dem es moeglich ist ein Ausgang mit folgenden Optionen auszustatten. Der Baustein soll spaeter mehrmals aufgerufen werden.
    z.B.

    Impuls: DB100.DBW0
    Pause: DB100.DBW2
    Repeat: DB100.DBW4
    Output: A8.4

    leider bin ich etwas ratlos wie ich Timer und Counter innerhalb des Baustein verwenden soll. Die Eingabe der verschieden Zeiten (impuls-pause) und Wiederholungen (repeat) erfolgt via OP (DB).
    Ich benutze S7V5.3.

    Besten Dank schon im voraus fuer die Hilfe.

    mzva
    Zitieren Zitieren Impuls_Pause_Repeat_in FC/FB  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Es gibt einige Möglichkeiten:

    1. Die gibst als Input-Var einen bzw. mehrere Timer an, den/die du dann intern nutzt.

    2. Du nimmst einen Zählimpuls der CPU (100ms) als Input für den Baustein und eine Zählvariable. Diese Zählvariable wird hochgezählt und mit den Impuls- und Pausewerten verglichen, bei Erreichen der vorgegebenen Anzahl jeweils den Ausgang ein- bzw. ausschalten. (Diese Variante würde ich vorziehen.)

    Wenn du einen Timer nutzt, kannst du am OP die Wert direkt als Timerwert konfigurieren, bei einem Zähler (100 ms) nimm am OP eine INT mit 1 Kommastelle, so kann der Zählwert direkt mit dem Zeitwert verglichen werden.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    30.03.2005
    Beiträge
    239
    Danke
    22
    Erhielt 2 Danke für 2 Beiträge

    Standard

    am besten du kreirst einen FB mit folgenden Parametern:

    IN : Impuls : integer
    IN : pause : integer
    IN : repeat : integer
    IN : takt : integer
    IN : start : bool
    OUT : output : bool

    aus takt machst du eine Flanke : TEMP : t_fl
    mit start setzt Du dir : STAT : gestartet
    Du addierst pause + impuls zu TEMP : Zyklus
    Du brauchst noch zwei weitere Zählvariablen als STAT : ZZ1 und ZZ2
    wenn gestartet 1 ist und die sekundenflanke da ist, erhöhst du ZZ1 um einen (mit +I). Ist ZZ1 grösser gleich Zyklus, setzt du zz1 auf null und erhöst zz2 gleichzeitig um einen. wenn zz2 grösser ist als repeat, setzt du zz2 zu null und setzt gestartet zurück.
    Nun zum ausgang: wenn zz1 kleiner gleich impuls ist und gestartet da, weist du dies dem ausgang zu. fertig.

    Ich hoffe ich konnte Dir damit helfen und habe die aufgabenstellung verstanden, sonst meld ich nochmal.

    gruß
    Zitieren Zitieren ein fb wär am besten...  

  4. #4
    Registriert seit
    20.10.2006
    Beiträge
    68
    Danke
    13
    Erhielt 19 Danke für 7 Beiträge

    Standard

    Quelle anlgen,
    Namen angeben in Symboltabelle,
    übersetzen,

    fertig

    FUNCTION_BLOCK "fbPulsPausCnt"
    TITLE =
    //Taktgeber mit einstellbarer Puls, Pausezeit.
    //iEnable 0 -> 1 = oPuls wird ausgegeben gleichzeitig lauft iPulsTime, nach
    //Ablauf von
    //iPulsTime wird umgeschaltet zu oPause.iPauseTime wird gestartet.
    //Nach Ablauf von iPauseTime beginnt der Ablauf von neuem.
    //iEnable 1 -> 0 oPuls und oPause schalten sofort aus. Zugehoerige Zeiten werden
    //gestoppt.
    //Zeiten laufen bei jedem wechsel von iEnable die volle Zeit neu.
    //Zeitwerte mit 0ms sind nicht erlaubt.
    //Jeder Puls wird mitgezaehlt, bei erreichen von iCount_Pulse wird oCount_OK auf
    //High gesetzt.
    // KNOW_HOW_PROTECT
    AUTHOR : FKJ
    FAMILY : TIMING
    NAME : PULSCNT
    VERSION : 0.1
    Know_how_protect
    VAR_INPUT
    iEnable : BOOL ;
    iPulsTime : TIME ;
    iPauseTime : TIME ;
    iCount_Pulse : INT ;
    END_VAR
    VAR_OUTPUT
    oPuls : BOOL ;
    oPause : BOOL ;
    oCount_OK : BOOL ;
    END_VAR
    VAR
    T_1 : "TON";
    T_2 : "TON";
    Counter_x : INT ;
    RT_2 : TIME ;
    RT_1 : TIME ;
    Q_T_1 : BOOL ;
    Q_T_2 : BOOL ;
    A : BOOL ;
    B : BOOL ;
    HM_1 : BOOL ;
    HM_3 : BOOL ;
    Count_ok : BOOL ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    U #iEnable; // Pulstime
    UN #Q_T_2;
    UN #Count_ok;
    = #A;
    CALL #T_1 (
    IN := #A,
    PT := #iPulsTime,
    Q := #Q_T_1,
    ET := LD 0);
    U #Q_T_1; // Pausetime
    U #iEnable;
    UN #Count_ok;
    = #B;
    CALL #T_2 (
    IN := #B,
    PT := #iPauseTime,
    Q := #Q_T_2,
    ET := LD 4);
    U #iEnable; // Reset
    SPB m002;
    L 0;
    T #Counter_x;
    SET ;
    R #Count_ok;
    m002: NOP 0;
    U #oPuls; // Count
    FP #HM_3;
    SPBN m001;
    L #Counter_x;
    L 1;
    +I ;
    T #Counter_x;
    m001: NOP 0;
    L #Counter_x; // Count Auswerten
    L #iCount_Pulse;
    >=I ;
    U #Q_T_1;
    S #Count_ok;
    U #Q_T_1; // Pause
    U #iEnable;
    UN #Count_ok;
    = #oPause;
    U #iEnable; // Puls
    UN #oPause;
    UN #Count_ok;
    = #oPuls;
    ON #iEnable; // Reset bei fertig oder Ende
    O #Count_ok;
    R #oPuls;
    R #oPause;
    U #Count_ok; // Count OK
    = #oCount_OK;
    END_FUNCTION_BLOCK


    mfg FKJ
    Zitieren Zitieren Vielleicht hilft Dir das weiter !  

  5. Folgender Benutzer sagt Danke zu FKJ für den nützlichen Beitrag:

    Waelder (28.02.2008)

  6. #5
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Besten Dank fuer die Hilfe, denke ich habe nun ein paar Ansatzpunkte um selbst zu einem "Ergebnis" zu kommen.

    Ralle was meinst du mit Zaehlimpuls (Taktmerker?)

    mzva

  7. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    In der Hardwarekonfiguration der S7 kannst du ein Taktbyte angeben (z.Bsp. MB100). Die einzelnen Bits haben unterschiedliche Taktzeiten, daraus kann man Impulse machen und diese dann zählen. Mit einem 100ms-Impuls als Zählimpils aus diesem Taktmerker realisiere ich alle Zeitüberwachungen (z.Bsp. für Zylinderbewegungen) in meinen SPS-Programmen.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. #7
    mzva ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2006
    Beiträge
    124
    Danke
    16
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Genau mit Taktmerker meinet ich was du beschrieben hast, Taktbyte.
    Wenn es ok fuer dich waere, koenntest du mir ein einem einfach Beispiel (Zylinderueberwachung) erklaeren wie du dies machst? Vielleicht Code posten?

    Gruss mzva

  9. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hier findest du genau den Code, den hatte ich da schon einmal gepostet :

    http://www.sps-forum.de/showthread.p...light=Stoerbit
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •