SPS-Datenbank

slider

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

öfters mal neue Aufgaben erheitern das Leben.

Ich brauche in der SPS eine art Datenbank. In der ich ca. 200 Datensätze bestehen aus je zwei Doppelworten ablege.
Und nun muß ich geziehlt nach einem String suchen und den Pointer auswerten. Anschließend den Datensatz abändern oder löschen.

Bin über jeden Tipp dankbar.
 
Hi

Ich empfehle dafür SCL.

Arrays anlegen und Sequenziel suchen.

(Kannst auch nach suchwort sortieren, dann erfolgt der Zugriff
aufgrund eine Suchroutine schneller)


Karl
 
Hallo,
Warum nicht alles in einen DB packen und bei der Suche einen Zähler in 2erschritten hochzählen der den DW entspricht wo der Suchzeiger steht?
200 Datensätze sind doch nicht soviel, das man pro nicht 10 pro Zyklus durchsuchen und bearbeiten könnte, und so für die gesammte Aufgabe 20Zyklen braucht?!

Grüße Thomas
 
Zuletzt bearbeitet:
Das größte Problem sehe ich im vergleichen der Strings.

Hier empfiehlt es sich eine eigene Funtkion zu schreiben, sofern die SPS zeitkritische Aufgaben erledigen soll.

Auf einer alten CPU 315-2DP brachte die Funktion zum Vergleichen der Strings, welche aus der Siemens Bibliothek entnommen wurde, eine Erhöhung der Zykluszeit um ca. 25ms pro Vergleichsvorgang.

Bei 10 Vergleichen pro Zyklus wäre das eine Mindestzykluszeit von 250(!) ms.

Vielleicht wird es auf neuen Steuerungen schneller bearbeitet, aber auf älteren Steuerungen würde ich entweder pro Zyklus nur eine oder maximal 2 Vergleichsvorgänge durchführen bzw. eine eigene Funtkion dafür erstellen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
da slider nur 2 doppelworte hat kann man das doch einfach mit einem vergleicher machen.

eine vergleichsoperation ==D dauert in einer 315-2dp 2 ys. das ganze sollte sich also in 1 bis zwei zyklen erledigen lassen.
 
Hallo Leute

son nun habe ich mehr Projektinfos

CPU = 414-2 DP

ich muß mir Telegramme zu je 140 Byte speichen
die werde ich wohl in eine UDT setzen

innerhalb des Teles liegt eine ID Nr. zu 12 byte und die muß ich suchen um das richtige Telegramm zu bearbeiten

wenn ich weiß welcher UDT die ID Nr. angehört habe ich weiter keine Probleme mehr :???:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn der vergleich mit der fc so langsam ist wie crasycat schreibt, könntest du folgendermassen vorgehen.

12 byte = 3 doppelworte.
das array nach dem 1. dbd durchsuchen. wenns passt das 2. und wenn wieder passt das 3. vergleichen.

ist das ersten schon falsch kannst du direkt den nächsten block nehmen.
 
der einfachheithalber habe ich mal einen Baustein gepostet den wir so einsetzen...

zur Info: die ID besteht aus 2 Doppelwörtern (Behälternummer)
und jeder Datenblock ist 40 Bytes lang

ausgegebn wird ein "gefunden" Bit und der Pointer an dem die gefundene ID beginnt.

die Datenbasis ist ein DB mit einem allgemeinen und einem Array aus den Datenblöcken



CLR // Initialisiere Suchvorgang
= #BH_gefunden
L 0
T #BH_Pointer
U( // Behälternummer auf ungleich Null prüfen
L #BH_Nummer_high
T #BH_Nr_high // und auf Lokaldaten für schnelleren Zugriff kopieren
L 0
==D
)
U(
L #BH_Nummer_low
T #BH_Nr_low
L 0
==D
)
BEB
AUF "Datenbasis" // Ringpuffer DB aufschlaten
LAR1 P#38.0 // Indexregister auf Anfangsadresse stellen
L DBLG // Lade Datenbausteinlänge
L L#38 // minus Länge der Allgemeinen DAten
-D
L 40 // dividiert duch 40 --> zum Ermitteln der Anzahl an Einträgen
/D
LP1: T #loopflag
L DBD [AR1,P#4.0] // Behälternummernvergleich mit Doppelwort low
L #BH_Nr_low
<>D
SPB UNGL
L DBD [AR1,P#0.0] // Behälternummernvergleich mit Doppelwort high
L #BH_Nr_high
==D
SPB GEFU
UNGL: +AR1 P#40.0 // auf nächsten Eintrag stellen
L #loopflag
LOOP LP1
BEA
GEFU: S #BH_gefunden // Behälternummer gefunden
TAR1
T #BH_Pointer
BEA
 
Zurück
Oben