Aufbereiten von Daten für Transfer über TCP/IP zu einem PC

Schnee

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

Ich habe ein Problem damit, die Daten für einen Transfer über AG_Send/AG_Recive vorzubereiten.
Verwendete HW ist eine CPU312C mit einem CP343-Lean an einen PC auf dem eine Software SPS läuft.
Die reine Kommunikation läuft schon.
Als SW kommt Step7 V5.4 SP1 zum Einsatz.

Probleme bereitet mir nun wie ich die Daten richtig zum PC schicke bzw die empfangenen richtig aufbereite.

Die Meldungen die gesendet und empfangen werden sind Klartextzahlen im Bereich 1 - 100. Die Zahlen stehen für ein bestimmtes Ereigniss, welches ausgelöst wurde oder werden soll.
Bsp:
E0.0 wird belegt daraufhin soll an den PC die Meldung 1 gesendet werden.
Vom PC kommt Meldung 24 darufhin soll ein Ventil angesteuert werden (A1.1)

Wie kann ich nun garantieren, daß wenn mehrer Ereignisse auftreten, auch alle gesendet werden und wenns geht auch noch in der Reihenfolge in der sie aufgetreten sind und vor allem nur einmal und nicht dauernd?

Problem mit den zu empfangenden Daten ist, wie lege ich sie am sinnvolsten ab, so daß ich auf jede Änderung der einzelnen Variablen reagieren kann.

Mein Wissensstand beschränkt sich leider noch eher auf die Grundfunktoinen der SPS, daher stehe ich diesem Problem grade etwas hilflos gegenüber. Insofern wäre ich über jegliche Hilfe sehr glücklich.

In der Hoffnung zumindest halbwegs verständlich mein Problem rüber gebracht zu haben, hoffe ich auf Rettung ;)

lg

Schnee
 
Die Meldungen die gesendet und empfangen werden sind Klartextzahlen im Bereich 1 - 100. Die Zahlen stehen für ein bestimmtes Ereigniss, welches ausgelöst wurde oder werden soll.
Bsp:
E0.0 wird belegt daraufhin soll an den PC die Meldung 1 gesendet werden.
Vom PC kommt Meldung 24 darufhin soll ein Ventil angesteuert werden (A1.1)

Wie kann ich nun garantieren, daß wenn mehrer Ereignisse auftreten, auch alle gesendet werden und wenns geht auch noch in der Reihenfolge in der sie aufgetreten sind und vor allem nur einmal und nicht dauernd?

Wenn Du eine einzige Meldenummer (1-100) verwendest, kannst Du natürlich die Meldungen auch nur nacheinander senden.

Anstelle Deiner Meldenummer kannst Du aber auch für jede Meldung ein einzelnes Bit versenden.
Z.B. versendest Du jedesmal 16 Bits (16 Meldungen) Jedes Bit steht für eine Meldung. Diese kommen dann gleichzeitig in jedem Telegramm bei Deinem PC an.
Zeitlich unterscheiden kannst Du die einzelnen Bits aber nicht. Zeitliche Unterschiede kannst Du nur von Telegramm zu Telegramm erkennen, nicht innerhalb eines einzigen. (Es sei denn, Du sendest für jedes Bit einen Zeitstempel mit, aber das nur so am Rande)

Die Ereignisse (Deine 16 Bits also) werden ständig, also zyklisch gesendet. So ist schon mal garantiert, dass immer alle Meldungen gesendet werden.

In Deiner PC-Anwendung prüfst Du, wann ein Bit gekommen ist (bzw. gesetzt ist) und wann es wieder gegangen ist (bzw. nicht mehr gesetzt ist) Darauf kannst Du dann entsprechend reagieren, z.B. ein Bit zurücksenden, um einen Ausgang zu setzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider muß ich die Meldenummern als ganze Zahl senden. Also tatsächlich immer die Zahl, also zb 10 für eine bestimmte Meldung.

Die Meldungen können ruhig nacheinander gesendet werden, da es nicht zeitkritisch ist. Zumindest bisher :)

Die Idee geht dahin, das ich die Ereignisse in einem DB ablege, also wenn ein Eingang kommt soll im DB die Zahl abgelgt werden mit der Meldung das sie noch nicht gesendet wurde.
Über eine Funktion soll dann der DB abgefragt werden und alles wo die Meldung gesetzt ist, das es noch nicht gesendet wurde, soll gesendet werden und nach erfolgreichem Senden soll der Bereich im DB wieder zurück gesetzt werden.

Gewährleistet muß halt sein, daß wirklich alle Meldungen die auflaufen auch gesendet werden.

Von Kollegen habe ich den Tip bekommen das mit Hilfe von UDT´s zu verwirklichen....
 
Na ja, von allen Möglichkeiten halte ich diese für die schlechteste. Ob Du nun eine Nummer sendest und die PC-Seite diese Nummer auswertet oder Du ein Bit setzt und die PC-Seite dieses Bit auswertet ist eigentlich egal.

Davon abgesehen benötigst Du mit der Nummer-Methode erheblich länger, alle Meldungen abzusetzen. Außerdem bedarf es so auf der SPS-Seite erheblich mehr Aufwand. (Wenn ichs nicht wüßte würde ich sagen, dass da jemand zu faul zum ändern seines PC-Programms ist;))

Deine Nummer Aufgabe könnte man evtl so lösen:

Lege Dir einen Array an. Für jede Meldungsnummer wird ein Feld reserviert. Im ungünstigsten Fall müssen soviel Felder her, wie maximal gleichzeitig anstehende Meldungen möglich sind.
(Ich gehe jetzt mal davon aus, dass Feld 1 Meldungsnummer 1 enthält, Feld 2 Nummer 2 etc. Das machts einfacher zu erklären)
Treten jetzt Meldungen auf, wird die Meldungsnummer in das entsprechende Feld eingetragen. Jedes Feld ohne Meldung wird mit 0 belegt, also so

MeldungsFeld MeldungsNummer
1 -----------1
2 -----------2
.
.
55 ----------0
66 ----------66
.
.
100 -------- 0

In diesem Beispiel stehen Meldungen Nummer 1,2 und 66 an. Meldung Nummer 55 und 100 sind auf 0, d.h. diese Meldungsnummern stehen nicht an.

Jetzt wanderst Du nach jedem Sendeauftrag in der Liste solange weiter, bis Du wieder eine Meldung findest. Diese Meldungsnummer versendest Du und setzt sofort im Anschluss an den Sendevorgang dieses Meldungsfeld auf 0. Wenn die Liste durchgearbeitet ist, wird wieder von vorne angefangen. (Es können natürlich jedem Meldungsfeld beliebige Nummern zugeordnet werden)

Eine andere Aufgabe ist es dann natürlich für Dich, diese Meldungsfelder bei Auftreten der Meldung nur Einmal zu schreiben. Zurückgesetzt wird nach dem Senden ja dann immer.
 
Ich würde die Meldenummern in einen FIFO schieben. Kommt eine Meldung , wird die Nummer in den FIFO hineingeschoben. Der Sende-FB holt alle Numern aus dem FIFO und sendet diese an den PC. Danach ist der FIFO wieder leer. Also können alle auflaufenden Meldungen in den FIFO, keine geht verloren. Sieh mal in der FAQ im Forum nach FIOFO, LIFO.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Neuer Tag, neue Infos.

Nun sind aus den Zahlen die gesendet und empfangen werden sollen Strings geworden....
Auch nach inzwischen stundenlangem suchen und lesen im Forum habe ich nichts gefunden was ich verstehe :(
Die Fragen die sich mir stellen sind:
1. Wie kann ich mit der SPS einen String empfangen? FC6?
2. Wenn ich ihn empfangen habe, wie kann ich daraus eine für mich verwertabre Info gewinnen? Ich will den String mit einem Wert der in einem DB hinterlegt ist vergleichen und damit ein Bit setzen.
3. Wie kann ich aus meinen "Merkern" die ich mir durch verschiedene Ereignisse setze Strings erzeugen?
4. Wie kann ich diese an den PC verschicken? FC5?

Problem für mich ist, daß ich von der Hardwareseite komme und außer SPS Programiereung bisher noch nichts in dem Bereich der Software gemacht habe. Also Begriffe wie Array, Char, String und Pointer usw. sind daher fast noch Fremdwörter, auch wenn ich in den letzten 2 Wochen darüber so viel gelsen habe das mir der Kopf raucht. ;)

Insofern wäre ich nach wie vor über Hilfe wirklich glücklich, wenn es machbar wäre auch mit einem Beispiel oder einem Link wo man es sich mal ansehen kann.

Bin derzeit ziemlich verzweifelt, da ich bis Dienstag erste Erfolge vorweisen können muß.....

in banger Hoffnung auf Hilfe

Schnee
 
1. Wie kann ich mit der SPS einen String empfangen? FC6?
2. Wenn ich ihn empfangen habe, wie kann ich daraus eine für mich verwertabre Info gewinnen? Ich will den String mit einem Wert der in einem DB hinterlegt ist vergleichen und damit ein Bit setzen.
3. Wie kann ich aus meinen "Merkern" die ich mir durch verschiedene Ereignisse setze Strings erzeugen?
4. Wie kann ich diese an den PC verschicken? FC5?

1.
Empfangen werden Deinen Daten ja immer automatisch komplett, und wie beim Senden landen Deine Daten wahrscheinlich auch in einem DB. In diesem DB deklarierst Du auch wieder einen String, der dann automatisch von der Sendeseite beschrieben werden sollte.


2.
Mit der IEC Funktion EQ_STRNG (FC10) kannst Du zwei Strings vergleichen. Wenn Dein Empfangsstring und Dein Vergleichsstring gleich sind, kannst Du dann einen Merker setzen.

3.
Wenn Dein Bit einen bestimmten Wert hat, kopierst Du einen String in Deine Sendedaten, dass musst Du schon von Hand machen;)

4.
Wenn Du Daten mit AG_Send versendest, gibst Du ja einen Datenbereich an, der versendet werden soll - das ist im allgemeinen oft ein DB, in dem alle zu sendenden Daten stehen. Wenn Du in diesem SendeDb einen String deklarierst, wird der ebenso versendet, wie alle anderen Daten auch. Das erfordert von Dir keinerlei Programmierarbeit. Wie dieser String auf der PC - Seite ausgewertet wird, steht auf einem anderen Blatt. (Der S7-String führt immer noch 2 Bytes als Kopf mit, das muss dann die PC-Seite wissen)


!! Natürlich müssen sich die PC-Seite und SPS-Seite auf einen bestimmten Telegrammaufbau einigen, d.h. jede Seite muss wissen, wohin sie ihre Daten senden muß, und wo sie die Daten abzuholen hat !!
 
hallo schnee

wieso willst du jetzt mit strings da arbeiten wenns doch einfach mit bits oder auch mit einem integer auch geht.
mit dem guten tipp von ralle zu einem FIFO zu greifen, bist du da denk ich mal auf der richtigen spur....

ansonsten bei allen siemens cpu's würde ich das meldenummernverfahren anwenden.

grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leider hab ich nicht wirklich so viel Möglichkeiten darauf Einfluß zu nehmen was mir gesendet bzw was ich zu senden habe. PC ist halt der Master ;)

Bisher hatte ich folgendes vor:
Erstellt in FUP

U(
L MW 120 // Empfangsbereich des FC6
L 99 // Vergleich Meldenummer
==I
)
S db101.dbx6.1 // Setzen Meldebit
U(
L MW 120 // Empfangsbereich des FC6
L 100 // Vergleich Meldenummer
==I
)
R db101.dbx6.1 // Rücksetzen Meldebit
NOP 0

Diese Netzwerk gibt es dann 50 mal für halt 50 Meldungen.

Ich bekomme also vom Pc immer für 1 Ereigniss 2 Meldungen.
zB.:
Lampe 1 an = Meldung 99
Lampe 1 aus = Meldung 100

Heute habe ich dann erfahren das ich halt keine INT Werte mehr bekomme sondern Strings.....
Kann ich nun den FC10 anstelle des Intvergleiches nutzen?


Beim senden habe ich gleich 2 Probleme.
1. Wie bestücke ich den Daten Baustein mit Strings?
Also die genaue Deklaration? Habe schon in einigen Posts hier nachgelesen, muß aber leider zu geben das ich es nicht verstanden habe :/

2. Wie schaffe ich es das wenn Ereigniss 1 auftritt, genau die zugeordnete Meldung gesendet wird und das Programm danach erst alle restlichen Meldungen abarbeitet und nicht, sollte wieder Meldung 1 anstehen dort wieder beginnt?
Kollegen haben mir gesagt ich sollte das über einen Pointer realisieren.
Leider beschränkt sich meine wissen derzeit drauf, wie ich einen Pointer erzeuge aber nicht wirklich darauf wie ich ihm dann bei bringe, das zu machen was ich möchte.
Meine Idee geht dahin den Pointer halt der Reihe nach den DB abarbeiten zu lassen und überall wo ein Sendebit gesetzt ist den Wert, ab jetzt halt ein String, zu übertragen und danach das Sendebit zurück zu setzen und zum nächsten Bereich über zu gehen.
Leider weiß ich nicht wie ich meine Idee der SPS beibringen soll.

DB ist im angehängten Screenshot zu sehen.
Mein Ereigniss setzt das Sendebit, daraufhin soll der Wert gesendet werden und das Bit zurückgesetzt werden.

Auf jeden Fall schonmal 1000 Dank für die Mühe die ihr euch macht und sorry für die vielen Fragen. Möglicherweise sind die Lösungen auch ganz einfach und ich steig nur nicht dahinter, weil mir der Kopf raucht :rolleyes:


lg

Schnee
 

Anhänge

  • DB1.JPG
    DB1.JPG
    109,7 KB · Aufrufe: 21
Zuletzt bearbeitet:
Zurück
Oben