Step 7 Werte aus DB auslesen

--alex--

Level-2
Beiträge
90
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

bekomme über HMI eine INT Eingabe und muss dazu den entsprechenden Wert ausgeben.
Dazu habe ich zwei DB´s angelegt.
In der einen stehen die möglichen INT Werte, in der anderen die entsprechenden auszugebenden Werte.

DB1
0.0 x1 50
0.2 x2 55
0.4 x3 57
0.6 x4 60

DB2
0.0 x1 32
0.2 x2 33
0.4 x3 34
0.6 x4 35

Bekomme ich jetzt als Eingabe z.B. 50,51,52,53 oder 54 soll 32 ausgeben werden
Bei Eingabe von 55 und 56 soll 33 ausgeben werden.
D.h. ich möchte in DB1 die Werte nacheinander durchgehen so lange mein Eingabewert kleiner dem DB Wert ist.
Dann möchte ich mit der entsprechenden Adresse oder dem entsprechenden Name den Wert aus DB2 ausgeben.

Hoffe dass ich das halbwegs verständlich ausgedrückt habe.

Habe momentan leider überhaupt leine Ahnung wie ich das überhaupt angehen soll.
Kann mir jemand einen vernünftigen Tippgeben wie man so etwas bewerkstelligen kann?
Gibt es eventuell eine geschicktere Herangehensweise an dieses Problem?

Vielleicht gibt es ja ähnliche Beispiele zu meiner Problemstellung.

Brauche keine fertige Lösung von Euch sondern zweckdienliche Hinweise, die aber dennoch über die Info: "Mit AWL kann man das lösen" hinausgehen.

Danke
Alex
 
.
...
Brauche keine fertige Lösung von Euch sondern zweckdienliche Hinweise, die aber dennoch über die Info: "Mit AWL kann man das lösen" hinausgehen.


HMI-Eingabe in einer Schleife mit den DW´s in deinem DB 1 vergleichen, bis
dein Wert erreicht wird.
Aus dem mitlaufenden Schleifenindex (Schleifenzähler) einen Pointer bauen,
der auf den entsprechenden DW im DB 2 zugreift.

Die Handhabung mit Pointern ist in unserer FAQ-Rubrik ausführlich erklärt.

.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist nicht verkehrt wie es SoftMachine schildert, aber je nach Art deiner Werte gibt es geschicktere/schnellere Methoden:

1.Wenn es sich bei den Werten in DB1 tatsächlich um 1-Byte-Werte handelt, würde es sich eventuell anbieten, den DB1 wegzulassen und den DB2 so zu gestalten, dass in der durch die Eingabe adressierten Speicherstelle das Ergebnis steht. Keine Schleife, nur ein einziger indirekter Zugriff.

2. Wenn es viele Werte sind, läuft eine einfache Schleife schlimmstenfalls bis zum Letzten und im Mittel bei n Werten n/2 mal. Das kann für deine Zykluszeit zuviel werden. Wenn die Werte sich selten ändern, kann man sie so anordnen, das sie im DB1 aufsteigend sortiert stehen. Dann man einen Wert schneller suchen, in dem man die Liste in zwei Teile teilt und schaut, in welcher Hälfte der gesuchte Wert liegen muß. Das heißt auch binäre Suche.

3. Statt Schleifen zu programmieren kann man diese Verfahren so umformen, dass pro Zyklus ein Schritt der ursprünglichen Schleife ausgeführt wird. Das lohnt sich wenn das Ergebnis nicht sofort oder sehr schnell benötigt wird und wenn sich die Eingabe relativ selten ändert.

4. Wenn du SCL hast, ist das alles in SCL einfacher zu programmieren.
 
.
Ja, sicher,

der TE bat erstmal um "zweckdienliche Hinweise", damit er überhaupt einen Ansatz findet.

Mal sehen, was er jetzt aus deinen und meinen Hinweisen macht.

Wäre schön, wenn er seinen entworfenen Code hier nochmal zeigt.

.
 
Danke für euren Hinweis,

habe mir Zottel´s Hinweis zu Herzen genommen und die Datenbank so aufgebaut dass ich den HMI Wert auf die Datenbankadresse umrechnen kann.

zB.
0,25 --> 4
0,30 --> 8
0,35 --> 12

Das funktioniert soweit recht gut.
Mittels KOP wandle ich den HMI Wert um und bekomme den entsprechenden Wert als Int.

Jetzt stehe ich nur noch vor dem "kleinen" Problem wie ich mit meinem ermittelten Wert (zB. 124) auf den Datenbankwert DB100.DBD124 zugreifen kann.
Schätze dass es sich hier um 2 Zeilen AWL handelt.

AWL ist aber nicht, oder noch nicht, meine Welt.

Könnt ihr mir verraten wie ich den Wert auslesen kann?


Danke Alex
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt stehe ich nur noch vor dem "kleinen" Problem wie ich mit meinem ermittelten Wert (zB. 124) auf den Datenbankwert DB100.DBD124 zugreifen kann.
Code:
L   124  //oder der ermittelte Wert
SLD 3    //--> P#124.0
LAR1
AUF DB100
L   DBD [AR1,P#0.0]
T   #meinWert

Harald
 
Zurück
Oben