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

Page 1 of 2 12 LastLast
Results 1 to 10 of 12

Thread: Teil eines DINT's-Wert kopieren

  1. #1
    Join Date
    18.06.2003
    Posts
    193
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    Eine Anlage liefert mir über Ethernet ein 8-stelliger DINT-Wert, z.B.
    57081201 was die Sorten-Nr. des produzierten Papiers entspricht. Je nach Papiersorte ändert sich diese Nummer sowie auch die Grammatur die aber immer 3-Stellig bleibt..

    Frage: Ich sollte aus dieser DINT-Nummer die 4., 3., und die 2.-letzte Stelle auf ein anderes DBD od. DBW kopieren. Also in diesem Fall wäre es den Wert 120, was die Grammatur des Papiers entspricht.

    Beispiel: DB300.DBD20 -> 57081201-> 120 auf DB301.DBD od. DBW20

    Hat jemand von euch einen Hinweis, Tips, oder sogar eine elegante Lösung in der Schublade? Wäre euch sehr dankbar. Bin nämlich noch nicht auf das Resultat gekommen.

    Besten Dank im voraus.
    mfG churchill
    Reply With Quote Reply With Quote Teil eines DINT's-Wert kopieren  

  2. #2
    Join Date
    20.08.2003
    Posts
    297
    Danke
    41
    Erhielt 33 Danke für 32 Beiträge

    Default

    Hallo,
    wenn ich das Problem richtig verstanden habe, handelt es sich um einen 32-Bit Hex-Wert also um DW#16#57081201.
    Dann sollte dieses Programm dein Problem lösen.

    L DB300.DBD20 // Wert von der Anlage (z.B. DW#16#57081201)
    SRW 4 // rechte Tetrade rausschieben
    L W#16#FFF // Maske für die 3 Stellen
    UW
    T DB301.DBW 20 // ins Ziel kopieren

    mfg. Rayk

  3. #3
    Join Date
    06.10.2003
    Posts
    4,521
    Danke
    626
    Erhielt 787 Danke für 616 Beiträge

    Default

    Hallo churchill,

    so wird's gehen, falls es sich tatsächlich um DINT (32-bit-Festpunktzahl) handelt:


    Code:
     
    
          L     L#57081201                  //bzw. DB200.DBD..
          L     10
          /D    
          L     1000
          MOD                               //Ergebnis im Akku1


    Gruß, Onkel

  4. #4
    Anonymous Gast

    Default

    Hallo Churchill,

    ein weiterer Vorschlag:
    Den DINT Wert mit den String IEC-Funktionen bearbeiten.
    DINT mit FC 5 in String umwandeln
    die drei Ziffern mit FC26 herauskopieren
    Rueckwandlung auf DINT oder Int mit FC37 oder FC38
    Reply With Quote Reply With Quote Titel: Teil eines DINT's-Wert kopieren mit Stringverarbeitun  

  5. #5
    Join Date
    30.08.2003
    Posts
    2,234
    Danke
    31
    Erhielt 258 Danke für 229 Beiträge

    Default

    Hallo,

    man kann aber auch den DINT-Wert in BCD wandeln, dann 4 Stellen nach rechts schieben, den linken Teil ausfiltern (Vorzeichen??) und dann wieder in INT oder DINT wandeln.

    MfG
    André Räppel

  6. #6
    churchill is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    18.06.2003
    Posts
    193
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Default

    Hallo zusammen

    Erstmals vielen Dank für eure Hilfsbereitschaft.
    Die Lösung mit den Strings hab ich auch schon ausprobiert--->ist aber für das Resultat das ich brauche viel zu aufwändig und geschwollen , trotzdem vielen Dank.
    Der Lösungsvorschlag von André werde ich sicherlich ausprobieren, vielen Dank.
    Da es sich um eine 32-Bit-Festpunktzahl handelt hab ich die Lösung von Onkel Dagobert verwendet, was auch wunderbar funktioniert. Besten Dank.
    Eigentlich wenn man es sich genauer anschaut und überlegt, ist es ziemlich einfach. Ich sollte meine mathematische Kenntnisse wohl vertiefen müssen

    Nochmals Vielen Dank an alle und einen schönen Sonntag.

    mfG churchill

  7. #7
    churchill is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    18.06.2003
    Posts
    193
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Default

    Hallo zusammen

    Es erinnert mich an einen vergangenen Beitrag der ich noch eine Lösungserklärung schuldig bin.
    Hier klicken
    Naja, die Lösung ist eigentlich ganz simpel:

    L #High_Word
    L 10000
    *D
    L #Low_Word
    +D
    T #Ret_Val

    Damit kann man die zwei Festpunktzahlen 16-Bit in einer 32-Bit zusammensetzen.

    Ich möchte auch gestehen, dass ich den MOD-Befehl nicht gekannt habe.
    Danke nochmals für eure Hilfe.

    mfG churchill

  8. #8
    Join Date
    06.10.2003
    Posts
    4,521
    Danke
    626
    Erhielt 787 Danke für 616 Beiträge

    Default

    Hallo churchill,

    gern geschehen :P !

    Ich denke mal, daß es nicht viele Anwendungen gibt bei der die MOD-Rechnung sinnvoll eingesetzt werden kann. Wer braucht in einer Steuerung schon den Rest einer ganzzahligen Division? Daher wird sie sicherlich von vielen Programmieren beim Nachdenken oftmals garnicht berücksichtigt.

    Ein sehr interessanter, eigentlich fast schon genialer Fall für die MOD-Anweisung ist die Berechnung eines Zeigers für ein Umlaufregister, ein FiFo oder auch für einen Aufrufverteiler. Es geht mit MOD sehr viel eleganter als mit Vergleichen und Rücksetzen des #REGISTER_ZEIGER über Sprungbefehle. Bei jedem Aufruf wird #REGISTER_ZEIGER um 1 erhöht. Ist #REGISTER_ZEIGER=#MAX_ANZAHL, liefert MOD das Ergebnis "0" und es wird wieder von vorne gezählt.

    Code:
    //*** Umlaufregister mit MOD
          L     #REGISTER_ZEIGER
          L     #MAX_ANZAHL
          MOD   
          T     #REGISTER_ZEIGER            // 0..(MAX_ANZAHL-1)
    
    //*** Register-Bearbeitung
          ...
          ...
    
    //*** Pointer erhöhen
          L     #REGISTER_ZEIGER
          L     1
          +I    
          T     #REGISTER_ZEIGER
    Gruß, Onkel
    Reply With Quote Reply With Quote gern geschehen  

  9. #9
    Join Date
    16.06.2003
    Location
    88356 Ostrach
    Posts
    5,009
    Danke
    1,346
    Erhielt 1,169 Danke für 551 Beiträge

    Default

    cool! kannte ich auch nicht, DANKE!

  10. #10
    Join Date
    16.06.2003
    Location
    88356 Ostrach
    Posts
    5,009
    Danke
    1,346
    Erhielt 1,169 Danke für 551 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    naja ich glaub so das optimale für ein sr ist der befehl doch nicht...

    1. geht nicht bei registern die in beide richtungen laufen (zeiger wird nicht auf <0 überwacht)

    2. wenn die registerbreite nicht durch die registerlänge teilbar ist, oder einfach nur der zeiger (aus welchen gründen auch immer) "verrutscht" läuft er über das registerende hinaus weil die mod anweisung ja nur "0" liefert wenn er genau die registerlänge erreicht.

Similar Threads

  1. TIA Wert von Real nach dint
    By litlegerman in forum Simatic
    Replies: 6
    Last Post: 11.11.2018, 13:10
  2. zun einem dint-Wert den Wert "1" addieren
    By Sedamon in forum Programmierstrategien
    Replies: 6
    Last Post: 03.08.2017, 11:31
  3. INT / DINT in Array of Byte kopieren
    By smartie in forum CODESYS und IEC61131
    Replies: 9
    Last Post: 24.03.2017, 08:00
  4. Step 7 DINT Wert um letzten Digit abfiltern
    By ChopinJunkie in forum Simatic
    Replies: 14
    Last Post: 03.05.2014, 21:15
  5. Teil eines arrays kopieren
    By Limette in forum Simatic
    Replies: 7
    Last Post: 26.11.2012, 20:10

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
  •