TIA Werte aus DB suchen

WL7001

Level-2
Beiträge
182
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ihr Alleskönner,

ich bräuchte mal einen Denkanstoß wie ich eine Situation lösen könnte. (TIA V15.1, S7-1500er)
Ich habe einen DB (nicht optimiert, kann den aber auch optimiert anlegen, falls sinnvoller) mit einem mehrdimensionalen Array, welches so aussieht: ( wenn die Array-Struktur ungeeignet ist, kann ich aber auch jede beliebige andere Struktur anlegen)

Hier hinterlege ich z.B. 300 Stationsdaten. Für jede Station gibt es 3 relevante Werte (Bsp. Station 1)
Station 1,0 : min Positionswert, hier 100mm
Station 1,1 : max Positionswert, hier 199mm
Station 1,3 : Stationsnummer, hier 1

Sieht so aus:
DB.JPG


Ein Lesegerät fährt im Prinzip einen sehr langen Weg ab und liefert mir ständig einen Istwert in mm als Dint ab.
Für jede Position in mm muss ich jetzt also bestimmen, unter welcher Stationsnummer ich mich befinde (um dann irgendwelche Funktionen auszuführen, spielt aber hier jetzt keine Rolle)



Erster Versuch :
FB.JPG


Das müsste ich jetzt ja 300 mal machen, da gibt es bestimmt eine bessere Lösung, weiß da jemand was?
Ansatz sollte in FUP oder AWL sein, SCL kann ich nicht. Wenn nur in SCL möglich, müßte ich mich im hohen Alter nochmal in was Neues einarbeiten, unschön :ROFLMAO:

Danke fürs Lesen
Gruß Wilhelm
 
Moin WL7001,

ein paar Fragen:

- wofür gibt es die Positionswerte max/min?
- Ist die Stationsnummer fortlaufend aufsteigend (dann könnte man auch den Array-Index nehmen)?
- gibt es für eine Station auch einen "Mittelwert", also eine, feste Position?

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal Danke fürs Lesen .

Positionswerte min / max beschreiben quasi die Grenzen innerhalb derer die Station sich befindet. Wenn also das Lesegerät den Wert 133(mm) liest, weiß ich dass ich mich innerhalb der Grenzen von Station 1 befinde (min=100 max=199). Anders formuliert : ab dem Wert 100 und bis zum Wert 199 befinde ich mich im Bereich der Station 1.

Das ist ja auch meine Fragestellung :ROFLMAO: Wie bekomme ich das möglichst effektiv hin, dass ich aus dem aktuellen Messwert die Stationsnummer ermittle ?

Stationsnummern sind fortlaufend , kann ich aber festlegen wie ich will

Mittelwert gibt es keinen, bzw definiert sich dieser ja über die min und max Werte. Also für Station 1 wäre der "virtuelle" Mittelwert ja ca.150 (min=100 , max=199)

!! Die min / max Werte im DB für die einzelnen Stationen (z.B. 100..199 für Station 1) sind nur beispielhaft, später kommen da vollkommen krumme Zahlen rein !!
 
Zuletzt bearbeitet:
Moin WL7001,
uf die positioniert
wenn sich Station 1 im Bereich 100-199 befindet, ist dann direkt ab 200 die Station 2 zu finden?

Ich stand bei meinen Regalen vor einem ähnlich gelagerten Problem:
es gibt absolute Positionen auf die ich positioniere.

Beispiel:

X1 = 1000
X2 = 3400
X3 = 7000
X4 = 9800
.
.
.

Dann mache ich eine Schleife, in der ich ein array mit index mache. X

Dann in jedem Schleifendurchlauf die Differenz zwischen den Positionswerten bilden.

also:
DIFF := X[i+1] - X;

dann die Differenz durch 2 teilen und auf X addieren (damit habe ich die Mittelposition zwischen den beiden Stationspositionen).

Dann:
Istposition >= Mittelposition ==> Station ist die i+1
Istposition < Mittelposition ==> Station ist die i

Gibt es irgendwelche Positionssprünge o.ä., die Du berücksichtigen musst?

VG

MFreiberger
 
Pas auf wenn man sucht nach "grösser als" und "kleiner als".
Man muss überlegen wass passiert wenn den zu vergleichende Wert genau auf einer von die MAX oder MIN Werte liegt.
In Beitrag #1 wurde für den Vergleich >= und <= verwendet. Das ergibt eventuell dobbelte Treffer.
In Beitrag #5 wurde für den Vergleich > und < verwendet. Das ergibt eventuell keine Treffer.
IN_RANGE entspricht >= und <=.

Mfreiberger schrieb:
Istposition >= Mittelposition ==> Station ist die i+1
Istposition < Mittelposition ==> Station ist die i
 
Die StationsGrenzen aus #1 sehen immerhin so aus, dass ...
- sich die StationsBereiche nicht überschneiden und
- zwischen den Stationen keine "verbotenen Zonen" liegen, die keiner Station zuzuordnen sind.
So gesehen ist es eigentlich überflüssig, pro Station einen Minimal- und einen MaximalWert zu hinterlegen.
Die Anzahl der Stationen sei n. Statt n * 2 Werte könnte man n+1 Werte hinterlegen, die die Grenzen zwischen den Stationen angeben.
Code:
Grenze[0]            Grenze[1]            Grenze[2]            Grenze[3]            Grenze[4]
          Station[1]           Station[2]           Station[3]           Station[4]           ...
Grenze[n] ist der maximale Wert, der noch zu Station n gehört und
Grenze[n] ist der maximale Wert, der kleiner ist als der minimale Wert von Station n+1
WENN aktuellePosition > Grenze[n-1] UND aktuellePosition <= Grenze[n] DANN StationsNr := n

Wahrscheinlich wechseln die PositionsWerte, die Du entschlüsseln willst, nicht kreuz und quer, sondern kontinuierlich.
Will sagen, wenn Du weisst z.B., dass Du Dich in Station 10 befindest und sich der PositionsWert verkleinert, dann musst Du nur noch prüfen, ab wann Du Dich in Station 9 befindest.
Das heisst, Du musst nicht ständig die komplette Liste durchgehen, bis Du die aktuelle StationsNr gefunden hast.
Du musst nur einen der beiden GrenzWerte der aktuellen Station vergleichen und Du weisst auch, welchen der beiden Du mit der aktuellen Position vergleichen musst, weil Du feststellen kannst, ob sich der aktuelle Wert in Richtung zur Grenze zur Station 9 oder 11 verändert hat.
Bedingung, um so verfahren zu können, ist allerdings, dass die Liste der GrenzPositionen sortiert ist - ob aufsteigend oder absteigend sortiert, das spielt keine Rolle.

Wenn die Liste aber "sowieso" sortiert und wenn sie zudem auch noch umfangreich ist, dann empfiehlt sich auch das Verfahren des "binären Suchens", um mit wenigen Zugriffen auf die ListenWerte zum Ergebnis zu kommen - das spart dann ZyklusZeit.
Binär suchen heisst: mitten reingreifen in die Liste und gucken,
- steht dort zufällig der gesuchte Wert - wenn ja, Suche beendet - ansonsten
- steht dort ein Wert, der grösser ist als der gesuchte, dann nach demselben Verfahren in der Hälfte der Liste weitersuchen, wo die kleineren Werte stehen - ansonsten
- in der anderen Hälfte der Liste weitersuchen - wiederum nach dem hier angegeben Verfahren.
Dadurch halbiert sich nach jedem Griff in die Liste auch die Länge der Liste, die noch weiter untersucht werden muss (andersherum: die Länge der Listen oberhalb und unterhalb des interessierenden Bereichs werden immer grösser).
Sofern Du den gesuchten Wert in der Liste nicht finden konntest, bist Du dann aber mit Deinem ArrayIndex an einem Platz in der Liste angekommen, der Dir die StationsNr angibt bzw. einlesen lässt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So, dank eurer vielen Hinweise und Ideen habe ich es jetzt hinbekommen.

Der für mich zündende Gedanke (kannte ich leider nicht, shame on me) habe ich Vollmis Beitrag entnommen. Das mit dem #array[index] war dann zielführend.

Und sooo viel Arbeit ist die Schleife in FUP gar nicht :ROFLMAO:, jedenfalls konnte ich mich erneut davor drücken SCL zu lernen :ROFLMAO::ROFLMAO:

Würde ja gerne für alle die so etwas eventuell auch mal brauchen meine FUP Lösung hier rein stellen, weiß aber nicht wie das geht. Sind 8 FUP Netzwerke, krieg ich nicht auf einer Seite dargestellt sodaß man noch was lesen könnte.

@heinileini : dein Gedanke ist bestechend, doch ist die echte Aufgabenstellung viel komplexer als von mir hier zur Verdeutlichung meines Prolems geschildert. Es ist keine durchgehende Strecke mit ineinander übergehnden Grenzen sondern es liegen überall einzelne Streckenschnipsel von ca. 1/2 Meter herum die überfahren werden und dabei gelesen und ausgewertet müssen um zu entscheiden, wo sich das Fahrzeug befindet.

Also nochmals Dank an alle.

Gruß Wilhelm
 
Es ist keine durchgehende Strecke mit ineinander übergehnden Grenzen sondern es liegen überall einzelne Streckenschnipsel von ca. 1/2 Meter herum die überfahren werden und dabei gelesen und ausgewertet müssen um zu entscheiden, wo sich das Fahrzeug befindet.
Die "überall herumliegenden StreckenSchnipsel" zwischen den "gültigen Stationen" erfordern zwar, dass man in der Liste (Array) entsprechend mehr Elemente vorsehen muss, sprechen aber nicht grundsätzlich dagegen, es so zu handhaben, wie es mir vorschwebt.
Vollmis Lösung sieht auf den ersten Blick tatsächlich verblüffend einfach aus, aber auf den zweiten Blick muss ich leider feststellen, dass ich ihn nicht lesen kann. Bin leider in FUP nicht wirklich zu Hause und habe deshalb Probleme, die nicht eindeutig lesbaren Details mit entsprechender Erfahrung auszubügeln ...
Weiterhin frohes Schaffen und treib's nicht zu doll mit Deiner SCL-Phobie! ;)

Gruss, Heinileini
 
Zurück
Oben