Hilfe bei SCL

G

Gast

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich hoffe mir kann hier wer helfen!!

Ich muss für die Schule ein Programm in SCL schreiben und komm nicht weiter
´

und zwar versuche ich einen Zähler(S_CUD) programmieren

Der Zähler soll durch 16 Schalter von A0.0 bis A1.7 angsprochen werden

das sieht dann bei mir so aus

CU := A0.0 OR A0.1 OR A0.2 OR A0.3 OR A0.4 OR A0.5 OR A0.6 OR A0.7 OR A1.0 OR A1.1 OR A1.2 OR A1.3 OR A1.4 OR A1.5 OR A1.6 OR A1.7

der Zählerstand wird dann in einer BCD-Anzeige ausgeben,

nun das Problem

wenn ich einen Schalter betätige zählt der zähler einen Hoch,doch wenn ich einen 2.ten betätigte passiert nichts, ich muss erst den 1. wieder umstellen und dann den nächsten betätigen damit hochgezählt wird!

Wie kann ich dieses nun verbessern??

Vielen Dank im Vorraus

Mfg
Patrick
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alten Wert des AWs merken, mit neuem Wert des AWs auf steigende Flanken prüfen und dann den Zähler hochzählen. In AWL ginge das einfach mit:

Code:
L AW 1  // hier steht der Wert, der die Flanke erzeugen soll
L MW 1  // hier steht der Wert drin, vom letzten Zyklus (siehe unten)
INVI    // 1er Komplement bilden
UW
L 0
<>I
// Hier erfolgt das hochzählen
L AW 1  // Aktuellen Zustand laden 
T MW 1  // sichert den Accu (Wert von AW 1) im MW 1 (für Vergleich im nächsten Zyklus)

Mit SCL kenne ich mich leider überhaupt nicht aus, aber wenns in AWL so einfach geht, dann sollte es in SCL ja auch flutschen ;)
 
Unter SCL könnte es so aussehen.

Code:
// Flankenbildung
TEMP_WORD := (EW0 XOR MW0) AND EW0;
IF TEMP_WORD <> 0 THEN
  TEMP := true;
  ELSE TEMP := false;
END_IF;
 
// Zähler
TEMP_WORD := S_CU (C_NO:=Z0, CU:=TEMP);
 
// Flankenmerker nachführen  
MW0 := EW0;

oder für Schreibfaule :D
Code:
TEMP := ((EW0 XOR MW0) AND EW0) <> 0;
MW0 := EW0;
TEMP_WORD := S_CU (C_NO:=Z0, CU:=TEMP);

Mit XOR werden die Unterschiede (pos. und neg. Flanken) zwischen EW0 und MW0 erkannt, anschliessend werden mit AND EW0 die neg. Flanken herausgefiltert. Übrig bleiben nur die pos. Flanken.


Wenn man den Zähler ein zweites mal mit VKE=0 aufruft, kann man auch in zwei aufeinanderfolgenden Zyklen zählen.
Code:
TEMP_WORD := S_CU (C_NO:=Z0, CU:=(((EW0 XOR MW0) AND EW0) <> 0));
TEMP_WORD := S_CU (C_NO:=Z0, CU:=false);
MW0 := EW0;


Gruß, Onkel
 
Zuletzt bearbeitet:
Zurück
Oben