Sonstiges FCs mit ganzzahligen DB adressierung in Instanzen kapseln.

vollmi

Level-3
Beiträge
5.425
Reaktionspunkte
1.403
Zuviel Werbung?
-> Hier kostenlos registrieren
Hoi zäme

Wie macht man sowas idealerweise?
Bsp:
Code:
      CALL  #P_SEND 
         REQ    :=#ST_REQ
         R      :=
         LADDR  :=#I_Adresse
         DB_NO  :=2
         DBB_NO :=0
         LEN    :=3
         DONE   :=#ST_DONE_SEND
         ERROR  :=#ST_ERROR_SEND
         STATUS :=#ST_STATUS_SEND

Der P_Send möchte ja bei DB_NO und bei DBB_NO ganzzahlig die Adresse des Zielbereichs haben.
Im Beispiel also DB2 ab DBB0 abfüllen.

Wie füttere diesen Baustein sauber wenn ich als Zielbereich gerne eine Struktur im Aufrufenden FB hätte.

also z.B. #sendebereich.Koppelbefehl als Zielbereich möglichst dynamisch. Also wenn sich was in der Schnittstelle verschiebt soll das alles trotzdem passen.

Mit DINO kriegt man ja nur den Instanzdb raus. Aber wie kriege ich dann effektiv die Startadresse des Zielbereichs heraus, vor allem wenn der aufrufende FB auch noch Multiinstanziert werden kann.

mfG René
 
Hallo René,

du lädst dir deinen Zielbereich als Pointer und lösst den dann entsprechend auf. Den Pointer kannst du in AWL allerdings nur auf die Haupt-Struktur (also bei dir #Sendebereich) bilden.
Wenn du allerdings mit SCL arbeitest und der Sendebereich ein Bestandteil deiner FB-Instanz ist, dann kannst du den Pointer auch in die Struktur bilden. Allerdings mußt du nach Ändern der Struktur den FB neu compilieren (bei der SCL-Version).

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie genau gibt man das denn in SCL an?

So?
Code:
#P_SEND_Instance(LADDR:=256,
                 DB_NO:=#Sendebereich[0],
                 DBB_NO:=#Sendebereich[0],
                 LEN:=3,
                 DONE=>#Snd_Done,
                 ERROR=>#Snd_Error,
                 STATUS=>#Snd_Status);

mfG René
 
das würde dann z.B. so aussehen :

SCL-Deklarationen :
Code:
VAR_TEMP
    DatenPtr_Adr : INT ;
    DatenPtr_ANY : ANY ;
    at_DatenPtr AT DatenPtr_ANY : STRUCT
                         ID_Code   : BYTE ;   
                         DataTyp   : BYTE ;
                         Anzahl    : WORD ;
                         DB_Nr     : INT ;
                         SpeicherPtr : DWORD ;
                      END_STRUCT ;
 END_VAR

VAR
    SendCMD_PrgChange  : STRUCT
        P       : CHAR := 'P';
        W       : CHAR := 'W';
        Komma   : CHAR := ',';
        NR_x10  : BYTE ;
        NR_x01  : BYTE ;
        CR      : BYTE := B#16#0D(*CR*);
    END_STRUCT ;
END_VAR

SCL-Code :
Code:
   DatenPtr_ANY := SendCMD_PrgChange ;
   DatenPtr_Adr := DWORD_TO_INT(SHR (IN:=(at_DatenPtr.SpeicherPtr AND dw#16#00FF_FFFF) , n:=3)) ;
    
   Send    (REQ    := Timer_Prg.Q 
           ,R      := false//NOT Programm.wechseln  
           ,LADDR  := CP_Adr 
           ,DB_NO  := at_DatenPtr.DB_Nr
           ,DBB_NO := DatenPtr_Adr
           ,LEN    := 6  
           ) ;

Kannst du damit etwas anfangen ...?

Gruß
Larry
 
Kannst du damit etwas anfangen ...?

Hatte da noch etwas Mühe ;) durchzusteigen wie wo jetzt was zugewiesen wird.
Aber es funktioniert und kommuniziert genau so wie ich das will und alles in SCL. YES!

Verstehe ich das richtig das mit:
Code:
DatenPtr_ANY := SendCMD_PrgChange ;

der ANYpointer immer die volle Grösse der Struktur oder des Arrays (von hier SendCMD_PrgChange) kriegt?

mfG René

Aber ich glaub jetzt verstehe ich es.
Habs jetzt in SCL gemacht
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja ... an der Stelle nimmt SCL dir echte Programmierarbeit ab.
Wenn du einem ANY in SCL eine Variable zuweist (die SCL kennt - also die unter SXL deklariert ist) dann beinhaltet der ANY die kompletten Informationen - egal ob BOOL, INT etc. oder STRING, ARRAY, STRUCT.
Ist das dann richtig angeordnet dann sieht das zuständige Programmteil m.E. schön übersichtlich aus.

Wenn dir an meinem Code noch etwas unklar ist dann frag bitte ...
Aber so wie du schreibst ist das ja wohl nicht so ...

Gruß
Larry
 
Wenn dir an meinem Code noch etwas unklar ist dann frag bitte ...
Aber so wie du schreibst ist das ja wohl nicht so ...

Oh das werd ich. Mit TIA ist bei mir SCL wieder stark im kommen. Wie man Pointer grundsätzlich auflöst ist mir auch klar. Aber AT und Pointer als Zwischenschritt dazu zu verwenden, auf die Idee wäre ich jetzt nicht gekommen.

mfG René
 
Zurück
Oben