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
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
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
Hi
Peewit ist normalerweise sehr schnell ;)
Bis deine "anderen" Probleme gelöst sind, ist Peewit auch schon fertig.
(Meistens)
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;
Hey peewit,
vielen Dank, das ging ja wirklich schnell. Werds morgen gleich mal ausprobieren!
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;
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.
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!!
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......
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
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....