SCL symbolische und absolute Adressierung mischen

onikos

Level-1
Beiträge
44
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich finde keine Lösung im Internet zu folgendem:

Ich habe einen DB der hat ein UDT_SEND_TEL und ein UDT_RECEIVE_TEL. SEND_TEL und RECEIVE_TEL sind 78 Byte lang.

Diesen Baustein mit gleichem Aufbau habe ich 8 mal.

Ich möchte über eine FOR-Schleife alle DBs abarbeiten/ umkopieren.

Ich programmiere symbolisch, arbeite jetzt jedoch mit dem Befehl Block_DB also gezwungenermaßen absolut.

Symbolisch wäre es
retval := BLKMOV ( SRCBLK := DBNR1.send_tel, DSTBLK := DBNR1.receive_tel );

Absolut müsste es ja in der Art sein:
retval := BLKMOV ( SRCBLK := Block_DB. ???, DSTBLK := Block_DB. ??? );

Etwas wie DBW 78 nur als Struct?

Danke fürs lesen!
 
Zuletzt bearbeitet:
Ich löse solche Dinge mit Any-Pointern
Hier mal 2 Code-Schnipsel

Code:
VAR_TEMP
    // temporäre Variablen
    i               : INT;  // Scheifenzähler 
    iRetVal         : INT;  // Rückgabewert von Funktionen, SFC, ...
    bDummy          : BOOL; // Dummy-Variable 
    wDBLaenge       : WORD; // Datenbaustein-Länge
    anyQuellDaten   : ANY;  // Any-Pointer Quelldaten
    vQuellDaten AT anyQuellDaten : STRUCT //Sicht auf Anypointer-Quelldaten
        byID  : BYTE;
        byTyp : BYTE;
        iAnz  : INT;
        iDBNr : INT;
        dwPTR : DWORD;
        END_STRUCT;
END_VAR

Code:
    // Any-Pointer für Blockmove zusammenbauen
    vQuelldaten.byID  := 16#10;
    vQuelldaten.byTyp := 16#02;
    vQuelldaten.iAnz  := WORD_TO_INT(wDBLaenge);
    vQuelldaten.iDBNr := "K1_TV".Akt_TypDBNr;
    vQuelldaten.dwPtr := 16#84000000; // Zeiger auf DBX0.0
    // Typdaten aus aktuellem Typdaten-DB nach DB "TD" kopieren
    iRetVal:= BLKMOV(
        SRCBLK := anyQuelldaten,
        DSTBLK := "TD");

Gruß
Dieter
 
Die Lösung mit den Anypointern kann ich jedoch schlecht in eine FOR Schleife einbauen, denn wie kann ich die Pointer mit einer Laufvariable versehen, damit der entsprechende Pointer auf seinen zugehörigen DB zeigt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja ok .. ich denke das ist der richtige Weg.
Dann scheitere ich wohl an der Syntax.

Also DB201 - DB208 sind vorhanden und enthalten SEND_TEL von UDT10 und RECEIVED_TEL von UDT10.
Gleiche Struktur aber unterschiedliche Werte.
Der DB300 enthält ein ARRAY OF STRUCT vom TYP UDT10. Dort soll hinein kopiert werden.

Code:
VAR_INPUT
BLOCK_DB:   BLOCK_DB;
END_VAR

VAR
DB_NR_PLUS: INT;
NR: INT;
RETVAL: ARRAY[1..8] OF INT;
VAR_END

FOR NR := 1 TO 8 DO

DB_NR_PLUS := 200 + NR;
BLOCK_DB := WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NR_PLUS)

retval[NR] := BLKMOV (SRCBLK := Block_DB.SEND ,DSTBLK := DB300.SEND[NR]);
                    
END_FOR


-> Das ist die Ausgangssituation. Jetzt muss ich einen Pointer einbauen. Aber ich weiß nicht wie..
 
Zuletzt bearbeitet:
Hallo,
das , was du da vorhast ergibt unterm Strich auf jeden Fall etwas unsauberes.
Du deklarierst einen ANY-Pointer als Variable unter SCL.
Dieser Variablen weist du, wie von Marcel beschreiben, deinen ersten UDT zu :
Code:
myAny := DBNR1.send_tel ;
Nun bildest du, wie im Beitrag von Blockmove beschrieben, auf diese Variable eine AT-Sicht, ersetzt in der Sicht an der richtigen Stelle die DB-Nr. und fütterst damit den BLKMOV.
Unsauber ist es deshalb, weil die ganze Kette dann von der Gleichheit der Strukturen abhängt ...

Ach ja ... Code einfüger geht übrigens mittels des "#"-Button im Beitrags-Editor.

Gruß
Larry
 
Aber habe ich denn eine andere Möglichkeit?
Gibt es eine Lösung für dieses Problem indem ich den Bereich im DB direkt anspreche?

Danke für die Antworten

Also ohne FOR Schleife würde das doch die Lösung sein oder?

Code:
VAR_INPUT 
BLOCK_DB:   BLOCK_DB; 
END_VAR  

VAR
pQUELLE : ANY;
pZIEL: ANY;
DB_NR_PLUS: INT; 
NR: INT; 
RETVAL: ARRAY[1..8] OF INT; 
VAR_END 

BEGIN
pQUELLE := DBzweihundert1.SEND_TEL
pZIEL := DBdreihundert.NR1.SEND_TEL

retval[1] := BLKMOV (SRCBLK := pQUELLE ,DSTBLK := pZIEL);                      
END_FUNCTION_BLOCK


Aber wie kann ich denn jetzt eine Schleife einbauen, ohne die genannten DBs in der Struktur zu ändern?
 
Zuletzt bearbeitet:
Ja hast du auch. Soweit bin ich jetzt. Einziges Problem denke ich sind die Adressen.
Habe viel gesucht und viel gefunden, auch im Forum, aber schlauer bin ich nicht geworden.

Es geht um den BYTE_POINTER
Wie konvertiere ich Adresse: DB200.DBX1060.0 und DB201.DBX78.0?



Code:
FOR NR := 1 TO 8 BY 1 DO

IF data_received  THEN
  
 DB_NR_PLUS  := 200;                                          
 DB_NR_SRC := (INT_TO_WORD(DB_NR_PLUS));
 BYTE_NR :=   [COLOR=#ff0000][B]??? [/B][/COLOR];
  
  p_src.ANY_id:= 16#78;  //Pufferlänge - Vorbelegen der Ziel-ANY-Pointer Variablen
  p_src.Source_DataType:= 16#2;  //Code für Datentyp Byte
  p_src.Source_Lenght:= 16#4E;
  p_src.Source_DB_Nummer:= DB_NR_SRC;
  p_src.Source_Byte_Pointer:= BYTE_NR;
                               

 DB_NR_PLUS  := 210 + NR;                                          
 DB_NR_DESTIN := (INT_TO_WORD(DB_NR_PLUS));   
 BYTE_NR :=   [COLOR=#ff0000][B]??? [/B][/COLOR];
                            
  p_destin.ANY_id:= 16#78;  //Pufferlänge - Vorbelegen der Ziel-ANY-Pointer Variablen
  p_destin.Source_DataType:= 16#2;  //Code für Datentyp Byte
  p_destin.Source_Lenght:= 16#4E;
  p_destin.Source_DB_Nummer:= DB_NR_DESTIN;
  p_destin.Source_Byte_Pointer:= BYTE_NR;

  retval[SCS_NR] := BLKMOV (srcblk:= p_any_src, 
                            dstblk:= p_any_destin);
          
 ELSE; END_IF;
 END_FOR;



Weiterhin habe ich den unterschied zwischen p_src.ANY_id und p_src.Source_Lenght noch nicht ganz verstanden.

Danke und eine gute Nacht
 
Hallo,
also erstmal - der Aufbau des ANY-Pointer wird m.E. in der Step7-Hilfe ganz gut beschrieben. Das solltest du auf jeden Fall schon mal intus haben.
Dann ... du hattest eingangs erwähnt, dass alle deine Quell-DB's identisch aufgebaut sind. Das sieht aber in deinem letzten Beitrag nun doch nicht mehr so aus. Jedenfalls ... machbar ist das dann dennoch, ich würde aber bei unterschiedlichem DB-Aufbau, aus den schon genannten Gründen, das lassen.
SCL ist vom Ansatz für dieses Pointer-Gehopse nicht gedacht und gemacht. SCL ist dann gut und sinnvoll eingesetzt, wenn es das, mit dem es arbeiten soll auch wirklich (selber) kennt und auch selber damit arbeitet.

Vielleicht kannst du den echten Hintergrund und den Sinn des Unterfangens noch einmal erläutern ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort.
Der Sinn ist das ich von 8 Maschinen Daten in der gleichen Struktur bekomme.
Diese werden hintereinander in einem DB300 gespeichert. Von dort aus muss ich diese Daten in einzelne DBs 211-218 kopieren.
Ich könnte alles 8 mal hintereinader schreiben, jedoch ist die Aufgabe eine FOR-Schleife zu benutzen.
Da ich durch BLKMOV leider absolute Adressen angeben muss, wollte ich mit dem Pointer arbeiten.

Ist der Pointer denn falsch aufgebaut? Ich habe den Aufbau von der S7 Hilfe.
Nur komme ich mit dem BYTE nicht zurecht.

Wie schreibe ich für DB200.DBX1060.0 und DB201.DBX78.0 in diese Form um? :???:

B#16#84??????????

Liebe Grüße
 
Ich habe gelesen das die Bytezahl mit 8 multipliziert und dann ins Hexformat umgewandelt werden muss.

Also

DB200.DBX1060.0 = B#16#84002120

Aber das funktioniert auch nicht.

Ist generell an dem Pointer etwas falsch?
 
Zurück
Oben