wie Speichert man eine REAL Zahl im Merkerbereich?

Horschd

Level-1
Beiträge
32
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend zusammen,

ich muss eine REAL Zahl im Merkerbereich speichen, bekomme aber folgende Meldung

Fehler 4010:program (46): Unverträgliche Typen: Kann Real nicht in DWORD konvertieren

der Speicherbefehl lautet: %MD8 := CohPhi1;

eine REAL ist doch 32 Bit groß und sollte dort doch hineinpassen.

Die ensprechende Variable wurde als REAL deklariert.


EDIT: mit Codesys 2,3
 
Zuletzt bearbeitet:
Wieso machst du nicht

Code:
VAR
      fCosPhi1 AT %MD8: REAL;
END_VAR
(*...*)
fCosPhi1 := 47.11;
?

Die Fehlermeldung ist ja recht eindeutig: das besagte Merkerdoppelwort wird als Doppelwort interpretiert. Und ein Doppelwort ist zwar von gleicher Länge, wie ein REAL, aber eben was ganz anderes. Der String "abc" ist ja auch rein vom Speicherbedarf her ein Doppelwort...aber ein REAL nun beim besten Willen nicht ;-)

Generell stellt sich mir sowieso die Frage, ob du überhaupt eine Notwendigkeit hast, deinen Wert in den Merkerbereich zu legen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die notwendikeit besteht darin, dass die daten über einen Bus abgeholt werden, und dafür müssen sie im Merkerbereich liegen.

kann man mit einer abwandlung deine deklaration auf ein ganzer Array von Real Zahlen im Merkerberech definieren?
 
Naja, dass die Daten über einen Bus geholt werden, muss nicht bedeuten, dass man sie dazu in den Merkerbereich legen muss ;-) Aber darum geht's nicht.

So ohne weiteres glaube ich nicht, hab zumindest noch nicht probiert
Code:
arrData AT %MD0: ARRAY[0..10] OF REAL;
zu deklarieren. Einen Versuch wäre es wert, allerdings bezweifle ich den Erfolg dieser Deklaration ;-)

Andernfalls könntest du einen "Umweg" nehmen:

1. die gewünschte Zahl an REAL-Variablen mit Adresse im Merkerbereich anlegen
2. dort, wo du die Daten beschreiben willst, ein ARRAY OF REAL anlegen
3. Dieses per MEMCOPY (ka ob das in der CoDeSys-Standard-Bib drin ist) auf die erste Variable kopieren. Da die in einem zusammenhängenden Bereich liegen sollte das gehen. Ist allerdings nicht die "schönste" Lösung, da es ein wenig Transparenz vermissen lässt und anfällig für so typische S7-Probleme ist ;-)
 
Zuletzt bearbeitet:
ok ich habe gerade mein Real array aufgebrochen und es von hab getippt mit deine deklaration von post #2


kann es nur nicht testen, da ich keinen wind mehr für mein windrad hab :-(

resultat folgt morgen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst auch ein ARRAY OF POINTER TO REAL (was eine Deklaration) anlegen und deine ganzen REAL-Variablen darauf mappen. Das ist schöner als mit MEMCPY, allerdings ist das auch nicht gerade wenig Arbeit, wenn du jetzt 100 Variablen hast. Bei einigen, wenigen ist das aber eine ganz nette Variante.

Alternativ kannste auch - sofern deine REAL-Moppeds in einem zusammenhängenden Speicherbereich liegen - Die Adresse der ersten per POINTER TO REAL nehmen und dann diesen Pointer um SIZEOF(REAL) inkrementieren. Ist dann (fast) wie ein Arrayzugriff und gerade bei vielen Variablen echt eine Zeitersparnis.

Viele Wege führen nach Rom.
 
Du muss die Variable in der Deklaration auf den Merkerbereich legen.
fTest :real at %QD100;
oder
fTest :real at %MD100;

Dann liegen die Werte "Automatisch" im Merkerdoppelwort.

Wir machen das normalerweise über E/As und verknüpfen diesen dann im Systemmanager mit der BUS Anschaltung.
 
Zurück
Oben