TIA Universaler Baustein, um Arrays nach Kriterium zu durchsuchen

TiZe

Level-1
Beiträge
12
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich bin noch nicht so lange in der SPS-Welt zugange, aber ich habe da eine Idee zu der ich gerne etwas Input/ bzw. eure Meinung hören würde!

Folgende Idee:

ich möchte eine Funktion erstellen mit der ich ein Array_of_xx nach einem bestimmten Kriterium durchsuchen und einen Array mit den entsprechenden Treffern ausgeben möchte. Da das ganze nach Überlegung universell nutzbar sein soll müsste ich

1. dem Baustein einen beliebigen Array übergeben können // intern dann eine Variable von Typ Variant
2. ein Kriterium übergeben auf das verglichen wird // intern ebenfalls eine Variable von Typ Variant
3. eine Information mit dem Inhalt an welcher Position, der einzelnen Felder des Arrays, der Wert liegt mit dem verglichen wird // intern ein Variant

Angenommen ich übergebe an die Funktion
1. einen Array of UDT (UDT bestehend aus einem bool, einem word und deinem DoT)
2. ich möchte auf den DoT vergleichen also übergebe ich z.B. DT#2020-12-01-00:00:00 als Vergleichswert

Aber jetzt stellt sich mir die Frage, ob und wie ich im Baustein überbaut auf die einzelnen Werte des UDT zugreifen kann und wie ich angebe welche Position es gibt. Oder ist die Idee einfach kompletter Unfug?

Bin gespannt auf eure Meinungen und Anregungen, falls eine sinnvoll Umsetzung möglich ist. :)

Bearbeitung mit TIA V17 und einer CPU 1516-3PN/DP V1.8

P.S. Ich bin nicht darauf aus ein fertiges Programm zu bekommen, sondern eben nur Feedback und Ansätze für die Umsetzung.
 
Darf man fragen, was die Idee dahinter ist und welchen Nutzen du dir davon versprichst und wie die konkrete Anwendung dann aussehen würde?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
2. ich möchte auf den D?T vergleichen also übergebe ich z.B. DT#2020-12-01-00:00:00 als Vergleichswert
Dieses Beispiel lässt schon ein Problemchen beim Vergleichen erahnen und beim Vergleichen von z.B. REAL-Werten wird es auch nicht besser.
Vermutlich wirst Du öfters einen ToleranzBereich angeben wollen/müssen, in dem der Vergleich "OK" liefert.

Spätestens, wenn es um umfangreichere Arrays geht, würde ich "binäres Suchen" anpeilen, um ein schnelles Auffinden zu ermöglichen. Dazu muss aber das Array nach der Spalte sortiert sein, in der gesucht werden soll.
Das Array selbst komplett zu sortieren ist aber gar nicht erforderlich, man benötigt lediglich zusätzlich eine eigene Spalte in der Tabelle, mit der man die Sortierung "vortäuscht". Diese Spalte enthält Indizes und diese werden so "sortiert", dass sie den entsprechenden Index (= Platz in dem Array) enthalten und der zweite, indirekte Zugriff auf die Tabelle den gewünschten DatenSatz liefert.
Das klingt wahrscheinlich etwas nebulös, ist aber im Prinzip ganz einfach und es erspart ein ständiges Umschaufeln der DatenSätze in der Tabelle.
Letzteres ist mit Blick auf die ZykklusZeit(-Schwankungen) durchaus ein Thema, wenn es darum geht, Deinen Plan in einer SPS umzusetzen.

Mein Beitrag ist zwar off Topic, aber, ich denke Du solltest Dich u.a. mit solchen Überlegungen beschäftigen, ehe Du Dich auf die Realisierung der "eierlegenden WollMilchSau" stürzt. Ich schätze, die Universalität der Routine dürfte zusätzliche RechenZeit in Anspruch nehmen, wenn sie denn überhaupt praktikabel ist.

Hast Du z.B. bedacht, dass Deine Routine im allgemeinen Fall zwei Ergebnisse liefern muss? Eines für den Wert "von" und ein weiteres für den Wert "bis"? Je nach Anwendungsfall, kann das Array mehrere Sätze enthalten, die eine Übereinstimmung mit dem SuchKriterium enthalten.

Ich fürchte ein wenig, dass bei Deinen Bemühungen ohnehin nur eine eierlegende WollMilchSau für einen oder wenige Spezialfälle herauskommen wird. Die denkbaren Anwendungen wären einfach zu vielfältig und zu unterschiedlich.
 
Ich wurde nicht ein 'universell nutzbare Baustein' machen.
Wenn die Daten als Array of UDT deklariert sind, macht man sehr schnell mit wenige Zeilen ein spezifike Suchfunktion in SCL.
Dann hat man auch flexibilität bei der Suchkriterium, und was passieren soll wenn Treffer gefunden sind.
Dies ist einfach zu warten, und die Performance ist maximal, insbesonders wenn die Daten 'optimiert' gespeichert sind.
 
Danke für euer Feedback und Meinungen!
Ich habe mir schon gedacht, dass ein "Baustein für alles" alles andere als praktikabel ist. Aber ich wollte einfach mal was ausprobieren und mich ein bisschen vertraut mit dem Typen Variant machen bzw. generell Erfahrungen sammeln von dem was möglich ist und von dem was nicht.

Hast Du z.B. bedacht, dass Deine Routine im allgemeinen Fall zwei Ergebnisse liefern muss? Eines für den Wert "von" und ein weiteres für den Wert "bis"? Je nach Anwendungsfall, kann das Array mehrere Sätze enthalten, die eine Übereinstimmung mit dem SuchKriterium enthalten.
Ja, das habe ich schon auf dem Schirm gehabt. Plan war ja alle Ergebnisse auszugeben.
Spätestens, wenn es um umfangreichere Arrays geht, würde ich "binäres Suchen" anpeilen, um ein schnelles Auffinden zu ermöglichen. Dazu muss aber das Array nach der Spalte sortiert sein, in der gesucht werden soll.
Das Array selbst komplett zu sortieren ist aber gar nicht erforderlich, man benötigt lediglich zusätzlich eine eigene Spalte in der Tabelle, mit der man die Sortierung "vortäuscht". Diese Spalte enthält Indizes und diese werden so "sortiert", dass sie den entsprechenden Index (= Platz in dem Array) enthalten und der zweite, indirekte Zugriff auf die Tabelle den gewünschten DatenSatz liefert.
Ja, du hast recht, da kam bei mir leider nur eine große Nebelwolke an. 😕
 
Zurück
Oben