TIA SCL Zähler?

SEAL

Level-1
Beiträge
80
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Ich versuche mir mit SCL einen Zähler zu bauen aber irgenwie klppt das mit der Zählerei nicht. Benutze TIA V13.


mein Code:

Code:
IF
    #eingang  THEN
    #z1 :=#z1 +1;
    IF #z1=  100 THEN
        #z1 := 1;
    END_IF;
    
   
END_IF;

z1 : statisch und integer
Eingang: bool

Was möchte ich:

ich möchte , wenn am eingang ein high signal anliegt z1 um 1 hochzählt, zählen soll er nur bis 100. Probiert habe ich es mit einen taktmerker von 1s.

das Problem:
z1 zählt nicht um 1 hoch wenn der eingang kommt, sonder springt um 20 -30 höher. Habe es schon mit einer flanke probiert aber es passiert immer das gleich.

Habe ich waas nicht beachtet?
 
das Problem:
z1 zählt nicht um 1 hoch wenn der eingang kommt, sonder springt um 20 -30 höher. Habe es schon mit einer flanke probiert aber es passiert immer das gleich.

Habe ich waas nicht beachtet?

Ja, Du hast die Flanke falsch umgesetz.

zum Verständnis: in Deinem obigen Programm wird solange #eingang=true bei jedem SPS-Zyklus der Zähler weitergezählt.

Also das mit der Flanke ist der richtige Ansatz. poste uns doch mal den Code mit der Flanke.

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der Code sieht dann so aus:
Code:
#hm := 0;

IF
    #eingang AND NOT #hm THEN
    #z1 :=#z1 +1;
    IF #z1=  100 THEN
        #z1 := 1;
    END_IF;
    
   
END_IF;
hm : ist temporär
 
der SCL Baustein ist ein FC #hm habe ich als ausgang definiert und an eine Datenbausteinbit gehängt. aber irgendwie klappt das nicht so ganz oder muss diesen als in/out nehmen?
 
Code:
IF #Motor_Freigeben AND "M x 1.0s" AND NOT #HM THEN
    #"Motor läuft" := #"Motor läuft" + 1;
    IF  #"Motor läuft"= 100 THEN
        #"Motor läuft" := 1;
    END_IF;
END_IF;
#HM := #Motor_Freigeben ;

scl.JPG

irgenwie klappt das mit dem zählen nicht, er springt wieder mehr als 1 hoch. Als Baustein brauch ich einen FC da ich diesen mehrmals aufrufen muss und alle Bausteien an einen DB binde
 
den HM habe ich an ein DBbit gebunden. Der "M x 1.0s" ist einTaktmerker von der SPS.
Mit den Untenstehenden Cod zählt er zwar langsammer aber immer noch mehr als eins. :(
Auch klappt das nicht wenn der Wert gösser al 100 ist das der den Zähler auf 1 zurücksetzt.
Code:
IF #"Motor läuft" >= 100 THEN
        #"Motor läuft" := 1;


Code:
IF #Motor_Freigeben AND "M x 1.0s" AND NOT #HM THEN
    #"Motor läuft" := #"Motor läuft" + 1;
    IF  #"Motor läuft" = 100 THEN
        #"Motor läuft" := 1;
    END_IF;
END_IF;
#HM := #Motor_Freigeben AND "M x 1.0s";
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber auch das sind FBs ;-)
Jo, und dabei kann man so schön übersichtlich programmieren mit FBs und stat. Variablen und Multiinstanzen... aber das krigt man in die Köpfe nicht reingeprügelt...

Ich wär einfach zu faul, Ordnung in den ganzen Merkerbereichen und GlobalDB-Bereichen zu halten...

Gruß.
 
Also wenn ich den Taktmerker aus dem Code nehme und ihn an den Eingang des Bausteins hänge dann zählt er um 1 hoch, so wie ich es will. bleibt nur noch das Problem warum er nicht bei >= 100 den zähler auf 1 setzt und gar nicht mehr zählt. Zudem ist auch noch die Frage warum ich den Taktmerker nicht in den Baustein einbauen kann , ist das ein zyklisches Problem?
 
den HM habe ich an ein DBbit gebunden. Der "M x 1.0s" ist einTaktmerker von der SPS.
Mit den Untenstehenden Cod zählt er zwar langsammer aber immer noch mehr als eins. :(
Auch klappt das nicht wenn der Wert gösser al 100 ist das der den Zähler auf 1 zurücksetzt.

Code:
IF #Motor_Freigeben AND "M x 1.0s" AND NOT #HM THEN
    #"Motor läuft" := #"Motor läuft" + 1;
    IF  #"Motor läuft" = 100 THEN
        #"Motor läuft" := 1;
    END_IF;
END_IF;
#HM := #Motor_Freigeben AND "M x 1.0s";

Es macht genau das, was Du programmiert hast:

bei jeder Flanke vom Taktmerker wird der Zähler eins hochgezählt, vorausgesetzt #Motor_Freigeben ist true.

zurückgesetzt wird nur, wenn Zähler=100 und auch nur wenn die äussere Bedingung erfüllt ist.

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der Grund warum ich FCs nehme ist hier das ich nicht für jeden FB einen DB aufrufen möchte sondern alles in einem DB haben möchte, bei meiner Aufgabe habe ich zb. 12 motoren, für jeden Motor gibts ein UDT mit Status und steuerwerten, das UDT rufe ich 12 mal in einem DB. Die jeweilige IO Bits hänge ich dann einfach an meinen FC.
 
der Grund warum ich FCs nehme ist hier das ich nicht für jeden FB einen DB aufrufen möchte sondern alles in einem DB haben möchte, bei meiner Aufgabe habe ich zb. 12 motoren, für jeden Motor gibts ein UDT mit Status und steuerwerten, das UDT rufe ich 12 mal in einem DB. Die jeweilige IO Bits hänge ich dann einfach an meinen FC.

dafür gibt es Multiinstanzen...

zu Deinem Code: #"Motor läuft" muss auch INOUT sein.

Gruß.
 
Es macht genau das, was Du programmiert hast:

bei jeder Flanke vom Taktmerker wird der Zähler eins hochgezählt, vorausgesetzt #Motor_Freigeben ist true.

zurückgesetzt wird nur, wenn Zähler=100 und auch nur wenn die äussere Bedingung erfüllt ist.

Gruß.

Leider eben nicht der Zähler springt um 50 oder mehr (ist unregelmässigt) hoch und nicht um +1.
 
Leider eben nicht der Zähler springt um 50 oder mehr (ist unregelmässigt) hoch und nicht um +1.

Dann ist #HM nicht mit einem Bit verknüpft dass ganz für sich alleine steht. Grundsätzlich funktioniert dass so (ducatis einwurf beachten!).

Und ja das wäre eine aufgabe für einen FB (als Multiinstanz also nicht mit eigenem DB), denn Flankenmerker an der Schnittstelle sind bäh.

mfG René
 
denn Flankenmerker an der Schnittstelle sind bäh.

sind ja nicht nur die Flankenmerker... alles was in dem FC von einem zum nächsten Zyklus gerettet werden soll, muss über einen INOUT irgendwo extern gespeichert werden... da hätte ich keine Lust dazu... und manchmal vergisst man es eben auch, so wie hier im Falle vom #"Motor läuft"...

also nochmal an den TE: höre auf uns und nehme einen FB mit Multiinstanz! Tu einfach Dir und Deinen Kollegen und uns und Frau Merkel den Gefallen. ;)

Gruß.
 
Zuletzt bearbeitet:
Zurück
Oben