Array [0..1]of DWORD zu einer variablen zusammenführen

DK1

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

wie kann ich ein Array[0..1] of DWORD zu einer variablen zusammenführen ggf. müssen die Arrayplätze gedreht werden um einen sinnvollen Wert zu erhalten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, z.B. zu einem LWORD mit einer Union:

Code:
TYPE uConvert2DWORDs :
UNION
    adwValue     : ARRAY [0..1] OF DWORD;
    lwValue        : LWORD;
END_UNION
END_TYPE


PROGRAM PLC_PRG
VAR
    uConvert2DWORDs:uConvert2DWORDs;
    adwTest        : ARRAY [0..1] OF DWORD := [429496, 7295];
    lwTest        : LWORD;
END_VAR


uConvert2DWORDs.adwValue[0] := adwTest[0];
uConvert2DWORDs.adwValue[1] := adwTest[1];

lwTest := uConvert2DWORDs.lwValue;
 

Anhänge

  • 2023-10-06 08_47_26-Window.png
    2023-10-06 08_47_26-Window.png
    17,4 KB · Aufrufe: 9
Danke für die schnelle Antwort.
Irgendwas passt da leider noch nicht ganz, ich habe jetzt anstatt das adwTest mein tatsächliches Array verknüpft.
Allerdings erhalte ich im LWORD einen sich ständig ändernden Wert für die Seriennummer.
 

Anhänge

  • e!COCKPIT.png
    e!COCKPIT.png
    20,1 KB · Aufrufe: 13
Zuviel Werbung?
-> Hier kostenlos registrieren
wie kann ich ein Array[0..1] of DWORD zu einer variablen zusammenführen ggf. müssen die Arrayplätze gedreht werden um einen sinnvollen Wert zu erhalten.
Ein Doppelwort soll das resultat aus den beiden zusammengestzten Arrayplätzen sein.
Ein Doppelword ist ein DWORD. Um aus zwei DWORD eines zu machen, könnte man sie z.B. ver-odern oder addieren. Oder meinst Du in einer der beiden Aussagen doch kein DWORD?

Man kann kaum glauben, daß solche Aussagen aus dem Mund eines "Programmierers" kommen. Wenn du deine Frage und deine Aussagen schon nicht fachgerecht und exakt formulieren kannst, dann musst Du halt etwas ausführlicher mit Umgangssprache erklären, was du da machen willst.
Was steckt in dem "Array[0..1] of DWORD" drin? Wo kommt es her?
Was soll in dem Ergebnis-Doppelword drin stecken?
 
Vielen Dank für diese überaus freundliche Antwort :-*

Was steckt in dem "Array[0..1] of DWORD" drin? -> die Seriennummer des Geräts verteilt auf ein Array mit zwei Plätzen
Wo kommt es her? -> Datenlogger SMA Datamanger M via Modbus TCP

Das Ergebnis soll eine variable sein welche die Arrayplatz 1 und 2 "zusammengesetzt" ausgibt.
 

Anhänge

  • SMA_Handbuch.png
    SMA_Handbuch.png
    32,1 KB · Aufrufe: 16
Du musst also kein Doppelword, sondern ein LWORD erhalten (quasi ein Doppel-Doppelword). Dafür ist die Anwort von paro in Beitrag #3 passend.

Vielen Dank für diese überaus freundliche Antwort :-*
Bitte schön ;)
Gib dir mehr Mühe beim Frage stellen und lese deine Frage vor dem Veröffentlichen nochmal durch, dann erhältst du auch kaum solche Antworten. Es ist für uns Frage-Beantworter oft schwierig zu verstehen, was der Fragesteller will, insbesondere wenn er trotz Nachfrage etwas anderes schreibt als er meint.
Schönes Wochenende.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da Du sicherlich mit einer Seriennummer nicht rechnen möchtest o.Ä., würde ich den einfachen Weg gehen und beide WORDS in String wandeln und zusammenfügen...

Nochmal etwas freundlicher formuliert als PN/DP:
Als Programmierer solltest Du wissen
8 Bit = 1 Byte
16 Bit = 2 Byte = 1 Wort
32 Bit = 4 Byte = 2 Wort = 1 Doppelwort

1 Register = 1 Wort
Du rufst 2 Worte ab = 1 Doppelwort.

Um die beiden Einzel-Worte zusammenzufügen:
Wort1 in ein Doppelwort speichern
Doppelwort um 16 Bit nach links schieben
Verodern mit dem zweiten Wort.
 
Dann dürfte bei Deiner Kommunikation aber etwas nicht passen. Sind die Werte in dem Array denn konstant?
Moment mal, habe mir gerade Dein Bild in #7 angesehen. Wie kommst Du auf zwei Doppelwörter? Ein Modbus Register ist ein Word und die Seriennummer belegt laut Handbuch zwei Register, also ein Doppelwort und nicht zwei. Daher erhältst Du wohl auch sich ändernde Werte, weil Du falsche Register mit ausliest.
 
Ich sag doch, die Aussagen passen nicht zueinander. Und was Word und Doppelword sind, ist eigentlich Basis Wissen für Programmierer.
Jetzt alles nochmal dreimal gelesen, vermute ich wie Oliver: er sollte 2 Word (2 Register je 16 Bit) per Modbus lesen und zu einem Doppelword 32 Bit zusammensetzen. Zur Zeit werden auch noch zu viele und falsche Register gelesen, die gar nicht zur Seriennummer gehören. Je nachdem, wie er bei seinem Wago(?)-Gerät das Modbus-lesen macht, kann man da vielleicht schon direkt ein Doppelword als Zielvariable angeben, oder halt per UNION oder Pointer oder Schieben und ver-odern das Doppelword aus zwei Word zusammensetzen. Ob dabei LWord und HWord vertauscht werden müssen, sieht man dann bei der Seriennummer sehr einfach. Je nachdem, was er mit der Seriennummer anfangen will, kann es tatsächlich günstig sein, das ganze gleich in String zu wandeln. Viele Wege führen nach Rom, besonders für Programmierer ;)
 
Zuletzt bearbeitet:
Was hat funktioniert? Welche Lösung... für denjenigen, der irgendwann mal Deinen Post rausfischt, und meint, eine Lösung zu finden, wird bitterlich enttäuscht, wenn Du nur schreibst "klappt"... ist so aussagekräftig wie "ist kaputt"...
 
Die Lösung von Paro hat funktioniert.
Ich habe ein Array of WORD mit 2 Arrayplätzen und habe daraus EIN DWORD generiert.
 

Anhänge

  • e!COCKPIT_1.png
    e!COCKPIT_1.png
    16,4 KB · Aufrufe: 12
  • e!COCKPIT_2.png
    e!COCKPIT_2.png
    9 KB · Aufrufe: 12
Zurück
Oben