Step 7 Tabelle auslesen

Wolfhunter

Level-1
Beiträge
52
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen zusammen,

ich stehe vor dem Problem eine Tabelle auszulesen.


Problemstellung:
Ich bekomme einen 4-stelligen Int Wert und muss diesen Wert mit 280 verschiedenen Datensätzen vergleichen um einen passenden Wert für meine Schaltung zubekommen.
Tabelle.JPG
Ich hatte bis jetzt überlegt jeden Wert einzeln zuvergleichen, nur das wäre viel zu viel Aufwand.


Gibt es in AWL/FUP eine Möglichkeit wie bei C über ein doppeltes Array die Datenauszulesen?
Gruß

Dennis
Und schon mal vielen Dank im voraus!:)
 
Aber natürlich geht so was.

Einen Zeiger über den Daten-Db jagen und den Inhalt vergleichen, eventuell in einer hübschen kleinen Schleife...

Ist es Zeitkritisch oder langt alle Zyklus ein Wert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal Danke für die Antwort.

Es ist nicht Zeitkritisch, Allerdings ich muss die "Namen" vergleichen.

Also z.B. ich bekomme den Wert 3051 in mein FB und muss dann den Wert 6 ausgeben.
Das Problem ist ja das ich als Name nicht 3051 eintragen kann und somit kann ich den Wert auch nicht vergleichen.
 
Nun, Du solltest zB die Werte nacheinander legen, also zuerst den x-Wert, dann den y-Wert.
Dann machst Du eine Schleife wo du immer um 4 Bytes erhöhst (also auf den x-Wert schaust), vergleichst Wert>x-Wert, wenn ja ist der y-Wert Adresspointer + P#2.0. wenn nein, Schleife erhöhen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau!
unter dem Symolischen Namen kannst Du nicht suchen.
Du kannst aber auch zwei DBs nehmen.
In einem die X-Werte im zweiten die Y-Werte.
Ist Geschmackssache.

Aber das Prinzip wird immer gleich bleiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist das so richtig?

L #Index
L ADR1

Auf DB 1002
Start: L Wert_x
L DBW[AR1, P0.0]
==I
SPB Gleich

L #index
L 4.0
+I
T #index
SPA Start


Gleich: L DBW[AR1, P2.0]
T #Wert_Ausgabe
 
So ähnlich denke ich.
;-)

2te Zeile "LAR 1"
Solltest Du statt ==I nicht besser >=I abfragen? Ich kenne Deine Werte nicht, sind die sicher um 1 aufsteigend? Schaut in der Tabelle in Eintrag #1 nicht so aus.
Du solltest noch eine Begrenzung einfügen (was ist wenn Dein Wert_x größer ist als der höchste x-Werte Bereich), da fliegt die SPS auf die Schnauze (weil Schleife nicht beendet wird).
Und da ist noch ein Fehler mit dem Index in der Schleife... ich meine Du solltest nicht diesen erhöhen sondern das AR1 (den Index schreibst Du ja VOR der Schleife ins AR1).


Was steht im Index?
 
Zuletzt bearbeitet:
L #Index
L ADR1

Auf DB 1002
Start: L Wert_x // Wert der eingelesen Wert
L DBW[AR1, P0.0] // Vergleichs- Wert aus dem DB
==I //Prüfen auf GLeichheit
SPB Gleich // Wenn die Werte gleich sind, dann springe zur Funktion "Gleich"
//Wenn nicht laufe weiter durch
L #index // Lade den Wert wo man gerade ist.
L 4.0 // Lade 4
+I // Addiere Index+4
T AR1 // Lade den Wert in den Adressregister 1 ,sollte auch AR1 stehen :)

L AR1 // Lade AR1
T #Index // Transferiere den Wert in #Index

L #index
L 1064 // maximaler Wert 1060 plus 4
==I
SPB ENDE

SPA Start


Gleich: L DBW[AR1, P2.0]
T #Wert_Ausgabe

ENDE: Set
= M1000.0


Im Index steht der Wert wo er sich gerade befindet. Also am Anfang auf 0 und jede weitere Runde plus 4. 0....4....8....12 usw.

Die Werte Liste steht ganz oben drinnen.
Und ich bekomme Werte die auf exakt Gleich geprüft werden müssen. Also ==I :)


Das Problem ist das die SPS in der Anlage steht und ich da nicht so ohne weiteres testen kann:-(
 
L #Index
L ADR1

Auf DB 1002
Start: L Wert_x // Wert der eingelesen Wert
L DBW[AR1, P0.0] // Vergleichs- Wert aus dem DB
==I //Prüfen auf GLeichheit
SPB Gleich // Wenn die Werte gleich sind, dann springe zur Funktion "Gleich"
//Wenn nicht laufe weiter durch
L #index // Lade den Wert wo man gerade ist.
L 4.0 // Lade 4
+I // Addiere Index+4
T AR1 // Lade den Wert in den Adressregister 1 ,sollte auch AR1 stehen

Nicht ganz gut, in Deinem Prog würde er immer dieselbe Stelle abfragen...
 
Wie würdest du es in C machen?
Meine Frage zielt auf Folgendes:
Wenn die Namen konstant sind oder selten einer hinzugefügt oder gelöscht wird, könnte sich eine binäre Suche lohnen (9 statt 280 Schleifendurchläufe). Dazu müssen die Namen halt auf- oder absteigend geordnet im DB stehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Borromeus.

@Zottel

In C würde ich ein Array definieren

Und mit einer IF-SChleife alle Werte abfragen bis ich meinen gefunden habe.

Die Werte werde danach nicht mehr geändert, bzw nur noch sehr selten.
Und die Namen sind schon alle aufsteigend sortiert.
 
Was sagt der Diagnosepuffer warum sie aus STOPP geht?
Zykluszeitüberschreitung?

An die kommt man:

Zielsystem - Diagnose/Einstellung - Baugruppenzustand

Ich würde die Abfrage

L #index
L 1064 // maximaler Wert 1060 plus 4
>=I

abfragen. wenn Du Die 1064 bei ==I nicht genau triffst bleibt die CPU in der Schleife hängen.
 
Zurück
Oben