Suche DeMux Funktion

Begonnen von rrbd, 14. August 2012, 18:16:40

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

rrbd


Hallo,
ich habe zwar lange Erfahrung in der SPS-Programmierung, bin aber neu im Thema IEC61131. Nun suche ich für die Übertragung für mich gewohnter Programmstruturen einen DeMultiplexer, der in etwa folgendes leistet
     +-----+
Act -       - Q0
Sel -       - Q1
     +       - Q2
     +       - Q3
     +       - Q4
     +       - Q5
     +       - Q6
     +-----+

Act: Flag/Bit - Voraussetzung für Ausgangssignale Q
Sel: Integer - Wählt einen Ausgang: es soll jeweils der durch den Zahlenwert von Sel repräsentierte Ausgang auf 1 gesetzt werden:
      Sel = 0  -> Q0 gesetzt
      Sel = 4  -> Q4 gesetzt
Q: Flags (Ausgangs-Bits)
Ich finde so etwas weder in der Beschreibung der vorhandenen Funktionen bei PC WORX noch in OSCAT_Basic_333

Überseh' ich da etwas oder muss ich mir den Baustein selbst basteln?

Danke schon mal vorab für Hilfe,

Grüße

Rainer

peewit

hallo

schau dir den baustein "SELECT_8" an, der kann das was du möchtest und sogar noch ein paar andere sachen
wenn der für dich nicht passt, kannst du ihn ja einfach adaptieren

FUNCTION_BLOCK SELECT_8
VAR_INPUT
E : BOOL;
SET : BOOL;
IN : BYTE;
UP : BOOL;
DN : BOOL;
RST : BOOL;
END_VAR
VAR_OUTPUT
Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7 : BOOL;
STATE : INT;
END_VAR
VAR
last_up: BOOL;
last_dn : BOOL;
END_VAR

(*
version 1.1 27. feb. 2009
programmer hugo
tested BY oscat

select_8 selects one of 8 outputs at any time. the outputscan be selected by up or down keys and an independent anable switches all outouts off if set false


*)
IF rst THEN
state := 0;
ELSIF set THEN
state := IN;
ELSIF up AND NOT last_up THEN
state := inc(state,1,7);
ELSIF dn AND NOT last_dn THEN
state := inc(state,-1,7);
END_IF;
last_UP := UP;
last_DN := DN;

Q0 := FALSE;
Q1 := FALSE;
Q2 := FALSE;
Q3 := FALSE;
Q4 := FALSE;
Q5 := FALSE;
Q6 := FALSE;
Q7 := FALSE;

IF E THEN
CASE state OF
0: Q0 := TRUE;
1: Q1 := TRUE;
2: Q2 := TRUE;
3: Q3 := TRUE;
4: Q4 := TRUE;
5: Q5 := TRUE;
6: Q6 := TRUE;
7: Q7 := TRUE;
END_CASE;
END_IF;

(* revision history
hm 16. jan 2008 rev 1.0
original version

hm 27. feb. 2009 rev 1.1
renamed input en to e
*)

rrbd

Ah, hervorragend!  Der Baustein ist so vielseitig, dass ich die benötigte "Basisfunktion" beim Querlesen glatt übersehen habe. Für mein ursprüngliches Anliegen hatte ich übrigens zunächst auf BYTE_TO_BITS zurückgegriffen, in der Webvisualisierung war es mir für die meisten Anwendungen egal, ob ich Meine 4 Tasten für Variable setzen auf 0-1-2-3 oder auf 0-1-2-4 benutze. Aber aus Kompatibilitätsgründen werde ich wohl doch die SELECT_8 Lösung bevorzugen.

Vielen Dank

Rainer