Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

HILFE! wie funktioniert die Speicher aufteilung???

bolle
2007-05-25
2007-05-30
  • bolle - 2007-05-25

    Hallo alle miteinader

    bin gerad auf ein riesenproblem gestossen.hab a prog geschreiben was ungefaehr um die 100 luefter steuern soll.hab natuerlich erstmal eins fuer einen einzelnen geschrieben und getestet .hat auch also so funktioniert wie ich es wollte aber als ich des dann 25 mal kopiert hab und das ganz uebersetzen wollte , war der speicher voll

    so und jetzt ist meine frage

    wie läuft des mit der speicheraufteilung

    auf der wago hp steht

    wago 750-842 plc controller

    Feldbus Eingangsprozessabbild max. (Byte)   512 Byte
    
    Feldbus Ausgangsprozessabbild max. (Byte)   512 Byte
    
    Eingangsvariablen max.  512 Byte
    
    Ausgangsvariablen max.  512 Byte
    
    Konfiguration   Mit Funktionsbaustein
    
    Programmspeicher    128 kByte
    
    Datenspeicher   64 kByte
    
    Remanentspeicher (retain)   8 kByte
    

    bis jetzt hab ich rausgefunden das prozessabbild fuer die an die klemmen angelegten signale stehen egal ob aus- oder eingang.in meinem fall sind es nur boolsche var.(bestehen aus einem wort also 16 bit also 2 byte ergo kann ich maximal 265 variablen die durch %iq bzw. %qx den klemmen zuweisen)So.unter dem eingangsvariablen werden alle die variablen betrachtet die uber das ISA-net protokoll verschickt werden also alle die die über den rj 45 anschluss ausgegeben bzw eingelesen werden.

    sind des dann wieder %qx bzw. %IX zuweisungen oder was?

    der remanentspeicher ist fuer die remanenten daten zustaednig also fuer alle die die mit AT %MX0.0 zugewiesen werden.

    was ist aber mit variablen die gar keine zuweisung bekommen welchen speicher verbrauchen die?????

    und wie wär die gloabalen variablen gehandhabt(spielen bei mir ne sehr grosse rolle)???

    bei mir kommt naemlich die fehlermeldung das die globalen vairablen den speicherplatz verbraucht haben

    und wie läuft das jetzt mit dem daten bzw. programmspeicher ab?

    ich weiss sind jetzt a bissl viel fragen;)

    ein guter link fuer die speicherverwaltung des plc controllers wuerde mich schon voll zufrieden stellen, allerdings hab bis jetzt keinen gefunden=(

    ich häng des prog einfach mal dran

    danke im vorraus an alle !;)

    MFG BOLLE

    Tiefgaragensteuerung_alpha_2forum.pro [314.82 KiB]

     
  • Knodelpa - 2007-05-25

    Hallo Bolle,

    du hast für jeden Lüfter ein eigenes Programm verwendet. Ich denke wenn es Dir gelingt stattdessen je eine Instanz eines FB's zu verwenden, sollte der Speicherbedarf deutlich sinken.

    Gruß Paul

     
  • bolle - 2007-05-27

    hallo

    geh mal davon aus das du hast mal reingeschaut in den anhang von mir.

    danke fuer die antwort aber bin mir jetzt net ganz sicher was du mit instanz meinst,soll ich die lueftereinheit PRG in funktionsbloecke umwandeln also in fb s???

    en link wo des mit der speicherverwaltung erklärt wird kennst net vielleicht ???

     
  • Anonymous - 2007-05-27

    Originally created by: Andy :-)

    Hallo Bolle,

    ob nun Programm oder FB ist nur endscheidend, wenn die Programme in einer eigenen Task aufgerufen werden (eigenes Prozessabbild).

    Bei der Menge an Lüftermotoren hätte ich allerdings auch FB's verwendet und diese als Array in einem Prog deklariert...

    zB.: Luefter :ARRAY [1..100] of FB_Luefter (Aufruf dann Luefter[18] )

    Schlecht (wegen dem Speicher) ist allerdings die Instanzierung (Deine FB's mit der Instanz der Timer, nur um die Bezeichner anzupassen...) Timer direkt aufrufen -> mehr Speicher (frei)...

    Also:

    -> Lüfter Progs in FB's umschreiben

    -> Timer in den neuen Lüfter FB's direkt instanzieren

    Eine weitere Optimierung wäre aus meiner Sicht, die Zykluszeit auf einen festen Wert zu setzen und damit die Timer zu ersetzen

    (das schafft richtig Platz und ist auch noch schneller) - Deine Anwendung sieht nicht so aus, als ginge es um die Millisekunde

    zB.:

    IF Zykluszaehler MOD 10 = 0 THEN ( TRUE jede volle Sekunde (Zyklus 100ms) )

    ....

    Die Speicheraufteilung des 841'er steht im Handbuch...

    Link: http://www.wago.com/wagoweb/documentati ... 84100d.pdf

    Seite 64

    Die jeweilige Speichergrösse in den technischen Daten.

    mfg

    Andy

     
  • bolle - 2007-05-29

    danke an alle schon mal fuer die hilfe

    werd die verbesserungen gleich mal vornehmen.

    ABER....... (;

    en paar fragen sind noch offen

    is das denn oft so das der speicherplatz von solchen progs net ausreicht???

    haett gemeint das der 750-842er eh zu den controllern gehoert die doch relativ viel speicherplatz haben.

    mich wunderts eh das in der heutigen zeit von 2 gb auf en paar qcm nur so wenig auf nem sps controller drauf sind,mit so nem 2gb teil wuerden doch solche probleme nie auftreten.(nie vielleicht nich aber auf alle faelle wär wesentlich mehr platz vorhanden)

    zu deiner aussage

    Zitat:

    Bei der Menge an Lüftermotoren hätte ich allerdings auch FB's verwendet und diese als Array in einem Prog deklariert...

    zB.: Luefter :ARRAY [1..100] of FB_Luefter (Aufruf dann Luefter[18] )

    was meinst du mit FB s als array in einem prog deklarieren???

    soweit ich weiss sind arrays symbolfelder in die bestimmte infos abgelegt werden koennen,was hat das mit meinen fbs zu tun???

    MFG Bolle

     
  • Erik Böhm - 2007-05-29

    Hi

    Also 1. sind z.B. 2GB mit einem 16Bit Controller nur sehr schwer zu addressieren und der Controller wird dann auch 'ein wenig' teurer...

    1. Lies doch mal das Handbuch zum Thema "Instanzen von Funktionsblöcken". Da ist das detailiert beschrieben.

    2. Ein Array ist eine Aneinanderreihung von Objekten. Das können auch Funktionsblöcke oder Strukturen sein.

    Gruss

    Erik

     
  • bolle - 2007-05-30

    hallo an alle

    ich hab jetzt fast alle vorgeschlagenen aenderungen vorgenommen(timer bausteine direkt instanzieren ,lueftereinheit progs in FBs umwandeln,bei der )hat mir aber leider kaum speicher vorteile gebracht.speicher verbrauch hat sich von 3084 bytes auf 3102 bytes pro luefter FB verändert,war also net wirklich ne ersparnis.

    zur zykluszeit:kann ich die zykluszeit nur mit einer schleife aendern

    zB.:

    IF Zykluszaehler MOD 10 = 0 THEN ( TRUE jede volle Sekunde (Zyklus 100ms) )

    oder geht des auch anders???

    bei der idee mit den arrays blick ich noch net ganz durch,hab noch nie mit arrays gearbeitet!

    so wie ich des verstanden hab soll ich also den einzelnen FB luefter mehrmals instanzieren,also ihm praktisch eingangswerte zuweisen ,den FB abarbeiten lassen und danach neue eingangswerte zuweisen und wieder abarbeiten lassen oder???

    aber die fbs haben interne zeiten ,geht das dann trotzdem.ich haette gesagt das diese instanzierung nur mit zeitunabhaengigen FBs

    funktioniert oder??

    hab mein prjekt mal angehaengt falls jemand mal reinschauen will hoff=)

    danke im vorraus an alle

    Tiefgaragensteuerung_alpha_2forum.pro [58.88 KiB]

     
  • Erik Böhm - 2007-05-30

    Mahlzeit

    Eine FB Instanzierung würde so aussehen:

    Luefter: array[1..100] of FB_Luefter;

    Der Aufruf sieht dann (in ST) so aus:

    Luefter1;

    Luefter2;

    .

    .

    .

    Luefter100;

    Das geht auch in einer Schleife

    FOR i:=1 TO 100 DO

    Luefteri;

    end_for

    Das wird am Speicherverbrauch aber wiederum kaum etwas ändern, weil für jede Instanz ein eigener Speicherbereich reserviert wird. Das muss auch so sein, weil ansonsten nach jedem Aufruf die internen Variablen verloren wären.

    Um Speicher zu sparen gibts nur die möglichkeit eine FUNCTION zu benutzen. Die belegt nur während der Ausführung Speicher, behält aber natürlich keine Variablenzustände.

    Du musst also alle Variablen (z.B. Timer) extern deklarieren und beim Aufruf an die Funktion übergeben und nach Ausführung wieder übernehmen. Da drängen sich dann IN_OUTPUT Variablen auf.

    Deklariert als VAR_IN_OUT. Die werden an die Funktion als Referenz (Pointer) übergeben.

    Ich denke deine Verwirrung ist damit perfekt, aber das ist meiner Meinung nach die einzige Lösung.

    Gruss Erik

     
  • bolle - 2007-05-30

    hi erik

    danke fuer die antwort

    aber die verwirrung is jetzt wirklich perfekt=)

    kann dir nich ganz folgen

    was Timer sind weiss ich ,aber was meinst mit"alle Variablen (z.B. Timer) extern deklarieren und beim Aufruf an die Funktion übergeben und nach Ausführung wieder übernehmen."???koenntest des anhand von nem FUP bsp deutlich machen

    kann man in meinem fall IN_OUT_Variablen ueberhaupt nutzen???

    des sind doch Var die von den instanzen"durchgereicht" werden und jede bearbeiet sie dann und gibt sie dann wieder weiter.

    haett gmeint sowas is nur nuetzlich fuer zahlenwerte die verarbeitet werden muessen,bei boolschen variablen bringt des doch nix oder????

    mal ganz was anderes

    bin irgendwie entäuscht von dem controller wago 750-842 haette wirklich gemeint da kann man mehr mit anfangen.haette gedacht das er in sachen speicher eher zur oberen schicht gehoert oder gibts da welche mit noch mehr???

    liegt des an meiner fehlenden programmiererfahrung ergo nich sehr effektiven programm oder is sowas eher fuer kleiner progs gedacht ?

    ich mein normalerweise werden doch damit noch viel komplexerer aufgaben geloest,versteh die welt nich mehr =(

    Bolle

     
  • Oberchefe - 2007-05-30

    der 750-842 hat 128 kByte Programmspeicher und 64 kByte Datenspeicher sowie 8 kByte Remanentspeicher, da hättest Du besser den 750-841 genommen, der hat 512 kByte Programmspeicher und 128 kByte Datenspeicher sowie 24 kByte Remanentspeicher. Abgesehen davon hat er einen 32 Bit Prozessor (statt des 16 Bit Prozessors im 750-842).

    Ich würde mir allerdings Gedanken machen ob die Globalen Variablen wirklich alle global sein müssen, Variablen können auch übergeben werden.

     
  • bolle - 2007-05-30

    hi

    macht des etwas nen unterschied ob global oder nicht???oder was meinst mit"Variablen können auch übergeben werden."

    die sache is die:

    mein prog dient zur steuerung von jet lueftern , d.h. so ca 50 stueck sollen damit angesteuert werden.Um strom spitzen beim anschalten zu vermeiden muessen sie allerdings alle zu verschiedenen zeiten angeschaltet werden ergo sie muessen alle einzeln ansteuerbar sein deswegen die hohe anzahl an globalen variablen.Ausserdem kann es vorkommen das die leufter nochmal interne sensoren haben die auch alle einzeln ausgewertet sollen,zusätzliche dazu kommt noch das es verschiedene typen an leuftern sind die teilweise verschiedene einschalt- und trudelzeiten haben.

    daher kommt die hohe anzahl an globalen variablen

    (sorry das ich die ganze zeit mit gegenfragen komm aber ich bin noch ziemlich gruen hinter den ohren;) )

    und moecht mich jetzt schon mal fuer deinen rat bedanken

     
  • Erik Böhm - 2007-05-30

    Hallo

    1. Also der 750-842 ist nicht unbedingt am oberen Ende der Performance, was SPS'en angeht. Eher am unteren. Eine SPS auf momentanem Stand der Technik hat normalerweise einen 32 Bit Prozessor und mehrere MB RAM und FLASH-Speicher.

    2. Globale Variablen belegen Speicher, und zwar dauernd, rund um die Uhr. Lokale Variabeln (in Funktionen) belegen den Speicher nur zur Laufzeit, also nur solange die Funktion aktiv ist. Deshalb: alles was nicht Global sein MUSS als lokale Variable definieren.

    3. Ich kann kein FUP (will ich auch gar nicht können...).

    Ohne jemanden beleidigen zu wollen: Diese Lego-Kästchen programmierung ist schon vor 10 Jahren veraltet gewesen.

    Echte Programmierer schreiben ihren Code noch mit Tinte

    1. Wenn man das ganze 'Objektorientiert' betrachtet, ist das Objekt der Lüfter, mit diversen spezifischen Eigenschaften. Diese Eigenschaften werden in einer Funktion abgebildet, die mit entsprechendem Input versorgt werden muss und dann dementsprechenden Output erzeugt.

    Falls dieser Output das weitere Verhalten des Objekts beeinflussen soll, muss du dir das in einer globalen Variable merken.

    Das Forum ist ja ne feine Sache, aber es ist eigentlich nicht als Ersatz für einen Programmierkurs tauglich

    Trotzdem: Bei Fragen -> fragen.

    Gruss Erik

     
  • bolle - 2007-05-30

    passt jetzt hab ichs auch verstanden=)

    da ich kein echter Programmierer bin sondern noch studierender Mechatroniker darf ich FUP benutzen

    Jedem das seine und mir FUP, find des einfach uebersichtlicher aber im grunde genommen bleibts sich gleich.man kann ja eh alles mit allem kombinieren.

    Viele wegen fuehren nach Rom!

    en programmierkurs kanns net ersetzen aber da von der loesung dieses problems die Zukunft meines ganzen Praxisemesters abhing und diese schon halb um ist war ich diesml a bissl hartnäckiger

    aber DICKES DANKE an alle die mir dabei geholfen

     
  • Erik Böhm - 2007-05-30

    Hi

    Na also. Geht doch.

    Hast du's auch wirklich verstanden, oder nur aufgegeben weil ich so 'pampig' geworden bin ? War nicht bös gemeint, aber das musste einfach mal gesagt sein.

    Gruss

    Erik

     
  • bolle - 2007-05-30

    na eh klar,ich war ja auch ziemlich nervig aber muss halt naechsten di die loesung fuer des ganze prob erläutern und wenn ich da mit leeren haenden da gestanden waer ,haette es keinen guten eindruck gemacht.Aber wie gesagt DANKE

    warst eh sehr geduldig

    denk schon das ichs verstanden hab

    mein denkfehler ,vermut ich, lag darin das ich gemeint haette man kann externe signal nur auf globale variablen legen deswegen gibts da auch so viele bei mir ,aber des is ja net zwingend

    (hoff echt das ich mich jetzt net bis auf die knochen blamier weil ichs doch net gecheckt hab )

     

Log in to post a comment.