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

Ergebnis 1 bis 7 von 7

Thema: Programm impulszähler

  1. #1
    Registriert seit
    16.09.2012
    Beiträge
    13
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich wollte ein Programm schreiben, welches Impulse (Anzahl der logischen Zuständen '0') zählt.

    Impulse werden mit Hilfe des Buttons erzeugt [Visualisierung]. 'Taste gedruckt' entspricht logischem '0'. Taste los gelassen entspricht logischen '1'.

    Das Programm als Button-Model konnte ich leider nicht anhängen (Meldung beim hochladen "Ungültige Datei"; das war Datei von Typ . pro), daher führe ich unten auf :

    PROGRAM PLC_PRG
    VAR
    var1: REAL:=6;
    var2: REAL:=3;
    but: BOOL:=1;
    zaehler: INT:=0;

    END_VAR
    ----------------
    var2=(var1)*0.3;







    Variable 'zaehler' sollte bei jeder Betätigung des Buttons um 1 wachsen. Startwert vom zaehler:=0 ?

    Beginne ich mit der while-schleife? bei der Algorithmisierung?:

    solange (but=1) -> Variable zaehler solte bleiben wie bisher [oder zaehler(i+1)=zaehler(i)]

    if (but=0) -> Variable zaehler wächst um 1. [zaehler(i+1)=zaehler(i)+1)
    if (but) bleibt weiter '0' (ohne Zustandsänderung inzwieschen) -> zaehler (i+1)=zaehler(i) bleibt unverändert;
    if (but) kehrt wieder in Zustand '1' [but=1] und bleibt weiter '1' -> zaehler bleibt wie bisher [zaehler(i+1)=zaehler(i)

    gehe wieder zum schleife while

    ist die Richtung des Algorithmes ungefähr i.O.?




    Für Programmbeispiele oder Links auf so was ähnliches wäre ich dankbar? Syntaksis Schleifen in CoDeSYS 2.3 ?
    Zitieren Zitieren Programm impulszähler  

  2. #2
    Registriert seit
    28.05.2010
    Ort
    OWL
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Kroster,

    an sich stimmt die Richtung. Jedoch musst Du beachten, dass sowohl bei der While-Schleife als auch bei deiner IF-Abfrage (bei gedrücktem Button) dein Zähler mit jedem SPS-Zyklus hochgezählt wird.
    Schau dir dazu mal die Funktionsbausteine R_TRIG bzw. in deinem Fall besser F_TRIG an. Den Ausgang Q des Bausteins würde ich dann entsprechend mit einer IF-Abfrage verbinden und den Zähler hochzählen.

  3. #3
    Registriert seit
    08.02.2011
    Beiträge
    24
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Kroster,

    Ich stimme Granz voll und ganz zu. Du könntest aber auch das ganze in FUP progrmieren und einen Zähler direckt an die Taste, aber negiert wegen 'Taste gedruckt' entspricht logischem '0'., schalten. Zähler sind von sichaus schon Flankengetriggert.

  4. #4
    Kroster ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    16.09.2012
    Beiträge
    13
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich schreibe das Programm in ST und wollte erst das Programm als Text:

    WHILE but=1 DO
    zaehler:=zaehler;
    IF but=0 THEN
    zaehler:=zaehler+1;
    END_IF
    END_WHILE

    aber bis jetzt hat es mit dem Zaehler noch nicht fonktioniert. Beim Drucken von button zaehler bleibt unverändert auf '0'

  5. #5
    Registriert seit
    08.02.2011
    Beiträge
    24
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo erstmal Kroster ,

    Also so wie ich das lese stimmt das mit dem Zähler=0. Wenn nämlich der Button but gedrückt wird, dann ist er 0 und die while-Schleife wird nicht mehr durchlaufen-> der Zähler kann nicht hochgezählt werden.

    Versuchsmal so:

    if but = 0 and Trig then
    Trig :=false;
    Zaehler := zaehler+1;
    end_if

    if but =1 then
    Trig:=true;
    end_if

    Trig ist Bool und kann local deffiniert sein. Er ist sowas wie ein Flankendedektoer.


    sollte funktionieren, ich habs aber nur "auf dem Papier" gemacht.

    Alternativ kannst du es auch mal so versuchen, sollte auch gehen: (Auch nur auf dem Papier getestet)

    Z als CTU (Aufwärtszähler) global deffinieren
    und mit
    Z.cu := not but;

    den Zählereingang beaufschlagen. not weil der Zähler auf positive Flanken reagiert. Diese Anweisung muss aber immer durchlaufen werden.

    Z.cv ist dann der Zählerstand.

    Viel Spaß beim Austesten, Holger

  6. #6
    Registriert seit
    28.05.2010
    Ort
    OWL
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Moin,

    also zu den beiden guten Vorschlägen meines Vorredners würde ich gerne noch eine dritte Möglichkeit ergänzen:

    F_TRIG_But(CLK:=but, Q=>); (*F_Trig_But => Funktionsbaustein vom Typ F_TRIG*)
    IF F_TRIG_But.Q THEN
    Zaehler:=Zaehler+1;
    END_IF;

    Ich denke mal, dass alle drei Möglichkeiten laufen sollten. Viel Spaß damit.

  7. #7
    Kroster ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    16.09.2012
    Beiträge
    13
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Herzlichen dank an alle.

Ähnliche Themen

  1. Impulszähler
    Von veritaz89 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 30.05.2012, 07:39
  2. S5 Programm überschreiben zu S7 Programm
    Von Tabler im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 29.03.2011, 22:37
  3. Antworten: 8
    Letzter Beitrag: 09.12.2010, 18:08
  4. Antworten: 0
    Letzter Beitrag: 05.10.2006, 13:56
  5. S5 Programm in ein S7 Programm umwandeln
    Von 1schilcher im Forum HMI
    Antworten: 3
    Letzter Beitrag: 15.01.2006, 11:53

Lesezeichen

Berechtigungen

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