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

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 29 von 29

Thema: Lokalvariablen in Multiinstanzen

  1. #21
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.205
    Danke
    926
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Grisu88 Beitrag anzeigen
    Code:
          TAR2                              // Anfangsadresse der aktuellen Instanz
          UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
          L     P##INSTANZVAR
          +D                                // Addiere Offset und Variablenadresse
          LAR1
    jedoch bekomme ich nun einen Systemfehler
    Hast Du die rote Zeile vergessen?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. #22
    Registriert seit
    24.10.2007
    Ort
    Niederlande
    Beiträge
    673
    Danke
    22
    Erhielt 143 Danke für 135 Beiträge

    Standard

    Probier es mit dieser code

    Code:
    TAR2                              // Anfangsadresse der aktuellen Instanz
          UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
          L     P##INSTANZVAR  // Name Ihre ANY
          +D                                // Addiere Offset und Variablenadresse
          LAR1
    Edit Harald war sneller.

    Joop

  3. #23
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    nein ich hatte die rote zeile davor ich

    ich habe alle LAR1 in meinem Funktionsbaustein durch

    Code:
      TAR2                              // Anfangsadresse der aktuellen Instanz
          UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
          +D                                // Addiere Offset und Variablenadresse
          LAR1
    ersetzt

    auch die, die gar nichts mit den lokal Variablen zu tun hatten. I

    ch habe nun nur die LAR1 umgeschrieben, die mit Eingängen arbeiten. Also den Pointern, die auf die übergebenden ANY Pointer zeigen. Damit funktioniert es soweit

  4. #24
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.205
    Danke
    926
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Nochmal ganz ausführlich:

    Du hast jedes dieses:
    Code:
          L     P##INSTANZVAR
          LAR1
    ersetzt durch:
    Code:
          L     P##INSTANZVAR
          TAR2
          UD    DW#16#FFFFFF
          +D
          LAR1
    Dann ist es korrekt, funktioniert und darf keinen "Systemfehler" verursachen.

    Beachte: bei Zugriffen auf die Adresse von TEMP-Variablen darf das AR2 nicht addiert werden. Nur beim Zugriff auf die Adressen von Instanz-Variablen (IN/OUT/IN_OUT/STAT) muß AR2 addiert werden.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #25
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    genau so hab ich es gemacht

    Ich habe mittendrin noch indirekte Adressierung zum Beispiel:

    Code:
       AUF   #DB_NUMMER
          L     P#211.0                     
          L     #LEN_COMMUNITY
          SLD   3
          +D    
          LAR1  
          L     B#16#A0                     //A0 := Get Request Befehl
          T     DBB [AR1,P#0.0]
          L     #LEN_PDU                    //PDU Länge
          T     DBB [AR1,P#1.0]
          L     B#16#2                      //Datentyp 2 := Integer
          T     DBB [AR1,P#2.0]
    Hierbei greift das Programm auf einen globalen DB zu und nicht auf den InstanzDB. Diese LAR1 hatte ich zuvor auch verändert. Das ,denke ich, den Fehler verursacht hat. Liege ich richtig das dadurch Adressen entstanden sind die gar nicht existieren und somit der systemfehler zustande kommt?
    Geändert von Grisu88 (10.01.2013 um 13:10 Uhr)

  6. #26
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.205
    Danke
    926
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Ja, durch das Addieren des AR2 greifst Du auf höhere Adressen als gewollt im globalen DB #DB_NUMMER zu, welche wahrscheinlich gar nicht existieren (DB nicht groß genug!).
    Wie gesagt: AR2 nur bei Zugriffen auf Adressen der eigenen Instanzvariablen addieren.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #27
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ja dann hab ich das so langsam verstanden

    vielen Dank

  8. #28
    Registriert seit
    28.07.2008
    Beiträge
    68
    Danke
    1
    Erhielt 33 Danke für 19 Beiträge

    Standard

    Hallo zusammen.
    Bitte für mich nochmal zum Mitschreiben:
    Grisu88, du hast einen FB, der einen INParameter besitzt.
    Dieser FB wird in einem Vater FB als Multiinstanz mehrfach aufgerufen.
    Die Instanzen sitzen in der STAT Sektion des Vaters.
    Über den Pointer wird ein ANY Pointer addressiert und dem Sohn FB übergeben.
    Meine Frage lautet nun:
    Wo genau liegen die ANY Pointer und wie übergibst du den Pointer beim Aufruf der Multiinstanz?
    Danke für eine Antwort.
    mfg
    Linus

  9. #29
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also:
    ich habe FB unteranderem ANY Pointer als Eingang bekommen. Im Instanzdatenbaustein dieses FB wird dann ein Speicherplatz von 10 Bytes zur Verfügung gestellt (ANY Pointer benötigen 10 Bytes). Wenn nun der Eingang einen ANY Pointer bekommt werden an dieser Stelle die Daten abgelegt.
    Zum Beispiel soll ein Datenbereich von 10 Bytes im globalen DB 500 über den Eingang "Datenablage" übergeben werden.
    Code:
          CALL  FB 1 , DB400
           DATENABLAGE     :=P#DB500.DBX0.0 BYTE 10
    Lädt man nun im FB 1 den Eingang "DATENABLAGE", wird nicht der übergebende ANY Pointer geladen. Stattdessen wird ein Pointer der auf das erste Bit des ANY-Pointers, welcher im Instanzdatenbaustein gespeichert ist, geladen. Damit im FB 1 der eigenltiche ANY Pointer wieder verwendet werden kann, habe ich den ANY Pointer im Temp Bereich wieder gebildet:
    Code:
          L     P##DATENABLAGE
          TAR2                              // Anfangsadresse der aktuellen Instanz
          UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
          +D                                // Addiere Offset und Variablenadresse
          LAR1  
          L     D [AR1,P#0.0]               //übergebender Pointer wird in einen ANY Zeiger gewandelt
          T     LD     0
          L     D [AR1,P#4.0]
          T     LD     4
          L     W [AR1,P#8.0]
          T     LW     8
    Die ersten 10 Bytes des lokalen Temp Bereichs sind nun der übergebende ANY-Pointer. Das Problem war nun der Einsatz von Multiinstanzen. Dieser FB 1 soll sehr oft aufgerufen werden. Das bedeutet das jedes mal ein Instanzdatenbaustein benötigt wird. Damit die Anzahl der Instanzdatenbausteine gering gehalten wird, werden alle "FB 1" in einem FB 2 aufgerufen und die Instanzdatenbausteine von FB 1 als Multiinstanzen im Instanzdatenbaustein von FB 2 gelegt.
    Das Problem ist LAR1 (Blaue Markierung), in den Multiinstanzen spielt das Adressregister 2 eine wesentliche Rolle. So ist je nach position der Multiinstanz im Instanzdatenbaustein von FB 2 das Adressregister 2 verschieden. Somit muss jede Adressierung die sich in einer Multiinstanz abspielt in Bezug auf das Adressregister 2 stattfinden. Das erledigt der rot markierte Programmteil.

    Bitte verbessert mich wenn ich jetzt irgendwas falsches gesagt habe

  10. Folgender Benutzer sagt Danke zu Grisu88 für den nützlichen Beitrag:

    LinusAM4V (11.01.2013)

Ähnliche Themen

  1. Lokalvariablen in Organisationsbausteinen
    Von Blueglasstalisman im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.08.2011, 14:33
  2. Lokalvariablen im DB weg
    Von Wassermann im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 28.04.2010, 19:35
  3. temporäre Lokalvariablen
    Von Earny im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 08.12.2009, 08:48
  4. keine Lokalvariablen im Datenbaustein
    Von Hans.S im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 02.10.2009, 12:52
  5. Problem mit S7 Lokalvariablen
    Von mrcmm300 im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 26.11.2007, 23:12

Lesezeichen

Berechtigungen

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