TIA TIA V14 / CPU 313 / CP340 / mehrere CHAR in String wandeln

ChristianVogel

Level-2
Beiträge
401
Reaktionspunkte
53
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe heute ein Negativ-Erlebnis gehabt, bräuchte da einen Tip: Ich habe eine Alt-Maschine aufrüsten bzw. erweitern müssen. Ich habe da eine CPU313 mit einem Kommunikationsprozessor CP340/RS232 erweitert, daran hängt ein Barcode-Scanner per RS232 dran, der mir das Scan-Ergebnis auch korrekt liefert. Dazu habe ich den Baustein "P_RCV" aus der entsprechenden CP340-Bibliothek verwendet...

WP_20181001_002.jpg

Die Aufgabe ist, verschiedene Barcodes in verschiedenen Längen und Inhalten zu scannen, diese bekomme ich auch wunderbar angezeigt, ABER ich bräuchte die einzelnen Bytes/Chars als einen String dargestellt. :sad: Ich hatte das neulich schon des öfteren und bei den neuen 1200/1500er CPUs ist das kein Problem, da ich aber eine "alte" 313er habe, werden mir sehr viele neue Bausteine betreffend CHAR/STRING garnicht im TIA angeboten...

Gibt es da keine Bausteine die ich in FUP verwenden kann? Bin kein Freund von AWL/SCL/ST... :cool: NATÜRLICH habe ich hier erstmal gesucht, viele Beiträge sind aber noch aus der Step7-Zeit und daher schon länger zurückliegend... Gibt es da was TIA-Eigenes?

Vielen Dank.

Gruß Christian
 
Theoretisch sollte es auch ohne speziellen Baustein möglich sein, du musst für den String nur im String Header die Stringlänge passend setzen.

Mal angenommen du legst dir einen DB1 an und fügst dort an Adresse +0.0 eine String-Variable ein.
An deinen P_RCV schreibst du dann als Adresse DB_NO = 1 und DBB_NO = 2, denn ab Byte 2 beginnen die eigentlichen Zeichen.
Den Wert des P_RCV-Ausgangsparameters "LEN" schreibst du auf DB1.DBB1 (1 Byte), dieses Byte in der String-Variable zeigt die aktuelle Länge des Strings an, d.h. die Anzahl der gültigen Zeichen im eigentlichen Char-Array des Strings. U.U. muss du LEN erst auf eine Zwischenvariable vom Typ Integer schreiben und dann per Move-Box auf das Byte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Thomas,

Vielen Dank für die Rückmeldung. LEN ziehe ich mir aus dem Instanz-DB, LEN wird in diesem Baustein leider nur einmal pro Zyklus ausgegeben, im Instanz-DB bleibt diese Info stehen... Du meinst ich soll mit dem "Move-Block" arbeiten? Leider habe ich ja die Bausteine wie "S_Move" wegen dem "alten Zielsystems" hier nicht zur Verfügung... Bei mir steht die gescannte Info ab DBB262 zur Verfügung, bei den Bytes habe ich ja aber noch kein Start/Stopzeichen, da müsste ich dann doch noch ab dem ersten Byte starten nehme ich an?
 
Unter "Einfache Anweisungen" und "Verschieben" kannst du doch die aus Step7 bekannte Move-Box in dein FUP-Netzwerk einfügen.
An EN schreibst du den Parameter NDR deiner P_RCV-Funktion, und an IN den Parameter LEN. An OUT schreibst du in Absolutadressierung das zweite Byte ab Startadresse (Startadresse +1 Byte) des Strings.
Dann wird nur wenn der Baustein mit NDR Erfolg meldet die Stringlänge gesetzt.

Vermutlich wird das TIA dir bei der Absolutadresse eine Warnung ausspucken, aber für diese einfache Lösung ohne weitere Programmierung ist das eben so (ein entsprechender Kommentar im Netzwerk was da passiert ist hilfreich). Alternativ musst du dir einen eigenen Baustein in AWL oder SCL schreiben welcher das Char-Array zusammen mit der Länge in einen korrekten S7-String wandelt.
 
Hallo Thomas,

sorry wegen der späten Rückmeldung, hatte noch eine andere Baustelle offen...: Also ich nehme an, Du meinst den "BLKMOV"-Baustein, den ich verwenden soll.

Also ich habe es bis jetzt nicht fertiggebracht vom vom "P_RCV"-Baustein meine Bytes in ein Array zu schreiben, daher habe ich in meinem DB eben ab DB35.DBB262 beschrieben und dann diese Bytes 1:1 manuell in das Array kopiert. Der "BLKMOV" nimmt ja wiederum nur ein Array in der Eingangsfunktion "SRCBLK".

Am Ausgang DSTBLK wird ja der String geschrieben, in der Länge wie er in der Eingangsfunktion angegeben wird, oder? Da habe ich jetzt das Problem, dass ich zwar aus der Detailansicht links aus dem DB das Array auf den Baustein ziehen kann, und dann steht da auch "DB35.DBX284.0" mit dem entsprechenden Symbol. Wenn ich aber manuell "DB35.DBX284.0" eingebe um dann meine Länge einzugeben, habe ich anscheinend ein Syntaxproblem...

Was müsste ich denn eingeben um beispielsweise vom Arry DB35.DBX284.0 eine Datenlänge von 10 Bytes in den String zu schieben? Im Prinzip ist ja die Datenlänge später durch enen Platzhalter angegeben, der von "LEN" bedient wird? Mein Vorschlag wäre "P#DB35.DBX284.0 BYTE 10", da meckert TIA auch nicht... Aber wie schreibe ich das "Byte 10" wenn da LEN stehen sollte???

2018-10-08.jpg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Byte: Angabe, wie viele Zeichen der String maximal aufnehmen kann
2. Byte: Angabe, wie viele der zuvor spezifizierten Anzahl n aktuell belegt sind (0 … n)
3. Byte: 1. Zeichen des String
n+2. Byte: letztes Zeichen des String

Code:
[LEFT][FONT=courier new][COLOR=#222222]Beispiel: String enthält die 10 Zeichen A … J, gültig sind aber nur die ersten 5 Zeichen A … E

[/COLOR][/FONT][/LEFT]
[FONT=courier new]1. 2. 3. 4. 5. 6. 7. 8. 9. 10.11.12.  Byte
[/FONT][LEFT][FONT=courier new][COLOR=#222222]0A 05 41 42 43 44 45 46 47 48 49 4A   Inhalt der Bytes, hexadezimal dargestellt
 |  |  A  B  C  D  E  F  G  H  I  J   Inhalt des String, ASCII-Zeichen A … j
 | 05 : benutzte Länge 5
[/COLOR][/FONT][COLOR=#222222][FONT=courier new]0A    : deklarierte Länge 10   [/FONT][/COLOR][/LEFT]
 
Moin,
hier mal eine FUP-Lösung mit Sicht-Pointer auf ein temporäres Char-Array. Dazu das befüllen eines temporären Strings-Headers in die von Heinileini (#6) beschriebenen Bytes:

charToStringViaSicht.jpg

Netzwerk 1 und 2: String-Header initialisieren (siehe Heinileini in Post #6)
Netzwerk 3: dein empfangenes Char-Array in ein temporäres Char-Array beginnend ab dritten Zeichen (also nach String-Header) kopieren
Netzwerk 4: Die Sicht (also den gebastelten String) in deinen Zielstring (DB) kopieren
 
N'Abend zusammen,

war erst heute wieder vor Ort und wollte Bescheid geben dass ich das nun doch noch hinbekommen habe, VIELEN DANK!

ich habe die Bytes manuell verschoben, wie im Beitrag von Heinileini beschrieben. Das war zwar erst eine Fummelarbeit, weil irgendwie mit MOVE_BLK das nicht so funktionieren wollte, wie ich mir das ausgedacht habe, aber bei bis zu 10 Bytes Länge der Strings war das nun doch überschaubar...

MfG
Ch. Vogel
 
Zurück
Oben