TIA S7-1500 ein bisschen Peek Poke gespiele

vollmi

Level-3
Beiträge
5.425
Reaktionspunkte
1.403
Zuviel Werbung?
-> 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)
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.
 
Wie nutzt du dann das?Die PEW musst du doch eh in die Symbolik bringen und die PEW an die AIN-Bausteine klemmen und am Ausgang auf ein Datenword schreiben.

  • :smile:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nein die ID wird als Integer angegeben. dass ist dann einfach das erste eingangswort des bereichs. Die länge des Bereichs kommt dann von der Struktur die am Record angehängt wird.

Meine Eingänge bekommen also überhaupt keine Symbolik, ausgenommen ein paar wenige einzelne welche keinem Objekt zugeordnet werden.

mfG René
 
Interessant.Das habe ich so auch noch nie gesehen.Bei verfahrenstechnischen Anlagen geht das wohl eher nicht.Weil ja alles Tag-Nummern orintiert ist.
 
Geht das auch in S7 classic so?Einen Anwendungsfall suche ich noch.Aber den Programmcode grabsche ich mir auf jeden Fall.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Step7 bzw bei S7-300/400 geht das eben nicht so. Da kannst du den ersten Code nehmen. oder mit Blockmove arbeiten. Ich habe Blockmove nicht genommen weil ich bei der klassischen oft außerhalb des Prozessabbildes Peripherie gehabt habe. (vor allem bei den älteren 300ern war der arg begrenzt)

Da blieb für mich also nur die For Schleife mit Wortweisem zugriff aus die Peripherie.

mfG René
 
Zurück
Oben