Allgemeine Frage zu RFID

anilo14

Level-1
Beiträge
38
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle,


ich habe eine allgemeine zu RFID. Ich habe des Öfteren gesehen, dass die Datenbausteine für Lese-/Schreibdaten den Datentyp BYTE besitzen.Bsp.: SendeDaten Array[0..254] of BYTE).

Kann man stattdessen auch den Datentyp INT verwenden (SendeDaten Array[0..254] of Int??


Viele Grüße und ein schönes Wochenende

anilo14
 
Das kann man so einfach/unkonkret nicht sagen, ob der real verwendete RFID-Empfänger ein Array akzeptiert was als INT-Array deklariert ist. Technisch wäre es kein Problem, es ist ja nur eine logische Struktur als die ein zusammenhängender Speicherplatz betrachtet wird. Man nimmt üblicherweise ein Byte-Array, weil es die kleinste sinnvoll einzeln adressierbare Elementgröße hat und Bytes relativ einfach in jeden anderen Datentyp umkopiert werden können.

Beachte: Ein BYTE hat eine Speichergröße von 8 Bit und ein INT eine Größe von 16 Bit - Dein INT-Array würde doppelt so viel Speicherplatz belegen wie das BYTE-Array.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort. Du hast geschrieben, das man ein Byte-Array in jeden Datentyp umkopiert werden kann. Wie mache ich es mit hohe INT-Werte wie z.B. 10000? Muss ich da evtl. 2 Bytes zusammenfügen?

anilo14
 
Ein Byte-Array kann in alle anderen Datentypen übertragen werden. Das geht aber nicht in die Gegenrichtung.
Werte von z.B. "10000" können in einem Byte garnicht vorkommen.

Und Ja, ein INT besteht aus zwei Byte.
 
Danke für deine Antwort. Also muss ich 2 Bytes verarbeiten um auf ein Int wert zu kommen. Gibt es da zufällig Bausteine in Tia, die genau das machen? Mein erster Gedanke wäre jetzt Serialize/ Deserialize Bausteine zu verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du mit TIA arbeitetest, dann gibt es elegantere Möglichkeiten als mit einem Byte-Array.
Du kannst dir einen passenden Datentyp anlegen in dem die Daten analog zur RFID-Struktur stehen.
Wenn du die RFID-Daten ins Prozessabbild bekommst, dann kannst du den 1. Eingang mit diesem Datentyp deklarieren,
Bekommst du die Daten über DPRD_DAT, dann kannst du den Zielbereich eben entsprechend deklarieren.
Wenn du unbedingt bei einem Byte-Array bleiben willst, dann gibt es auch die Möglichkeit mit "AT".
Einer der wenigen Vorteile von TIA, dass AT jetzt auch in KOP und FUP funktioniert.

Gruß
Blockmove
 
Am besten, wenn Du den Speicherplatz der beiden Bytes gleich als INT deklarieren kannst oder per "AT" eine INT-Variable drüber legen kannst - vorausgesetzt das High-Byte des INT ist das erste der beiden direkt hintereinanderliegenden Bytes und die Bytes liegen nicht in "optimiertem" Speicher. Zwei beliebige Bytes kann man so zu einem INT zusammenbasteln:
Code:
#iVal := WORD_TO_INT( SHL(IN := BYTE_TO_WORD(#Byte1), N := 8) OR #Byte2 );

//in TIA kann man auch schreiben:
#iVal := WORD_TO_INT( SHL_WORD(IN := #Byte1, N := 8) OR #Byte2 );
[...]
Noch besser ist es, wenn man über die beiden direkt hintereinanderliegenden Bytes per "AT" ein WORD oder INT legen kann, dann braucht man nicht basteln (wenn die Endianness passt). Oder man bastelt die Bytes per "Slice" in ein WORD, was man danach in INT konvertieren kann.
Die Verwendung von Serialize/Deserialize wäre so ziemlich die unperformanteste Lösung.
Was für eine CPU willst Du programmieren?

Harald
 
Guten Morgen Harald,

die S7-1511T CPU. Die Sende/-Lesedatenbausteine hatte ich schon auf "Standandzugriff" eingestellt gehabt. Ich habs soweit so gut verstanden. Habe da noch eine Frage. Wie mache ich es, wenn ich den Datenträger beschreiben möchte? Da muss ich doch den INT-Wert in zwei unterschiedliche Bytes auftrennen, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In was für einen Datenträger - die Speicherkarte die in der CPU steckt? Oder in das Dateisystem bzw. einen Datenträger eines angeschlossenen HMI/Panels?
Mit den Möglichkeiten, wie eine S7-1500 Daten auf die Speicherkarte der CPU schreiben kann, kenne ich mich nicht wirklich aus.
Es könnte sein, daß vor dem Schreiben in eine Datei der INT in einen String gewandelt werden muß.

Warum willst Du auf Datenträger schreiben? Schreiben in einen remanenten DB oder in den Ladespeicher reicht nicht?

Harald
 
Hallo Harald,

ich möchte RFID-Datenträger beschreiben. Die Werte sollen dann auf der HMI angezeigt werden, wenn sie gelesen werden.

anilo14
 
Ich kenne nur die von IFM
DTE101 mit ant513 und RFID E80371

in der hw-config wird die gsd vom dte101 eingebunden. dort trägt man die blockgröße des e80371 ein.
am mitgeliefertem fb trage ich die startadresse ein und die zu schreibenden/lesenden anzahl an Bytes.
dem fb ist es völlig egal wie dieser datenbereich strukturiert ist.

was ich damit sagen will ist, dass du deine Daten so anlegst wie es für deine Datentypen sinnvoll ist.

das könnte z.b. so aussehen. und das kannst du natürlich auch im hmi anzeigen
 

Anhänge

  • Zwischenablage02.jpg
    Zwischenablage02.jpg
    48,4 KB · Aufrufe: 35
Zuviel Werbung?
-> Hier kostenlos registrieren
ich möchte RFID-Datenträger beschreiben. Die Werte sollen dann auf der HMI angezeigt werden, wenn sie gelesen werden.
Da kommt es darauf an, wie der RFID-Schreiber die Daten haben will und evtl. was das für Daten sind. Ich kenne RFID-Tags von TI, da will der Schreiber ein 80-Bit-Datenfeld und einige Steuerbits haben. Dem RFID-Schreiber ist es egal, wie das 80-Bit-Datenfeld logisch strukturiert ist (also ob das BYTEs oder INTs oder BOOLs oder gemischt sind).

Vielleicht verrätst Du uns, was für einen RFID-Reader/Writer Du da hast und zeigst uns evtl. die Doku der RFID-R/W Datenstrukturen.

Hmm, warum willst Du auf den RFID-Datenträger schreiben? Wie oft? Wieviele Schreibzugriffe kann der RFID-Datenträger in seiner Lebenszeit?
Bei uns beschreiben wir die RFID-Tags (Datenträger) nur einmalig mit einer unique Seriennummer, wir schreiben keine Daten auf die Tags. Die zu den Tags gehörenden veränderlichen Daten werden in SPS und PC-Datenbanken gespeichert.

Harald
 
Ich benutze die Balluff BIS013Z Lese/Schreibeköpfe. Am besten schildere ich euch kurz mal mein Vorhaben. Ich habe eine Rezeptverwaltung programmiert, dabei werden die Rezepturen nicht auf dem Panel sondern in einem DB gespeichert. Das funktioniert auch ohne Probleme. Nun habe ich vor bestimmte Rezeptdaten in RFID-Datenträger zu schreiben. Die Steuerung soll konstat prüfen ob meine RFID-Daten mit meine Rezeptdaten übereinstimmen. Wenn ja, soll die "Produktion" freigegeben" werden. Wenn nicht, soll eine Fehlermeldung erscheinen.

anilo14



 
Hallo in die Runde,
ok eure letzte Nachricht ist fast 20Monate her, aber ich hab hier das fast gleiche Problem.
Ich hab die Daten vom RFID SIEMENS RF200 Reader als Array of Byte, diese möchte ich im HMI anzeigen lassen und mit der im HMI eingegebenen
Vorgabe (wird als string vom HMI an die Siemens S7-1200 geschickt.)
abgleichen.

Also stehen mir hier die Daten WZ00120.00 als Array of Byte
und von dem HMI die daten WZ00120.00 als string zur Verfügung.

S7 Tiaportal bin ich echt Anfänger.
Dachte an Serialize bzw. Deserialize, aber hab keine Ahnung wie.

Programmiere alles in KOP
Vielen Dank...
Gruss
Sascha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich denke ein neuer Thread hätte hier gut getan.
Wo genau ist denn jetzt dein Problem? Möchtest du dein Byte-Array in einen String wandeln um diesen anzuzeigen? Dann wäre wichtig zu wissen, ob der Inhalt der Bytes schon Ascii codiert ist? Dann könntest du entweder direkt eine Zeichenkette im HMI anzeigen oder aber die einzelnen Zeichen, die in deinen Bytes stehen, zu einem String zusammenfügen.
Auf der anderen Seite das gleiche, du könntest im HMI an Stelle des Strings eine Zeichenkette als Eingabe nutzen (also Array of Char) oder aber deinen Eingabe-String in der SPS zerlegen. Das Zerlegen ginge händisch bspw. in einen For-Schleife oder mit Funktionen wie Strg_TO_Chars...
Wie gesagt, so ganz wird mir nicht klar was genau du willst.
 
Hallo,
wie gesagt ich bin echt Anfänger was TIA-Portal angeht. Früher viel mit mitsubishi, Omron programmiert.

OK zurück zu Deinen Fragen:
1. Ich muss die 10Bytes vom RFID Reader (Array of Byte) mit der Eingabe vom HMI abgleichen.
Beispiel: Der RFID liesst WZ00120.00
Der Bediener gibt am HMI ein, das er das Werzkeug WZ00120.00 laufen lassen möchte.
Jetzt muss ich mit einem VERGLEICH überprüfen ob das angewählte Werkzeug auch das Angewählte ist.
Mit dem vergleich denke ich komme ich klar. Kann aber nicht (Array of Byte) mit (String) vergleichen.

Deine Idee die Daten vom RFID zu kopieren und in String oder ähnlich dann als Kopie zur verfügung zu haben.
Denke ich wäre die beste.
So kann ich dann auch den Wert vom RFID an dem HMI anzeigen lassen.
Danke, es drängt da Kunde schon nächsten Dienstag kommt.
Bis dahin muss ich das gereget haben :-(
 
Wie gesagt (oder gefragt) wäre es wichtig zu wissen was genau in deinem Byte-Array steht. Steht dort bspw W(=57hex), Z (=5Ahex) - also der ASCII-Code von W und Z drin?
Dann könntest du ganz einfach mit einer For-Schleife alle Zeichen vom String mit dem Byte-Array vergleichen:
Code:
For i:=1 To 10 Do
    IF Byte_To_Char(byteArray[i]) = stringEingabe[i] Then
        isEqual := True;
    Else
        isEqual := False;
        Exit;
    End_If;
End_For;
oder man kopiert das Byte-Array erstmal in ein Char-Array und macht dann einen String draus:
Code:
For i:=1 To 10 Do
    charArray[i] := Byte_To_Char(byteArray[i])
End_For;

Chars_To_String(Chars := charArray, pChars := 0, Cnt := 0, Strg => tempString);

If stringEingabe <> tempString Then
    isEqual := False;
Else
    isEqual := True;
End_If;
oder oder oder ;)
 
Zurück
Oben