# Bedienfehler COUNT\_BR???

**URL:** <https://oscat.discourse.group/t/bedienfehler-count-br/620>\
**Category:** oscat.lib fuer TwinCAT/CoDeSys\
**Created:** [2. Juni 2009 um 07:17 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620 "2009-06-02T07:17:37Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [2. Juni 2009 um 07:17 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/1 "2009-06-02T07:17:37Z")

</div>

Hallo zusammen!

Ich bin Maschinenbaustudent und habe erst vor kurzem angefangen mit CoDeSys zu programmieren. In dem Zuge bin ich dann auf eure Internetseite und die Oscat.lib gestoßen. Eine tolle Sache, und hierfür schon mal ein dickes Lob!

Nun benutze ich in einem Projekt den Baustein COUNT\_BR. Die Eingänge sind wie folgt beschalten:

UP:= (Variable BOOL)  
STEP:= 10  
MX:= 100  
CNT=\> (Variable BYTE)

Der Rest ist nicht beschalten. Der Eingang UP erhält immer mal wieder einen Impuls, das Ergebnis ist folgendes:

0, 10, 20, …90, 100, 9, 19, … 89, 99, 8, 18…

Das heist, ich verliere bei jedem Durchlauf erneut ‘1’.  
Nun meine Frage, bediene ich den Baustein falsch, oder habe ich dessen Funktion falsch verstanden?

Danke schon mal im vorraus.

Gruß Alex

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [2. Juni 2009 um 16:28 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/2 "2009-06-02T16:28:30Z")

</div>

Hallo AlexR

Dein festgestelltes Verhalten kann ich nachvollziehen

dabei wird bei einen überlauf die zahl 0 auch als zählposition angesehen, und verursacht diese verschiebung

beispiel:

inc (90,10,100) ergibt 100 (ist noch ok)  
inc (100,10,100) ergibt 9

betrifft: count\_br und count\_dr

wir werden uns das genauer noch ansehen…

danke für den tip

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [3. Juni 2009 um 08:06 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/3 "2009-06-03T08:06:08Z")

</div>

Hallo peewit,

danke schon mal für die Antwort. Meinst du es gibt in absehbarer Zeit ne Lösung für dieses Verhalten? Verwende sehr gerne eure Lib, aber sonst werd ich mich mal an einen eigenen Baustein mit dieser Funktionalität machen.

Alex

---

<div class="post-metadata">

**Author:** ![gravieren](https://avatars.discourse-cdn.com/v4/letter/g/54ee81/32.png) [@gravieren](https://oscat.discourse.group/u/gravieren)\
**Post date:** [3. Juni 2009 um 09:59 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/4 "2009-06-03T09:59:03Z")

</div>

Hi

Peewit ist normalerweise sehr schnell 😉

Bis deine “anderen” Probleme gelöst sind, ist Peewit auch schon fertig.  
(Meistens)

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [3. Juni 2009 um 17:29 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/5 "2009-06-03T17:29:43Z")

</div>

Hallo AlexR

hier hast du einmal eine vorläufige lösung

ich schlage vor das du für diese provisorische lösung einfach einen neuen baustein anlegst (count\_br2)

FUNCTION\_BLOCK COUNT\_BR2  
VAR\_INPUT  
SET : BOOL;  
IN : BYTE;  
UP : BOOL;  
DN : BOOL;  
STEP : BYTE := 1;  
MX : BYTE := 255;  
RST : BOOL;  
END\_VAR  
VAR\_OUTPUT  
CNT : BYTE;  
END\_VAR  
VAR  
last\_up: BOOL;  
last\_dn: BOOL;  
END\_VAR

IF rst THEN  
cnt := 0;  
ELSIF set THEN  
cnt := LIMIT(0,in,mx);  
ELSIF up AND NOT last\_up THEN  
IF STEP \> MX - CNT THEN  
CNT := CNT - MX + STEP;  
ELSE  
CNT := CNT + STEP;  
END\_IF;  
ELSIF dn AND NOT last\_dn THEN  
IF STEP \> CNT THEN  
CNT := CNT - STEP + MX;  
ELSE  
CNT := CNT - STEP;  
END\_IF;  
END\_IF;  
last\_up := up;  
last\_dn := dn;

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [3. Juni 2009 um 20:49 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/6 "2009-06-03T20:49:49Z")

</div>

Hey peewit,

vielen Dank, das ging ja wirklich schnell. Werds morgen gleich mal ausprobieren!

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [4. Juni 2009 um 10:44 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/7 "2009-06-04T10:44:31Z")

</div>

Hallo peewit,

habs nun mal ausgetestet. Funktioniert so weit ganz gut, nur wird beim hochzählen/runterzählen bei “Überlauf” nicht mit 0 bzw. MX begonnen. Darum passt der Vorschlag nicht zur Beschreibung der Oscat.lib. Ich hab deinen Vorschlag etwas abgeändert, so dass es Funktionieren könnte.

FUNCTION\_BLOCK Count\_BR  
VAR\_INPUT  
SET : BOOL;  
IN : BYTE;  
UP : BOOL;  
DN : BOOL;  
STEP : BYTE := 1;  
MX : BYTE := 255;  
RST : BOOL;  
END\_VAR  
VAR\_OUTPUT  
CNT : BYTE;  
END\_VAR  
VAR  
last\_up: BOOL;  
last\_dn: BOOL;  
END\_VAR

IF rst THEN  
cnt := 0;  
ELSIF set THEN  
cnt := LIMIT(0,in,mx);  
ELSIF up AND NOT last\_up THEN  
IF CNT=MX THEN  
CNT:=0;  
ELSIF STEP \> MX - CNT THEN  
CNT := CNT - MX + STEP;  
ELSE  
CNT := CNT + STEP;  
END\_IF;  
ELSIF dn AND NOT last\_dn THEN  
IF CNT=0 THEN  
CNT:= MX;  
ELSIF STEP \> CNT THEN  
CNT := CNT - STEP + MX;  
ELSE  
CNT := CNT - STEP;  
END\_IF;  
END\_IF;  
last\_up := up;  
last\_dn := dn;

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [5. Juni 2009 um 06:17 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/8 "2009-06-05T06:17:09Z")

</div>

Das mein Vorschlag nicht zur Oscat.lib passt, ist klar, denn dafür müsstest du wieder den original count\_br nehmen

darum meinte ich auch das du am besten diese version count\_br2 nennen solltest, da das verhalten nicht dem cound\_br bzw. der Doku entspricht.

deine änderung bewirkt folgendes

UP:= (Variable BOOL)  
STEP:= 10  
MX:= 100  
CNT=\> (Variable BYTE)

0, 10, 20, …90, 100, 0,10,20

das unlogische ist der zählschritt von 100 auf 0 bei schrittweite 10  
Wenn du mit deiner letzten änderung für deine anforderungen zufrieden bist, gut so… aber ich kann den Sinn nicht wirklich nachvollziehen.

es gibt nur zwei möglichkeiten entweder mit “0” als zählwert oder ohne

orignal count\_br (0 = zählposition)  
0,10,20,…90,100,9

meine count\_br2 (0 ist keine zählposition, ausser bei programmneustart oder reset oder set auf 0)  
0,10,20,…90,100,10,20

wenn n \> max wird dann sollte danach eigentlich n = n+step-max sein, und das passiert bei mir auch.

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [10. Juni 2009 um 11:09 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/9 "2009-06-10T11:09:30Z")

</div>

Hey peewit,

danke nochmal für die Info.

In der Oscat304.pdf steht

“COUNT\_BR ist ein Byte Zähler der von 0 bis MX zählt und dann wieder bei 0 beginnt.”

als Beschreibung. Max wäre ja bei mir 100. Deswegen macht für mich auch … 90, 100, 0, 10 … Sinn. Was für mich nun eigentlich bedeutet, dass der Baustein nicht zur Beschreibung passt, zumindest nicht immer! Denn für Step:= 1 und Mx:= 2 ergibt sich sehr wohl 0, 1, 2, 0, 1, 2 … mit COUNT\_BR.

Ich nehme den Baustein unter anderem um bei einer Visualisierung im Tipp-Betrieb zwischen 0%, 10% … 100% durchzuwechseln. Wenn allerdings dann beim 2. Durchlauf keine 0% mehr angezeigt wird, oder eben 9%, 19% … ist das für meine Anwendung eben schlecht. Nun gut.

Für meinen Fall ist mir geholfen. Wenn ich dann der Einzige bin, der die Beschreibung bzw. den Funktionsblock Count\_BR nicht für stimmig hält, ok. Ansonsten müsste man da meiner Meinung nach etwas nachbessern.  
Aber wie gesagt, die Oscat.lib finde ich trotzdem richtig klasse.

Danke für die Hilfe!!

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [10. Juni 2009 um 14:28 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/10 "2009-06-10T14:28:33Z")

</div>

Hallo AlexR  
bei der beschreibung muss ich dir recht geben…

Aus der oscat-Beschreibung geht nicht eindeutig hervor was bei einen Überlauf passieren soll (in der beispieltabelle fehlt ein über/unterlauf )  
fängt dieser wieder bei genau 0 an , oder bei 0 + Überlaufwert

Allerdings funktioniert deine änderung auch nur wenn genau der max wert erreicht wird

wenn z.b. Wert 92 + Schrittweite 10 gezählt wird , fängt dein baustein genauso wenig bei “0” an

kannst du mal eine matrix erstellen , wo alle fall beispiele definiert sind.  
dann werde ich gerne das für dich umsetzen…

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [14. Juli 2009 um 15:39 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/11 "2009-07-14T15:39:22Z")

</div>

dein problem mit count\_br kannst du ganz einfach umgehen indem du MX auf 109 setzt.

dann zählt der counter bis 100 und dann weiter bei 0

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [18. Juli 2009 um 08:49 UTC](https://oscat.discourse.group/t/bedienfehler-count-br/620/12 "2009-07-18T08:49:04Z")

</div>

das ganze ist etwas undurchsichtig aber eigentlich kein fehler.

der counter ist so designed das er auch einen overflow richtig macht.

beispiel:  
wir haben einen counter der 0..9 zählt um uns einen dezimalzähler zu bauen  
wir setzen count auf 3 damit er immer 3 schritte zählt  
der counter steht bei 8 und zählt 3 schritte (8-9-0-1)  
genau das würde man vom zähler am überlauf erwarten und nichts anderes  
stell dir das so vor als ob der zähler intern immer einzelschritte zählt. spätestens dann wird das verhalten klar  
wenn er also in 10 schritten bis 240 zählen soll und dann beim nächsten 10-schritt 0 dann muss der mx wert eben bei 249 stehen damit er von 240 bis 0 auch 10 schritte machen kann

anders kannst du dein problem auch lösen indem du den counter 0..8 zählen lässt und dann den ausgang mit 10 multiplizierst, das ergibt dann auch 0,10,…70,80,0,10…
