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

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

Thema: Any-Pointer - Multiinstanz-Schachtelungstiefe???

  1. #1
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo. Ich moechte gerne einen Any-Pointer an die dritte Schachtelungstiefe weiterreichen. Das Ganze als Multiinstanz. Beim weiterreichen an die zweite Multiinstanz passiert's... Der Pointer ist mit P#0.0 belegt. Hab ich in meinem Code nen Fehler??? Eigentlich rette ich mir die Adressregister temporär. Sollte ich das etwa statisch machen?

    TAR1 #TempAr1 // Adressregister 1 retten
    TAR2 #TempAr2 // Adressregister 2 retten
    LAR1 P##HmiKurvendatenQuelle // Lade Adressregister 1 mit Pointer aus Schnittstelle IN
    LAR2 P##TempAny1 // Lade Adressregister 2 mit Pointer aus Schnittstelle TEMP
    L W [AR1,P#0.0] // Code des Datentypes lesen
    T W [AR2,P#0.0]
    L W [AR1,P#2.0] // Wiederholfaktor lesen
    T W [AR2,P#2.0]
    L W [AR1,P#4.0] // Nummer des Datenbausteines oder "0"
    T W [AR2,P#4.0]
    L D [AR1,P#6.0] // Bereichszeiger
    T D [AR2,P#6.0]
    LAR2 #TempAr2 // Adressregister 2 wiederherstellen
    LAR1 #TempAr1 // Adressregister 1 wiederherstellen
    Zitieren Zitieren Any-Pointer - Multiinstanz-Schachtelungstiefe???  

  2. #2
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 184 Danke für 169 Beiträge

    Standard

    Hallo!

    Ich verstehe jetzt nicht was passiert?

    Wie gibst du deinen Any-Pointer weiter?

    Wenn du in den Temp Bereich indirekt Adressieren willst und schon
    T W [AR1,P#0.0] schreibst dann sollte es so heißen
    T LW[AR1,P#0.0] weil du ja lokaldaten ansprichst.

    Code:
    TAR1 #TempAr1 // Adressregister 1 retten
    TAR2 #TempAr2 // Adressregister 2 retten
    LAR1 P##HmiKurvendatenQuelle // Lade Adressregister 1 mit Pointer aus Schnittstelle IN
    LAR2 P##TempAny1 // Lade Adressregister 2 mit Pointer aus Schnittstelle TEMP
    L W [AR1,P#0.0] // Code des Datentypes lesen
    T LW [AR2,P#0.0]
    L W [AR1,P#2.0] // Wiederholfaktor lesen
    T LW [AR2,P#2.0]
    L W [AR1,P#4.0] // Nummer des Datenbausteines oder "0"
    T LW [AR2,P#4.0]
    L D [AR1,P#6.0] // Bereichszeiger
    T LD [AR2,P#6.0]
    LAR2 #TempAr2 // Adressregister 2 wiederherstellen
    LAR1 #TempAr1 // Adressregister 1 wiederherstellen
    godi

  3. #3
    xhasx ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard

    Nö... ...dann muestte es heissen

    L W [AR1,P#0.0]
    T LW 0
    .
    .
    .
    L D [AR1,P#6.0]
    T LD 6

    Ich nehme das Adressregister 2 her und verweise auf den L-Bereich (Temp). Sozusagen steht der Quellepointer im Ar1 und der Zielpointer im Ar2. Bei den Sprüngen aus den Unterprogrammen wird das jeweilige Ar zurückgesichert. Ich kann aber kein Ar auf dem STAT Bereich sichern...

  4. #4
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 184 Danke für 169 Beiträge

    Standard

    Nein nicht
    T LW 0
    kannst schon T LW [AR2,P#0.0] schreiben.

  5. #5
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 184 Danke für 169 Beiträge

    Standard

    hier mal ein code der sicher funkt

    Code:
    FUNCTION_BLOCK FB 3
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      Any_Pointer_in : ANY ; 
    END_VAR
    VAR_TEMP
      Any_Pointer_Temp : ANY ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
          L     P##Any_Pointer_in; 
          LAR1  ; 
          L     B [AR1,P#0.0]; //  B#16#10
          L     B [AR1,P#1.0]; //  B#16#2
          L     W [AR1,P#2.0]; //  10
          L     W [AR1,P#4.0]; //  1
          L     D [AR1,P#6.0]; //  P#DBX 0.0
    END_FUNCTION_BLOCK
    FUNCTION_BLOCK FB 2
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      Any_Pointer_in : ANY ; 
    END_VAR
    VAR
      Instanz : FB 3; 
    END_VAR
    VAR_TEMP
      Any_Pointer_Temp : ANY ; 
      Save_AR1 : DWORD ; 
      Save_AR2 : DWORD ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          TAR1  #Save_AR1; 
          TAR2  #Save_AR2; 
          LAR1  P##Any_Pointer_in; 
          LAR2  P##Any_Pointer_Temp; 
          L     D [AR1,P#0.0]; 
          T     LD [AR2,P#0.0]; 
          L     D [AR1,P#4.0]; 
          T     LD [AR2,P#4.0]; 
          L     W [AR1,P#8.0]; 
          T     LW [AR2,P#8.0]; 
          LAR1  #Save_AR1; 
          LAR2  #Save_AR2; 
    
          CALL #Instanz (
               Any_Pointer_in           := #Any_Pointer_Temp);
    END_FUNCTION_BLOCK
    FUNCTION_BLOCK FB 1
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      Any_Pointer_in : ANY ; 
    END_VAR
    VAR
      Instanz_1 : FB 2; 
    END_VAR
    VAR_TEMP
      Any_Pointer_Temp : ANY ; 
      Save_AR1 : DWORD ; 
      Save_AR2 : DWORD ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          TAR1  #Save_AR1; 
          TAR2  #Save_AR2; 
          LAR1  P##Any_Pointer_in; 
          LAR2  P##Any_Pointer_Temp; 
          L     D [AR1,P#0.0]; 
          T     LD [AR2,P#0.0]; 
          L     D [AR1,P#4.0]; 
          T     LD [AR2,P#4.0]; 
          L     W [AR1,P#8.0]; 
          T     LW [AR2,P#8.0]; 
          LAR1  #Save_AR1; 
          LAR2  #Save_AR2; 
          CALL #Instanz_1 (
               Any_Pointer_in           := #Any_Pointer_Temp);
     
    
    END_FUNCTION_BLOCK
    
    ORGANIZATION_BLOCK OB 1
    TITLE = "Main Program Sweep (Cycle)"
    VERSION : 0.1
    
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ; //Reserved for system
      OB1_RESERVED_2 : BYTE ; //Reserved for system
      OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
      ANY_Pointer : ANY ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          L     P##ANY_Pointer; 
          LAR1  ; 
          L     B#16#10; 
          T     LB [AR1,P#0.0]; 
          L     B#16#2; 
          T     LB [AR1,P#1.0]; 
          L     10; 
          T     LW [AR1,P#2.0]; 
          L     1; 
          T     LW [AR1,P#4.0]; 
          L     P#DBX 0.0; 
          T     LD [AR1,P#6.0]; 
    
          CALL FB     1 , DB     3 (
               Any_Pointer_in           := #ANY_Pointer);
     
    END_ORGANIZATION_BLOCK

  6. #6
    xhasx ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard

    Den Versuche ich jetzt aber nicht mehr
    Wenn der funktioniert bedanke ich mich natürlich schön brav und denk drüber nach warum da LW und nicht nur L steht. Mein Code geht ja auch, aber nur für eine Instanztiefe...
    Trotzdem Danke mal!!!

  7. #7
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 184 Danke für 169 Beiträge

    Standard

    Warum LW?
    Die SPS muss auch wissen was sie beschreibt.
    LW = Lokalwort
    also es wird ein Wort in den Lokaldaten (=Temp-Bereich) der CPU Adressiert

  8. #8
    xhasx ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard

    Schon klar mit dem L !!! nur das L steckt ja schon in der #ZielPointer deklaration drin!

  9. #9
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 184 Danke für 169 Beiträge

    Standard

    Zitat Zitat von xhasx Beitrag anzeigen
    Schon klar mit dem L !!! nur das L steckt ja schon in der #ZielPointer deklaration drin!
    Da muss ich da recht geben!

    Bei mir funktionierts aber auch ohne dem L vor dem W.

  10. #10
    xhasx ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.05.2007
    Beiträge
    416
    Danke
    14
    Erhielt 45 Danke für 40 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vesuch mal in der Multiinstanz nochmal ne Multiinstanz aufzurufen und die Any weiterzureichen... So dass du ne Schachtelungstiefe von 3 Fb's mit nur einem Instanz Db hast. Als bei mir (WinRTX) geht's nicht.

Ähnliche Themen

  1. Multiinstanz in SCL
    Von godi im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 08.03.2015, 19:59
  2. TIA V11 SCL TON Multiinstanz
    Von MrEASY im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 04.03.2013, 15:17
  3. Antworten: 13
    Letzter Beitrag: 26.07.2011, 11:28
  4. Schachtelungstiefe von FBs
    Von Andre_ im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 02.06.2006, 18:17
  5. Multiinstanz
    Von godi im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 01.05.2006, 20:31

Lesezeichen

Berechtigungen

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