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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Any-Pointer über Bausteinschnittstelle

  1. #11
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das konnte ich schon feststellen. Wenn ich wie im obrigen Bild FB800

    Zuerst hatte ich im FB800 den FB801 32 mal aufgerufen und die Bausteine über den EN Eingang einzeln Enabled. Bis zum 16 Baustein war kein Fehler aufgetreten. Wenn ich dann den Baustein 17 Enable bringt der mir den beschriebenen Fehler.

    Danach hab ich alle Bausteine höher 17 (COM_CP2_ID01) aus dem FB800 und der Deklarationstabelle gelöscht. Der Fehler bestand immer noch.
    Daraufhin hab ich alle Bausteine vor dem 17 (COM_CP2_ID01) gelöscht aber in der Deklarationstabelle die 16 belassen.
    Der Fehler war immer noch da. Erst wenn ich den Baustein 17 (COM_CP2_ID01) Disable läuft die CPU ohne Fehler an.

    Dann hat das doch bestimmt mit den Adressen zu tun. Komischerweise immer wenn die Adresse höher 4000 ist.


    Deklarationstabelle.jpg

  2. #12
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Petri.f Beitrag anzeigen
    [CODE]//AR2 Adressregister sichern TAR2 #tmp_DW_AR2_Save
    Steht das wirklich so in Deinem Programm oder ist der Fehler beim Kopieren ins Forum passiert?
    Also ist das TAR2... in Deinem Programm tatsächlich auskommentiert?

    Weil AR2 in Multiinstanz-FB schon benutzt wird um den Offset dieser Instanz im Mutter-IDB anzugeben, darf AR2 nicht verändert werden bzw. wenn man es verändert, dann muß der Inhalt gesichert und vor dem Zugriff auf Instanz-Variablen wieder hergestellt werden.
    In Deinem Programm wird womöglich AR2 nicht gesichert aber später mit einem zufälligen Wert aus dem TEMP "wiederhergestellt".
    #tmp_DW_AR2_Save muß ein DWORD in TEMP sein. Es darf nicht in STAT liegen, weil es dann nach dem Ändern von AR2 nicht "wiedergefunden" wird.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #13
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Harald das war ein Fehler beim Kopieren ins Forum ist mir aber selbst nicht aufgefallen.
    So wie ich das verstehe sollte das mit deinem Code funktionieren und diese Problem nicht auftreten.
    Hab dir nochmal ein Bild vom Baustein angehängt.

    Vielen Dank


    FB801 NW7.jpg

  4. #14
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Petri.f Beitrag anzeigen
    Wenn ich im Fenster Baugruppenzustand (Diagnosepuffer) auf die Schaltfläche Baustein öffnen klicke öffnet sich der Baustein FB801 und springt zu Harald's Code.
    Zu welcher Programmzeile genau?
    An der Unterbrechungsstelle hat AR1 einen völlig falschen Wert.
    Veränderst Du das AR2 schon vor diesem Netzwerk 7?

    Hast Du PLCSIM?
    Ich empfehle, nur die 20. Instanz aufzurufen und mit PLCSIM die Werte in AR1 zu kontrollieren. Dabei zunächst die Kopierbefehle überspringen und dann nach und nach wieder aktivieren.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #15
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich Simuliere es momentan mit PLCSim. Aber der Fehler ist beim Kollegen auf der Baustelle aufgetreten.
    Das AR2 wir meines Wissens nicht vorher verändert.

    Wieso mit der 20. Instanz anfangen ? Das versteh ich noch nicht ganz.

    Wenn ich auf Baustein öffnen klicke geht er zur markierten Zeile siehe Bild.

    Danke Harald.


    FB801 NW7 Fehlerzeile.png
    Geändert von Petri.f (19.02.2014 um 16:18 Uhr)

  6. #16
    Registriert seit
    29.03.2004
    Beiträge
    5.731
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Das Liegt am Befehl +AR1, der kann nämlich nur bis 32767 addieren. Wenn man die untersten 3 Bits für die Bitadressierung abzieht, bleiben noch 4096 Bytes.

    Siehe hier:
    Anzahl der möglichen Multiinstanzen durch Befehl +AR1 begrenzt.

  7. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Petri.f (20.02.2014)

  8. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Ich habe den Fehler gefunden:
    Die Operation +AR1 addiert AKKU1-L als vorzeichenbehaftete 16-Bit-Zahl - addiert oder subtrahiert also einen 15-Bit-Offset!
    Die Version in Beitrag #3 funktioniert nur mit IDB bis max. 4KByte.

    Zitat Zitat von Hilfe zu AWL - +AR1 Addiere AKKU 1 zum Adreßregister 1
    +AR1 (Addiere zu AR1) addiert einen Versatz, der entweder in der Anweisung oder in AKKU1-L angegeben wird, zum Inhalt von AR1. Die Ganzzahl (16 Bit) wird zunächst vorzeichenrichtig auf 24 Bit erweitert und danach zu den niederwertigsten 24 Bit von AR1 (Teil der relativen Adresse in AR1) addiert. Der Teil der Bereichskennung in AR1 (Bits 24, 25 und 26) wird nicht verändert.

    +AR1: Die Ganzzahl (16 Bit), die zum Inhalt von AR1 addiert werden soll, wird durch den Wert in AKKU1-L angegeben. Zulässig sind Werte von -32768 bis +32767.

    Hier die korrigierte Version:
    ANY-Parameter von IN/IN_OUT in TEMP umkopieren in Multiinstanz-FB:
    Code:
    //Multiinstanz! AR2 Adressregister sichern
          TAR2  #tmp_DW_AR2_Save
    
    //*** E_Any_farAdr kopieren *************************
    //Pointer auf IN-Parameter E_Any_farAdr erstellen
          L     P##E_Any_farAdr             // relative Adresse #E_Any_farAdr in dieser Instanz (DI)
          TAR2                              // Offset dieser Multiinstanz (DB)
          UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
          +D
          LAR1                              // AR1: absolute Adresse #E_Any_farAdr im IDB (DI)
    
    //Pointer auf TEMP-Variable tmp_Any_farAdr erstellen
          LAR2  P##tmp_Any_farAdr           // AR2: Adresse des TEMP-ANY
    
    //ANY IN.E_Any_farAdr nach TEMP.tmp_Any_farAdr kopieren
          L     D [AR1,P#0.0]               // (S7-ID + Datentyp + Wiederholfaktor)
          T     D [AR2,P#0.0]
          L     W [AR1,P#4.0]               // (DB_Nr)
          T     W [AR2,P#4.0]
          L     D [AR1,P#6.0]               // (Bereichsadresse)
          T     D [AR2,P#6.0]
    
    //*** E_Any_locAdr kopieren *************************
    //Pointer auf IN-Parameter E_Any_locAdr erstellen
          L     P##E_Any_locAdr             // relative Adresse #E_Any_locAdr in dieser Instanz (DI)
          L     #tmp_DW_AR2_Save            // Offset dieser Multiinstanz (DB)
          UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
          +D
          LAR1                              // AR1: absolute Adresse #E_Any_locAdr im IDB (DI)
    
    //Pointer auf TEMP-Variable tmp_Any_locAdr erstellen
          LAR2  P##tmp_Any_locAdr           // AR2: Adresse des TEMP-ANY
    
    //ANY IN.E_Any_locAdr nach TEMP.tmp_Any_locAdr kopieren
    //ALTERNATIVE Codevariante für besser verstehbar
          L     DID [AR1,P#0.0]             // (S7-ID + Datentyp + Wiederholfaktor)
          T     LD [AR2,P#0.0]
          L     DIW [AR1,P#4.0]             // (DB_Nr)
          T     LW [AR2,P#4.0]
          L     DID [AR1,P#6.0]             // (Bereichsadresse)
          T     LD [AR2,P#6.0]
    
    //*** Ende Parameter vorbereiten ********************
    //VOR Zugriffen auf Instanzobjekte das AR2 unbedingt wiederherstellen!
          LAR2  #tmp_DW_AR2_Save            //AR2 Adressregister wiederherstellen
    
    //*** GET mit ANY-Parametern aufrufen ***************
          CALL  #S_PLC_GET
           REQ   :=...
           ID    :=...
           NDR   :=...
           ERROR :=...
           STATUS:=...
           ADDR_1:=#tmp_Any_farAdr
           RD_1  :=#tmp_Any_locAdr
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Korrektur wg. +AR1  

  9. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    gordon (04.05.2015),Petri.f (20.02.2014)

  10. #18
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Guten Morgen,
    ein großes Lob an Harald und Thomas für die super Hilfe. Ich werde den Code jetzt in meinem Programm aktualisieren und euch Rückmeldung geben ob es bei mir funktioniert.

  11. #19
    Registriert seit
    18.04.2011
    Ort
    Bayern
    Beiträge
    20
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Morgen,
    der Code hat prima Funktioniert mir sind keine weiteren Fehler aufgefallen.

    Nochmals vielen Dank

Ähnliche Themen

  1. Ausgänge über ANY Pointer setzen
    Von Pico1184 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 02.10.2012, 11:53
  2. Speichrzugriff über Adresse aus ANY-Pointer
    Von MarkusP210 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 24.09.2009, 11:26
  3. Zugriff auf DB(String) über Pointer
    Von Thomas R im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.03.2007, 21:04
  4. pointer über temp struct...
    Von Jochen Kühner im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.09.2006, 10:23
  5. adressierung DB über Pointer
    Von TonyMono im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 13.06.2006, 22:24

Lesezeichen

Berechtigungen

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