TwinCAT3 CPU ließt/schreibt Daten in falsche Adressen/Register?

0skill

Level-2
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Hab ein Problem mit MEMCPY
genauer gesagt lese ich via Modbus FB_MBReadRegs die Analog Kanäle von meiner Heizung aus

Die Daten kommen ja in WORD und müssen dann in DWORD gewandelt werden. Also DWORD_OF_WORD und anschließend werden sie mit MEMCPY von DWORD in REAL gewandelt
Anfangs waren es nur ein paar Register die ich ausgelesen hab
Hat soweit alles ganz gut funktioniert
nun lese ich mit 3 Abfragen die Gesamten Register aus
Eigentlich auch noch kein Problem
Jetzt musste ich aber feststellen das gewisse Werte via MEMCPY anscheinend falsch kopiert werden
es schein als würde MEMCPY auf bei ein paar aufrufen auf falsche Register/Adressen zugreifen
Das Bild zweigt:
ganz oben sollte eigentlich die Puffertemperatur TOP sein in die Variable wird aber die Betriebsstundenzeit vom Einschub geschrieben
bei Betriebsstunden Einschub wird mir irgend eine Temperatur rein geschrieben
und beim Lagerstand stehen wieder die Betriebsstunden vom Einschub drinnen
Unbenannt.JPG

Wieso ich weiß das hier irgendwo ein Fehler ist
Es hat eigentlich schon mal funktioniert
nur da war der Code (Modbusseitig) nicht schön
Ich hatte einige Funktionsblöcke um jeweils ein paar wenige Register aus zu lesen
dann hab ich den Code optimiert --> 1 Funktionsblock der in einer Schrittkette mit unterschiedlichen Parametern aufgerufen wird und die Abfragen so groß das man mit 3 aufrufen die Kompletten Register abfragt
da kam dann der Fehler
Also Code wieder umgeschrieben mit 3 unterschiedlichen Funktionsblöcken --> wieder der selbe fehler

Vielleicht hatte ja schon mal jemand ein ähnliches Problem
Gleich mal Danke für jede Hilfe
 
... und anschließend werden sie mit MEMCPY von DWORD in REAL gewandelt ...
MEMCPY sollte sich hüten, etwas von DWORD in REAL zu wandeln. Mit MEMCPY kannst Du das BitMuster aus einer Variablen in eine als REAL deklarierte Variable kopieren, aber das BitMuster muss bereits den Aufbau einer REAL-Variablen haben.

TypeCast (per MEMCPY?) von DWORD in DINT, dann Wandeln von DINT in REAL.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Oha Vorsicht!
Der Parameter n in Memcpy ist die Anzahl der BYTES die kopiert werden sollen nicht der BITS!!!!

Du kopierst also jedes mal 32 Byte und überschreibst damit alle anderen Variablen die in im Adressbereich nach der Zieladresse liegen mit irgendwelchen 32 Byte die nach der Startadresse im Speicher folgen!

Mache es wie Heinileini vorschlägt, DWORD_TO_DINT und dann DINT_TO_REAL.

Beim direkten Rumwurschteln im Speicher sollten man 1000% sicher sein was man tut.
 
Leider funktionieren eure Ansätze nicht
mal davon abgesehen das die vorliegenden Bitmuster schon einem REAL entsprechen und es relativ ungeschickt wäre dieses Bitmuster vorher in DINT und dann in REAL zu wandeln (konnte hier aber keiner wissen)

TwinCAT3 funktioniert DWORD_TO_REAL nicht --> zumindest in diesem Fall nicht. Das war vor einem halben Jahr schon mal mein Ansatz
da wurde mir hier geholfen: TwinCat3 Probleme mit Modbus 2xWORD to REAL (Mit ReadRegs 32Bit Float lesen)

es besteht nur die Möglichkeit MEMCPY oder über eine Union

Ich hab es jetzt über eine Union gelöst und so funktioniert es jetzt auch
Mich würde aber trotzdem interessieren wieso MEMCPY vorher falsche Daten kopiert hat
 
Leider funktionieren eure Ansätze nicht
mal davon abgesehen das die vorliegenden Bitmuster schon einem REAL entsprechen und es relativ ungeschickt wäre dieses Bitmuster vorher in DINT und dann in REAL zu wandeln (konnte hier aber keiner wissen)
"konnte hier aber keiner wissen": Doch, Du! Und hast es uns verschwiegen. :ROFLMAO:

TwinCAT3 funktioniert DWORD_TO_REAL nicht
Sollte es eigentlich auch nicht. INT_TO_REAL, UINT_TO_REAL, DINT_TO_REAL und UDINT_TO_REAL sollten funktionieren, wenn die DatenQuellen das enthalten, was ihre DatenTypen versprechen.

es besteht nur die Möglichkeit MEMCPY oder über eine Union
...
Ich hab es jetzt über eine Union gelöst und so funktioniert es jetzt auch
Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

Mich würde aber trotzdem interessieren wieso MEMCPY vorher falsche Daten kopiert hat
Könnte sein, dass Du tatsächlich das "IndianerProblem" hast, bei dem die Bytes/Worte in der "falschen" Reihenfolge kommen.
Könnte aber auch sein, dass Du mit dem MEMCPY und der falschen (zu hohen Anzahl 32 statt 4) Anzahl Byte munter die Daten kaputt geschrieben und damit die "falschen Daten" produziert hast, die andere MEMCPYs dann richtig kopiert haben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Könnte aber auch sein, dass Du mit dem MEMCPY und der falschen (zu hohen Anzahl 32 statt 2) Anzahl Byte munter die Daten kaputt geschrieben und damit die "falschen Daten" produziert hast, die andere MEMCPYs dann richtig kopiert haben.
Dann käme, vom Indianer-Problem mal abgesehen, immer noch nichts sinnvolles bei raus. Ein Real besteht aus 4 Bytes und nicht aus 2.


Von irgendwas mit Internetzugang gesendet.
 
Ja war mein Fehler da ich mich bei der Beschreibung von MEMCPY verlesen habe und anstatt Bytes Bits gelesen hab
32Byte ist doch ein bisschen mehr als 32Bit
 
Zurück
Oben