Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: SCL symbolische und absolute Adressierung mischen

  1. #1
    Registriert seit
    24.03.2010
    Beiträge
    44
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Frage


    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!
    Geändert von onikos (18.07.2012 um 10:57 Uhr)
    Zitieren Zitieren SCL symbolische und absolute Adressierung mischen  

  2. #2
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.492
    Danke
    1.142
    Erhielt 1.243 Danke für 974 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    11.12.2009
    Beiträge
    2.115
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Code:
    ZIEL:=QUELLE;
    Das erstellt selbst einen BLK_MOV

    Grüße

    Marcel

  4. #4
    onikos ist offline Benutzer
    Themenstarter
    Registriert seit
    24.03.2010
    Beiträge
    44
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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?

  5. #5
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.492
    Danke
    1.142
    Erhielt 1.243 Danke für 974 Beiträge

    Standard

    Zitat Zitat von onikos Beitrag anzeigen
    denn wie kann ich die Pointer mit einer Laufvariable versehen, damit der entsprechende Pointer auf seinen zugehörigen DB zeigt?
    In dem du der Variablen vQuelldaten.iDBNr die entsprechende DB-Nummer zuweist.

    Gruß
    Dieter

  6. #6
    onikos ist offline Benutzer
    Themenstarter
    Registriert seit
    24.03.2010
    Beiträge
    44
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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..
    Geändert von onikos (18.07.2012 um 12:55 Uhr)

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    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

  8. #8
    onikos ist offline Benutzer
    Themenstarter
    Registriert seit
    24.03.2010
    Beiträge
    44
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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?
    Geändert von onikos (18.07.2012 um 13:26 Uhr)

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    ??? ...
    Ich denke, das hatte ich beschrieben (allerdings nicht getestet). Was war dir an der Beschreibung unklar ?

  10. #10
    onikos ist offline Benutzer
    Themenstarter
    Registriert seit
    24.03.2010
    Beiträge
    44
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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 :=   ??? ;
      
      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 :=   ??? ;
                                
      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

Ähnliche Themen

  1. Absolute Adressierung in SCL
    Von ASi-Master im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 01.10.2015, 09:21
  2. Indir. symbolische Adressierung
    Von Beckx-net im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 17.09.2010, 12:49
  3. Symbolische indirekte Adressierung
    Von Isha im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 18.06.2010, 13:10
  4. symbolische Adressierung in AWL
    Von wiede im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 09.02.2008, 15:36
  5. Antworten: 1
    Letzter Beitrag: 10.09.2005, 11:15

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •