FUNCTION FC 103 : VOID
TITLE =
//Diese Funktion steuert in abhängigkeit der Nummer (Nr),
//ein Bit im Any-Pointer (Bitfeld).
//Der Zustand der aktuellen Bit-Nummer wird im Status (Status)
//angezeigt.
//- Zulässige Parameter für den Any-Pointer sind:
// BIT, BYTE, WORD u. DWORD
//- Folgende Fehler (Fehler) werden ausgewertet:
// Parametrierung, Nr größer Bitanzahl u. Nr kleiner 0
// Fehler wird im BIE-Bit signalisiert.
// Parametrierung Fehlerfrei BIE = TRUE
// " " " Fehler BIE = FALSE
AUTHOR : dalbi
FAMILY : SIGNAL
NAME : NRBIT
VERSION : 1.1
VAR_IN_OUT
NR : INT ; //Nummer
ZEIGER : ANY ; //Zeiger Bitfeld
END_VAR
VAR_TEMP
tLaenge : INT ; //Länge in Bits
tZaehler : INT ; //Schleifenzähler
tDBNr : WORD ; //Datenbausteinnummer
tTyp : BYTE ; //Datentyp
SaveAR1 : DINT ; //Speicher Adressregister 1
SaveAR2 : DINT ; //Speicher Adressregister 2
END_VAR
BEGIN
NETWORK
TITLE =Adressregister sichern
TAR1 #SaveAR1;
TAR2 #SaveAR2;
NETWORK
TITLE =Any-Pointer zerlegen
L P##ZEIGER; // AR1 auf ANY
LAR1 ;
L W [AR1,P#4.0]; // DB-Nummer
T #tDBNr;
L W [AR1,P#2.0]; // Wiederholfaktor für Typ
T #tLaenge;
L B [AR1,P#1.0]; // Datentyp
L B#16#1; // BIT
==I ;
L 0;
SPB set1;
L B [AR1,P#1.0]; // Datentyp
L B#16#2; // BYTE
==I ;
L 1;
SPB set1;
L B [AR1,P#1.0]; // Datentyp
L B#16#4; // WORD
==I ;
L 2;
SPB set1;
L B [AR1,P#1.0]; // Datentyp
L B#16#6; // DWORD
==I ;
L 3;
SPB set1;
BEA ; // Bausteinende wenn Typ nicht past
set1: T #tTyp;
NETWORK
TITLE =Bitbereich löschen
L D [AR1,P#6.0]; // AR1 auf Anfangsadresse
LAR1 ;
AUF DB [#tDBNr]; // DB aufschlagen
L #tLaenge;
next: T #tZaehler;
L #tTyp;
SPL nix;
SPA BIT; // Sprung bei 0
SPA BYTE; // Sprung bei 1
SPA WORD; // Sprung bei 2
SPA DW; // Sprung bei 3
nix: L 0;
T #tTyp;
BEA ;
BIT: SET ;
R [AR1,P#0.0];
+AR1 P#0.1; // Weiter auf nächstes Bit
SPA cr;
BYTE: L B#16#0;
T B [AR1,P#0.0];
+AR1 P#1.0; // Weiter auf nächstes Byte
SPA cr;
WORD: L 0;
T W [AR1,P#0.0];
+AR1 P#2.0; // Weiter auf nächstes Word
SPA cr;
DW: L L#0;
T D [AR1,P#0.0];
+AR1 P#4.0; // Weiter auf nächstes DW
cr: L #tZaehler;
LOOP next;
LAR1 #SaveAR1; // Adressregister 1 rückschreiben
LAR2 #SaveAR2; // Adressregister 2 rückschreiben
NETWORK
TITLE =Any-Pointer zerlegen
L P##ZEIGER; // AR1 auf Bitfeld
LAR1 ;
L B [AR1,P#1.0]; // Datentyp
L B#16#1; // BIT
==I ;
SPB bit;
TAK ;
L B#16#2; // BYTE
==I ;
SPB byte;
TAK ;
L B#16#4; // WORD
==I ;
SPB word;
TAK ;
L B#16#6; // DWORD
==I ;
SPB dw;
SPA err; // Fehler, wenn kein Typ
bit: L 1; // BIT
SPA set;
byte: L 8; // BYTE
SPA set;
word: L 16; // WORD
SPA set;
dw: L 32; // DWORD
set: L W [AR1,P#2.0]; // Wiederholfaktor für Typ
*I ;
T #tLaenge; // Länge in Bit
L #NR;
L 1;
>=I ;
SPB m031;
T #NR;
m031: L #NR;
L #tLaenge; // Wiederholfaktor für Typ
<=I ;
SPB m032;
T #NR;
m032: NOP 0;
L W [AR1,P#4.0]; // DB-Nummer
T #tDBNr;
AUF DB [#tDBNr]; // DB aufschlagen
L #NR;
L P#0.1;
*D ;
L P#0.1;
-D ;
L D [AR1,P#6.0]; // AR1 auf Anfangsadresse
+D ;
LAR1 ;
NETWORK
TITLE =Logik
SET ;
= [AR1,P#0.0]; // steuern
NETWORK
TITLE =Auswertung BIE-Bit
SET ; // IO
SPA io; // BIE-Bit auf 1 setzen
err: SET ; // Bei Fehler
CLR ; // BIE-Bit auf 0 setzen
io: SAVE ; // BIE-Bit sichern
LAR1 #SaveAR1; // Adressregister 1 rückschreiben
LAR2 #SaveAR2; // Adressregister 2 rückschreiben
END_FUNCTION