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

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

Thema: Berechnung im DB?

  1. #1
    Registriert seit
    20.04.2010
    Beiträge
    65
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute ich mal wieder ;D

    Undzwar stell ich mir die Frage, ob es irgend eine Möglichkeit gibt einen Anfangswert direkt im DB als Formel einzugeben!

    Mein Problem ist folgendes ich habe einen DB mit 26 Strukturen.
    Von diesen Strukturen habe ich jeweils ein wert den ich über eine Formel berechnen will. Dazu hätte ich eine Konstante und eine Variable die sich ebenfalls im DB befindet.
    Nun macht es für mich keinen Sinn das alles in FCs zu schreiben wäre glaube ich sehr ineffektiv auch über einen FB würde das alles ziemlich groß werden. Gibt es da noch eine andere Möglichkeit sowas zu realisieren?
    Zitieren Zitieren Berechnung im DB?  

  2. #2
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard

    Ein DB ist eine Datenspeicher, der kann keine Operationen ausführen, das muss schon das programm machen.

    Wie oft oder wnn muss denn diese Formel berechnet werden ?

    Wenn die Strukturen immer gleich sind , würde ein FB reichen, der in einem Loop alle 16 Formeln durchrechnet.

  3. #3
    Registriert seit
    20.04.2010
    Beiträge
    65
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Im Prinzip muss er es nur einmal am Anfang berechnen und wenn sich irgendwann die Variable ändert aber das würde dann ja eh mit der Zykluszeit neuberechnet werden?

    Wie könnte man so einen Loop realisieren?

  4. #4
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard

    Das hängt von deiner Struktur ab, ist aber im Prinzip egal wie es aussieht, nur sollten die Daten irgendwie "hintereinander stehen", also als Array in einem DB oder in 26 DB's hintereinander.

    Ich beschreibe das erst einmal, je nach deinem Kenntnisstand könnte dir das vieleicht zu viel werden, ist aber eine schöne Übung für Any-pointer.

    Im Prinzip legst du eine Startadresse fest und die lLänge deiner Struktur
    z.B. DB10 ab DBB0 immer 20 Byte lang, Dann wäre Dein Parameter zur Formelberechnung ja immer um 20 Byte versetzt pro Typ und das kann man berechnen .

    Bei Start wird der Maximale Wert der durchläufe in einer variablen gespeichert und damit der Loop gestarte .Der Pointer für den ersten Wert berechnet.
    Die Daten werden indirekt aus dem DB gelesen, berechnet und indirekt in den DB wieder gespeichert. Am Ende kommt der Befehlt "Next" und die schleife springt wieder nach oben zur berechnung , aber um eins verringert. So zählt der Loop von 26 Rückwärts bis 0.

    Eine Option wäre noch die alten Werte zu speichern und nur zu rechnen wenn eine Änderung vorliegt, Wenn es aber keine richtige komplizierte Formel ist, würde ich immer alles berechnen lassen, die die Abfrage eventuelle genausoviel Zeit kostet wie das berechnen.
    Loop aus der Siemens Hilfe
    AWL Erläuterung
    L L#1 //Lade die Ganzzahl-Konstante (32 Bit) in den AKKU 1.
    T MD20 //Transferiere den Inhalt von AKKU 1 in MD20 (Initialisierung).
    L 5 //Lade die Anzahl der Schleifenzyklen in AKKU1-L.
    NEXT: T MW10 //Sprungmarke = Anfang der Schleife / Transferiere AKKU1-L in
    Schleifenzähler.
    L MD20
    * D //Multipliziere aktuellen Inhalt von MD20 mit aktuellem Inhalt von
    MB10.
    T MD20 //Transferiere Ergebnis der Multiplikation in MD20.
    L MW10 //Lade den Inhalt des Schleifenzählers in AKKU 1.
    LOO
    P
    NEXT //Dekrementiere den Inhalt von AKKU 1 und springe zur Sprungmarke
    NEXT, wenn AKKU1-L > 0 ist.
    L MW24 //Der Programmablauf wird nach dem Ende der Schleife hier
    fortgesetzt.
    L 200
    >I

  5. #5
    Registriert seit
    20.04.2010
    Beiträge
    65
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Alles klar dank dir erstmal ich werde mich mal ransetzen und versuchen das Umzusetzen.
    Hab ich das mit Offset von 20 Byte richtig verstanden, dass ich quasi die berechnung alle 20 Byte in diesem DB durchführe?

  6. #6
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard

    Bin zwar gleich weg, aber schreib doch mal was zu der Formel, der Struktur und wo die Daten stehen.

    Es gibt hier auch einige Beispiele, falls du noch nix mit ANY-Pointern gemacht hast, schau die im FAQ das mal an.

  7. Folgender Benutzer sagt Danke zu jabba für den nützlichen Beitrag:

    motamas (11.06.2010)

  8. #7
    Registriert seit
    20.04.2010
    Beiträge
    65
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Meine Struktur sieht wiefolgt aus:

    Lagerplatz_1 Struct

    Aktueller_Füllstand REAL 0.0
    MAX_Füllstand REAL 0.0
    MIN_Füllstand REAL 0.0

    END_STRUCT


    und das ganze 26 mal.

    Ich möchte jetzt den MAX_Füllstand berrechnen über: Volumen x Dichte wobei sich die Dichte ändern kann und das Volumen konstant ist!

  9. #8
    Registriert seit
    19.06.2003
    Ort
    Im Staub ...
    Beiträge
    337
    Danke
    115
    Erhielt 26 Danke für 23 Beiträge

    Standard

    Diese Struktur kommt 26x nacheinander vor?

    wenn 'Aktueller_Füllstand REAL 0.0' z.B. dem DBD0 im DB entspricht, dann
    könnte das grob z.B. so aussehen (kommt auch darauf an, wo die Quellwerte Vol und Dichte herkommen)

    Code:
    l 4
    sld 3  //nach pointer wandeln (für zugriff DBD4)
    t #dest_ptr  //temporäre var (pointer für zieladresse)
    l 26
    lp1: t #loop_counter  //temporäre var (schleifenzähler)
    l #vol
    l #dichte
    *r  //Berechnung
    t dbnnn.dbd [#dest_ptr]  //in zieladresse schreiben
    l #dest_ptr  //temporäre var (pointer für zieladresse)
    l p#12.0
    +d  //+12 bytes für nächsten max-wert
    t #dest_ptr  //temporäre var (pointer auf nächste ziel adresse setzen)
    l #loop_counter  //temporäre var (schleifenzähler)
    loop lp1
    Gruß
    s

  10. #9
    Registriert seit
    20.04.2010
    Beiträge
    65
    Danke
    17
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Dank dir erstmal für die Ausführung ssound1de!

    Also diese Struktur kommt noch 26 mal vor also Lagerplatz_1, Lagerplatz_2, ..., Lagerplatz_26.

    Meine Frage ist jetzt noch wenn ich das alles in einen FB schreibe und diesen dann in einem FC aufrufe, mit welchen Werten Parametrier ich den?
    Wenn ich ihm die Werte aus der ersten Struktur gebe macht er dass dann automatisch weiter zur zweiten und so weiter oder wie würde das dann laufen?
    Weil ich gebe ihm ja die Parameter dann fest vor oder seh ich da was falsch!

    Die Werte für Dichte und Volumen stehen auch in diesem DB mit drinnen!

    Ich bin mir nicht ganz sicher aber müsste es nicht irgendwie so gemacht werden:

    l #vol
    l #dichte
    *r //Berechnung
    AUF dbnn //dbnn laden
    t dbd [#dest_ptr] //in zieladresse schreiben


    So ungefeir steht es jedenfalls in der Anleitung die jabba gepostet hat.


    Geändert von motamas (11.06.2010 um 14:37 Uhr)

  11. #10
    Registriert seit
    19.06.2003
    Ort
    Im Staub ...
    Beiträge
    337
    Danke
    115
    Erhielt 26 Danke für 23 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Meine Frage ist jetzt noch wenn ich das alles in einen FB schreibe und diesen dann in einem FC aufrufe, mit welchen Werten Parametrier ich den?
    Wenn ich ihm die Werte aus der ersten Struktur gebe macht er dass dann automatisch weiter zur zweiten und so weiter oder wie würde das dann laufen?
    Weil ich gebe ihm ja die Parameter dann fest vor oder seh ich da was falsch!

    Die Werte für Dichte und Volumen stehen auch in diesem DB mit drinnen!
    Dann musst du statt
    l #vol
    l #dichte
    z.B.
    L DBnn.DBDmm //für Volumen
    L DBnn.DBDmm //für Dichte
    schreiben

    Ich verstehe aber immer noch nicht so richtig, was du vor hast.
    Soll der Max.Wert nur für einen bestimmten Lagerplatz berechnet werden?
    Sind Volumen und Dichte für jeden Lagerplatz verschiedene DBD's?
    Das sind leider zu wenig infos!

    In der von mir gezeigten Schleife wird in alle 26 Lagerplätze der gleiche Max.Wert geschrieben.

    Ich bin mir nicht ganz sicher aber müsste es nicht irgendwie so gemacht werden:

    l #vol
    l #dichte
    *r //Berechnung
    AUF dbnn //dbnn laden
    t dbd [#dest_ptr] //in zieladresse schreiben
    Das geht auch - du kannst AUF DBnn dann vor die Schleife schreiben. Dann wird der DB nicht ständig in der Schleife aufgeschlagen.

    Kleine Info ...
    T DBnn.DBD [#dest_ptr] schreibt in die passende Adresse, auch wenn vorher mit AUF DBnn ein anderer DB aufgeschlagen wurde.
    T DBD [#dest_ptr] schreibt in den DB der mit AUF DBnn aufgeschlagen wurde.

  12. Folgender Benutzer sagt Danke zu ssound1de für den nützlichen Beitrag:

    motamas (21.06.2010)

Ähnliche Themen

  1. Berechnung??
    Von Prog22 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 12.04.2010, 18:39
  2. Berechnung
    Von SebastianLicht im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.06.2009, 11:35
  3. Berechnung von Zeitdifferenzen
    Von M4RKU5 im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 05.02.2009, 15:20
  4. MPI CRC Berechnung
    Von Hannes im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.07.2007, 13:37
  5. Antworten: 1
    Letzter Beitrag: 23.09.2005, 13:56

Lesezeichen

Berechtigungen

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