Step 7 SCL - Auf mit SFC 22 CREAT_DB erzeugten DB zugreifen

KurtKalle

Level-1
Beiträge
5
Reaktionspunkte
0
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.
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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
 
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" :confused: 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
 
Zurück
Oben