- Beiträge
- 5.425
- Reaktionspunkte
- 1.403
-> Hier kostenlos registrieren
Ich hab da mal ein bisschen mit Peek Poke gespielt.
Ich ordne in meiner Hardware die Objekte normalerweise immer genau gleich an so dass immer den ersten Eingang nehmen kann und die fortfolgenden dann immer auch zum Objekt gehören und somit indirekt adressiert werden können.
Dazu habe ich die Peripherie immer in einen UDT eines DBs kopiert. Um mit dem UDT dann weiterarbeiten zu können.
Das habe ich früher mit einer For Schleife gemacht (BLKMOV konnte ja keine Peripherie nur Prozess)
Jetzt bei der 1500er bietet sich da Peek/Poke noch besser an.
Poke läuft natürlich genau andersrum.
Vielleicht kanns ja jemand brauchen.
Ich ordne in meiner Hardware die Objekte normalerweise immer genau gleich an so dass immer den ersten Eingang nehmen kann und die fortfolgenden dann immer auch zum Objekt gehören und somit indirekt adressiert werden können.
Dazu habe ich die Peripherie immer in einen UDT eines DBs kopiert. Um mit dem UDT dann weiterarbeiten zu können.
Das habe ich früher mit einer For Schleife gemacht (BLKMOV konnte ja keine Peripherie nur Prozess)
Code:
FUNCTION PERIN : VOID
TITLE = 'Kopiere Peripherie in DB'
//
// Der Baustein nimmt die Erste Adresse eines PERIPHERIEWORTES und kopiert dieses und alle folgenden
// der Reihe nach auf den Zielbereich der an RECORD angehängt ist. Die Menge wird vom Pointer an RECORD festgelegt
// Die Hardwareadressen müssen alle aneinanderliegen.
VERSION : '1.0'
AUTHOR : VoR
NAME : name
FAMILY : family
VAR_INPUT
PER_IN : INT; // erste Pripherieadresse länge wird durch Anypointer an RECORD bestimmt
END_VAR
VAR_IN_OUT
RECORD : ANY;
END_VAR
VAR_TEMP
laufvariable : INT;
zwischenany : ANY;
Recording AT zwischenany : STRUCT
SyntaxID : BYTE;
Datentyp : BYTE;
Laenge : INT;
db_Nummer : WORD;
BytePointer : DWORD;
END_STRUCT;
END_VAR
zwischenany := RECORD;
FOR laufvariable := 0 TO (Recording.Laenge - 1) BY 1 DO
WORD_TO_BLOCK_DB(Recording.db_Nummer).DB[(DWORD_TO_INT(SHR(IN := SHL(IN := Recording.BytePointer, N := 8), N := 11)) + laufvariable)]
:= EB[(PER_IN + laufvariable)];
END_FOR;
END_FUNCTION
Jetzt bei der 1500er bietet sich da Peek/Poke noch besser an.
Code:
FUNCTION "PERIN" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
PER_IN : Int;
END_VAR
VAR_IN_OUT
Record : Any;
END_VAR
VAR_TEMP
zwischenany : Any;
Recording AT zwischenany : "ANY_POINTER";
END_VAR
BEGIN
#zwischenany := #Record;
POKE_BLK(area_src:=16#81, // von Peripherie lesen
dbNumber_src:=0,
byteOffset_src:=#PER_IN,
area_dest:=16#84,
dbNumber_dest:=#Recording.DB_Nr, // nach DB in Anypointer schreiben
byteOffset_dest:=DWORD_TO_DINT(SHR(IN := SHL(IN := #Recording.Startadresse, N := 8), N := 11)), // Startadresse berechnen
count:=#Recording.Anzahl_Werte); // Anzahl Werte aus Pointer holen.
END_FUNCTION
Poke läuft natürlich genau andersrum.
Vielleicht kanns ja jemand brauchen.