Zwei WORD Variablen zu DWORD vereinigen?

Pitsch52
2006-05-27
2009-05-25
  • Pitsch52 - 2006-05-27

    Hallo Leute

    Kann mir Jemand sagen, wie ich in CodeSys 2 Variablen vom Typ WORD zu einer Variablen vom Typ DWORD vereinige. LowByte und HighByte.

    Da gibt es sicher eine definierte Funktion dafür.

    Mit freundlichen Grüssen! Pitsch

     
  • Pitsch52 - 2006-05-28

    Hallo

    Ich dachte, (bevor ich das Rad nochmal erfinde) vielleicht sei schon eine Funktion dazu in CodeSys implementiert. Scheint nicht der Fall zu sein. Ich habe nun eine Funktion nach Folgendem Code programmiert, der ich das Low-WORD und das High-WORD übergebe und als Retourwert erhalte ich das gewünschte DWORD. Funktioniert einwandfrei!

    (Das Low-WORD im unteren Teil des DWORD's einfügen)

    LW_HW_TO_DWORD.0 := LW.0;

    LW_HW_TO_DWORD.1 := LW.1;

    LW_HW_TO_DWORD.2 := LW.2;

    LW_HW_TO_DWORD.3 := LW.3;

    LW_HW_TO_DWORD.4 := LW.4;

    LW_HW_TO_DWORD.5 := LW.5;

    LW_HW_TO_DWORD.6 := LW.6;

    LW_HW_TO_DWORD.7 := LW.7;

    LW_HW_TO_DWORD.8 := LW.8;

    LW_HW_TO_DWORD.9 := LW.9;

    LW_HW_TO_DWORD.10 := LW.10;

    LW_HW_TO_DWORD.11 := LW.11;

    LW_HW_TO_DWORD.12 := LW.12;

    LW_HW_TO_DWORD.13 := LW.13;

    LW_HW_TO_DWORD.14 := LW.14;

    LW_HW_TO_DWORD.15 := LW.15;

    (Das High-WORD im oberen Teil des DWORD's einfügen)

    LW_HW_TO_DWORD.16 := HW.0;

    LW_HW_TO_DWORD.17 := HW.1;

    LW_HW_TO_DWORD.18 := HW.2;

    LW_HW_TO_DWORD.19 := HW.3;

    LW_HW_TO_DWORD.20 := HW.4;

    LW_HW_TO_DWORD.21 := HW.5;

    LW_HW_TO_DWORD.22 := HW.6;

    LW_HW_TO_DWORD.23 := HW.7;

    LW_HW_TO_DWORD.24 := HW.8;

    LW_HW_TO_DWORD.25 := HW.9;

    LW_HW_TO_DWORD.26 := HW.10;

    LW_HW_TO_DWORD.27 := HW.11;

    LW_HW_TO_DWORD.28 := HW.12;

    LW_HW_TO_DWORD.29 := HW.13;

    LW_HW_TO_DWORD.30 := HW.14;

    LW_HW_TO_DWORD.31 := HW.15;

    Na ja.... Vielleicht kann es ja Jemand brauchen ...?

    Mit freundlichen Grüssen! Pitsch

     
  • Rolf-Geisler - 2006-06-02

    http://www.geisler-controls.de im Downloadbereich die Bibliothek liegen habe. Sie packt u.a. zwei Worte zu einem DWORD, es sind aber auch noch eine Reihe weiterer oft gebrauchter Funktionen darin enthalten.

    Die Lib steht unter der GNU und kann von jedermann verwendet werden.

    Rolf

     
  • Anonymous - 2006-06-07

    Originally created by: Bernhard Werner

    Man bedenke: der Bitzugriff dw.1 ist sehr aufwendig!

    Es geht auch einfacher:

    dw2 := SHL(WORD_TO_DWORD(w1), 16) OR w2;

    Eine andere Lösung wäre über Pointer:

    pw : POINTER TO WORD;

    pw := ADR(dw);

    pw^ := w1;

    pw := pw + 2;

    pw^ := w2;

    Bernhard

     
  • betty - 2009-04-29

    ich hab eine variable vom typ dword und würd sie gerne in zwei variablen vom typ word splitten, weil ich diese sonst nicht weiterverarbeiten kann...

    wie mach ich das?

    habe dies mal

    dw2 := SHL(WORD_TO_DWORD(w1), 16) OR w2;

    hiernach

    SHL(DWORD_TO_WORD(Zaehler1), 16) OR Zaehler2:=gZaehler1;

    umgestellt, dachte dann könnte es funktionieren, aber codesys gibt mir einen fehler raus...

    danke schon mal im voraus

     
  • Uwe - 2009-04-29

    Hi betty,

    ich verstehe nicht nach welchen Regeln du das umgestellt hast

    und der Compiler versteht es ja offensichtlich auch nicht.

    Aber man kann und muss ja auch nicht alles verstehen,

    man muss ja nur wissen wie es funktioniert

    Also ich nehme mal an dein gZaehler1 ist dein DWORD

    und Zaehler1 b.z.w. Zaehler2 sind deine WORD Variablen.

    Dann wäre einer von vielen Wegen es wie folgt zu machen

    Zaehler1 := DWORD_TO_WORD(gZaehler);

    Zaehler2 := DWORD_TO_WORD(gZaehler / 16#0001_0000);

    Uwe

     
  • betty - 2009-04-29

    hallo uwe,

    zunächst einmal vielen dank, es funktioniert

    ich hab keine regeln angewandt, dachte, wenn ich es umstelle, würds vllt. funktionieren

    ging aber nicht...

    noch ne kleine frage:

    was heißt das genau??? 16#0001_0000

    lg betty

     
  • Uwe - 2009-04-29

    Hallo betty,

    16# bedeutet das die folgende Zahl eine Zahl zur Basis 16 ist

    also eine Hex-Zahl.

    Der Unterstrich in der Zahl dient nur der besseren Lesbarkeit und darf aber muss nicht

    da sein. Es dürfen auch mehrere, einzelne Unterstriche sein.

    Man könnte z.B. auch statt

    16#0001_0000

    auch

    16#00_01_00_00

    oder

    2#00000000_00000001_00000000_00000000 ( zur Basis 2 -> also binär )

    oder

    65536 ( dezimal )

    schreiben.

    (Zahl / 16#0001_0000)

    ist letztendlich nur ein Rechtsschieben um 16 Bit,

    da teilen durch 2 ein Rechtsschieben um 1 Bit ist

    und

    2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^16

    oder eben = 65536 ist.

    Was man wiederum auch hexadezimal 00010000h darstellen kann.

    Uwe

     
  • betty - 2009-04-30

    guten morgen!

    vielen dank euch beiden

    liebe grüße betty

     
  • betty - 2009-05-06

    hallo,

    ich habe da noch ne frage.

    und zwar, wenn ich diese werte force

    DATA[18]=65535 und

    DATA[19]=1

    gib dann mein touchpanel, weil die werte wieder zusammen zu nem dword gefasst werden den wert 131071 aus.

    kann mir jemand bitte erklären warum?!

    lg betty

     
  • Anonymous - 2009-05-06

    Originally created by: Stephanie Kreutz

    Hallo,

    naja, weil es eben die zwei Wörter zusammenfügt ?!? Das ist ja was du wohl machen wolltest.

    Als Wert steht dann eben DATA[19]_Data[18] und das ist nunmal

    16#0001_FFFF = 131071

    Gruß Steffi

     
  • betty - 2009-05-11

    vielen dank stephanie!!!!!

     
  • J Schohaus - 2009-05-11

    Hallo betty

    Es kann sein das dein Problem einfacher zu Händeln ist.

    Du willst ein Datenbereiche für das Bedienpanel haben.

    Data ARRAY [1..100] of WORD ;

    Dieser beinhaltet verschiedene andere Werte.

    Data[0] und Data[1] = X als DWORD

    Data[2] und Data[3] = Y als TIMER

    Oder was sonst noch gewünscht wird.

    Dann ist das einfachste beide bereich feste Adressen zu vergeben.

    also

    Data AT%MW0 ARRAY [1..100] of WORD ;

    X AT %MW0 of DWORD ;

    Y AT %MW2 of TIME ;

    Vorteil es ist kein Programm nötig.

    MfG Jochen

     

    Related

    Talk.ru: 1
    Talk.ru: 2
    Talk.ru: 3

  • stonix - 2009-05-13

    siehe http://forum.3s-software.com/viewtopic.php?t=1941 auch hier ganz simpel:

    PROGRAM PLC_PRG
    VAR
       wort1:WORD:=16#1234;
       wort2:WORD:=16#5678;
       dwort:DWORD:=16#00000000;  (*Initialisierung kann auch weggelassen werden*)
    END_VAR
    

    dwort := SHL( wort1 , 16 ) OR wort2; (*Wird zu 16#12345678*)
    
     
  • betty - 2009-05-19

    guten morgen,

    vielen dank für die antworten

    ich hab ein doppelwort, was ich aufsplitten muss, damit ich das übertragen kann...

    aber damit mir die ganze geschichte angezeigt wird, muss ich das im panel wieder zusammenfügen

    für mich ist das alles neuland

    @stonix: wo kann ich nachlesen was das hier bedeutet?

    wort1:WORD:=16#1234;

    wort2:WORD:=16#5678;

    dwort:DWORD:=16#00000000;

    und

    Code:

    dwort := SHL( wort1 , 16 ) OR wort2; (Wird zu 16#12345678)

    danke schon mal

     
  • Anonymous - 2009-05-19

    Originally created by: Stephanie Kreutz

    guten morgen,

    es gibt ein Dokument "Erste Schritte mit CoDeSys" das bei der Installation direkt mit kommt.

    Vielleicht schaust du dir das einmal an. Anscheinend fehlen hier noch die Grundlagen...

    außerdem gibt es noch Bücher.. das ist so altmodisches Zeug mit Papier

    Gruß Steffi

     
  • Sara - 2009-05-19

    Hey Betty,

    schau mal bei CoDeSys unter Hilfe -> Suchen -> WORD-Konstanten.

    Das hilft dir bestimmt auch weiter.

    Viele Grüße

    Sara

    PS: @ Steffi: Was für Bücher kannst du denn empfehlen? Ich kenn nur das von H. Lepers - "SPS Programmierung nach IEC 61131-3, Mit Beispielen für CoDeSys und Step7"

     
  • stonix - 2009-05-19

    Mit CoDeSys lassen sich ja bekanntlich verschiedene Zielsysteme programmieren.

    Je nach erworbenes Zielsystem wird eigentlich die richtige Dokumentation bereitgestellt. Diese befinden sich auf den mitgelieferten CD's (bei WAGO beispielsweise auf der CD "759-911 WAGO-I/O-PRO CAA" oder "Automation Tools and Docs", bin mir nemme so ganz sicher).

    -

    Zitat:
    @stonix: wo kann ich nachlesen was das hier bedeutet?

    Im Internet findest Du die Doku unter:

    http://www.wago.com/wagoweb/documentation/navigate/nm9dp__d.htm

    (achte auf die Version bevor Du sie ausdruckst... sind viiiiiele Seiten mirindenarschbeiß)

    wort1:WORD:=16#1234; 
    wort2:WORD:=16#5678; 
    dwort:DWORD:=16#00000000;   (*Diese Initialisierung mit 16#00...00 kann auch weggelassen werden*)
    

    In der Doku "759-333 WAGO-I/O-PRO CAA" im "Anhang C", "Kap. 10.15" auf der Seite "10-35" und "2-10".

    und

    dwort := SHL( wort1 , 16 ) OR wort2;     (*Wird zu 16#12345678*)
    

    In der Doku "759-333 WAGO-I/O-PRO CAA" im "Anhang E", "Kap. 10.21" ab den Seiten "10-71".

    Viel Spaß

     
  • betty - 2009-05-25

    guten morgen,

    vielen dank für eure antworten...!!!!

    ich wünsche euch eine erfolgreiche woche

    liebe grüße

    betty

     

Log in to post a comment.