DB mit 1000 Strings durchsuchen...?!?!

Klausi

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

ich bin noch neu hier bei EUCH.

Ich knabbere schon seit längere Zeit an ein Problem:

-einen Datenbaustein mit 1000 Strings[4] durchsuchen und
mit einen eingelesenen Wert (CP340) 1 String[4] auf vorhandensein
prüfen

Mein Ansatz ist eine Schleife die ich programmiert habe,
leider wird diese nur 1mal durchlaufen :::((((
ich finde einfach das Problem nicht...
und auserdem 1000 Strings...was sagt den da die Zykluszeit einer
CPU314 ????

Vielleicht habt Ihr eine bessere Idee und oder Lösungansätze???
 
Hallo Klausi,

...Mein Ansatz ist eine Schleife die ich programmiert habe, leider wird diese nur 1mal durchlaufen :::((((
ich finde einfach das Problem nicht...
Und wie soll man dir da helfen? Irgendwer würde den Fehler sicherlich finden wenn er den Code von dir sehen würde ;) .

..einen Datenbaustein mit 1000 Strings[4] durchsuchen und mit einen eingelesenen Wert (CP340) 1 String[4] auf vorhandensein prüfen..
...und auserdem 1000 Strings...was sagt den da die Zykluszeit einer CPU314 ????

Für die Zykluszeit ist so etwas natürlich nicht so gut. Da die Strings alle die Länge 4 haben, könnte man die Längenangaben der Strings beim Vergleichen ausser acht lassen und einfach nur die Bitmuster der vier Byte als Doppelwort vergleichen (nicht als String). Desweiteren könnte man u.U. den Vergleich der 1000 Strings auf mehrere Zyklen verteilen.


Gruß, Onkel
 
Hier ist der Code:

UN E 0.0
SPB end
//*
AUF "Database"
L 0
SLD 3
LAR1
//*
loop: L DBD [AR1,P#0.0]
L DB10.DBD 2
==D
SPB end
L DBD [AR1,P#0.0]
T #int1
TAR1
L P#4.0
+D
LAR1
SPA loop
//*
end: NOP 0
SET
S M 0.0

sobald ich den e0.0 betätige geht die CPU in Stop????

Bitte um Hilfe!!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Klausi
Weiterhin hast du nur eine Abbruchbedingung, wenn der String erkannt wird. Ist der String nicht in deiner Tabelle verzeichnet, läuft dein Pointer irgenwann ans dem DB (der DB ist dann zu kurz) und deine CPU geht in STOP. (Stopursache über Strg D)

Ich würde folgendes vorschlagen:

Du legst eine stat Variable an, in der du die momentan zu vergleichende DW - Nummer ablegst. (Daraus kann man dann auch die Adresse für AR1 ableiten). Weiterhin eine stat Var Busy, die anzeigt, daß ein Vergleich läuft. Mit dem Loop-Befehl programmierst du eine Schleife für z.Bsp. 50 Durchläufe (temp Var Zaehler und stat Var Gesamtzaehler).

Bei Start des FC kontrollierst du Busy
Ist Busy 0, dann Neuststart mit den Startwerten (0 für Zaehler und Gesamtzaehler)
Ist Busy 1, dann Schleife normal durchlaufen mit den stat.Variablen.

Jeder Durchlauf vergleicht 50 Strings. Danach wird der Loop beendet, das restliche SPS-Programm kann abgearbeitet werden, Busy ist auf 1.
Bei jedem Nächsten SPS-Zyklus weitere 50 Strings.
Wird ein String gefunden, Ausgabe des Ergebnis und Busy auf 0 (evtl. noch ein Fertigbit setzen).
Wenn die stat Var Gesamtzaehler auf 1000 hochgezählt hat, Busy ebenfalls auf 0, dann ist der String nicht im DB (Bit für fehlenden String setzen).

Ein neuer Vergleich wird nur gestartet, wenn Busy auf 0 ist.

Bei 50 Vergleichen und einer Zykluszeit von 20ms hast du den DB in einer Sekunde durch, deine Zykluszeit aber nicht allzusehr belastet.
 
Zuletzt bearbeitet:
Volker der Tipp war schon gut,
leider durchsucht die Schleife nicht den DB"Database":::(((

Der Code wird nur 1 mal durchlaufen...der Offsetwert ändert
sich nicht...müsste man ja in der Onlineansicht im Adressregister sehen
oder ???
 
Ralle, das ist eine sehr guter Ansatz:)

Ich hoffe das ich die Sache irgendwie hinbekomme.

Für ein Codebeispiel wäre ich sehr dankbar.

Gruss
Klausi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
welchen sinn haben diese zeilen?
L DBD [AR1,P#0.0]
T #int1

den index kannst du auch so erhöhen
L P#4.0
+AR1

mache ich im folgenden beispiel aber anders

Code:
      UN    E      0.0
      SPB   exit
      CLR   
      =     M      0.0
      L     0
      T     #index
loop: NOP   0
      SLD   3
      LAR1  
      AUF   DB    11
      L     DBD [AR1,P#0.0]
      L     DB10.DBD    2
      ==D   
      =     #gefunden
      SPB   end
      L     4
      L     #index
      +I    
      T     #index                      //index erhöhen
      L     4000                        //letztes dbd
      >=I   
      SPB   exit
      TAK                               //neuen index zurückholen
      SPA   loop
//*
end:  NOP   0
      L     #index                      //gefunden in dbd x
      T     #int1
exit: U     #gefunden
      S     M      0.0
 
@Klausi

Volkers Code ist der "innere" Teil meines Vorschlags, Index allerdings auf 4*50=200. Außen herum mußt du jetzt noch die Start-Routine und einen Gesamtindex legen, so daß also nach jedem Durchlauf der Gesamtindex um 200 höher ist. Der Gesamtindex muß Statisch (DB oder Merker-Wort) sein, da er im nächsten SPS-Zyklus seinen alten Wert noch haben muß. Ebenso das Busy-Bit. Versuchs mal und stell den Code hier rein, dann sehen wir weiter.
 
Danke Volker so funktioniert die Sache ::))

Ralle, ich werde mal Dein Vorschlag in Angriff nehmen, werde
den den Code hier reinstellen.

Estmal vielen Dank für eure Teilnahme !!!

Gruss
Klausi
 
Zurück
Oben