Hallo easy Freunde,
in der Praxis habe ich festgestellt, das bei Verwendung des Multiplexers zur Temperaturmessung mit PT1000 gewisse Einschwingzeiten zu beachten sind. Trotz EMV-gerechter Installation, kam es immer zu Schwankungen auf den Kanälen. Dies Bestätigte mir auch Rinck. Da es oft nicht erforderlich ist einen Durchlauf < 2s zu machen, habe ich die Variante von Paul etwas abgeändert.
Das Programm wurde nun als FB realisiert.
Die Einschwingzeit kann nun von aussen als n Zyklen vorgegeben werden.
Zur Info wird an CV der aktive Kanal des Multiplexers ausgegeben.
Wie das Original, ist der FB für einen Multiplexer. Zur Kaskadierung muss der Code entsprechend abgeändert werden.
Der Code ist verwendbar unter Codesys 2.3 / 3.5 und wurde auf XV100 getestet.
FUNCTION_BLOCK Read_Mux16
(*
##################################################################################
Programmbeschreibung:
Rinck Multiplexer Mux-U-16 steuern und auslesen
Sensorwert über einstellbare Zyklenzahl einschwingen lassen, einlesen
und in einem Array ablegen
Die Einschwingzeit kann zwischen 3-1000 Zyklen eingestellt werden
##################################################################################
Änderungsindex
Name:Paul Knodel Version:0.1 Datum:12/2006 Grund: neu
Name:TL Version:0.2 Datum:03.12.16 Grund:
-leicht änderbare Einschwingzeit und Ausgabe Kanalnummer
##################################################################################
*)
VAR_INPUT
IN : INT; (* Analogeingang *)
ESZ: INT :=5; (* Einschwingzeit in Zyklen *)
END_VAR
VAR_OUTPUT
Analogwerte: ARRAY [0..15] OF INT;
Q1:BOOL; (* Muxkanal 2^0 *)
Q2:BOOL; (* Muxkanal 2^1 *)
Q3:BOOL; (* Muxkanal 2^2 *)
Q4:BOOL; (* Muxkanal 2^3 *)
CV:INT; (* Aktiver Mux-Kanal *)
END_VAR
VAR
Zyklus: INT; (*Zyklenzähler*)
Adresse: BYTE:=0;(*Adressbyte für Array und Muxkanal*)
EZP: INT; (*Einlesezeitpunkt*)
END_VAR
(*Einlesen eines Analogmultiplexers der Firma Rinck Elektronik*)
EZP:= LIMIT (3, ESZ, 1000); (*Einlesezeitpunkt bestimmen und begrenzen*)
(*Zykluszähler*)
Zyklus:=Zyklus+1;
IF Zyklus = 1 THEN
(*Adressleitungen Mux ansteuern*)
Q1:=Adresse.0;
Q2:=Adresse.1;
Q3:=Adresse.2;
Q4:=Adresse.3;
CV:= Adresse +1;
ELSIF Zyklus = EZP THEN
Analogwerte[Adresse]:=IN; (*Analogeingang in Array schreiben*)
ELSIF Zyklus >= (EZP + 1) THEN
(*nach einlesen: Adressen nachführen, Zykluszähler löschen*)
Adresse:=Adresse+1;
IF Adresse >=16 THEN Adresse:=0; END_IF;
Zyklus:=0;
ELSE ;
END_IF
Wer möchte kann sich passend zum FB auch noch eine Struktur erstellen zB:
TYPE STR_Mux16 :
STRUCT
Analogwerte: ARRAY [0..15] OF INT; //Wertespeicher
CV:INT; //Aktiver Mux-Kanal
END_STRUCT
END_TYPE
Gruß Thomas
Hinweis: Wenn die Messwerte auf Fehler überwacht werden, darf dies erst nach einem vollen Durchlauf aktiv werden, oder man initialisiert das Array mit neutralen Werten die keine Fehlermeldung auslösen.