Step 7 SCL Impliziter Zugriff

Draco Malfoy

Level-1
Beiträge
1.168
Reaktionspunkte
82
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Kurze Frage: ich will in SCL implizit auf einen Datenbaustein zugreifen, d.h. DB[DBNr].Struktur_1.Struktur_2.Data sodaß der SCL Baustein die DBNr erst zur Laufzeit übermittelt bekommt und sich daraus die Zugriffsadresse errechnet.

1. Ist das überhaupt möglich in SCL ??
2. Wenn ja dann wie ??

Danke im Voraus
 
Auf einen DB zugreifen, von dem nur die Nummer übergeben wird, ist zwar möglich aber nicht symbolisch sondern nur auf absolute Adressen. Weil man dem Compiler nicht sagen kann welche Struktur der zur Laufzeit übergebene DB haben wird. Will man symbolisch adressieren dann muß man einen STRUCT oder UDT übergeben oder zuerst den DB in eine lokale Struktur umkopieren.

Harald
 
Du müßtest eine UDT definieren und die als IN-Parameter für deinen Baustein bestimmen.
Den jeweils gewünschten Datenbereich (der dann natürlich auch vom Typ dieser UDT sein muß) übergibst du dann (am Besten symbolisch) deinem Baustein auf der Schnittstelle.

Gruß
Larry
 
Verstehe ich gerade überhaupt gar nicht... Wie sieht der Code konkret aus ? UDT ist längst definiert, mein DB hat eine Struktur die diesem UDT entspricht. Jetzt will ich aus meinem FC oder FB darauf symbolisch zugreifen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL, ungetestet:
Code:
TYPE TMyUDT
  STRUCT
    Var_1 : INT ;
    Var_2 : INT ;
    Text : STRING[14] ;
  END_STRUCT
END_TYPE 

DATA_BLOCK DB_Data
  STRUCT
    Var_1 : INT ;
    Data_1 : TMyUDT ;
    Data_2 : TMyUDT ;
    Var_x : INT ;
  END_STRUCT
  BEGIN

END_DATA_BLOCK


FUNCTION_BLOCK FBxxx

VAR_IN_OUT
  IOData : TMyUDT ;
END_VAR

  IF IOData.Var_1 = IOData.Var_2 THEN
    IOData.Text := "" ;
  END_IF ;

END_FUNCTION_BLOCK

//irgendwo der Aufruf des FBxxx mit Übergabe des UDT:
  Instance_of_FBxxx(IOData := "DB_Data".Data_1) ;

Harald
 
Zuletzt bearbeitet:
Also so richtig verstehen tue ich das immer noch nicht. Vielleicht sollte ich besser die Hände von SCL lassen...
Also mein Problem ist: Muss ich das UDT innerhalb meines SCL-Bausteins definieren ? Es ist doch schon vorher irgendwo definiert. Ich habe jetzt beispielsweise einen FB, wo am Anfang die eingehende Variablendeklaration ist:

VAR_INPUT
...
END VAR

gefolgt vom Anweisungsteil

BEGIN
....
END_FUNCTION_BLOCK

Wie und was muss ich also in das Feld VAR_INPUT reinschreiben, um im Anweisungsteil auf den Datenbestand im DB mittels wie folgt aussehendem Zugriff: "Achsen_DB".Statuswort.Antriebsdiagnose zugreifen zu können, wenn mein DB13 aus mehreren UDTs besteht, und davon einer "Statuswort" heißt ?

Danke im Voraus.
 
Zuletzt bearbeitet:
Der UDT kann schon außerhalb der SCL-Quelle vorhanden sein.

Angenommen der UDT heißt UDT5 mit dem symbolischen Name "TAchsstatus". Der UDT hat einen Member "Antriebsdiagnose".
Weiter hast Du einen DB13 mit dem symbolischen Name "Achsen_DB". In dem DB gibt es eine Variable "Statuswort" vom Typ UDT5 ("TAchsstatus").

In der SCL-Quelle schreibst Du Deinen FB:
Code:
FUNCTION_BLOCK FBxxx

VAR_INPUT
  Achsstatus : UDT5 ;  //oder:  Achsstatus : TAchsstatus ;
END_VAR

  IF Achsstatus.Antriebsdiagnose ...

END_FUNCTION_BLOCK


//irgendwo:

//direkter Zugriff auf eine UDT-Variable
  "Achsen_DB".Statuswort.Antriebsdiagnose := ... ;

//Aufruf des FBxxx mit Übergabe des UDT:
  Instance_of_FBxxx(
    Achsstatus := "Achsen_DB".Statuswort
  ) ;

Harald
 
Zurück
Oben