Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Results 1 to 8 of 8

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

  1. #1
    Join Date
    01.12.2013
    Posts
    20
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Default


    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
    Reply With Quote Reply With Quote TwinCAT3 CPU ließt/schreibt Daten in falsche Adressen/Register?  

  2. #2
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    2,138
    Danke
    210
    Erhielt 407 Danke für 330 Beiträge

    Default

    Quote Originally Posted by 0skill View Post
    ... 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.
    Last edited by Heinileini; 03.01.2020 at 15:00.

  3. Folgender Benutzer sagt Danke zu Heinileini für den nützlichen Beitrag:

    0skill (04.01.2020)

  4. #3
    Join Date
    24.02.2009
    Posts
    1,359
    Danke
    29
    Erhielt 310 Danke für 262 Beiträge

    Default

    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.
    Sänd from mei Kombjudder mitse Dastadurr.

  5. Folgender Benutzer sagt Danke zu MasterOhh für den nützlichen Beitrag:

    0skill (04.01.2020)

  6. #4
    0skill is offline Neuer Benutzer
    Themenstarter
    Join Date
    01.12.2013
    Posts
    20
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Default

    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

  7. #5
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    2,138
    Danke
    210
    Erhielt 407 Danke für 330 Beiträge

    Default

    Quote Originally Posted by 0skill View Post
    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.

    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
    Quote Originally Posted by PN/DP View Post
    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.
    Last edited by Heinileini; 05.01.2020 at 11:19. Reason: Lapsus GehirnWindicus korrigiert

  8. #6
    Join Date
    13.12.2011
    Location
    Bückeburg
    Posts
    2,584
    Danke
    316
    Erhielt 374 Danke für 328 Beiträge

    Default

    Quote Originally Posted by Heinileini View Post
    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.

  9. #7
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    2,138
    Danke
    210
    Erhielt 407 Danke für 330 Beiträge

    Default

    Quote Originally Posted by oliver.tonn View Post
    Ein Real besteht aus 4 Bytes und nicht aus 2.
    Absolut! Das kommt davon, wenn man die Anzahl Bytes meint, aber irgendwie noch die Anzahl Worte in der Birne hat. Sorry!!! Ich korrigiere das sofort.
    Gruss, Heinileini

  10. #8
    0skill is offline Neuer Benutzer
    Themenstarter
    Join Date
    01.12.2013
    Posts
    20
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Similar Threads

  1. WebMI - CX5020 WES7 - Neustart - falsche Daten
    By j_poool in forum CODESYS und IEC61131
    Replies: 1
    Last Post: 27.03.2019, 12:50
  2. Replies: 7
    Last Post: 16.02.2017, 18:36
  3. Replies: 9
    Last Post: 20.01.2017, 18:27
  4. Replies: 2
    Last Post: 18.05.2015, 22:27
  5. Aufbau S7-CPU Register usw.
    By Makhai in forum Simatic
    Replies: 19
    Last Post: 05.09.2011, 18:27

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •