Programm impulszähler

Kroster

Level-1
Beiträge
13
Reaktionspunkte
0
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 ?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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'
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zurück
Oben