Berechnung im DB?

motamas

Level-1
Beiträge
65
Reaktionspunkte
1
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?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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!
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.


 
Zuletzt bearbeitet:
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.
 
Anbei mal ein Beispiel.
Da kann man bestimmt noch was optimieren
und z.B. die Länge des UDT ermittelns usw.
Ist aber nach meiner Meinung alles "Schnick-Schnack"
Hauptsache kurz knapp und verständlich und das auch für einen Ausssenstehenden.
Hab keine Ahnung von Schnick-Schnack bin ja "Kop"ler und kein Programmierer :ROFLMAO:
Im OB100 werden beim Anlauf die wichtigsten Werte einmal gesetzt,
Falls man z.B. mehr Lager benötigt wird einfach der DB geändert und im OB100 die Anzahl der Lager erhöht.
 

Anhänge

  • Test_lager.zip
    425,6 KB · Aufrufe: 6
Zuviel Werbung?
-> Hier kostenlos registrieren
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!


So um das noch mal eindeutig niederzulegen :D

Ich habe für alle Lagerplätze die gleiche Dichte, aber wenn wir jetzt sagen wir mal das Material ändern würden was in den Lagerplätzen sein soll würde sich auch die Dichte ändern. Somit wollte ich dir Möglichkeit einbauen dass man die Dichte ändern kann.
Auf Basis der geänderten Dichte ändert sich ja dann quasi die Masse pro Volumen und somit hätte man bei gleicher Masse ein anderes Volumen.
Das heißt ich gebe einen Dichtewert ein und es soll dann die Maximale Füllhöhe über die Masse berechnet werden. Dazu habe ich ja wie erwähnt 26 Lagerplätze, die eine unterschiedliche Füllhöhe haben können.
Damit ich die vorhandene Berechnung nicht in 26 FC's schreiben muss wollte ich das ja über zum Beispiel eine solche Schleife so vereinfachen dass es nur noch einen FB oder ähnliches gibt, der den Datenbaustein mit diesem Wert für die Füllhöhe füttert.

Für die Lagerplätze wäre die Art der Berechnung also gleich nur dass es halt auch 26 verschiedene Masse werte geben kann und somit auch verschiedene Füllhöhen.

Ich hoffe das war so einigermaßen verständlich :D

@ Jabba danke dir ich schau mir das jetzt gleich mal an :TOOL:
 
Anbei mal ein Beispiel.


Also erstmal ein Super dickes Danke das ist soziemlich genau das was ich mir vorgestellt habe.

Eine Frage hätte ich dazu aber noch. Du verwendest da ja jetzt ein UDT, es würde ja aber auch nicht schlimm sein, wenn ich diese 26 Stucturen einzeln in einem DB abgelegt habe und darauf zugreife oder?
Weil wenn ich noch was visualisieren möchte und vielleicht Anzeigen brauche wäre dass so sicher sinvoller!
 
Solange der Aufbau gleich bleibt ist das überhaupt kein Problem.
Wichtig ist nur bei so einer Schleife das zum Berechnen die Abstände (Structurgröße) immer gleich sind
 
Zurück
Oben