Step 7 Meterzähler mit Absolut Drehgeber realisieren

bananajoe

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

habe im Forum nichts entsprechendes zu diesem Thema gefunden.

Ich habe einen Baumer DPV0 Absolutdrehgeber am Profibus hängen und möchte diesen als Meterzähler an einem Druckband einsetzen.

Der Drehgeber gibt mir im PEW einen Wert zwischen 0 und 65536 , der die zurück gelegte Strecke in cm darstellt. Bei einem Wert von über 65536 fängt dieser wieder bei Null an.

Ich möchte mit dem Zähler auch Werte über 655,36 Meter erfassen können und diesen über ein Reset Signal auch wieder auf Null zurück setzen können.

Leider fehlt mir gerade jegliche Idee wie ich die Problemstellung angehen kann.

Hat jemand von euch schonmal ein ähnliches Projekt umgesetzt und kann mir einen Tipp geben? :confused:
 
Überlauf erkennen (z.B. Zählerwert = 0 oder Differenz alter Wert <-> Neuer Wert > 60000) und eine weitere Variable hochzählen.

Anzahl der Zählvariable * 65536 + aktueller Zählwert = Gesamtzählwert (Achtung DINT nutzen (10,5MIO) oder auf Real ausweichen.

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der Zähler umschlägst merkst du das ja daran, dass der neue Wert kleiner als der vorhergehende Wert ist. Daraus kannst du dir eine Flanke bilden, möglichst noch mit einer Hysterese, so dass nichts passiert, wenn der Baumet mal ein paar cm zurückgedreht wird. Oder du machst dir ein Fenster in dem ab 655 m einen Wechsel in Richtung 0 erkannt wird.
Mit dieser Flanke kannst du nun entweder einfach eine Variable hochzählen oder direkt den Wert 655,36 auf eine Variable aufaddieren.
Deine aktuelle Meterzahl ist dann diese Variable+ aktueller Baumer-Wert.
 
Danke Marcel und Ralle!

Das war der Anstoß den ich brauchte. Jetzt ist nur noch die Frage wie ich den Gesamtzählwert durch den Reset auf Null zurück setzen kann. Hierbei holt er ja wieder den Eingangswert des Drehgebers, der ja aber irgendwo zwischen 0 und 65535 liegen kann?
 
Kann man den Drehgeber ggf. Referenzieren? Dann darüber lösen.

Ansonsten kannst du beim "nullen" sagen der aktuelle Sensorwert ist 0 und von da aus rechnen… etwas komplizierter wenn der überlauf kommt, denn dann musst du nicht 65k sondern Differenz -> dein Nullpunkt zu 65k in den Zähler werfen beim ersten mal, und dann immer 65k...

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst auch in dem Moment, in welchem du den Geber "Nullst" dessen Wert in eine Variable "Offset" eintragen.
Der tatsächliche Wegwert berechnet sich dann immer aus

Weggeber + "Weg gesamt" - Offset

wobei "Weg gesamt" der aufaddierte Weg aus den Überläufen ist.

Am einfachsten wäre es, in "Weg gesamt" einfach nur die Anzahl der Überläufe abzuspeichern.

Dann rechnet man für die Gesamtanzeige einfach:

Absolutwertgeber + "Anzahl der Überläufe" * 655,36 - Offset

 
Dann rechnet man für die Gesamtanzeige einfach:

Absolutwertgeber + "Anzahl der Überläufe" * 655,36 - Offset


Das klingt sehr viel versprechend. Ich bin leider erst morgen wieder an der Anlage und versuche mich mal daran die Vorschläge umzusetzen.

Aber aufjedenfall bin ich mit der möglichen Logik schonmal viel weiter. Danke an alle :D!!

Mal was anderes, ist die Hardware fix? Absolut ist für diesen Anwendungsfall nicht optimal.

Ja die Hardware ist leider schon verbaut. Das Messrad wurde meinem Kunden so als Meterzähler für den Profibus verkauft ohne eine Funktionsbaustein o.a. mitzuliefern. Glaube die haben das selbst noch nie umgesetzt.
 
Warum?
Mit einem Offset zum "Nullen" ist das ja eigentlich kein Problem.

Weil Inkremente zählen mit einer entsprechenden Karte einfacher, eindeutiger und aus meiner Sicht das richtige ist. Keine lange rumrechnerei, nullen Überlauf...
Natürlich ist das mit Offset alles machbar und kein großes Problem, die passende Hardware ist es trotzdem nicht.
 
Hallo
Ralle's Loesung ist sowieso vorzuziehen, da man den Wert sonst bei einem Ausfall der CPU, oder des Busses(?) sonst verliert, und gar nichts mehr weiss!
Gruss
Christoph
 
Habe es nun nach Ralle´s Vorgabe umsetzen können. Funktioniert wunderbar :)

Ja, ich hätte dem Geber auch ein Preset geben können. Allerdings besteht dann das Problem nach wie vor noch, dass er sich bei 655 Meter automatisch nullt. Klar gäbe es dafür euch eine Lösung, aber so habe ich die Gesamte Logik dann doch im Programm selbst.

Besten Dank an alle!
 
FUNCTION "m7b_WEG_ZAEHLER" : VOID
TITLE =Weg-Zähler (km Zähler)
//Dieser FC arbeitet als Weg-Zähler, vergleichbar einem km-Zähler.
//
//IN: ENDODER: Positionswert des zu zählenden Encoders
//IN: INKR : Anzahl der Weginkremente, die jeweils eine Zähleinheit bilden
//IN: FRG : Zählfreigabe; Zählvorgang an der akt. EncoderPos. beginnen
//IN: RICHTUNG: hiermit kann die Zählrichtung für den Weg angebeben werden 0:+/1:-
//
//Der Baustein verfügt über eine integrierte Fehlerkorrektur: D.h. es soll z.B.
//in einer Teilung von je 100 INKR gezählt werden. Dabei kommt es vor, bedingt
//durch SPS Zykluszeit usw., das das Zählerereignis erst bei einem Weg von z.B.
//105 INKR bearbeitet wird. Dies wird korrigiert, indem beim nächsten Mal die
//Soll-Inkremente dann auf 95 festgelegt werden usw. Dies verhindert einen sich
//aufschaukelden Fehler!
//
//AUTOR: Stefan Maag, Dipl.-Ing. (FH) Elektrotechnik
//DATUM: 3/2003
//
//AENDERUNGSVERMERKE:
//--------------------------------------------------------------------------------
//DATUM NAME AENDERUNG
//--------------------------------------------------------------------------------
//
//--------------------------------------------------------------------------------
//
//HINWEISE:
AUTHOR : 'S.Maag'
FAMILY : Maagic7
VERSION : 0.1


VAR_INPUT
ENCODER : DINT ; //Positionswert Encoder
INKR : DINT ; //Inkremente für einen gezählten Wegimpuls (TEILUNG)
FRG : BOOL ; //Zählfreigabe
RICHTUNG : BOOL ; //Zählrichtung 0 = vorw. / 1 = rückw.
END_VAR
VAR_IN_OUT
Weg : DINT ; //Speicher für Wegwert
tmpWeg : DINT ; //Hilfsspeicher für Zwischenspeicherung Startwert Zählen
tmpINKR : DINT ;
btmpStart : BOOL ; //Hilfsmerker Zähler gestartet
END_VAR
VAR_TEMP
WEGDIFF : DINT ;
END_VAR
BEGIN
NETWORK
TITLE =

UN #FRG; // keine FRG
R #btmpStart; // Zähler gestartet clr
BEB ;

NETWORK
TITLE =Zähler starten: jedesmal bei Wiederkehr von FRG neu starten

U #btmpStart; // Zähler bereits gestartet
SPB NWE; // Netzwerkende

S #btmpStart; // Zähler ist gestartet

L #ENCODER; // Encoder-Wert
T #tmpWeg; // als Startwert speichern

L #INKR; // Anzahl der zu zählenden Inkremente
T #tmpINKR; // in temp-Varible speichern

NWE: NOP 0;
NETWORK
TITLE =

L #ENCODER; // aktueller Encoder Wert
L #tmpWeg; // Hilfsspeicher StartWert Encoder
-D ; // zurückgelegte Strecke
SPP WEIT; // Wenn positiv dann weiter
NEGD ; // Vorzeichen drehen
WEIT: L #tmpINKR; // Anzahl der Inkremente pro Wegeinheit
-D ; // >=0 : Wegeinheit erreicht; >0 zuviel gez. INKR
SPPZ CNT; // springe zu zählen, wenn >=0
BEA ;

CNT: L #INKR; // Inkremente pro Wegeinheit
TAK ; // zu viel gezählte INKR in Akku 1 zurück
-D ; // Korrektur SollInkr.: beim nächsten mal weniger zählen
T #tmpINKR; // beim nächsten mal zu zählende Inkremente

L 1;
UN #RICHTUNG; // keine Richtungsumkehr
SPB INC; // Weg erhöhen
NEGD ; // Vorzeichen drehen
INC: L #Weg;
+D ;
T #Weg;

L #ENCODER; // Encoder-Wert
T #tmpWeg; // als Startwert speichern

END_FUNCTION
 
Zurück
Oben