Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: FCs mit ganzzahligen DB adressierung in Instanzen kapseln.

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.647
    Danke
    788
    Erhielt 654 Danke für 497 Beiträge

    Standard


    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é
    Zitieren Zitieren FCs mit ganzzahligen DB adressierung in Instanzen kapseln.  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    vollmi (27.06.2013)

  4. #3
    Avatar von vollmi
    vollmi ist gerade online Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.647
    Danke
    788
    Erhielt 654 Danke für 497 Beiträge

    Standard

    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é

  5. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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

  6. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    vollmi (27.06.2013)

  7. #5
    Avatar von vollmi
    vollmi ist gerade online Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.647
    Danke
    788
    Erhielt 654 Danke für 497 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    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

  8. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    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

  9. #7
    Avatar von vollmi
    vollmi ist gerade online Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.647
    Danke
    788
    Erhielt 654 Danke für 497 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Larry Laffer Beitrag anzeigen
    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é

Ähnliche Themen

  1. Mit libnodave FCs in S7-315 übertragen
    Von Mibra im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 09.09.2011, 14:47
  2. DINT nach INT bei positiven und ganzzahligen Werten (Frequenzmessung)
    Von poppycock im Forum Programmierstrategien
    Antworten: 9
    Letzter Beitrag: 23.07.2009, 21:28
  3. RS-Flipflops in FCs mit Eingangsvariablen
    Von sk1rie im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 14.11.2008, 08:50
  4. CFC Pläne kapseln
    Von Brainyboy im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 12.09.2007, 13:37
  5. Antworten: 1
    Letzter Beitrag: 24.06.2003, 22:14

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •