Step 7 String in leerem DB-Platz ablegen

Mr. Schinken

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

Erst einmal eine kurze Erklärung was ich mache:
Ich scanne einen Barcode mit einem Handscanner und übermittle diesen via RS232 an meine CP340.
In der S7 werden dann meine Empfangsdaten abgelegt.
Hier habe ich einen Baustein welcher mir einen DB mit 750 STRING[12] durchsucht ob es eine Übereinstimmung mit dem gescannten Barcode gibt.
Wenn es eine Übereinstimmung gibt ist alles gut. Dann muss nichts weiter gemacht werden.
Sollte es ein neuer Barcode sein muss ich diesen allerdings in den DB ablegen.
Hier habe ich eine Leersuche gestartet (mit dem selben Baustein die oben beschrieben). Wenn ein leerer Platz im DB gefunden wurde gibt der Baustein mit diesen als INT-Wert aus.
Nun möchte ich die Daten aus dem Empfangs-DB in den DB mit dem leerplatz verschieben.

Über UBLKMOV wäre das ja kein Problem allerdings habe ich etwas Probleme wie ich die dynamische Adressierung auf den jeweiligen Freiplatz umsetzen soll.
Hat hier jemand eine Idee oder idealerweise fertige Lösung?

Danke schonmal!

 
Hallo,

du weißt das ein Platz 14 Bytes in Anspruch nimmt. 12 Bytes für die Zeichen und 2 Byte String Header.
Damit kannst du dir die Adresse errechnen. Ist also Platz 10 frei ist die Adresse des ersten neuen String Bytes 140.


Nun kannst du dir mittels Pointer den String dahin kopieren.

Steffan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das ist soweit klar.
Das Problem habe ich allerdings momentan bei der Erstellung des Pointers mit dem ich die Daten dann mit UBLKMOV in den DB schreibe.
Weiß gerade nicht wie ich den FB oder FC aufbauen soll mit dem ich die Adresse in UBLKMOV schreibe.
 
Wie durchsuchst du denn den DB?
Ist der als Array of String aufgebaut oder adressierst du dort auch über eine Berechnung der Adressen?
Hier #9 hatten wir mal einen Baustein, der als Input für Zeil und Quelle den DB, die Bytenummer und die Länge erwartet.
Ja nach Organisation deines DB kannst du ja berechnen,ab welchem Byte der jeweilige Platz beginnt.

1 String beginnt bei 0
2. String bei 14
3. String bei 28
...

Dann kannst du über den o.g. Baustein direkt das Start-/Zielbyte angeben und (hier) mit dem SFC20 umkopieren ohne selbst irgendwelche Any-Zeiger umbelegen zu müssen.
 
Ist eine Suche hier aus dem Forum die ich für meine Zwecke gekürzt habe.
Hab mal den Code angehängt.
Dan DB habe ich via Quelle erstellt. Dieser beinhaltet lediglich 750 Strings der Länge 12 (also 14 mit Header).
 

Anhänge

  • Suche.txt
    4 KB · Aufrufe: 22
Zuviel Werbung?
-> Hier kostenlos registrieren
Uh, ist schon ganz schön alt, glaube ich.
Kommt mir aber bekannt vor irgendwie. :ROFLMAO:
MD100 ist wohl nur zum Beobachten, kann dann wahrscheinlich wegfallen.
Es wird ja die Bytepos des gefundenen Strings ausgegeben, die kannst du dann für den FC112 nutzen.
Evtl. noch etwas nachjustieren, wegen der 2 Byte Kopf.

Ideal wäre ja heutzutage, das in SCL mit einem Array 0... of String zu machen. und dann den DB zu durchsuchen, indem man einen Arrayindex hochzählt.
Mit diesem Index kann man dann arbeiten.

Möglicherweise ist das aber damals in AWL gemacht worden, weil erstmal nur das 1. DWord gesucht und verglichen wird und das u.U. schneller geht, als den FC für den Stringvergleich aus der IEC-Library zu verwenden.
Du mußt ohnehin mal sehen, was die Zykluszeit der SPS sagt, wenn du wirklich bis zum Ende des DB suchen mußt!
 
So hab mal den FC112 getestet.
Läuft ohne Probleme. Hab mir noch ein Startsignal zum umkopieren reingebastelt und fertig! Echt top und genau das was ich gesucht habe.
Hab im Such FB noch ein Offset von 2 eingetragen und nun landet alles richtig im Ziel DB.

Ja hatte das ganze Anfangs in SCL. Läuft auch bis zu einer gewissen Anzahl von Typen super.
Das Problem war allerdings das ich 6 DB´s mit je 750 Typ durchsuche.
Da hat die 314er nicht mehr mitgespielt.
Hab dann kurzerhand mal den FB aus dem Forum getestet da hier DWORD weiße verglichen wird und da hat es geklappt von der Zykluszeit her.
Daher die altmodische Lösung mit AWL. Bin auch nicht der riesen AWL Fan aber wusste nicht so recht wie ich die Strings in SCL auftrenne ohne riesen zeitlichen Aufwand reinzustecken.

Vielen Vielen Dank für die Hilfe kann ich nur sagen.
 
Zurück
Oben