in SCL Adresse von String im IDB ermitteln

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.404
Reaktionspunkte
4.039
Zuviel Werbung?
-> Hier kostenlos registrieren
SCL ist nicht meine Standardsprache, daher muß ich hier mal nachfragen.

Ich habe in einem FB einen String als STAT definiert.
Diesen String will ich mit dem P_Send-Baustein senden.
Dieser Baustein verlangt die DB-Nummer, die DBB_Adresse und die Länge des Strings.
Wie komme ich am einfachsten zur Laufzeit an diese Informationen, die sich ja nun auf den IDB beziehen. Ich möchte das nicht direkt als Zahlen antragen, sondern die Werte ordentlich ermitteln, so daß sich der IDB auch ändern kann, ohne dass nachgearbeitet werden muß.
 
einen FC mit input ANY und output DB-nummer, DB-byte ... den kannste dann auch in deiner stammsprache AWL schreiben...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
einen FC mit input ANY und output DB-nummer, DB-byte ... den kannste dann auch in deiner stammsprache AWL schreiben...

Geht das wirklich nicht anders, Mann, das kann doch echt nicht wahr sein, ich willllllllll es aber direkt machen! :ROFLMAO:

Auch Any hat doch keinen Sinn oder? Ich hab doch den String direkt im SCL-Baustein definiert und keinen Any.
 
Geht das wirklich nicht anders, Mann, das kann doch echt nicht wahr sein, ich willllllllll es aber direkt machen! :ROFLMAO:

Hallo Ralle,
das geht auch direkt ... habe ich schon ein paar Mal (genau für so etwas) gemacht.
Du machst dir in SCL einen ANY und weisst dem den String zu. Nun kannst du den ANY (mit AT) auflösen und kannst das dem Baustein übergeben.
Ich suche dir das gleich mal als Beispiel heraus ...

Gruß
Larry
 
hier der Code :
Code:
VAR_TEMP
   DatenQuelle_Adr : INT ;
   DatenQuelle_Any : ANY ;
   DatenQuelle_struct AT DatenQuelle_Any : STRUCT
                   ID_Code   : BYTE ;   
                   DataTyp   : BYTE ;
                   Anzahl    : WORD ;
                   DB_Nr     : WORD ;
                   SpeicherPtr : DWORD ;
                END_STRUCT ;
END_VAR
  
BEGIN   
   // Sende Daten
   DatenQuelle_Any := Send_Keys ;  // das ist mein Sende-String ...
   DatenQuelle_Adr := DWORD_TO_INT(SHR (IN:=(DatenQuelle_struct.SpeicherPtr AND dw#16#00FF_FFFF) , n:=3)) ;
                   
   Send    (REQ    := Write.Enable  
           ,R      := false           
           ,LADDR  := CP_ADDR    
           ,DB_NO  := WORD_TO_INT(DatenQuelle_struct.DB_Nr)         
           ,DBB_NO := DatenQuelle_Adr       
           ,LEN    := 6           
           ) ; 

// usw.
... ich hoffe, dass es das war ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja Larry, genau das war es. Danke für den Code.
Ist schon sehr speziell mit dieser AT-Ansicht und der Wandelorgie für die DBB-Adresse. :ROFLMAO:
Ich hatte zwischenzeitlich 4Ls Rat beherzigt und einen FC geschrieben, der das macht, aber so ist mit das lieber, ich muß nicht noch einen FC im Projekt haben.

Zusatz:

Hier noch die zusätzliche Zeile, um die Länge des String zu ermitteln:

Code:
SendData.LEN := WORD_TO_INT(WORD_TO_BLOCK_DB(DatenQuelle_struct.DB_Nr).DB[DatenQuelle_Adr + 1]);
 
Zuletzt bearbeitet:
Ist schon sehr speziell mit dieser AT-Ansicht und der Wandelorgie für die DBB-Adresse. :ROFLMAO:

Naja ... im Grunde würdest du es in AWL ja auch nicht anders gemacht haben. Aber du hast schon Recht ... wenn man es im Code sieht dann muss man auch schon wissen, was gemeint ist ...

Gruß
Larry
 
Zurück
Oben