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

Ergebnis 1 bis 5 von 5

Thema: SCL - Auf mit SFC 22 CREAT_DB erzeugten DB zugreifen

  1. #1
    Registriert seit
    20.11.2014
    Beiträge
    5
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,
    ich habe ein Problem mit dem beschreiben eines zur Laufzeit erstellten DB's.
    Der DB wird in einer Funktionen wie folgt erstellt:

    ERROR_CREAT_DB := CREAT_DB (LOW_LIMIT := 50, UP_LIMIT := 200, COUNT := 6, DB_NUMBER := NUMBERNEWDB);

    Das klappt auch ganz gut. In der Online-Ansicht finde ich den DB auch in der CPU.

    Nun soll anschließend in den DB 6 Bytes der Reihe nach hinein geschrieben werden.
    Meine Frage ist, wie schaffe ich es diesen DB (am besten mit Absoulter Adressierung wie z.B. DB_NUMBERNEWDB.DB0) zu füllen.

    Vielen Dank schon im vorraus.

    Gruß

    Edit:
    Versucht habe ich es mit:
    WORD_TO_BLOCL_DB(DB_NUMBERNEWDB).DB[0] := B#16#14

    Allerdings bekomme ich dann die Fehlermeldung bezeichner existiert nicht.
    Geändert von KurtKalle (20.11.2014 um 11:55 Uhr)
    Zitieren Zitieren SCL - Auf mit SFC 22 CREAT_DB erzeugten DB zugreifen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Hallo,
    so, wie du es vorhast, sollte es funktionieren.
    Was mir allerdings auffällt : du schreibst einmal von "NUMBERNEWDB" und dann beim Zugriff von "DB_NUMBERNEWDB" - sicher, dass du wirklich den DB adressierst, den du adressieren willst ?
    Schau dir doch mal in der Online-Ansicht an, auf was du da zugreifen willst ...

    Ist dann alles richtig kann es noch sein, dass dein DB vielleicht nicht zu dem Zeitpunkt existiert, wo du ihn brauchst ...

    Gruß
    Larry

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    KurtKalle (25.11.2014)

  4. #3
    KurtKalle ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    20.11.2014
    Beiträge
    5
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    vielen Dank für die Antwort. Es lag wirklich einfach nur an meinem dummen "NUMBERNEWDB" "DB_NUMBERNEWDB" Fehler. Jetzt lässt sich ohne Probleme in absoluter Adressierung auf den DB zugreifen.

    Leider hat sich nun ein weiteres Problem aufgetan.

    Code:
    SENDPOINTER :=WORD_TO_BLOCK_DB(DB_NUMBERNEWDB);
    SENDPOINTER ist vom Typ ANY und füttert den Baustein FC wie folgt:

    Code:
    AG_SEND(ACT:= ACT, ID:=1, LADDR := W#16#0180, Send:=SENDPOINTER, LEN:=5, DONE:=DONE, ERROR:= ERROR, STATUS:= STATUS);
    Leider bekomme ich beim Sendeversuch immer den Fehlercode 8184 -Unzulässiger Datentyp für Parameter Send.

    Code:
    SENDPOINTER :=D100;
    wiederum funktioniert aber. Jemand eine Idee?

    Vielen Dank schonmal
    Geändert von KurtKalle (25.11.2014 um 17:00 Uhr)

  5. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    OK ... SendPointer ist vom Typ ANY - aber welchen Datentyp erwartet AG_Send denn bei "Send:=" ? Doch wohl eher WORD oder Block_DB ...
    Das solltest du erstmal überprüfen ...

    Gruß
    Larry

  6. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    AG_SEND erwartet einen ANY-Pointer auf die zu sendenden Daten.

    Die SCL-Anweisung "SENDPOINTER:=WORD_TO_BLOCK_DB(DB_NUMBERNEWDB);" erstellt eine temporäre Variable vom Typ BLOCK_DB und erzeugt einen ANY-Pointer auf diese Variable. Das ist natürlich nicht das gewünschte.
    (der von SCL erstellte unzulässige ANY-Pointer lautet ungefähr "P#Vxx.0 BLOCK_DB 1" so einen ANY-Pointer gibt es offiziell gar nicht)

    Meines Wissens gibt es in SCL nur den Weg, sich den ANY-Pointer auf den mit CREAT_DB dynamisch erzeugten DB selber zu basteln:
    Code:
    VAR_TEMP
      SENDPOINTER : ANY ;
      APtr AT SENDPOINTER :
        STRUCT
          ID      : BYTE ;
          Typ     : BYTE ;
          Anzahl  : INT ;
          DB_Nr   : WORD ;
          Adresse : DWORD ;
        END_STRUCT ;
    END_VAR
    
      // ANY basteln: SENDPOINTER := P#DB[DB_NUMBERNEWDB].DBX0.0 BYTE 5
      APtr.ID      := B#16#10 ;        //Any ID
      APtr.Typ     := 2 ;              //Datentyp BYTE
      APtr.Anzahl  := 5 ;              //Anzahl Datentypen (hier: Länge in Byte)
      APtr.DB_Nr   := DB_NUMBERNEWDB ; //DB-Nummer von CREAT_DB
      APtr.Adresse := DW#16#84000000 ; //P#DBX0.0
    
      AG_SEND(ACT:= ACT, ID:=1, LADDR := W#16#0180, Send:=SENDPOINTER, LEN:=5, DONE:=DONE, ERROR:= ERROR, STATUS:= STATUS);
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    KurtKalle (05.12.2014)

Ähnliche Themen

  1. Antworten: 12
    Letzter Beitrag: 18.05.2011, 23:57
  2. Indirekt auf DB zugreifen (IN SCL)
    Von Bensen83 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 09.07.2010, 08:52
  3. IN SCL auf Instanz DB zugreifen
    Von Bensen83 im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 08.07.2010, 14:45
  4. auf DB in SCL zugreifen
    Von Bensen83 im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 18.02.2010, 12:33
  5. Antworten: 2
    Letzter Beitrag: 16.08.2005, 17:23

Lesezeichen

Berechtigungen

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