Speicherbedarf nach Verwendung von "Struct"

A

Anonymous

Guest
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
 
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.com/WW/view/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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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...
 
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
 
Zurück
Oben