[FONT=Courier New]FUNCTION_BLOCK DMX_Treppe
CONST
Stufen:= 26; // Anzahl Stufen
Neben := 3; // benachbarte Stufen
Rampe := 10; // Zyklen, um Istwert zu dekrementieren
END_CONST
VAR_INPUT
Stufe : ARRAY [1..Stufen] OF BOOL; // Belegungserkennung Stufe
END_VAR
VAR_IN_OUT
DMX_Soll : ARRAY [1..Stufen] OF BYTE; // Sollvorgabe für DMX
DMX_Ist : ARRAY [1..Stufen] OF BYTE; // Byte-Ausgabe für DMX
END_VAR
VAR
DMX_Rampe : ARRAY [1..Stufen] OF INT; // Zähler für Ausdimmen
END_VAR
VAR_TEMP
Dimm : ARRAY [0..Neben] OF BYTE; // Dimmstufen
i : INT; // Index-Variable benachbarte Stufen
z : INT; // Index-Variable Stufen
END_VAR
// Dimmstufen festlegen
Dimm[0]:= 255; // Dimmstufe 0 = 100% = 255
Dimm[1]:= 179; // Dimmstufe 1 = 70% = 179
Dimm[2]:= 102; // Dimmstufe 2 = 40% = 102
Dimm[3]:= 25; // Dimmstufe 3 = 10% = 25
// Treppenstufen abfragen und DMX-Sollwerte zuweisen
FOR z:= 1 TO Stufen BY 1 DO // Schleife über alle Stufen
DMX_Soll[z]:= 0; // DMX-Wert für Stufe zurücksetzen
FOR i:= 0 TO Neben BY 1 DO // Schleife über benachbarte Stufen
IF Stufe[ SEL(G:= z + i > Stufen, IN0:= z + i, IN1:= z) ] OR // Wenn Stufe i höher (wenn existent, sonst eigene) oder
Stufe[ SEL(G:= z - i < 1, IN0:= z - i, IN1:= z) ] // Stufe i tiefer (wenn existent, sonst eigene) belegt
THEN // Befehle bei belegter Stufe:
DMX_Soll[z]:= Dimm[i]; // DMX-Byte entspechend Abstand zu belegter Stufe zuweisen
EXIT; // Schleife über benachbarte Stufen vorzeitig verlassen
END_IF; // Ende Befehle bei belegter Stufe
END_FOR; // Ende Schleife über benachbarte Stufen
END_FOR; // Ende Schleife über alle Stufen
// Istwert-Anpassung
FOR z:= 1 TO Stufen BY 1 DO // Schleife über alle Stufen
IF BYTE_TO_INT( DMX_Soll[z] ) < BYTE_TO_INT( DMX_Ist[z] ) // Vergleich Soll- und Istwert
THEN // Befehle bei kleiner:
DMX_Rampe[z]:= DMX_Rampe[z] + 1; // Rampe inkrementieren
CASE DMX_Rampe[z] OF // Prüfung Rampenwert:
1: DMX_Ist[z]:= INT_TO_BYTE( BYTE_TO_INT( DMX_Ist[z] ) - 1 ); // = 1: [/FONT]Istwert dekrementieren[FONT=Courier New]
Rampe: DMX_Rampe[z]:= 0; // = Ende: Rampe rücksetzen
END_CASE; // Ende Prüfung Rampenwert
ELSE // Befehle sonst:
DMX_Ist[z]:= DMX_Soll[z]; // Istwert direkt vom Sollwert übernehmen
DMX_Rampe[z]:= 0; // Rampe rücksetzen
END_IF; // Ende Vergleich
END_FOR; // Ende Schleife über alle Stufen
END_FUNCTION_BLOCK[/FONT]