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

Ergebnis 1 bis 4 von 4

Thema: Speicherbedarf nach Verwendung von "Struct"

  1. #1
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo alle miteinander...

    ich habe eine FC mit mehreren Durchgangsparametern geschrieben, welche einen Speicherbedarf von ca. 460 byte hat... so weit so gut.
    Um die Durchgangspara's leichter abzulegen habe ich in einem DB und in besagten Fc einen Struct-Bereich angelegt und gleich benannt.
    Nur ist jetzt der Speicherbedarf der FC auf fast 1400 byte gestiegen !?

    Woran liegt das - und viel wichtiger -> weis einer eine speicherschonende Lösung ???

    Ich habe schon mit any und SFC20 gespielt - komme aber nicht weiter.

    Danke im voraus

    Andreas
    Zitieren Zitieren Gelöst: Speicherbedarf nach Verwendung von "Struct"  

  2. "Danke, die Werte sprechen wirklich für sich...

    Schade eigendlich, war so schön einfach


    Werde Deinen Ratschlag mit den Pointern umsetzen - Danke für die rasche Antwort..."


  3. #2
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Hallo Andreas,

    zu diesem Thema hatte ich mal bei Siemens einen Beitrag gelesen und habe ihn auch wieder gefunden. Die Zahlen in der Tabelle sind schon sehr interessant.

    (Nachtrag: Siemens-Beitrag existiert leider nicht mehr)
    http://support.automation.siemens.co...ew/de/13904362

    Die Kombination FC-UDT-IN_OUT ist vermutlich eine sehr ungünstige Kombination. Sehr viel günstiger geht es, wenn du als Bausteinparameter einen Pointer verwendest, der auf deine Datenbereich zeigt. In der FC kannst du dann über die Adressregister indirekt auf deine Daten zugreifen. Beispiele findest du hier im Forum. Vielleicht postet ja auch noch jemand ein kleines Beispiel.


    Gruss, Onkel
    Geändert von Onkel Dagobert (08.03.2006 um 16:40 Uhr)

  4. #3
    Andreas Henkel Gast

    Standard

    Danke, die Werte sprechen wirklich für sich...

    Schade eigendlich, war so schön einfach


    Werde Deinen Ratschlag mit den Pointern umsetzen - Danke für die rasche Antwort...

  5. #4
    Registriert seit
    06.10.2003
    Beiträge
    3.413
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Andreas,

    keine Panik, es bleibt immer noch einfach, sofern das Prinzip erst einmal klar ist.
    Falls ich deine Programmbeschreibung richtig verstanden habe, könnte dir folgendes Beispiel helfen. Der Pointer "HMI_DATEN_BEDIENUNG" ist ein Eingangsparameter und zeigt auf deinen struct im DB. Im ersten Netzwerk werden die Daten des struct in die temporären Lokaldaten kopiert. "P" ist der selbe struct der auch im DB verwendet wird! Am Ende des Bausteins werden die Lokaldaten wieder in den DB zurück kopiert.

    Es sind quasi selbstgestrickte statische Lokaldaten, jedoch in einer FC. Diese Vorgehensweise hat gegenüber der Verwendung eines FB mit statischen Lokaldaten einige Vorteile. Man kann in einer FC sehr viel besser als in einem FB mit AR1/AR2 umgehen und man hat die Vorzüge der Datenablage in einem Global-DB. Das Hin- und Herkopieren lohnt sich erst richtig bei umfangreichen FC-Bausteinen.

    Zwischen dem ersten und letzten Netzwerk kannst du wie bei deiner jetzigen Variante mit den Lokaldaten arbeiten.


    Code:
    FUNCTION "MUSTER" : VOID
    TITLE =
    AUTHOR : Onkel
    FAMILY : PID
    NAME : HMI_PID
    VERSION : 0.1
    
    
    VAR_INPUT
      HMI_DATEN_BEDIENUNG : POINTER ;	//Datenfeld im DB
    END_VAR
    VAR_TEMP
      P : "UDT_M3V_UNI";	// UDT (struct)
      TEMP_AR1 : DWORD ;
      TEMP_INT : INT ;	
    END_VAR
    BEGIN
    NETWORK
    TITLE =Datenbereiche in Lokaldaten kopieren
    
    
    //****************************************************************************
    //*** AR1 sichern
    //****************************************************************************
          TAR1  #TEMP_AR1; 
          SET   ; 
          SAVE  ; 
    
    //****************************************************************************
    //*** Datenfeld in Lokaldaten kopieren
    //****************************************************************************
    //*** AR2 auf Datenfeld
          L     P##HMI_DATEN_BEDIENUNG; 
          LAR2  ; 
          L     W [AR2,P#0.0]; 
          T     #TEMP_INT; 
          AUF   DB [#TEMP_INT]; 
          L     D [AR2,P#2.0]; 
          LAR2  ; 
    
    //*** 100 Byte vom Datenfeld in Lokaldaten kopieren
          LAR1  P##P; 
          L     25; 
    LOO3: T     #TEMP_INT; 
          L     DBD [AR2,P#0.0]; 
          T     LD [AR1,P#0.0]; 
          +AR1  P#4.0; 
          +AR2  P#4.0; 
          L     #TEMP_INT; 
          LOOP  LOO3; 
    
    NETWORK
    TITLE =Eigentliches Programm
    
    // Hier gewohnt mit den Lokaldaten arbeiten
    
    NETWORK
    TITLE =Lokaldaten in Datenbereiche zurückschreiben
    
    
    //****************************************************************************
    //*** Lokaldaten in Datenfeld kopieren
    //****************************************************************************
    //*** AR2 auf Datenfeld
          L     P##HMI_DATEN_BEDIENUNG; 
          LAR2  ; 
          L     W [AR2,P#0.0]; 
          T     #TEMP_INT; 
          AUF   DB [#TEMP_INT]; 
          L     D [AR2,P#2.0]; 
          LAR2  ; 
    
    //*** 100 Byte von Lokaldaten in Datenfeld kopieren
          LAR1  P##P; 
          L     25; 
    L997: T     #TEMP_INT; 
          L     LD [AR1,P#0.0]; 
          T     DBD [AR2,P#0.0]; 
          +AR1  P#4.0; 
          +AR2  P#4.0; 
          L     #TEMP_INT; 
          LOOP  L997; 
    
    //****************************************************************************
    //*** AR1-Register wiederherstellen
    //****************************************************************************
    
          LAR1  #TEMP_AR1; 
    
          BE    ; 
    
    
    END_FUNCTION


    Gruss, Onkel

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 16.03.2012, 18:20
  2. Verwendung von SFB 104 "IP_CONF"
    Von Marcus im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 22.02.2012, 12:20
  3. Verwendung "normaler" SPS'n nach 13849
    Von istat_gb im Forum Maschinensicherheit - Normen und Richtlinien
    Antworten: 15
    Letzter Beitrag: 22.07.2009, 12:35
  4. Antworten: 8
    Letzter Beitrag: 16.05.2008, 11:26
  5. AWL: "SFB 3 TP" Verwendung in einem FB?
    Von hans55 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 17.02.2008, 21:11

Lesezeichen

Berechtigungen

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