Bedienfehler COUNT_BR???

Begonnen von AlexR, 02. Juni 2009, 09:17:37

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

AlexR

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


peewit

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 

AlexR

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

gravieren

Hi

Peewit ist normalerweise sehr schnell   ;)

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


peewit

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;

AlexR

Hey peewit,

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

AlexR

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;

peewit


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.


AlexR

#8
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!!


peewit

#9
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......

hugo

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

hugo

#11
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....