Kommunikation mit CP240

CBRA

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

ich möchte ein externes Telegramm auslesen und in ein separaten DB (UDF basiert) speichern.

Das empfangene Telegramm besteht aus mehreren Einzeltelegrammen. (Kopf / Füllen / Stabilisieren / Messen / Entlüften /Ende)
Jedes Telegramm hat als ersten Byte das s.g. Startbyte mit der Kennung 013 (0Dh). Das zweite Byte gibt die Länge der Datenbyte an. Im dritten Byte steht die Telegrammnummer welche die Inhalt klassifiziert. Die letzen beiden Bytes sind Prüfsummen. Zwischen der Telegrammnummer und den beiden Prüfsummen-Byte, stehen die Daten die auswertbar sind.

Meine Idee ist nun z.B., das eine Routine das Byte mit dem Inhalt 013 (0Dh), das vorgegebene zweite Byte (z.B. 004 (04h)) und das dritte Byte (z.B. 139 (8Bh)) als Kombination sucht. Wenn diese Kombination (013 (0Dh) 004 (04h) 139 (8Bh)) gegeben bzw. gefunden ist, soll das vierte bis sechste Byte (z.B. 000 (00h) 005 (05h) 000 (00h)) in einem separaten DB gespeichert werden.

Der separate DB soll das ersten Ergebnis ( z.B. 000 (00h) 005 (05h) 000 (00h)) gespeichern. Im Klartext lautet mein Beispiel „005 Pa“ als Messergebnis.
Sollte ein weiteres Ergebnis kommen ( z.B. 000 (00h) 006 (06h) 000 (00h)), dann soll dieses vor das zuletzt empfangene Ergebnis geschrieben werden.
Wenn die maximale Anzahl (z.B. 100 Ergebnisse) erreicht wurde, soll das älteste Ergebnis gelöscht werden und somit Platz für das neue Ergebnis geben. Somit kann ein definierter Platzbedarf vorgesehen werden und die Auswertung via HMI ist in Tabellenform leichter.
Die Ergänzung durch weitere Bytes ist natürlich denkbar und vorteilhaft. Hierbei denke ich an den Zeitstempel der im Ergebniskopf steht. Ein Array bestehend aus den u.a. und rot und fett markierten Bytes. Die grün und unterstrichen markierten Bytes sind Anzeigeformen, d.h. Kommastelen.

013 012 135 001 000 000 001 000 022 007 009 020 021 011 030 024 188 (Datum+Uhrzeit)
013 004 136 000 000 005 036 016 037 (Druckangabe)
013 004 137 000 000 005 036 208 024 (Druckangabe)
013 004 139 000 005 000 003 091 050 (Messergebnis plus Maßeinheit)
013 004 140 000 000 005 036 208 212 (Druckangabe)
013 000 143 167 161 (Ende)

Das letzte Telegramm „013 (0Dh) 000 (00h) 143 (8Fh) 167 (A7h) 161 (A1h)“ ist beim Empfang der Ergebnisse immer gleich, daher könnte es als Signalmerker dienen.
Leider erhalte ich einen STOP-Zustand in meiner Anlage.


Kann einer sich die Anlage mal anschauen? :sm17:
 

Anhänge

Sortieren und speichern von Daten

Hallo zusammen,

ich habe folgendes Problem auf dem Tisch.

Ich möchte die eingehenden Daten eines DB 11 sortiert abspeichern. Dabei ist das erste Byte (DATA_0) eines Einzeltelegramm 013 (0Dh). Im Byte DATA_2 steht die Telegrammnummer und die Länge der der nach dem Byte Telegrammnummer gesendet werden, steht im Byte DATA_1.
Eingehende Daten werden durch Eingang E 3.7 und einem Merker 555.0 (Beispiel) angezeigt. Nachfolgend habe ich ein Beispieltelegramm aufgeschrieben. Die in Klammer stehenden Bezeichnungen sind Klartexte und Erläuterungen.

013 012 135 001 (Prog-Nr.) 000 000 001 (Bewertung) 000 (Testart) 022 (Tag) 007 (Monat) 009 (Jahr) 020 (Jahrhundert) 021 (Stunde) 011 (Minute) 030 (Sekunde) 024 188
013 004 136 000 (1. Teil Wert) 000 (2. Teil Wert) 005 (Einheit) 036 (Kommastelle) 016 037
013 004 137 000 (1. Teil Wert) 000 (2. Teil Wert) 005 (Einheit) 036 (Kommastelle) 208 024
013 004 139 000 (1. Teil Wert) 005 (2. Teil Wert) 000 (Einheit) 003 (Kommastelle) 091 050
013 004 140 000 (1. Teil Wert)000 (2. Teil Wert) 005 (Einheit) 036 (Kommastelle) 208 212
013 000 143 167 161 (Ende des Telegramm)

Nun möchte ich die Daten aus den DB11 in einem DB135, DB136, DB137, DB138 und DB140 speichern. Wenn jeder der Speicher DB's die Anzahl 100 Messungen (als Beispiel) erreicht hat, soll im DBB oder DM 0 begonnen werden. Das nennt man FIFO-Prinzip, habe ich gelesen.

Was muss ich einstellen, damit ein Suchbefehl die richtige Kombination aus Star-, Längen- und Telegrammbyte findet? Was und wo muss was eingerichtet werden, damit die Einzeltelegramme in separate vorbereitete Telegramme gespeichert werden. Es kann sein, dass zusätzliche Telegramme gesendet und nachträglich ausgewertet werden müssen.

Mein Wissen über Lade- und Transferbefehle bzw. Pointer ist begrenzt, darum mein HILFERUF an euch.
 

Anhänge

Zuviel Werbung?
-> Hier kostenlos registrieren
Einmal Einstellen reicht im Allgemeinen, ich hab die Threads mal zusammengeschmissen. Das Thema ist rel. komplex, es wird das Beste sein, du fängst erstmal an und stellst dann konkretere Fragen. Zuerst solltest du mal in die FAQ des Forums schauen, da gibt es zumindest Beiträge zum Thema FIFO und indirekte Adressierung.

Anregungen zum Durchsuchen eine DB z.Bsp. hier:

https://www.sps-forum.de/threads/9283

und hier im Beitrag #30 hatte ich mal Code eingestellt, der schon eine bestimmte Bytefolge aus einem DB raussucht:

https://www.sps-forum.de/threads/17774

Allerdings werden dort Strings verwendet, die haben noch 2 Byte Kopf. Der Code muß also modifiziert werden, ist auch für S7-300/400. Hast du eine S7-200?
 
Zuletzt bearbeitet:
Zurück
Oben