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