TIA S7-1200 - Mehrere aufeinanderfolgende Eingangsbytes in Datenbaustein kopieren

smartie

Level-1
Beiträge
298
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
S7-300/S7-1200 - Mehrere aufeinanderfolgende Eingangsbytes in Datenbaustein kopieren

Hallo zusammen,

ich stehe grad mal wieder auf dem Schlauch und brauch vermutlich brauch ich nur einen Schubs in die richtige Richtung :wink:.

Ich habe hier einen Datalogic Scanner mit einer CBX500 Anschlussbox. Darin ist eine ProfinetIO Schnittstelle eingebaut,
über die ich Barcodedaten in meine S7-1200 einlesen muss.
Die ProfinetIO Kommunikation zu dem Scanner habe ich aufgebaut und kann prinzipiell auch Daten empfangen.

Allerdings sind die Projektierungsmöglichkeiten des Scanners in der Gerätekonfiguration sehr eingeschränkt. So können zum
Beispiel maximal 64 Byte in einem "Rutsch" übertragen werden. Alles was länger ist (was bei einem 2D-Code leicht möglich ist)
wird vom Scanner gesplittet und sequentiell übertragen.

Dazu kommt, und das ist im Moment mein eigentliches Problem, das in der Gerätekonfiguration des Scanners keine großen
Datenblöcke angelegt werden können, sondern das Telegramm muss aus den Modulen 1 Byte, 1 Word, 2 Word oder 4 Word
zusammengestellt werden.

Somit ist ein Einlesen der Daten mit der Funktion DPRD_DAT bzw. DPWR_DAT (zum Schreiben) nicht möglich.

Ich suche also nun nach einer brauchbaren Funktion um 64 Bytes einzulesen und in einen Datenbaustein zu kopieren.
- Der MOVE Befehl funktioniert, ist aber bei 64 Byte (jeweils für Eingang/Ausgang) doch recht unübersichtlich.
- Die Funktion MOVE_BLK scheidet auch aus, weil als Eingangsformat ein Array erwartet wird.

Kennt jemand von euch eine geeignete Funktion, vorzugsweise FUP/KOP, da ich über keine Kentnisse in SCL verfüge.


Alternativ habe ich schon mit dem Gedanken gespielt einen Baustein zu schreiben, der die Daten aus nur 10 Bytes sequentiell
einliest. Diese 10 Bytes würde ich dann mit dem MOVE Befehl von der Schnittstelle in den DB kopieren.
Anschließend muss dem Scanner mitgeteilt werden das die Daten verarbeitet worden sind, damit er die nächsten 10 Zeichen
sendet, die dann an das Ende des ersten Teils angehängt werden.

Allerdings fürchte ich das die Datenübertragung damit recht "lange" dauert. Ist zwar nicht zeitkritisch, sollte aber auch nicht
"ewig" dauern. Um sicherzustellen das die Daten konsistent sind gibt es wohl eine Option am Scanner, die ein identisches
Check-Byte am Anfang und Ende des Datentelegramms einbindet.

Was haltet ihr davon, bzw. hat jemand Erfahrung mit diesem Gerät (scheint übrigens auch bei der S7-300 nicht anders zu
sein). Oder hat jemand eine Idee wie ich die Daten "ohne großen Aufwand" konsistent übertragen kann.


Gruß smartie
 
Zuletzt bearbeitet:
Hat keiner eine Idee? - Ist ja eigentlich auch kein S7-1200 spezifisches Problem, da es sich bei einer
S7-300 genau gleich verhält.

Oder habe ich mich nur undeutlich ausgedrückt? ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Eingänge des Scanners im PAE (Prozessabbild) liegen, dann sind die Daten konsistent. Eine Möglichkeit wäre, die Eingänge mit einer FOR-Schleife in einem DB-Bereich zu kopieren.

Gruss
TMaroni
 
Gibt es von dem Scanner-Hersteller vielleicht ein TIA-Beispielprojekt oder einen spezifischen Programmbaustein oder wenigstens eine Anleitung?

Harald
 
Hallo zusammen,

es gibt vom Hersteller des Scanners (DataLogic) leider weder ein passendes Beispiel in S7-300, noch in S7-1200/1500.
Was es gibt ist ein sehr universell gehaltenes Projekt für die S7-300, aber dazu gibt DataLogic keinen Support.
In diesem Beispiel ist ein Baustein enthalten mit dem über verschiedene Schnittstellen-Protokolle eine Verbindung zu
allen möglichen DataLogic-Scannern aufgebaut werden kann.
Der Baustein ist in AWL geschrieben und das übersteigt zum einem meine AWL-Kentnisse und zum anderen ist er recht
unübersichtlich, da er eben recht universell ist und deswegen alle möglichen Optionen bietet, die ich nicht brauche.

Da die Schnittstellen-Eingänge bei der S7-1200 im Prozessabbild liegen und somit konsistent sind sollte der Vorschlag
von TMaroni ja eigentlich funktionieren. Nur arbeite ich eben nicht mit SCL und habe somit keine Schleifen-Operation.
Ich werde also mal versuchen eine entsprechende Lösung in KOP/FUP zu realisieren. :icon_confused:

Gruß smartie
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich suche also nun nach einer brauchbaren Funktion um 64 Bytes einzulesen und in einen Datenbaustein zu kopieren.
- Der MOVE Befehl funktioniert, ist aber bei 64 Byte (jeweils für Eingang/Ausgang) doch recht unübersichtlich.
- Die Funktion MOVE_BLK scheidet auch aus, weil als Eingangsformat ein Array erwartet wird.

Kennt jemand von euch eine geeignete Funktion, vorzugsweise FUP/KOP, da ich über keine Kentnisse in SCL verfüge.
- bei MOVE wären alle EA-Zugriffe sauber nachzuverfolgen. EA-Rangieren mit vielen MOVE ist keine Programmiererschwäche sondern durchaus üblich
- BLKMOV sollte gehen, wenn der Zieldatenbaustein "Standard-Zugriff" hat. Ist aber nicht zu empfehlen.
- Du könntest nur für das Kopieren der EA-Bytes einen Baustein in SCL schreiben. Wenn das nur je eine Schleife ist, dann schreibt den bestimmt auch ein Forumuser für Dich.

Harald
 
Die 1200-er hat doch den Baustein DPRD_DAT aus der "Library/Erweiterte Anweisungen/Weitere".
Damit kannst du auch von einem Profinet-IO_Device konsistent Daten lesen. und gleich in einen Record eines DB schreiben. Vielleicht wäre das die einfacherer Variante.
Möglich, dass dazu die Adressen außerhalb des Prozessabbildes liegen müssen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... EA-Rangieren mit vielen MOVE ist keine Programmiererschwäche sondern durchaus üblich

Das beruhight mich wirklich sehr das du das so siehst, bzw. das das durchaus üblich ist. :razz:
Ich hätte das eher als "unprofessionell" empfunden.

Du könntest nur für das Kopieren der EA-Bytes einen Baustein in SCL schreiben. Wenn das nur je eine Schleife ist, dann schreibt den bestimmt auch ein Forumuser für Dich.
Freiwillige vor ... :wink:

Die 1200-er hat doch den Baustein DPRD_DAT aus der "Library/Erweiterte Anweisungen/Weitere".
Ja, die Funktion ist in der S7-1200 vorhanden, habe ich schon oft benutzt, aber die Anzahl der einzulesenden Bytes wird meinem Wissen nach
doch durch die am Eingang "LADDR" definierte Hardware-Adresse bestimmt.
Da ich aber bei der Hardwarekonfiguraton nur Module mit maximal 4 Word als Schnittstelle auswählen und somit meinen Schnittstellenbereich
aus einer Vielzahl einzelner Bytes zusammenstellen muss, würde DPRD_DAT nicht (sinnvoll) funktionieren.

Oder irre ich mich da?

Ich habe zum Verständniss mal zwei Bilder angehängt.

Gruß smartie

HW_Konfig.jpgDPRD_DAT.jpg
 
Wieviele Byte DPRD_DAT einliest richtet sich danach, wie groß/lang (wieviele Byte) die Baugruppe/Modul an der E-Adresse (LADDR) in Hardware Konfig projektiert ist. Und das müssen wie gesagt 3 oder mindestens 5 Byte sein. Bei 1, 2 oder 4 Byte kann DPRD_DAT nicht benutzt werden.

Um 64 Byte einzulesen, müßtest Du 8 mal DPRD_DAT aufrufen (für 8 Module je "4 Word") oder mindestens 16 mal MOVE. Eine "schicke" Schleife wird aufwändiger und undurchsichtiger.

Harald
 
Wieviele Byte DPRD_DAT einliest richtet sich danach, wie groß/lang (wieviele Byte) die Baugruppe/Modul an der E-Adresse (LADDR) in Hardware Konfig projektiert ist.
Das meinte ich ja, deswegen habe ich das Bild angefügt. Wobei ich da zum ersten Testen eben nur 10 x 1 Byte angelegt hatte und danach nur noch in einzelnen Bytes gedacht habe.
Aber für ein Wort kann ich natürlich DPRD_DAT verwenden. Danke ;)

Da ich sicher mehr als 64 Byte übertragen muss (ca. 240 Zeichen insgesamt) werde ich nun vermutlich einen Baustein schreiben der die Funktion DPRD_DAT bzw. DPWR_DAT mehrmals
enthält (maximal aber 8 mal). Über ein Steuerbyte erhalte ich vom Scanner die Info ob das Telegramm noch nicht fertig übertragen ist.
- Ist dies der Fall rufe ich über ein entsprechendes Bit in Steuerbyte den nächsten Block ab und hänge diese Daten an das Ende des ersten Blocks im DB an. Dies geschieht solange bis
alle Daten empfangen sind.

Also benötige ich eine "Schleife", die ich wohl mit einer Schrittkette oder Sprungoperationen in KOP/FUP realisieren werde.

Danke soweit :smile:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah, ihr habt recht, die Modulgröße gibt den Ausschlag. Ich hatte bei den Boxen nur eine DP_RD, da ich das am Profibus hatte und da ist es ein 32-Byte Block. Ist ja unschön von Datalogic, dass das so anders gelöst wurde.
Leider ist mein Baustein für den Scanner in AWL mit ind. Adressierung und Schrittkette über Sprungleiste, also würde der dir gar nicht helfen.
 
So, kleine Rückmeldung zum Abschluss noch:

Ich habe mit nun einen Funktionsbaustein geschrieben der jeweils 8 Byte von der Schnittstelle liest und schreibt.
- Dazu verwende ich in dem Baustein den MOVE Befehl. Wie weiter oben geschrieben steht wollte ich eigentlich die Funktionen DPRD_DAT und DPWR_DAT verwenden,
aber nachdem ich einen halben Tag erfolglos versucht habe damit 4 Word einzulesen bzw. zu schreiben, habe ich von einem Servicetechniker bei DataLogic erfahren
müssen das der tolle Scanner den ich hier habe mit der aktuellen Firmware in einen Rutsch nur maximal 64 Datenblöcke mit jeweils 1 Byte übertragen kann.... :rolleyes:

Also blieb mir nichts anderes als der MOVE-Befehl übrig. Damit lese ich die Daten jetzt ein und kopiere sie, gesteuert über einen variablen Index nacheinander in ein Array.

Das ganz funktioniert eigentlich ganz gut, dauert aber bei ca. 240 Byte etwa 2,5 Sekunden bis alle Daten eingelesen sind. Eventuell werde ich den Sende-/Empfangsbereich
später noch vergrößern (allerdings liegt die Grenze des Scanners wie gesagt bei max 64 Byte pro Übertragung), jetzt gehts erst mal mit der Verarbeitung der gescannten
Daten weiter.


Gruß smartie
 
Zuletzt bearbeitet:
Zurück
Oben