CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Mo Jan 21, 2019 10:14 pm

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 52 Beiträge ]  Gehe zu Seite 1 2 3 4 Nächste
Autor Nachricht
 Betreff des Beitrags: SP RTE Speicher reservieren ...
BeitragVerfasst: Sa Feb 12, 2011 10:59 am 
Offline

Registriert: Do Jan 10, 2008 7:35 am
Beiträge: 29
Hallo,

ich bin der Meinung das ich schon öfters in der RTE Speicher allokiert habe.
Wobei ich sagen muss ich teste gerade auf meinem Laptop ohne jeglichen Controller.

pnt: pointer to Array[0..99] of String;

pnt := SysMemAlloc(Sizeof(pnt^));

Warum bekomme ich hiermit keinen Zeiger zurück ???


MacToolz


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Sa Feb 12, 2011 1:46 pm 
Offline

Registriert: Do Jan 10, 2008 7:35 am
Beiträge: 29
Hi,

super, steht ganz klar in der Doku.

Kann mir jemand erklären was das für einen Sinn macht ???


MacToolz


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Di Feb 15, 2011 12:13 pm 
Offline

Registriert: Mo Okt 13, 2008 2:14 pm
Beiträge: 10
liefert denn die SIZEOF- Funktion denn überhaubt etwas zurück?
du greifst ja auf die Referenz eines Zeigers zurück die nicht existiert!
versuch es mal mit einer statischen Übergabe der Größe (in deinem Bsp. 100*String=100*80=8000)

Grüße
Klaus


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Di Feb 15, 2011 1:34 pm 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 190
Wohnort: Bei Ulm
Moin

Ich hab auch den Eindruck das wäre ein Fehler.
SysMemAlloc liefert auch mit Aufruf "dwAlloc := SysMemAlloc(5);" auf der RTE und in der Simulation nur eine NULL zurück.

iSize := SIZEOF(pnt^);
liefert korrekt 8100 zurück.

Gruß
Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Di Feb 15, 2011 2:41 pm 
Offline

Registriert: Mo Okt 13, 2008 2:14 pm
Beiträge: 10
In der Hilfe wir darauf hingewiesen das 0 zurückgeliefert wird, wenn nicht genügend Speicher vorhanden ist:
Zitat:
Als Rückgabewert erhält man entweder den Pointer auf den reservierten Speicherplatz oder 0, wenn nicht soviel Platz wie angefordert, verfügbar ist. Dieser Rückgabewert sollte immer geprüft werden, auch wenn nur ein kleiner Speicherbereich allokiert werden soll !


Als Hinweis wird noch erwähnt:
Zitat:
Hinweis: Die Funktion wird von CoDeSys SP RTE nicht unterstützt.


Vielleicht hilft das noch weiter bei der Problemfindung


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Di Feb 15, 2011 4:35 pm 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 190
Wohnort: Bei Ulm
Hallo zusammen

1.
Zitat:
ich bin der Meinung das ich schon öfters in der RTE Speicher allokiert habe.

oder
Zitat:
Hinweis: Die Funktion wird von CoDeSys SP RTE nicht unterstützt.


Es kann ja nur Eins von Beiden richtig sein...

2. Ich programmier ja jetzt auch schon länger mit CoDeSys, frage mich (oder besser den Ersteller des Threads) aber immer noch: Wofür überhaupt Speicher allokieren ?
Das passiert doch automatisch.
Auch in anderen Threads gabs ja schon diverse Fragen zu dem Thema, und auch da habe ich keine Antwort auf diese Frage bekommen.

Gruß
Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Mi Feb 16, 2011 6:43 am 
Offline

Registriert: Mo Okt 13, 2008 2:14 pm
Beiträge: 10
Hey

Zitat:
Wofür überhaupt Speicher allokieren ?

Ich denke zur dynamischen Speicherverwaltung, doch sehe ich das in einem SPS Programm generell auch als kritisch an!

Wenn es ansonsten im RTE funktioniert hat, kann es auch sein das kein Speicher mehr frei ist und deshalb eine 0 zurückgeliefert wird, oder?

Letztendlich ist es doch immer eine Frage des Targets wie und ob die Funktionen unterstützt werden.

Benötigt man nur den Zeiger und die Referenz ist eh immer gleich Groß, kann man sich auch den Zeiger von der Referenz holen:
Code:
VAR
   arString:    ARRAY[0..99] OF STRING;
   dwPointer:   DWORD;
END_VAR

dwPointer:=ADR(arString);


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Mi Feb 16, 2011 4:47 pm 
Offline

Registriert: Mi Jan 11, 2006 10:18 am
Beiträge: 10
Wohnort: Fulda
Hi.
KlOis hat geschrieben:
Ich denke zur dynamischen Speicherverwaltung, doch sehe ich das in einem SPS Programm generell auch als kritisch an!

Und wozu sollte man sowas brauchen?! Mir fällt keine App ein wo das zwingend nötig wäre. Ich erkenne da auch einfach die praxisrelevanten Aussagen von Erik wieder, für einen Anlagenprogrammierer ist dyn. Speicherreservierung eigentlich kein Thema. Denn eine SPS ist im eigentlichen Sinne kein Datensammler, dafür gibts FTP, DB-Systeme & Co.. Wozu dann also dynamisch Speicher allokieren? Das würde mich auch mal interessieren. Mehr als "Rumspielerei" erwarte ich da auch ehrlich gesagt nicht.

Was das Thema Speicherreservierung angeht:
Das ist absolutes Detailwissen welches wohl die wenigen die selbst täglich mit Codesys zu tun haben kennen. Ich weiss dass es von 3S regelmäßig "Expertentreffen" gibt, dort werden solche Details auch diskutiert. Oder an den Support wenden. In der Praxis halte ich dieses Wissen aber für irrelevant außer "nice-to-know". Generell stimme ich dir aber, dass das kritisch ist. Selbst Pointer sind absolut kritisch. Wer mal einen Pointer in den Wald gesetzt weil er z.B. die Adresse nicht zyklisch aktualisiert wurde und dadurch seine Maschine/Steuerung abballert hat ganz viiiel Spass bei der Fehlersuche. :wink:

Gruß Andy


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Mi Feb 16, 2011 4:54 pm 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 190
Wohnort: Bei Ulm
Servus

Ich hab eigentlich nichts gegen Pointer. Sind ne feine Sache, wenn man weiss was man tut.
Nutzen wir teilweise auch recht ausgiebig.

Das Pointer Modell einem 'klassichen' SPS Programmierer zu erklären ist immer wieder interessant ;-)

Aber allokieren muss ich deshalb trotzdem nicht. Zumal dadurch das Ganze noch lange nicht dynamisch wird.
Das Array hat immer noch feste Grenzen.

Gruß
Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Do Feb 17, 2011 6:57 am 
Offline

Registriert: Mo Okt 13, 2008 2:14 pm
Beiträge: 10
Moin,

halte es auch nicht für sinnvoll (dyn. Speicherverwaltung), außer man soll viele Daten sammeln, was wie schon erwähnt am besten anders geschieht.
Doch nicht immer kann man es sich aussuchen!
Deshalb die Suche nach einer solchen Lösung!

Zitat:
Aber allokieren muss ich deshalb trotzdem nicht. Zumal dadurch das Ganze noch lange nicht dynamisch wird.
Das Array hat immer noch feste Grenzen.


Nein.

Man bestimmt durch das allokieren wieviel Speicher belegt wird.

wenn man einen Pointer anlegt, z.B.
Code:
ptArray:  POINTER TO ARRAY[1..255] OF BYTE;

Dann sind die 255 Byte noch nicht reserviert.
Wenn man Speicher allokiert, z.B.:
Code:
ptArray:=SysMemAlloc(10);

Hat man nur 10 Byte Speicher reserviert.
Sollte jedoch aufpassen das man nicht auf Elemte > 10 zugreift ^^

Deshalb --> unsauber und sollte vermieden werden!
Aber dynamisch ist es doch, nur die Obergerenze wird in der Deklaration festgelegt (Bei meinen Bsp.).

MfG
KlOis


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Do Feb 17, 2011 7:34 am 
Offline
Häufiger Nutzer
Häufiger Nutzer
Benutzeravatar

Registriert: Do Apr 07, 2005 1:22 pm
Beiträge: 190
Wohnort: Bei Ulm
Moin

Wenn man einen Pointer anlegt, dann wird (ausser den 4Byte für den Pointer) kein Speicher reserviert.
Der Pointer zeigt aber (physikalisch) auch nirgends hin. Was hab ich dann davon ?

Gruß
Erik

_________________
Wer Rechtschreibfehler findet darf sie behalten...


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Do Feb 17, 2011 9:02 am 
Offline

Registriert: Mo Okt 13, 2008 2:14 pm
Beiträge: 10
Servuz,

Zitat:
Wenn man einen Pointer anlegt, dann wird (ausser den 4Byte für den Pointer) kein Speicher reserviert.
Der Pointer zeigt aber (physikalisch) auch nirgends hin. Was hab ich dann davon ?


Nix, solang man dem Pointer kein Speicherbereich "zeigt".
Wenn man mit der Funktion SysMemAlloc(); Speicher reserviert, liefert diese einen Zeiger auf den allokierten Bereich zurück --> man hat solang man nix reserviert nur 4Byte verbraten.
Nachdem man den Inhalt seines reservierten Bereichs ausgewertet hat --> Speicher wieder freigeben.

Diese Art der Programmierung hat dann nicht mehr viel mit SPS ansich zu tun.
Es ist mehr für die Daten- sammlung und - auswertung von Nutzen.

Ich habe mal einwenig damit experimentiert.
Trotz dessen das ich nur auf allokierten Bereich zugegriffen hatte, kam nach mehrfachen allokieren und freisetzten von Speicherbereichen unterschiedlicher Größe, bei einem Speicherzugriff eine Access violation.

Also Achtung und alles mit Vorsicht zu genießen.

Grüße
KlOis


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: So Feb 20, 2011 2:14 am 
Offline

Registriert: Do Jan 10, 2008 7:35 am
Beiträge: 29
Hallo zusammen,

als erstes wollte ich erwähnen dass in CoDeSys V.2.3 es keine Dynamischen Speicher gibt. Einen Speicher zu allokieren heißt noch lange nicht
das er dynamisch ist.
Dynamische Speicherrervierung ist erst dann dynamisch wenn er zur Laufzeit seine Größe verändert werden kann.

Sobald ein Array mit einer Indexgröße deklariert wurde wird beim übersetzen der Speicher für die Größe des Arrays reserviert.

arr: array[0..9] of Byte; --> folglich 10 Byte direkt durch compiler reserviert.

Bei einem Zeiger wird erstmal ein DWORD als größe im Speicher belegt, dass bedeutet 4Byte.

pntArr: array[0..9] of Byte; --> 4Byte

Aber auch hier kann man von keiner dynamischen Allokierung sprechen. Weil die Feldgröße vom Array fest deklariert ist.
Wenn man mit dem Zeiger Speicher reservieren will, durch SysMemAlloc, wird auch nur für die Größe
des Arrays Speicher reserviert. Selbst wenn man versuchen würde und über die Größe die an SysMemAlloc übergeben wird
eine größere Anzahl von Bytes reservieren wollte z.B. 20, wird als SizeOf(pntArr) = 10 Bytes zurück gegeben.

Nur dann frage ich mich, wo sind die anderen Bytes hin ???

Wozu braucht man denn Zeiger in CoDeSys. Ich könnte mir vorstellen wenn man größere FBs hat, diese über einen Zeiger
zur Laufzeit den FB allokieren und wenn dieser nicht mehr benötigt wird wieder frei zu geben.

Oder halt zur Laufzeit gewisse Anzahl von Bytes zu allokieren, Daten darin zu verarbeiten und wieder frei zu geben.
In einem Programm mit Zeiger zu arbeiten ist vom Prinzip her das beste. Schnell, schneller geht es nicht, klar es liegt noch daran
was dahinter an Quelltext liegt um mit dem Pointer zu arbeiten aber effektiv und Speicher sparend.

Oder man hat ein

arrPntListFb: array[0..9] of dword;

und speichert hier viele verschiedene Adressen verschiedener FBs und man arbeitet mit dem Zeiger zu einem FB.
Gut was dann dazu kommt das man wissen muss wie der FB aufgebaut ist damit man über die einzelenen Offsets der Variabeln
den Zeiger verbiegt um an die Variabeln Werte zu kommen.

Sicherlich sind Zeiger absolut gefährlich. Man ist sehr schnell da wo man nicht hin soll und die Steuerung steht ruck zuck. Ganz klar.

Man darf aber nicht vergessen die ganzen Bibliotheken sind nicht in CoDeSys geschrieben sondern mindestens in C und dort
werden definitiv Zeiger verwendet.

Aber die schöne diskussion hat aber meine Frage nicht ganz beantwortet. Ich bin mir eigentlich sicher
das die RTE den SysMemAlloc Befehl ausgeführt hat und jetzt nicht mehr. Obwohl die Anleitung schreibt das es nicht geht.
Bin gerade irgendwie verwundert.

Ich muss jetzt ins Bett .... bis später zur weiteren diskussion


MacToolz


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Mo Feb 21, 2011 7:06 am 
Offline

Registriert: Mo Okt 13, 2008 2:14 pm
Beiträge: 10
Moin Moin,
Zitat:
Selbst wenn man versuchen würde und über die Größe die an SysMemAlloc übergeben wird
eine größere Anzahl von Bytes reservieren wollte z.B. 20, wird als SizeOf(pntArr) = 10 Bytes zurück gegeben.

Ich denke mal du meinst
Code:
SizeOf(pntArr^)
.
Und den hast du als
Code:
pntArr: POINTER TO array[0..9] of Byte;

deklariert. Deshalb gibt er immer 10 als Rückgabewert. Die Funktion "SizeOF()" weiß einfach nicht ob und wann du Speicher allokiert hast, sie gibt zurück wie groß der Speicherbereich sein sollte auf den der Pointer zeigt.
Zitat:
Nur dann frage ich mich, wo sind die anderen Bytes hin ???

Die Stehen hinten dran. Ich weiß nicht was passiert wenn du auf pntArr^[11] z.B. zugreifst, aber theoretisch sollte da dein 12. Element stehen.

Doch können die, die es nur benutzen, also wir, doch nur raten. Vielleicht kann sich in diesem offiziellen 3S Forum ja mal einer von 3S äußern.

Zitat:
Aber die schöne diskussion hat aber meine Frage nicht ganz beantwortet. Ich bin mir eigentlich sicher
das die RTE den SysMemAlloc Befehl ausgeführt hat und jetzt nicht mehr. Obwohl die Anleitung schreibt das es nicht geht.
Bin gerade irgendwie verwundert.

Benutzt du seit dem ein anderes Target? Vielleicht das gleiche, aber eine neuere Version?

Gruß
Klaus


Nach oben
   
 Betreff des Beitrags: Re: SP RTE Speicher reservieren ...
BeitragVerfasst: Mo Feb 21, 2011 10:07 am 
Offline

Registriert: Do Jan 10, 2008 7:35 am
Beiträge: 29
Hi,

KlOis hat geschrieben:
Doch können die, die es nur benutzen, also wir, doch nur raten. Vielleicht kann sich in diesem offiziellen 3S Forum ja mal einer von 3S äußern.

was meinst du damit, ich kann gerade nicht folgen.


KlOis hat geschrieben:
Benutzt du seit dem ein anderes Target? Vielleicht das gleiche, aber eine neuere Version?

Da habe ich schon nachgeschaut. Ich muss das nochmal prüfen was das ist. Laut Anleitung soll es ja nicht gehen.

KlOis hat geschrieben:
deklariert. Deshalb gibt er immer 10 als Rückgabewert. Die Funktion "SizeOF()" weiß einfach nicht ob und wann du Speicher allokiert hast, sie gibt zurück wie groß der Speicherbereich sein sollte auf den der Pointer zeigt.

Da bin ich nicht der Meinung, dass hat nichts mit dem Sizeof zu tun. Das hat andere gründe. Normalerweise wäre die größe erstmal 0 weil kein Speicher allokiert wurde.
Da aber wohl beim kompalieren automatisch der Speicher für den Pointer reserviert wird ist die Größe direkt als 10Byte zu ermitteln.

Warum eigentlich ???
Das könnte doch mal bitte jemand vom 3S erklären.
Gibt es da eine logische Erklärung für :-) ?

MacToolz


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 52 Beiträge ]  Gehe zu Seite 1 2 3 4 Nächste

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de