CFC / SCL - Nummer des Instanz-DB ermitteln?

TVG206

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi ich habe folgendes Problem, bzw. Frage:
Im CFC werden nach dem Generieren die Instanz-DB's zu vorhandenen FB's automatisch erzeugt.
Nun bräuchte ich die Adresse bzw. Nummer des Instanz-DB's von einem gewählten FB, um diese in einem anderen Baustein auslesen zu können.
Gibt es eine Funktion, mit der man die Nummer eines Instanz-DBs ermitteln kann?
Der Zweck ist einfach, eine automatische Verbindung zwischen 2 fixen FBs herzustellen, ohne dass ein Anwender überhaupt eine Verbindung dazwischen herstellen muss und auch die Schnittstellenparameter nicht sieht und somit nicht verändern kann.
 
Ich habe dieses Problem auch gehabt....
bei fertigen FB's konnte ich es nicht lösen, glaube auch nicht dass es lösbar ist.....

Aber wenn Du selber einen FB schreibst müsste es mit:

L DINO
T OUT- Wert gehen

diesen kann man dann mit einem passenden Eingang des nächsten CFC- Bausteines (auch selbergeschrieben) verschalten.... denke ich mal so.....
 
... es geht auch direkt im SCL-Code - allerdings ein bißchen umständlich ...
Code:
FUNCTION_BLOCK FB430    
TITLE   = 'UP Get-I-DB-Nummer'   // UP Get-I-DB-Nummer
AUTHOR  : 'LL'
VERSION : '0.1' 
//KNOW_HOW_PROTECT
 
VAR_OUTPUT
   DB_Nummer : INT ;   // Nummer des I-DB
   DB_Offset : INT ;   // Offset-Adresse für den Begin des Datenbereichs
END_VAR
VAR
   Test_Var  : INT ; 
END_VAR
VAR_TEMP
   xAnyPointer : STRUCT
         ID_Code     : BYTE ;
         DataTyp     : BYTE ;
         Anzahl      : WORD ;
         DB_Nr       : WORD ;
         SpeicherPtr : DWORD ;
   END_STRUCT ;
   hAny AT xAnyPointer : ANY ;
END_VAR
 
BEGIN
// Adresse des Datenbausteins für FB430 aufbereiten
   hAny := Test_Var ;
   DB_Offset := DWORD_TO_INT (SHR (IN:=(xAnyPointer.SpeicherPtr AND dw#16#00FF_FFFF) , N:=3)) ;
   DB_Nummer := WORD_TO_INT (xAnyPointer.DB_Nr) ;
 
END_FUNCTION_BLOCK

In meinem Beispiel wird die Offset-Adresse (Byte-Nummer) von der deklarierten "Test_Var" und die zugehörige DB-Nummer ausgegeben. Das kann man natürlich auch genauso gut intern weiter verwursten ...

Gruß
LL
 
... es geht auch direkt im SCL-Code - allerdings ein bißchen umständlich ...
Code:
FUNCTION_BLOCK FB430    
TITLE   = 'UP Get-I-DB-Nummer'   // UP Get-I-DB-Nummer
AUTHOR  : 'LL'
VERSION : '0.1' 
//KNOW_HOW_PROTECT
 
VAR_OUTPUT
   DB_Nummer : INT ;   // Nummer des I-DB
   DB_Offset : INT ;   // Offset-Adresse für den Begin des Datenbereichs
END_VAR
VAR
   Test_Var  : INT ; 
END_VAR
VAR_TEMP
   xAnyPointer : STRUCT
         ID_Code     : BYTE ;
         DataTyp     : BYTE ;
         Anzahl      : WORD ;
         DB_Nr       : WORD ;
         SpeicherPtr : DWORD ;
   END_STRUCT ;
   hAny AT xAnyPointer : ANY ;
END_VAR
 
BEGIN
// Adresse des Datenbausteins für FB430 aufbereiten
   hAny := Test_Var ;
   DB_Offset := DWORD_TO_INT (SHR (IN:=(xAnyPointer.SpeicherPtr AND dw#16#00FF_FFFF) , N:=3)) ;
   DB_Nummer := WORD_TO_INT (xAnyPointer.DB_Nr) ;
 
END_FUNCTION_BLOCK

In meinem Beispiel wird die Offset-Adresse (Byte-Nummer) von der deklarierten "Test_Var" und die zugehörige DB-Nummer ausgegeben. Das kann man natürlich auch genauso gut intern weiter verwursten ...

Gruß
LL

Selbst nach über 7 Jahren noch nützlich!
 
Zurück
Oben