FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
Startpos_DB : BLOCK_DB ;
Startpos_Pos : INT ;
Zielpos_DB : BLOCK_DB ;
Zielpos_Pos : INT ;
Laenge : INT ;
Start : BOOL ;
END_VAR
VAR_TEMP
Hilfsdoppel : DINT ;
Hilfsdoppel_2 : DINT ;
Speicherzelle : BYTE ;
Speicherzelle_2 : BYTE ;
Durchlaeufe : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
//----------Startbedingung
U #Start;
SPBN ende;
L #Startpos_Pos; //Lade die Byteadresse der Startposition
T #Hilfsdoppel; //Zwischenspeichern
L #Zielpos_Pos; //Lade die Byteadresse der Zielposition
T #Hilfsdoppel_2; //Zwischenspeichern
L 0; //Lade 0
T #Durchlaeufe; //nullen der Durchläufe
// -----------Schleife lesen der Werte
loop: AUF #Startpos_DB; //Öffnen des Start DB´s
L #Hilfsdoppel; //Lade Zwischenspeicher Startpos
SLD 3; //schiebe links Pointerformat
LAR1 ; //in Adressregister schieben
L DBB [AR1,P#0.0]; //Lade erstes Byte des Zwischenspeichers
L B#16#F; //maskieren der unteren 4 Bit
UW ; //verunden
L B#16#30; //für ASCI +48
+I ; //addition
T #Speicherzelle; //transfer in Speicherelle
L DBB [AR1,P#0.0]; //Lade Zwischenspeicher Startpos
SRW 4; //schiebe rechts für die linken 4 Bit
L B#16#F; //maskieren
UW ; //verunden
L B#16#30; //für ASCI +48
+I ; //addition
T #Speicherzelle_2; //transfer in Speicherelle_2
//------------schreiben auf Zielbereich
AUF #Zielpos_DB; //Öffnen des Start DB´s
L #Hilfsdoppel_2; //Lade Zwischenspeicher Zielpos
SLD 3; //schiebe links Pointerformat
LAR1 ; //in Adressregister schieben
L #Speicherzelle; //Laden der ersten Speicherzelle
T DBB [AR1,P#0.0]; //Transfer nach Zielpos erstes Byte
L #Speicherzelle_2; //Laden der zweiten Speicherzelle
T DBB [AR1,P#1.0]; //Transfer nach Zielpos zweites Byte
//-------Offset für Schleife einrichten
L #Hilfsdoppel; //Lade Hilfsdoppelwort für Offset
L 1; //Lade 1 zum erhöhen des Offsets Byte
+D ; //addition
T #Hilfsdoppel; //Transfer nach Hilfsdoppelwort für Offset
L #Hilfsdoppel_2; //Lade Hilfsdoppelwort für Offset
L 2; //Lade 2 Byte für Wortoperation
+D ; //addition
T #Hilfsdoppel_2; //Transfer nach Hilfsdoppelwort für Offset
//incrementieren des Schleifenzählers
L #Durchlaeufe; //Lade Anzahl der bisherigen Durchläufe
L 1; //Lade 1
+I ; //addition
T #Durchlaeufe; //Transfer nach bisherige Durchläufe
//------ prüfen der Anzahl Durchläufe für Abbruchbedingung
L #Laenge; //Lade Bausteinlänge
L #Durchlaeufe; //Lade bisherige Durchläufe
>=I ; //vergleich auf größer gleich
SPB loop; //Sprunbedingung für Schleifendurchlauf
//----nullen der Speicher nach Schleifendurchlauf
L 0; //laden Wert null
T #Speicherzelle; //nullen der Speicherzelle
T #Speicherzelle_2; //nullen der Speicherzelle
ende: NOP 0;
END_FUNCTION