TIA Char Array Werte löschen

Austria

Level-1
Beiträge
36
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Mithilfe des TRCV_C Bausteins empfange ich Werte eines RFID Readers und speichere diese in ein Char Array. Danach kopiere ich die eingelesenen Werte aus dem Array in einen String. Jedoch habe ich danach folgendes Problem: Wurden die Werte in den String kopiert möchte ich das Char Array wieder rücksetzen (Array [0] = ' ' und so weiter...). Dieses Rücksetzen habe ich auf 3 unterschiedliche Arten probiert, jedoch scheint keine zu klappen. Unerklärlicherweise funktioniert auch das anfangs genannte Werte einlesen nicht mehr, wenn ich eine dieser 3 Möglichkeiten zum Rücksetzen ausführe.

1649844377358.png

1649844389470.png

Wäre euch sehr dankbar über mögliche Lösungsansätze.

Schöne Grüße
 
Was heißt denn "funktioniert nicht"?

Wie lautet denn die Variablendeklaration von "Array_of_UID"?

Ich würde zumindest wenn du auf die Daten schreibend zugreifen willst, warten, dass der TRCV fertig ist und denn disablen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mit nicht funktionieren meine ich, dass wenn ich eine der 3 Varianten auskommentiere (also einbinde) dann der Char to Strg Block am Anfang auch nicht mehr funktioniert.

1649845473143.png


1649845481313.png

1649845499785.png
 
Was genau heißt Funktioniert Nicht. Du kopierst das Array zyklisch auf einen String, löscht aber zwischendurch das Array, dann ist auch der String leer. Meinst du das?
 
oh, zu spät... TP-Inc war vor mir dran...

Aber ergänzend dazu: Verwende "DONE" vom TRCV_C, um Deinen Wert umzukopieren und dein Array zu löschen.
DONE steht nur für einen Zyklus an (Flanke).

Warum willst Du überhaupt das Array ablöschen? Ist doch nur zusätzliches kopieren und bringt Dir nichts?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich schildere euch mal meine Vorstellung wie ich das eigentlich umsetzen möchte:

  1. Mittels TRCV_C empfange ich in ein Char Array Werte eines RFID Readers
  2. Diese Werte sollen dann in eine String Variable kopiert werden

Die richtige Char Länge der eingelesenen Daten ist 7767CE65$R$L
Anschließend kopiere ich diese Werte in meinen String = 7767CE65$R$L
Danach suche ich mittels Find Funktion nach der Position des Steuerzeichens $R
Zum Schluss lösche ich alle Steuerzeichen ab der gefundenen Position von $R

Der endgültige String sieht nun folgendermaßen aus: String = 7767CE65

1649849545367.png

Folgendes Problem ergibt sich aber wenn ich eine "falsche" RFID Karte einscanne, die mehr Werte enthält:

1649849571168.png

Soweit so gut diese RFID Karte wird eingelesen… Scanne ich nun erneut die "richtige" RFID Karte ein passiert folgendes:

1649849596376.png

=> Die "richtige" Karte kann nicht mehr korrekt eingelesen werden… Deswegen möchte ich das Char Array nach jedem Einlesevorgang rücksetzen.

Erhöhe ich beispielsweise den Index des Char Array auf 30, werden erst die Daten in den String kopiert, wenn alle 30 Indizes gefüllt sind.
Somit müsste ich (7767CE65$R$L) 3 mal einscannen bis es in den String kopiert wird.

Ich hoffe diese ausführliche Beschreibung war hilfreich, damit ihr mein Problem versteht. Möglicherweise muss ich die Konfiguration von TRCV_C anpassen ?
Oder habt ihr sonst noch Vorschläge wie dieses Problem umgangen werden kann?


Hier wäre noch mein vollständiges Programm:

1649849613535.png
 
Moin Austria,

wenn Du ADHOC auf "TRUE" stellst, kannst Du Daten mit Variabler Länge empfangen.

Was heißt das?
An "DATA" trägst Du ein Array[] of Byte ein, das so groß ist, dass der größte zu erwartende Datensatz hineingeschrieben werden kann.
An RCVD_LEN wir die Länge der Daten angegeben, die empfangen wurden.

Andere Frage:
Wenn Du schon ein Array[] of Byte (oder Char) hast, warum kopierst Du das in eine String-Variable?

Ich würde am EN_R auch keinen Takt abgeben. Das programmiere ich üblicherweise so:

Code:
TRCV_C();  // Aufruf, die Parameter spare ich mir hier

IF
    connected // frage ich mit T_DIAG ab; der Status von TRCV_C war nicht robust genug
THEN
    EN_R := true;
END_IF;


IF
    DONE
THEN
    EN_R := false;
    Daten sichern
END_IF;


VG

MFreiberger
 
Danke MFreiberger für die Antwort, werde es mal versuchen umzusetzen! Eine String Variable mit der enthaltenen UID verwende ich deswegen, weil ich diese an eine Datenbank sende und darin auswerte (geht einfacher mit einem String...)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Freiberger, konnte deine Vorschläge erfolgreich umsetzten. Jedoch besteht mein Anfangsproblem immer noch... Wenn ich einen Eingangspuffer, mit dem größten zu erwartenden Eingangspuffer definiere, wird solange "gewartet" bis dieser vollständig gefüllt ist. Beispielsweise definiere ich eine charArray[1...30] und lese 10 Werte von meinem Reader ein. Diese 10 Werte muss ich 3 mal einlesen, damit der Puffer gefüllt ist, erst dann zeigt mir das Array die eingelesenen Werte an, vorher komischerweise nicht... Was müsste ich dementsprechend noch konfigurieren oder ähnliches?
 
Moin Austria,

das verstehe ich noch nicht richtig.
Was heißt "es wird gewartet"? Wer wartet?

Wertest Du das Bit "DONE" aus? Gibt es einen "ERROR" (ggf. Status bei ERROR speichern)?

Was heißt "Diese 10 Werte muss ich 3 mal einlesen"?
Werden damit die 30 Char gefüllt, immer das erste überschrieben und was triggert das Einlesen? Wann stehen NEUE Werte an?

VG

MFreiberger
 
Ich schicke nochmal einen Screenshot meines überarbeiteten Programms. Es wird zuerst der Verbindungsaufbau mit Done von T Diagnose überprüft. Ist dies erfolgreich wird das Einlesen getriggert, sobald eine RFID Karte gescannt wird. Habe nun mal mehrere Tests mit unterschiedlicher Konfiguration durchgeführt:

Fall 1:
Adhoc = TRUE => Char Array wird immer von Index 1 an gefüllt. Beim nächsten scannen wieder von 1 - 10. Jedoch wird das erste Zeichen abgeschnitten bzw. nicht eingelesen
=> 767CE65$R$L

Fall 2:
Adhoc = FALSE => Char Array wird zuerst von Index 1 -10 gefüllt. Danach von 10 – 20 und schlussendlich 20 – 30. Jedoch wird hier die Seriennummer korrekt eingelesen, bedeutet, dass das erste Zeichen nicht wie vorhin abgeschnitten wird.
=> 7767CE65$R$L7767CE65$R$L7767CE65$R$L

Fazit:
Hätte gerne das Fall 1 zutrifft, sprich das Array wird immer von Beginn an gefüllt. Jedoch verstehe ich nicht wieso das erste Zeichen nicht angezeigt wird.

Hier noch mein Programmcode:

1649922467340.png

1649922573127.png

1649922720109.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich schicke nochmal einen Screenshot meines überarbeiteten Programms. Es wird zuerst der Verbindungsaufbau mit Done von T Diagnose überprüft. Ist dies erfolgreich wird das Einlesen getriggert, sobald eine RFID Karte gescannt wird. Habe nun mal mehrere Tests mit unterschiedlicher Konfiguration durchgeführt:
Warum ist die Zeile "#TRCV_C.EN_R := FALSE;" auskommentiert?

Fall 1:
Adhoc = TRUE => Char Array wird immer von Index 1 an gefüllt. Beim nächsten scannen wieder von 1 - 10. Jedoch wird das erste Zeichen abgeschnitten bzw. nicht eingelesen
=> 767CE65$R$L
Möglicherweise ist es sinnvoll, den Eingangspuffer zu löschen, bevor der TRCV_C aufgerufen wird.

Fall 2:
Adhoc = FALSE => Char Array wird zuerst von Index 1 -10 gefüllt. Danach von 10 – 20 und schlussendlich 20 – 30. Jedoch wird hier die Seriennummer korrekt eingelesen, bedeutet, dass das erste Zeichen nicht wie vorhin abgeschnitten wird.
=> 7767CE65$R$L7767CE65$R$L7767CE65$R$L
Also immer die gleichen Daten werden mehrfach in den Puffer geschrieben?

Fazit:
Hätte gerne das Fall 1 zutrifft, sprich das Array wird immer von Beginn an gefüllt. Jedoch verstehe ich nicht wieso das erste Zeichen nicht angezeigt wird.
Das verstehe ich i.M. auch (noch) nicht.
 
Warum ist die Zeile "#TRCV_C.EN_R := FALSE;" auskommentiert?
war ein Fehler meinerseits, soll natürlich nicht auskommentiert werden

Also immer die gleichen Daten werden mehrfach in den Puffer geschrieben?
es müssen nicht zwingend die gleichen Daten sein. Aber der Eingangspuffer wird erst in den String kopiert wenn alle 30 Werte gefüllt sind. Lese ich meine Karte nur 1 mal ein (also 10 Werte) passiert nichts und es wird auch nichts kopiert.

Möglicherweise ist es sinnvoll, den Eingangspuffer zu löschen, bevor der TRCV_C aufgerufen wird.
werde dies mal versuchen, möglicherweise wird der Fehler, dass das 1te Zeichen nicht angezeigt wird dadurch behoben
 
Fazit nach weiteren Tests: (Konfiguration: Adhoc = true)

Nun wird die Seriennummer wie gewünscht immer an den Anfang des Puffers geschrieben. Da ich den Puffer vor dem TRCV Aufruf lösche.
Problem: Das erste Zeichen wird leider immer noch abgeschnitten bzw. wird nicht angezeigt. Habe dafür leider keine Erklärung...

Aktuell:
1649927123393.png
korrekt müsste es : 7767CE65 sein

1649927108729.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst Du mal eine Zeile
#Process_UID.charArray := #Process_UID.charArray;
hinzufügen, damit man den Ausgang von TRCV_C kontrollieren kann?

Noch was, das nicht das eigentliche Problem behandelt, aber wichtig ist:
von T_DIAG nicht das DONE benutzen, sondern (in Deinem Fall) das #T_DIAG.RESULT. Wenn das gliech b#16#4 ist, ist die Verbindung aufgebaut.

Dein Array löscht Du am besten ab, indem NOCH ein Array anlegst, das leer ist.

Dann kannst Du die Zeile:
#Process_UID.charArray := <leeres Array>;
schreiben. Nur muss das leere Array natürlich den gleichen Aufbau haben; d.h. die Struktur muss überein passen.

Und das Ablöschen immer VOR dem Aufruf von TRCV_C machen. Und zwar zyklisch, nicht von irgendetwas (wie z.B. #T_DIAG.DONE) abhängig machen!
 
Noch was, das nicht das eigentliche Problem behandelt, aber wichtig ist:
von T_DIAG nicht das DONE benutzen, sondern (in Deinem Fall) das #T_DIAG.RESULT. Wenn das gliech b#16#4 ist, ist die Verbindung aufgebaut.
1649929812589.png
Hab ich gemacht.

Dann kannst Du die Zeile:
#Process_UID.charArray := <leeres Array>;
schreiben. Nur muss das leere Array natürlich den gleichen Aufbau haben; d.h. die Struktur muss überein passen.

Und das Ablöschen immer VOR dem Aufruf von TRCV_C machen. Und zwar zyklisch, nicht von irgendetwas (wie z.B. #T_DIAG.DONE) abhängig machen!
1649929870580.png

Habe es nun vor dem Aufruf von TRCV eingefügt.

Kannst Du mal eine Zeile
#Process_UID.charArray := #Process_UID.charArray;
hinzufügen, damit man den Ausgang von TRCV_C kontrollieren kann?
bin mir jetzt nicht ganz sicher an welcher Zeile in meinem Code ich das einfügen soll

1649930080099.png

Bezüglich dem Problem, dass das erste Zeichen der Seriennummer nicht richtig eingelesen wird:

Kann es sein, dass die Seriennummer zu schnell eingelesen wird? Da manchmal im String kurzzeitig das erste Zeichen erscheint:
inputUID = '7' nach erneutem Einlesen lautet es wieder folgendermaßen: inputUID = '767CE65' (korrekt wäre 7767CE65)
Kann man die Einlesezeit irgendwie "verlangsamen"...?
 

Anhänge

  • 1649930057831.png
    1649930057831.png
    15 KB · Aufrufe: 2
Ist denn gewährleistet, dass vom Sender immer genau 10 Zeichen kommen? Wenn ja, dann würde ich nicht Adhoc verwenden. Dann könntest du als Sicherheit nochmal abfangen wenn die letzten Zeichen nicht $R$L sind, dann selber die Verbindung trennen und neu aufsetzen.

Ansonsten musst du halt das Protokoll verarbeiten. D.h. Zeichen einlesen bis $R$L kommt, dann alles bis hier hin verarbeiten. Sind noch weitere Zeichen übrig aber noch kein $R$L vorhanden, dann gehören die zu einem neuen Telegramm und du darfst die Zeichen nicht wegwerfen sondern musst diese speichern und zusammensetzen. Das ist bei TCP eben so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist denn gewährleistet, dass vom Sender immer genau 10 Zeichen kommen? Wenn ja, dann würde ich nicht Adhoc verwenden. Dann könntest du als Sicherheit nochmal abfangen wenn die letzten Zeichen nicht $R$L sind, dann selber die Verbindung trennen und neu aufsetzen.
genau es kommen immer 10 Zeichen, bei denen die letzten 2 Zeichen immer die Steuerzeichen sind. Dabei handelt es sich bei dem Transponder um eine RFID Mitarbeiterkarte, welche aktuell 10 Zeichen lang ist. Da es jedoch sein kann, dass in ein paar Jahren es auch Mitarbeiterkarten mit Seriennummern größer 10 Zeichen gibt, möchte ich den Eingangspuffer nicht auf Index 10 begrenzen, sondern einen größeren Wert z.b. 30.

Dann habe ich den Parameter Adhoc falsch verstanden, dachte: Adhoc = true => Array wird immer von Index 1 an gefüllt
Adhoc = false => Werte werden nacheinander im Array gefüllt Index 1-10 dann 10-20 und so weiter. Welcher Parameter ist dann dafür zuständig nach welchem Prinzip das Array gefüllt wird? Was ist denn die genaue Aufgabe von Adhoc?


Ansonsten musst du halt das Protokoll verarbeiten. D.h. Zeichen einlesen bis $R$L kommt, dann alles bis hier hin verarbeiten. Sind noch weitere Zeichen übrig aber noch kein $R$L vorhanden, dann gehören die zu einem neuen Telegramm und du darfst die Zeichen nicht wegwerfen sondern musst diese speichern und zusammensetzen. Das ist bei TCP eben so.
hmm okay. Das bedeutet Array einlesen bis mit der Find Funktion beispielsweise $R gefunden wird? Danach erst das Array mit Char to Strg kopieren? Bin mir nur nicht sicher ob mir das bezüglich dem Problem, dass das erste Zeichen nicht angezeigt wird, hilft...
 
Adhoc bedeutet nur, dass auch Daten im Empfangspuffer eingetragen werden, bevor die angegebene Länge erreicht wurde. Bei TCP ist aber nicht gewährleistet, dass auch wenn dein Partner die immer 10 Bytes schickt, die dann auch immer bei deinem RECV als 10 Byte ankommen. Das kann dann eben auch mal 2 Bytes und dann beim nächsten Aufruf 8 Bytes sein. Und damit muss dein Programm umgehen können, nicht mehr und auch nicht weniger. Wenn du den Adhoc Modus nicht verwendest und du gibst 10 Zeichen bei RECV an, dann speichert der Baustein die Daten z.B. die 2 Bytes zwischen, und meldet dir erst, dass neue Daten eingetroffen sind wenn auch die letzten 8 eingetroffen sind.
 
Zurück
Oben