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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Automtische Multiplikation in DB speichern

  1. #1
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Moin liebe Gemeinde,

    ich progge zur Zeit an einer 315T-2DP mit CU320 herrum.
    Hier brauche ich eine Rechnung und weiss leider nicht so recht wie.
    Ich habe einen positiven Wert X (INT) z.B. 512, den muss ich dann mit einem Wert Y (INT) z.b. 8 multiplizieren.
    z.B. 0 x 512, 1 x 512, 2 x 512, usw bis Wert Y hier im Beispiel 8. Jedes Ergebnis muss ich im DB ab DBW 0 speichern,
    Ergebnis 1 DBW0, Ergebnis 2 DBW2 usw. Im DB habe ich ein Array [254] of Int.
    Wie progge ich dass?
    Vor lauter Schleifen usw blick ich irgendwie nicht durch.

    Gruß von der Ostsee

    Nordischerjung
    Zitieren Zitieren Automtische Multiplikation in DB speichern  

  2. #2
    Registriert seit
    20.11.2009
    Beiträge
    18
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    hi

    du brauchst im eigentlichen nur 1 Schleife
    der y wert ist dein Schleifenzähler (Merker od. temp.)
    den x speicherst du in einen Merker
    den rest kannst du mit temp. variablen machen die du pro schleifen durchlauf incementierst.
    auf den Db kannst du mit zeigern schreiben.

    lg freezer

  3. #3
    Avatar von Nordischerjung
    Nordischerjung ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard

    Hallo,
    danke für deine Antwort.
    Hört sich so ganz einfach an aber...
    bei der Umsetzung hängt es. Das mit der Schleife werde ich hoffentlich irgendwie
    hin bekommen, aber wie und wann speicher ich die Ergebnisse in den DB?
    Kommt das auch in die Schleife?

  4. #4
    Registriert seit
    03.04.2008
    Beiträge
    6.200
    Danke
    237
    Erhielt 815 Danke für 689 Beiträge

    Standard

    Geht doch eigentlich ganz einfach.

    1. Wert 1 einlesen
    2. Wert 2 einlesen
    3. ausrechen
    4. Wert mit flanke in Datenbaustein speichern


    also mal los, wenn du ein Problem hast, stell den Code hier rein, denn du willst es ja lernen, einige hier können es schon


    bike

  5. #5
    Avatar von Nordischerjung
    Nordischerjung ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard

    Hab mir jetzt mal etwas zusammen gestellt in FC1.
    Kann man das so machen?

    Code:
           TAR1 #AR1_temp                    //AR1 sichern in Temp Var DWORD
    
           AUF  DB      100
    
           L    P#        2.0                //Adresse der 1. DB Variablen laden und (hier DBW 2, da DBW0 immer 0 ist)
           T    #Pointer_temp                    
           
           L    #Input_1                     //Lade den ersten Eingangswert 
           T    #Input_1_temp            //Speichern auf temp. Variable
    
           L    #Input_2                     //Anzahl den Multiplikator
    Loop  :T    #Count                     //Zähler für Schleife
           
           L    #Pointer_temp                     //Pointer für DB
           LAR1
    
           L    #Init                           //Eingabewert 1 Temp
           L    #Count                       //Lade den Zähler der Schleife
           *I                               
           T    DBW [AR1,P#0.0]          // lädt das DBW
    
           L    #Pointer_temp                    //Zeiger nach Akku 1 transferieren / 
           L    P#        2.0                //Wordadresse des Zeigers um 2 Byte erhöhen (Typ: INT)
           +I                                
           T    #Pointer_temp                    //Neue Adresse in Zeiger laden
    
           L    #Count                       //Schleifenzähler laden
           LOOP Loop
    
    End   :NOP  0
     
           LAR1 #AR1_temp                    //AR1 zurück schreiben
    Wie kann ich es denn jetzt proggen, dass die Schleife nicht von Oben nach unten zählt,
    sondern umgekehrt. Ich benötige den kleinsten Wert zuerst

    Gruß Nordischerjung

  6. #6
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard

    Entweder schreibst du deinen DB von hinten nach vorne oder du baust dir deine schleife ganz einfach selbst mit einem SPB und zählst hoch...

  7. #7
    Registriert seit
    22.12.2006
    Beiträge
    43
    Danke
    0
    Erhielt 6 Danke für 6 Beiträge

    Standard

    2. Versuch
    Geändert von tim_taylor (30.11.2009 um 06:45 Uhr) Grund: Falschen Knopf erwischt!

  8. #8
    Registriert seit
    22.12.2006
    Beiträge
    43
    Danke
    0
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo, hallo,


    habe den Code mal kurz überflogen.

    Sieht doch ganz hübsch aus.

    Code:
    *I                               
           T    DBW [AR1,P#0.0]          // lädt das DBW
    
           L    #Pointer_temp                    //Zeiger nach Akku 1 transferieren / 
           L    P#        2.0                //Wordadresse des Zeigers um 2 Byte erhöhen (Typ: INT)
           +I                                
           T    #Pointer_temp                    //Neue Adresse in Zeiger laden
    
           L    #Count                       //Schleifenzähler laden
           LOOP Loop
    Ich würde das +I gegen ein +D tauschen.

    Code:
    *I                               
           T    DBW [AR1,P#0.0]          // lädt das DBW
    
           L    #Pointer_temp                    //Zeiger nach Akku 1 transferieren / 
           L    P#        2.0                //Wordadresse des Zeigers um 2 Byte erhöhen (Typ: INT)
           +D                               
           T    #Pointer_temp                    //Neue Adresse in Zeiger laden
    
           L    #Count                       //Schleifenzähler laden
           LOOP Loop
    Gruß

    Dominik
    Zitieren Zitieren GutenMorgen  

  9. #9
    Avatar von Nordischerjung
    Nordischerjung ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard

    Ich würde das +I gegen ein +D tauschen.
    Ups,

    hatte ich beim Testen auch, warum hab ich das wieder geändert??

  10. #10
    Avatar von Nordischerjung
    Nordischerjung ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.02.2006
    Ort
    Ostsee 5 min zum Strand
    Beiträge
    780
    Danke
    92
    Erhielt 110 Danke für 98 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe es jetzt hoffentlich geschafft.
    Es ist auch noch das Löschen der alten Daten dazu gekommen, falls das nächste Beschreiben kleiner Ist als das voherige.
    (Das ist aber nur zur Übung für mich)
    Auf jeden fall habe ich so einen guten Überblick von der Pointer und Zeiger Geschichte bekommen

    Code:
    
         TAR1  #AR1_temp                   //AR1 sichern in Temp Var DWORD
    
          AUF   "DB10_Speicherpos"          //DB 10 auschlgaen
    
          L     0.000000e+000               //Lade 0 in 
          T     DBD    0                    //1. DBD, da der 1.Wert immer 0 ist
    
          L     P#4.0                       //Adresse der 1. DB Variablen laden (hier DBD .04, da DBD 0.0 immer 0 ist)
          T     #Pointer_temp
    
          L     #Input_1                    //Lade den ersten Eingangswert
          T     #Input_1_temp               //Speichern auf temp. Variable
    
          L     #Input_2                    //Lade den Multiplikator
          L     1                           //subtrahiere , da Schleife nicht bei 0
          -I                                //arbeitet
    Loop: T     #Count                      //Zähler für Schleife
    
          L     #Input_2                    //Lade den Multiplikator 
          L     #Count                      //Lade Zähler Schleife und subtrahiere von Multiplikator
          -I                                //damit der kleinste Wert als erstes im DB steht
          T     #multiplik
    
          L     #Pointer_temp               //Pointer für DB
          LAR1  
    
          L     #multiplik                  //Lade den gerechneten Zähler der Schleife
          DTR   
          L     #Input_1_temp               //Eingabewert 1 Temp
          *R    
          T     DBD [AR1,P#0.0]             // lädt das DBD
    
          L     #Pointer_temp               //Zeiger nach Akku 1 transferieren 
          L     P#4.0                       //Wordadresse des Zeigers um 2 Byte erhöhen (Typ: INT)
          +D    
          T     #Pointer_temp               //Neue Adresse in Zeiger laden
    
          L     #Count                      //Schleifenzähler laden
          LOOP  Loop
    NW2
    Code:
          L     #Input_2                    //Lade den Multiplikator
          L     4                           //mit 4 multiplizieren 
          *I                                //um 1. freie Anfangsdresse im DB zu bekommen
          T     #anfang_BYTE
    
          L     49                          //maximale DB Länge
          L     #Input_2                    //belegte DBD subtrahieren
          -I    
          T     #unbenutzte_DBD
    
          L     #Input_2                    //Wenn >49 kein SFC21 Aufruf
          L     49                          //springe zu ende
          >I    
          SPB   ende
    NW3
    Code:
    
          L     B#16#10                     //10h für s7
          T     LB    30
          L     B#16#8                      //Typ REAL
          T     LB    31
          L     #unbenutzte_DBD             //Anzahl (Wiederholungsfaktor)
          T     LW    32
          L     0                           //*1 Datenbaustein (hier 0 da wir ja auf
          T     LW    34                    //   einen Merkerbereich zugreifen wollen) 
          L     200                         //Anfangsadresse M200.0
          SLD   3                           //Pointer bauen
          T     LD    36
          L     B#16#83                     //Speicherbereich (hier Merker)
          T     LB    36
    NW4
    Code:
    //Any Zeiger für DB 10 ab welcher Position mit = geschrieben wird
    
          L     B#16#10                     //10h für s7
          T     LB    40
          L     B#16#8                      //Typ REAL
          T     LB    41
          L     #unbenutzte_DBD             //Anzahl (Wiederholungsfaktor)
          T     LW    42
          L     10                          //Datenbaustein  10
          T     LW    44                    //    
          L     #anfang_BYTE                //Anfangsadresse
          SLD   3                           //Pointer bauen
          T     LD    46
          L     B#16#84                     //Speicherbereich (hier DB)
          T     LB    46
    NW5
    Code:
          CALL  "FILL"
           BVAL   :=#Zeiger_Quelle
           RET_VAL:=#retval
           BLK    :=#Zeiger_DB_Ziel
    
    
    
    ende: NOP   0
          LAR1  #AR1_temp                   //AR1 zurück schreiben
    Könnte man es so erstelle oder ist das zu aufwendig und geht es eleganter?
    Geändert von Nordischerjung (30.11.2009 um 16:29 Uhr)

Ähnliche Themen

  1. DB als .xls Speichern
    Von Deep Blue im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 15.12.2009, 12:44
  2. Einstellungen speichern
    Von eYe im Forum HMI
    Antworten: 2
    Letzter Beitrag: 25.02.2009, 21:28
  3. Logfiles speichern
    Von Roos im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.01.2009, 19:22
  4. auf MMC speichern
    Von slk230-power im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 01.10.2007, 21:29
  5. Speichern in 312 IFM
    Von waldy im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 01.07.2004, 20:59

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •