wellenbrecher
Level-1
- Beiträge
- 25
- Reaktionspunkte
- 2
-> Hier kostenlos registrieren
Hallo,
ich habe heute einen Baustein geschrieben, der ein Bit in einem variablen Speicherbereich "laufen" lässt. Dabei habe ich einiges über Any-Pointer, indirekte Adressierung usw. gelernt.
Meine prinzipielle Vorgangsweise:
1. Anypointer auswerten (Adresse, evtl. DB, Speicherbereich)
2. Anhand Speicherbereich jeweils die Laufbit-Routine durchlaufen
3. Routine: Gesetztes Bit suchen, dann zurück setzen und nächstes Bit setzen. Bis Bereichsende, dann evtl. wieder erstes Bit setzen.
Nun meine Frage: Geht das auch einfacher?
- Muss ich z.B. für jeden Speicherbereich die Routine extra aufrufen?
ich habe heute einen Baustein geschrieben, der ein Bit in einem variablen Speicherbereich "laufen" lässt. Dabei habe ich einiges über Any-Pointer, indirekte Adressierung usw. gelernt.
Meine prinzipielle Vorgangsweise:
1. Anypointer auswerten (Adresse, evtl. DB, Speicherbereich)
2. Anhand Speicherbereich jeweils die Laufbit-Routine durchlaufen
3. Routine: Gesetztes Bit suchen, dann zurück setzen und nächstes Bit setzen. Bis Bereichsende, dann evtl. wieder erstes Bit setzen.
Nun meine Frage: Geht das auch einfacher?
- Muss ich z.B. für jeden Speicherbereich die Routine extra aufrufen?
Code:
FUNCTION FC 997 : VOID
TITLE =Laufbit
VERSION : 0.1
VAR_INPUT
Takt : BOOL ; //Takt für Geschwindigkeit Laufbit
Adr : ANY ; //Startadresse (M, A, DB)
AnzBit : INT ; //Anzahl der Bits
Wdh : BOOL ; //Am Ende von Vorn beginnen (1: Ja/ 0: Nein)
END_VAR
VAR_TEMP
Schleife : INT ;
SpBer : INT ; //Speicherbereich
DBNr : INT ;
StAdr : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =Ausführung, nur wenn Takt
U #Takt;
SPBN Ende;
NETWORK
TITLE =Anypointer Auswerten
//-------------------------------------------------------------------------------
L P##Adr; // Startadresse in Adressregister laden
LAR1 ;
L B [AR1,P#1.0]; // Datentyp
L W [AR1,P#4.0]; // DB-Nummer
T #DBNr;
L B [AR1,P#6.0]; // Speicherbereich
T #SpBer;
L D [AR1,P#6.0]; // Adresse auslesen
L DW#16#7FFFF; // Maske für Bytadresse + Bitadresse
UD ;
T #StAdr;
LAR1 ;
//-------------------------------------------------------------------------------
// Speicherbereich auswerten
L W#16#83; // Merker
L #SpBer;
==I ;
SPB SpM;
L W#16#84; // Datenbaustein
==I ;
SPB SpDB;
TAK ;
L W#16#82; // Ausgänge
==I ;
SPB SpA;
SPA Ende;
//-------------------------------------------------------------------------------
NETWORK
TITLE =Speicherbereich Merker
//-------------------------------------------------------------------------------
SpM: L #AnzBit;
LoM: T #Schleife; // Gesetztes Bit im Bereich suchen
U M [AR1,P#0.0]; // Wenn gefunden aus Schleife springen
SPB GefM;
+AR1 P#0.1;
L #Schleife;
LOOP LoM;
//-------------------------------------------------------------------------------
SPA Ende; // Wenn nichts gefunden: Ende
//-------------------------------------------------------------------------------
GefM: R M [AR1,P#0.0]; // Gesetztes Bit zurück setzen
L #Schleife; // Überprüfen, ob letztes Bit im Bereich
L 1;
==I ;
SPB WdhM;
S M [AR1,P#0.1]; // Nächstes Bit setzen
SPA Ende;
//--------------------------------------------------------------------------
WdhM: U #Wdh;
SPBN Ende;
L #StAdr; // Startadresse in Adressregister laden
LAR1 ;
S M [AR1,P#0.0]; // Erstes Bit setzen
//-------------------------------------------------------------------------------
NETWORK
TITLE =Speicherbereich Datenbaustein
//-------------------------------------------------------------------------------
SpDB: AUF DB [#DBNr];
L #AnzBit;
LoDB: T #Schleife; // Gesetztes Bit im Bereich suchen
U DBX [AR1,P#0.0]; // Wenn gefunden aus Schleife springen
SPB GefD;
+AR1 P#0.1;
L #Schleife;
LOOP LoDB;
//-------------------------------------------------------------------------------
SPA Ende; // Wenn nichts gefunden: Ende
//-------------------------------------------------------------------------------
GefD: R DBX [AR1,P#0.0]; // Gesetztes Bit zurück setzen
L #Schleife; // Überprüfen, ob letztes Bit im Bereich
L 1;
==I ;
SPB WdhD;
S DBX [AR1,P#0.1]; // Nächstes Bit setzen
SPA Ende;
//--------------------------------------------------------------------------
WdhD: U #Wdh;
SPBN Ende;
L #StAdr; // Startadresse in Adressregister laden
LAR1 ;
S M [AR1,P#0.0]; // Erstes Bit setzen
//-------------------------------------------------------------------------------
NETWORK
TITLE =Speicherbereich Ausgänge
//-------------------------------------------------------------------------------
SpA: L #AnzBit;
LoA: T #Schleife; // Gesetztes Bit im Bereich suchen
U A [AR1,P#0.0]; // Wenn gefunden aus Schleife springen
SPB GefA;
+AR1 P#0.1;
L #Schleife;
LOOP LoA;
//-------------------------------------------------------------------------------
SPA Ende; // Wenn nichts gefunden: Ende
//-------------------------------------------------------------------------------
GefA: R A [AR1,P#0.0]; // Gesetztes Bit zurück setzen
L #Schleife; // Überprüfen, ob letztes Bit im Bereich
L 1;
==I ;
SPB WdhA;
S A [AR1,P#0.1]; // Nächstes Bit setzen
SPA Ende;
//--------------------------------------------------------------------------
WdhA: U #Wdh;
SPBN Ende;
L #StAdr; // Startadresse in Adressregister laden
LAR1 ;
S A [AR1,P#0.0]; // Erstes Bit setzen
//-------------------------------------------------------------------------------
NETWORK
TITLE =Register wiederherstellen
Ende: NOP 0;
END_FUNCTION