TIA Ringspeicher mit Vergleicher

Amkonianer

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

ich bräuchte dringend eure Hilfe!!!!!

Bin erst seit 3 Wochen in der Programmierung so wirklich drinnen.
Meine aufgabe ist es einen Ringspeicher zu programmieren in dem insgesamt 20 Nummern geschrieben werden sollten. Nach jedem Prüfvorgang kommt quasi eine neue nummer hinzu und die letzte soll "hinausgeschoben" werden. Die nummern sind 8 stellig. Sie sollen dann vergliechen werden.
das heißt jede nummer darf nur einmal im speicher vorkommen. wenn das nicht der fall ist soll eine Fehlermeldung kommen das zweimal die gleiche nummer gescannt wurde (Handscanner).

ich hab heute schon den ganzen gegoogelt und im Forum nachgeschaut aber ich weiß einfach nicht wie und wo ich anfagen soll.

Hoffe ihr habt vll einige tipps für mich bzw. code etc., irgendwas das mir weiterhilft!

Danke schonmal im vorraus.

Euer Fabian.
 
Ich fang mal mit Tips an:

1. Programmieren in SCL.
2. Programmieren eines Ringbuffers mit einem Zeiger
ein FB mit Array[1..20] of String[8] im Stat definiert (ich geh mal von einem String aus)
ein Zeiger INT

Ablauf:

-Neuer String gescannt --> Eintragen des String als IN in den FB, Starten deri Eintrags mit einer Flanke
-Zuerst suchen über das Array[1..20], ob der Eingangsstring <> dem jeweiligen Element
läuft die Suche bis 20 durch, kann der String an die Position eingetragen werden, auf die der Zeiger zeigt, wenn nicht --> Errormeldung und kein Eintrag, da der String bereits vorhanden

wenn Eintrag --> Der Zeiger startet bei Initialisierung mit Wert 1. Soll ein String eingetragen werden, dann auf Element[Zeiger], danach wird der Zeiger um 1 erhöht und gepüft, ob er > 20 ist. Ist er das, dann wir der Zeiger auf 1 gesetzt, ansonsten passiert nichts weiter

Eine Init-Routine würde ich noch vorsehen, Zeiger auf 1 und in einer Schleife alle Array-Einträge auf ''
 
Vielen dank erstmal für eure schnellen antworten.

an ralle: nein ein string ist es nicht, es ist ein Array von 8 chars.

ja ich weiß bei der Suchfunktion kommen etliche fifo lösungen etc. aber ich weiß einfach nicht welchen ich benutzen soll bzw. wo ich anfangen soll, steh ziemlich unter Zeitdruck und soll bist nächste Woche diesen ringspeicher programmieren und soll auch noch Datenarchivierung machen und ich hab keine Ahnung wie ich das mit dem tabellenformat mach :D

ich schau das ich zumindest diesen ringspeicher erstmal hinbekomme :)
PS: Hab auch noch nie in SCL programmiert :rolleyes::confused:ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht solltest du erstmal damit anfangen, dir ein Konzept zu erstellen : Was will ich wie machen ...

Zu deiner letzten Frage :
AT-Sicht auf deinen definierten String machen, der den Zeichenanteil davon als Array of Char (am Besten in gleicher Größe wie deine Quelle) sieht. Dein Quell-Array of Char dem Array of Char in der AT-Sicht zuweisen. Die Stringlänge im String eintragen. Nun kannst du in der Folge mit dem String arbeiten.

Wenn das Ganze zu etwas Code werden soll würde ich vorschlagen, du erstellst erstmal etwas und veröffentlichst das hier und wir entwickeln das dann GEMEINSAM weiter ...
So "ins Blaue" werden wir m.E. nicht wirklich weiter kommen ...

Gruß
Larry
 
Wie Larry Laffer schon schrieb, fang mal an dass du es schaffst (eventuell mit dem Codesnippet) dass dein erster Wert durch ein Startsignal in das FIFO geschrieben wird und der letzte rausfliegt. Der Vergleich der Charwerte ist dann noch eine 2. weitere Ausbaustufe der Funktion
 
Unbenannt3.PNG
Nun will ich quasi diese 8 chars in einen string zusammenfassen damit ich den dann im ringpuffer speichern kann, und jedes mal wenn ein neuer string in den puffer kommt soll er mit allen anderen vergliechen werden damit es nicht vorkommt dass das teil welches gescannt wird 2 mal vorkommt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu dem "die Chars in einen String bringen" habe ich dir doch etwas geschrieben - versuch doch mal das umzusetzen, dann den Code zu posten ... und dann schauen wir mal ...
 
ja ich hab das gelesen, leider hab ich keine Ahnung von SCL, bzw. ich versteh das einfach nicht was ich machen soll und wie das funktioniert:confused:
 
Naja ... ich weiß im Augenblick nicht so recht, wie ich dir da helfen soll ...
Mit irgend etwas MUSST du anfangen. Deine Ringspeicher-String-Char-Array-Geschichte wäre in SCL am Sinnvollsten aufgehoben und ist da auch am Einfachsten umzusetzen. Wie würdest du es denn umsetzen wollen ? KOP, FUP, AWL ? Auch da mußt du die "ein bißchen" tiefer in die Materie einarbeiten - dann kannst du auch (schon allein von der Sinnfälligkeit her) gleich mit SCL starten.

Wie soll es nun weiter gehen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Amkonianer verrat uns doch mal welche Ausbildung du hast bzw. welche Vorkenntnisse du hast.
Wenn du irgendeine Hochsprache mal gelernt hast, dann ist SCL der richtige Weg.
Wenn nicht, dann wird es nämlich richtig kompliziert.
Die Aufgabe lässt sich natürlich auch in AWL lösen, aber dabei wird das Ganze noch schwieriger.
Mit TIA kannst du die Aufgabe auch in Kop oder Fup lösen, aber ob das dann noch nachvollziehbar ist sei mal dahingestellt.

Gruß
Dieter
 
@Larry:

wenn ihr sagt das es am einfachsten in SCL geht, dann versuch ich das jetzt auch mal. leider finde ich im tia Portal keinen be**** Baustein wie z.b. char_to_strg oder einen ähnlichen. Hast du vielleicht ein bischen code für mich wie ich anfangen soll das ich jetzt nur mal die Array of char [0..8] in einen string umwandle das wär schon mal eine große hilfe :|

@Blockmove:

Also ich hab vor kurzen meine Ausbildung zum Elektroniker für Betriebstechnik abgeschlossen. War vor 4,5 Jahren für ein Jahr auf einer Schuler für Fachinformatiker für Anwendungsentwicklung und Systemintegration. Also ein wenig Programmiererfahrung hab ich noch glaub ich :ROFLMAO:
Hatte dort c++, html, php und ein bischen my SQL gelernt.
Da ich der einzige bei uns in der Firma bin der jetzt programmiert, hab ich eben keinen "Mentor" das ist einfach blöd.
 
Das du was zum anfangen hast.

Array of Char ist ja fast schon ein String ihm fehlen nur noch die statusbytes am anfang.
Also könntest du dir mal ne Struktur eines Strings anlegen (brauchst du eigentlich nicht ist aber erstmal zum Anfangen sinnvoll).
Code:
      Rec : Struct         
         Byte1 : Byte;
         Byte2 : Byte;
         CHAR: Array[0..256] of CHAR;

Damit hast du schonmal einen platz wo du deinen Array of Char versorgen kannst. Mit Blockmove kopierst du deine Chars jetzt in CHAR[x-y] der Struktur.

Dann kannst du Rec direkt einem String zuweisen. z.Bsp so:
Code:
#Dummyval := BLKMOV(SRCBLK:=#Rec.CHAR, DSTBLK=>#Empfangsstring);

Um eine einfache Wandlung zwischen Array of Char und String zu machen brauchst du also nichtmal die längenbytes. Ich lasse sie aber immer als Struktur stehen da man dann einfacher eine Sicht drauf machen kann.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 27855
Nun will ich quasi diese 8 chars in einen string zusammenfassen damit ich den dann im ringpuffer speichern kann, und jedes mal wenn ein neuer string in den puffer kommt soll er mit allen anderen vergliechen werden damit es nicht vorkommt dass das teil welches gescannt wird 2 mal vorkommt.

Ich seh da 6 Char, ist das die richtige Nummer?
Wenn das immer eine Nummer (nur Ziffern) ist, könnte man die auch in eine DINT wandeln (dazu könnte man sich evtl. einen kleinen FC schreiben), dann wäre der Vergleich einfacher und schneller.
Steht die Nummer in den Empfangsdaten immer an der selben Stelle, ist die immer gleich lang? Sonst müßte man sich die ja erst einaml raussuchen, z.Bsp. das '/' suchen und dann die folgenden Daten rauskopieren.

Was für eine SPS nutzt du überhaupt?
 
Ach ja Entschuldigung es sind 6.

Ja die Ziffern stehen immer an der selben Stelle und sind immer gleich lang.

Hab hier WinAC RTX Controller Panel weiß jz leider nicht was diese für eine SPS simuliert, und im Schaltschrank eine ET200MP mit 2 Eingangsmodulen und 1 Ausgangsmodul.

Okay dann probier ich das mit dem DINT erstmal, weil beim SCL Code scheiterts bei mir anscheinend schon in den ersten Zeilen. Das Tia zeigt mir dauernd an das "function_block" nicht deklariert ist ...
 
Ach ja Entschuldigung es sind 6.

Ja die Ziffern stehen immer an der selben Stelle und sind immer gleich lang.

Hab hier WinAC RTX Controller Panel weiß jz leider nicht was diese für eine SPS simuliert, und im Schaltschrank eine ET200MP mit 2 Eingangsmodulen und 1 Ausgangsmodul.

Okay dann probier ich das mit dem DINT erstmal, weil beim SCL Code scheiterts bei mir anscheinend schon in den ersten Zeilen. Das Tia zeigt mir dauernd an das "function_block" nicht deklariert ist ...


Bei Bausteine gibts in TIA eine Funktion "Neuen Baustein einfügen".
Dort FB auswählen, als Erstellersprache SCL.

Bei der SPS gings mit nur darum ob "Alt" (Klassik) oder "Neu" (1200/1500-er).
Deine Info reicht da schon. :)
 
Hier mal ein kleines Beispiel.

Anhang anzeigen Ringbuffer.scl.txt

Unter der CPU im TIA gibt es einen Folder "Externe Quellen".
Da hinein kopieren und dann übersetzen. (Vorher das .txt weglöschen, das ist nur da, damit man es hier hochladen kann.)
Am besten ein neues Projekt nutzen. Du mußt noch einen OB 1 anlegen, in dem du den FB aufrufst und mit Merkern bestückst.
Dann kannst du ja mal testen und ändern. Es ist nur als Beispiel gedacht, die Wandlung funktioniert, ist aber ohne Prüfung, d.h. wenn in den Char etwas anderes als Ziffern steht, kommt Mist bei der Wandlung raus. Kannst du ja gerne auch mal probieren.
 
Zurück
Oben