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

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

Thema: Probleme mit Any-Pointer

  1. #1
    Registriert seit
    15.03.2016
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo. Ich habe folgendes Problem.
    Ich habe einen Any-Pointer:

    LAR1 P##mySourcePointer //zeiger ins adressregister laden
    L W#16#10 //SyntaxID. bei S7 immer 10
    T LB [AR1,P#0.0]
    L W#16#2 //Typ BYTE
    T LB [AR1,P#1.0]
    L 18 //Anzahl Bytes
    T LW [AR1,P#2.0]
    L 1 //Quell-DB
    T LW [AR1,P#4.0]
    L 0 //Anfang des Zieles
    SLD 3
    T LD [AR1,P#6.0]
    L B#16#84 //Speicherbereich (hier DB)
    T LB [AR1,P#6.0]


    Problem ist nun das ich den Quelle und den Anfang des Speicherbreiches nach der Variable richten soll. Sprich.. Ich gebe in dem FB eine Variable an und DB und Startadresse wird in jeweils eine Integervariable geschrieben.


    Vielen Dank im Vorraus
    Smazze
    Geändert von Smazze (17.03.2016 um 12:00 Uhr)
    Zitieren Zitieren Probleme mit Any-Pointer  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.177
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Meinst Du, daß Du die konstante DB-Nummer 1 und die konstante Adresse 0 durch Variablen ersetzen willst?
    Dann mach' das doch und schreibe statt den Konstanten die Variablen dahin.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Smazze ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.03.2016
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Wie mach ich das dann?

    LAR1 P##mySourcePointer //zeiger ins adressregister laden
    L W#16#10 //SyntaxID. bei S7 immer 10
    T LB [AR1,P#0.0]
    L W#16#2 //Typ BYTE
    T LB [AR1,P#1.0]
    L 18 //Anzahl Bytes
    T LW [AR1,P#2.0]
    L #Variable //Quell-DB
    T LW [AR1,P#4.0]
    L #Variable //Anfang des Zieles
    SLD 3
    T LD [AR1,P#6.0]
    L B#16#84 //Speicherbereich (hier DB)
    T LB [AR1,P#6.0]

    ..geht ja nicht. Dann würde er ja den Inhalt der Variablen nehen. Geht das dann mit P## ?? meine das hötte aber auch nicht funktioniert..
    Bzw. einmal müsst ich ja den DB haben und einmal die Adresse.
    Bräuchte ein Befehlen wie Inthilsvariable=DBof(Variable) und Inthilsvariable=adressof(Variable) wenn wir in C wären
    Geändert von Smazze (17.03.2016 um 12:42 Uhr)

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.177
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Wieso soll das nicht gehen? Wenn man eine Variable lädt dann lädt man den Inhalt der Variable, so wie auch in C. Was willst Du mit der Adresse der Variable anfangen???

    Ob Du uns vielleicht mal mitteilen kannst, wo/wie Du die DB-Nummer und die Anfangsadresse herbekommst?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    ... es geht natürlich NICHT mit derselben Variablen - du bräuchtest da schon wenigstens 2. Die könnten dann auch sinnvollerweise #Quell_DB und #Start_Adr heissen.
    Vielleicht sind das ja IN-Parameter deines Bausteins oder Variablen des Bausteins in dem du dich befindest ...

    Gruß
    Larry

  6. #6
    Smazze ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.03.2016
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Glaub wir verstehen uns da grade falsch.
    Klar wird es hinter so aussehen:

    LAR1 P##mySourcePointer //zeiger ins adressregister laden
    L W#16#10 //SyntaxID. bei S7 immer 10
    T LB [AR1,P#0.0]
    L W#16#2 //Typ BYTE
    T LB [AR1,P#1.0]
    L 18 //Anzahl Bytes
    T LW [AR1,P#2.0]
    L #Quell_DB //Quell-DB
    T LW [AR1,P#4.0]
    L #Start_Adr //Anfang des Zieles
    SLD 3
    T LD [AR1,P#6.0]
    L B#16#84 //Speicherbereich (hier DB)
    T LB [AR1,P#6.0]

    Allerdings habe ich in einem FB eine Stuktur die übertragen werden soll. Diese Stuktur liegt ja in einem DB und hat eine Anfangsadresse.
    Und somit muss ich nun rausbekommen wo die Stuktur liegt die übertragen werden soll.. Von der Strukur kenn ich nur den Namen und die Länge...

  7. #7
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Es ist schwer Dir zu folgen!
    Du willst in einem FB1 auf die Instanzdaten eines FB2 zugreifen?!
    Habe ich das so richtig verstanden?

    Wenn ja, kannst Du die Anfangsadresse der Struktur im FB2 auswerten und danach dem FB1 zur Verfügung stellen.

  8. #8
    Smazze ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.03.2016
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe einen FB in dem der Anypointer und eine Struktur ist.
    Die Struktur soll in einen anderen DB kopiert werden.

    Problem ist nur das ich den FB umbenennen kann (zB vo FB10 in FB100) oder den FB als Multiinstanz in einem anderen FB aufrufen könnte.
    Dann müsst ich doch wissen in welchem DB wo die Startadresse liegt...
    Nun würde ich gerne irgendwie abfragen wie der DB und die Anfangsadresse von der Sturktur ist die übergeben werden soll...
    ..und die beiden Daten werden dann als Integer in #Quell_DB und #Start_Adr gespeichert..

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.177
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Der FB, der die Struktur aus seinen Instanzdaten hergeben soll, könnte die Struktur sauber über seine Baustein-Schnittstelle übergeben. Dann schließe einfach außen Deinen Zielbereich an und es kopiert sich von ganz alleine ohne ANY-Gebastel.

    Woher soll Dein Programmcode wissen/wie wolltest Du ihm mitteilen, auf welche FB-Instanz er zugreifen soll und auf welcher Adresse da die Struktur liegt?
    Oder ist Dein Programmcode in dem FB, welcher die Struktur aus seinen eigenen Instanzdaten irgendwohin kopieren soll? Dann ist die Übergabe über die Baustein-Schnittstelle am einfachsten. Wenn man aber unbedingt selber wursteln will, dann erhält man die eigene IDB-Nummer über "L DINO" und die Adresse im IDB errechnet sich aus P##Struktur + AR2 (suche mal nach Multiinstanz Offset AR2).

    PS: Wie ein FB heißt hat für die Berechnung von Variablenadressen keinen Einfluß.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #10
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    ich weiss ich bin da etwas komisch. Aber ich find einfach in SCL ist solches Pointergeschubse irgendwie einfacher

    Code:
    FUNCTION_BLOCK "Baustein_1"{ S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
       VAR_INPUT 
          Startdaten : Any;
          pStartdaten AT Startdaten : "ANY_POINTER";
          versatz : Int;
       END_VAR
    
    
       VAR_TEMP 
          Zieldaten : Any;
          pZieldaten AT Zieldaten : "ANY_POINTER";
          index : Int;
          IN_Byte : Int;
       END_VAR
    
    
    
    
    BEGIN
    	#pZieldaten := #pStartdaten;
    	
    	#IN_Byte := DWORD_TO_INT(SHR(IN := SHL(IN := #pStartdaten.Startadresse, N := 8), N := 11));
    	
    	FOR #index := 0 TO (#pStartdaten.Anzahl_Werte - 2) DO
    	    WORD_TO_BLOCK_DB(INT_TO_WORD(#pZieldaten.DB_Nr)).DB(#IN_Byte + #index + #versatz)
    	    := WORD_TO_BLOCK_DB(INT_TO_WORD(#pStartdaten.DB_Nr)).DB(#IN_Byte + #index);
    	END_FOR;
    	    
    END_FUNCTION_BLOCK
    In AWL ist das so mühsam.

    mfG René

  11. Folgender Benutzer sagt Danke zu vollmi für den nützlichen Beitrag:

    friendo (23.03.2016)

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 05.01.2016, 09:58
  2. Antworten: 7
    Letzter Beitrag: 12.06.2015, 16:57
  3. Step 7 Probleme mit Any Pointer
    Von D.Fricke im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 21.03.2014, 08:56
  4. Problem mit Pointer
    Von Mathias im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 06.02.2009, 10:03
  5. Sortierbasutein mit Any Pointer
    Von stevexxx im Forum Simatic
    Antworten: 71
    Letzter Beitrag: 19.11.2008, 08:39

Lesezeichen

Berechtigungen

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