Step 7 S7 Kommunikation, BSEND zu langsam im OB35 Weckalarm (10ms)

Need4Speed

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

ich möchte gerne im OB35 (aktuell auf 10ms eingestellt) mit BSEND 960 Bytes (die PDU wurde mit 240 ausgehandelt, also sind es 4x PDU). Als Gegenstelle verwende ich einen Linux PC mit der Snap7 Bibliothek, der hält also sehr gut mit.

Soweit funktioniert das auch, allerdings arbeitet BSEND ja asynchron und kann lt. Dokumentation mehrere Zyklen brauchen, bis er wieder bereit ist, die nächsten Daten zu senden - leider tut er das auch. Ich habe es so programmiert, dass in meinem "Header" der Zeitstempel vom Aufruf des SFC 1/READ_CLK steht, und zusätzlich zähle ich die Sequenz / Counter hoch, so dass ich auf dem Linux PC sehen kann, ob ich Daten von jedem OB35 Aufruf bekomme, oder ob eben Daten fehlen bzw. ausgelassen werden.

Was ich nun sehe ist, dass ich vom BSEND nur alle 20ms neue Daten bekomme, was auch zur Sequenznummer passt, da sehe ich auch nur jede zweite. D.h. ich bin mir ziemlich sicher, dass der BSEND nicht schnell genug übertragen kann.

Zuerst hatte ich das Phänomen auf einer 315 PN/DP gesehen, da habe ich dann in der HW Konfiguration den Anteil der "Kommunikation" auf 50% der Zykluszeit gestellt - damit hat es dann wirklich funktioniert, so dass nur alle Datenblöcke angekommen sind.

Leider hat das bei einer CPU 317F-3 PN/DP, welche als Bestandteil einer Sinumerik 840d läuft, nicht funktioniert; diese liefert trotz der 50% Kommunikationsanteil immer nur jeden zweiten Datenblock.

Der Unterschied ist natürlich auch, dass in dem Projekt der CPU 317F-3 PN/DP in der Sinumerik ca. 10 PROFINET Teilnehmer sind - da ist also ohnehin mehr auf dem Ethernet/PROFINET los, sozusagen.


Jetzt meine Frage: habt ihr noch einen Tipp, wie ich der CPU 317F-3 PN/DP Kommunikation Beine machen kann? Bringt es was, den BSEND auf zwei Verbindungen "aufzuteilen" oder die Daten im OB35 zu puffern, und dann statt 960 Bytes pro Aufruf, 1920 Bytes zu übertragen? Erste schnelle Tests deuten nicht darauf hin.

Wäre USEND (UDP, ungesicherte Kommunikation) eine Alternative? Aber dazu finde ich extrem wenig Dokumentation, auch nicht, was der Unterschied zwischen USEND und USEND_E ist.

Aber eigentlich wäre es am besten, dem BSEND einfach mehr Kommunikationskapazität einzuräumen, falls das irgendwie geht.

Die Linkliste von Harald habe ich schon ausführlich studiert Linkliste SIMATIC-Kommunikation über Ethernet aber auch keine echte Idee gefunden, an welchen Stellen man noch drehen könnte.

Hat jemand einen Tipp?

Vielen Dank vorab und viele Grüße, Jürgen
 
Zuletzt bearbeitet:
Hallo Need,

was passiert wenn du denn Bsend im Ob1 aufrufst und nur den Trigger im Ob35 setzt? Oder ist dein Ob1 langsamer als dein Ob35?

Gruß Tia
 
Hallo alle- lieben Dank für die schnellen Antworten.


1. Die 10ms brauche ich wirklich, weil im Hintergrund alle 10ms Daten aus der SINUMERIK NCU in das Dual-Port RAM geschrieben werden, welches ich auch im OB35 lese. Das heisst, die Datenrate der angelieferten Daten ist ca. 870 Bytes alle 10ms

2. Wenn ich den Aufrufintervall des OB 35 auf 100ms dann kommen die Daten auch an, aber es gehen dann entsprechend 90% der Daten verloren.

3. Mein OB1 (sorry, vergessen zu erwähnen) läuft bei ca. 25-30ms, je nachdem dem, welche Netzwerke abgearbeitet werden müssen.


Ich habe noch was von einem FC/SFC "AG_SEND" gelesen, aber kann den auch nirgends in der Step7 Doku finden, so dass ich den mal aufrufen könnte.

VG, Jürgen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
2. Wenn ich den Aufrufintervall des OB 35 auf 100ms dann kommen die Daten auch an, aber es gehen dann entsprechend 90% der Daten verloren.

Wie sieht es mit deinen Zeitstempeln aus?
Kann es vielleicht sein, dass BSEND nur bei jedem 2. Aufruf senden kann?

Ansonsten kannst du auch mal Snap7 als Client probieren und in der der Hardwarekonfig der S7-300 priorisierte BuB-Kommunikation aktivieren.
Dann brauchst du keinen BSEND mehr.
Aber Vorsicht:
Damit deaktivierst du den Zykluskontrollpunkt.

Gruß
Blockmove
 
Hallo Need,

wenn n wir hier Überlegen die CPU wird wahrscheinlich nur Daten im Zykluskontrollpunkt senden und die kommst ja im Schnitt nur jedes 2 mal bei einem ob35 in dem Zykluskontrollpunkt. Evtl könnte das Priorisierte BuB wirklich was bringen.

B Idee wäre hier halt evtl wirklich nur jedes 2 mal doppelt soviele Daten Senden, wenn das machbar wäre.

Ps: ich bin mittlerweile schon so S7 400 /1500 verseucht das ich an keinen Zykluskontrollpunkt mehr denke :)

Gruß Tia
 
Wenn du 960 Bytes über BSEND verschicken willst, dann benötigt das bei einer 240 Byte S7-PDU fünf PDUs und nicht nur vier.
Denn in der S7-PDU hast du für deine BSEND-Nutzdaten pro S7-PDU nur 204 Bytes für die erste und 206 Bytes für alle folgenden PDUs zur Verfügung.
In der ersten PDU werden den Nutzdaten noch 2 Bytes für die Länge vorangestellt. Wenn du also noch etwas optimieren möchtest, dann könntest du deine Nutzdatenlänge auf 822 Bytes (204+206+206+206) reduzieren.

Der BSEND benötigt eine steigende Flanke am REQ-Eingang. Du musst also schon etwas trickreich programmieren, damit der BSEND bei Aufruf alle 10ms wirklich jede 10ms einen Trigger mitbekommt, d.h. er müsste schon mehr als einmal im OB35 aufgerufen werden.

Eine Erhöhung der Zyklusbelastung durch Kommunikation in der HW-Konfig bringt einiges. Bei einer ET200S CPU benötigt ein BSEND mit den 822 Bytes von oben bei eingestellten 20% ca. 16 ms, bei eingestellten 50% nur noch ca. 7ms.

Ich habe noch nicht getestet wie schnell die TCP-Funktionen in der S7 sind. Der Vorteil ist dann in jedem Fall, dass du deine 960 Bytes in einem Telegramm verschicken kannst. Bei S7 Kommunikation wird jede PDU vom Partner bestätigt bevor es mit der nächsten weitergeht.
 
BSEND sendet bei steigender Flanke an REQ. Wenn Du BSEND in jedem OB-Durchlauf nur einmal aufrufst dann kann nur höchstens in jedem zweiten OB-Durchlauf ein neuer Sendeanstoß ausgelöst werden. Für Sendeanstöße in jedem OB-Durchlauf müsste BSEND bei DONE=1 sofort nochmal mit REQ=0 aufgerufen werden.

Was für Daten willst Du versenden? Zustände von E/A aus dem Prozessabbild? Das funktioniert nicht schneller als die Aktualisierung des Prozessabbilds im OB1.

Ich bin nicht sicher doch ich meine, mit einer ISO-on-TCP- oder einer TCP-Verbindung kann schneller gesendet werden als mit einer S7-Verbindung mit BSEND. Stichworte "offene Kommunikation" und "T-Bausteine"

Ich habe noch was von einem FC/SFC "AG_SEND" gelesen, aber kann den auch nirgends in der Step7 Doku finden, so dass ich den mal aufrufen könnte.
AG_SEND braucht man um Sendedaten aus dem Anwenderprogramm an einen CP343-1 zu übergeben. AG_SEND funktioniert nicht mit der in der CPU 317 PN/DP integrierten PN-Schnittstelle.

Dokumentation von AG_SEND/AG_RECV:
im FUP/KOP/AWL-Editor: Ansicht > Übersichten Ctrl+K
Bibliotheken / SIMATIC_NET_CP / CP 300 / FC5 AG_SEND > markieren und F1 drücken

Eine Kurz-Dokumentation findet man auch in dem Kompendium Kapitel 34.4
und die ausführliche Dokumentation im Programmierhandbuch SIMATIC NET Programmbausteine für SIMATIC NET S7-CPs Kapitel 2.1
(Beide Handbücher sind in der von Dir erwähnten Linkliste verlinkt.)

Harald
 
wenn n wir hier Überlegen die CPU wird wahrscheinlich nur Daten im Zykluskontrollpunkt senden und die kommst ja im Schnitt nur jedes 2 mal bei einem ob35 in dem Zykluskontrollpunkt. Evtl könnte das Priorisierte BuB wirklich was bringen.
/QUOTE]

Ich hab noch nie BSEND im OB35 verwendet. Es stellt sich wirklich die Frage, ob der Zykluskontrollpunkt da evtl. zuschlägt.
Daher die Idee mit dem Aktivieren von prio. BundB.
In Verbindung mit der Umstellung von Snap7 auf Client (also im Prinzip eine Get-Funktionalität), dürfte das die schnellstmögliche Kommunikation mit dem S7-Protokoll sein.
Allerdings mit all den Nachteilen, die ein fehlender Zykluskontrollpunkt hat.

Gruß
Blockmove
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Blockmove,

der BSEND sendet definitiv beim jedem Aufruf- ich habe mir da mit einer "Holzhammermethode" beholfen, und zwar so, dass ich den BSEND mit denselben Parametern (DB, lokale und remote ID; Ausnahme: Sendetrigger, den lasse ich hier auf "FALSE") 2x aufrufe:

  • der erste Aufruf ist quasi zur Abfrage des Status (Done, Busy/Sending, Error), und falls der Status nicht "busy" ist,
  • dann im zweiten Aufruf mit dem Sendetrigger auf "TRUE"

Die Idee mit der priorisierten BuB Kommunikation kannte ich noch nicht!! Allerdings kann ich noch nicht überblicken, was die Auswirkungen des Zykluskontrollpunkt sind, von daher möchte ich mir den Ansatz als letzten Rettungsanker aufheben.

VG, Jürgen
 
Hallo Wincc-Tia!

> Ps: ich bin mittlerweile schon so S7 400 /1500 verseucht das ich an keinen Zykluskontrollpunkt mehr denke :smile:

Glückspilz!! Wenn ich nur auch eine 400er hätte, dann könnte ich ein Teilprozessabbild an den OB35 fest koppeln und die Daten über ein PN I/O Device (Hilscher Karte, Anybus würde aber bestimmt auch gehen) schicken und müsste mir keine weiteren Gedanken machen. Aber die Option das TPA1 an den OB35 zu koppeln gibt es bei den 300er anscheinend nicht :(

Bei jedem Aufruf 2x so viele Daten habe ich auch versucht - hat leider nicht geklappt. Was aber geklappt hat ist, wenn ich mehrere S7 Verbindungen im NetPro konfiguriere! Dazu unten mehr.

VG, Jürgen
 
Hallo Blockmove,

der BSEND sendet definitiv beim jedem Aufruf- ich habe mir da mit einer "Holzhammermethode" beholfen, und zwar so, dass ich den BSEND mit denselben Parametern (DB, lokale und remote ID; Ausnahme: Sendetrigger, den lasse ich hier auf "FALSE") 2x aufrufe:

  • der erste Aufruf ist quasi zur Abfrage des Status (Done, Busy/Sending, Error), und falls der Status nicht "busy" ist,
  • dann im zweiten Aufruf mit dem Sendetrigger auf "TRUE"

Die Idee mit der priorisierten BuB Kommunikation kannte ich noch nicht!! Allerdings kann ich noch nicht überblicken, was die Auswirkungen des Zykluskontrollpunkt sind, von daher möchte ich mir den Ansatz als letzten Rettungsanker aufheben.

VG, Jürgen

Hallo Jürgen,

das mit den 2 Aufrufen sollte passen.
Dann probier das mit dem prio. BundB.
Die Änderung bewirkt Folgendes:
Bei der S7-300 findet die Kommunikation üblicherweise zu Beginn des Zyklus statt. Also zu einem definierten Zeitpunkt.
Damit hast während des Zyklus konsistente Daten. Also ähnlich dem Prozessabbild.
Schaltet man den Zykluskontrollpunkt ab, dann findet die Kommunikation willkürlich auch mehrfach während des Zyklus statt.
Ist natürlich deutlich schneller, kann aber Inkonsistenzen zur Folge haben, wenn mehrfach während des Zyklus auf Daten zugegriffen wird.
Wenn man sich der Situation bewusst ist, dann kann man es z.B. durch Puffer kompensieren.

Gruß
Blockmove
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas,


Wenn du 960 Bytes über BSEND verschicken willst, dann benötigt das bei einer 240 Byte S7-PDU fünf PDUs und nicht nur vier.
Denn in der S7-PDU hast du für deine BSEND-Nutzdaten pro S7-PDU nur 204 Bytes für die erste und 206 Bytes für alle folgenden PDUs zur Verfügung.
In der ersten PDU werden den Nutzdaten noch 2 Bytes für die Länge vorangestellt. Wenn du also noch etwas optimieren möchtest, dann könntest du deine Nutzdatenlänge auf 822 Bytes (204+206+206+206) reduzieren.

Oha, das ist ja ein Ding ... jetzt wird mir so einiges klar. Ich habe immer mit Vielfachen von 240 getestet und dann nur mal so mit 1800 Bytes statt 1920 und damit konnte ich auch in 10ms mehr Daten durch die Leitung kriegen, und jetzt ist es schon klar: 1800 < 1852 (204+206+206+206+206+206+206+206+206).


Der BSEND benötigt eine steigende Flanke am REQ-Eingang. Du musst also schon etwas trickreich programmieren, damit der BSEND bei Aufruf alle 10ms wirklich jede 10ms einen Trigger mitbekommt, d.h. er müsste schon mehr als einmal im OB35 aufgerufen werden.

Ja, so habe ich mir das überlegt, ich rufe den 2x auf und "frage" den Status ab (busy, done, error) - wenn nicht mehr busy, dann setze ich den Trigger.

Eine Erhöhung der Zyklusbelastung durch Kommunikation in der HW-Konfig bringt einiges. Bei einer ET200S CPU benötigt ein BSEND mit den 822 Bytes von oben bei eingestellten 20% ca. 16 ms, bei eingestellten 50% nur noch ca. 7ms.

Ja, schon erstaunlich- aber leider geht nicht mehr als 50% :eek:

Ich habe noch nicht getestet wie schnell die TCP-Funktionen in der S7 sind. Der Vorteil ist dann in jedem Fall, dass du deine 960 Bytes in einem Telegramm verschicken kannst. Bei S7 Kommunikation wird jede PDU vom Partner bestätigt bevor es mit der nächsten weitergeht.

Das wäre auch meine Hoffnung, ich versuche es mal heute Abend noch oder morgen. Wäre schon gut, wenn das klappen würde - eine "normale" MTU bei TCP auf Ethernet sind ja 1500 Bytes, damit kann man dann schon was anfangen.

Nochmals vielen Dank für deinen Input!!

VG, Jürgen
 
Hallo Harald!!

Vielen Dank für den Hinweis bezüglich T_ Bausteine - das lese ich mir heute Abend noch genauer durch und teste es!

Das mit dem AG_Send ist mir jetzt auch klar, und wo du es schreibst, habe ich es auch gefunden. Die Hilfefunktion ist schon ein echtes Labyrinth! (da könnte Siemens auch mal eine gute Suche machen, mit der man die ganzen Hilfeseiten zu den FB/FC finden- so muss man sich da echt auskennen bzw wissen, wo man sucht).

Bezüglich BSEND Aufruf- den rufe ich tatsächlich 2x auf, um zu schauen, ob "Done=1" bzw. Status=25/0x19 (busy).


> Was für Daten willst Du versenden? Zustände von E/A aus dem Prozessabbild? Das funktioniert nicht schneller als die Aktualisierung des Prozessabbilds im OB1.

Meine Daten kommen über den Dual Port RAM direkt aus der SINUMERIK NCU:
https://support.industry.siemens.com/cs/document/593887/

>> The dualport-RAM lies as interface between the NC and the PLC. Its size corresponds to exactly 1024 bytes. This is the maximum size for reading and writing in total. For programming in several channels the programmer must ensure that there is no dual assignment (e.g. channel 1 byte 0-200, channel 2 byte 201 to 400).


Lieben Dank auch noch für den genauen Link zur richtigen Stelle im Programmierhandbuch!!

VG, Jürgen
 
Versuche auch mal den OB35 z.B. auf 100 oder 200ms hochzusetzen, und dann in jedem Aufruf einen Zähler um 1 zu erhöhen und diesen mitzuschicken. Dann kannst du zumindest sehen ob das mit deinem doppelten BSEND-Aufruf zuverlässig funktioniert, wenn beim Empfänger auch jeder Wert des Zählers fortlaufend ankommt.
 
Hallo Blockmove,

Hallo Jürgen,

das mit den 2 Aufrufen sollte passen.
Dann probier das mit dem prio. BundB.
Die Änderung bewirkt Folgendes:
Bei der S7-300 findet die Kommunikation üblicherweise zu Beginn des Zyklus statt. Also zu einem definierten Zeitpunkt.
Damit hast während des Zyklus konsistente Daten. Also ähnlich dem Prozessabbild.
Schaltet man den Zykluskontrollpunkt ab, dann findet die Kommunikation willkürlich auch mehrfach während des Zyklus statt.
Ist natürlich deutlich schneller, kann aber Inkonsistenzen zur Folge haben, wenn mehrfach während des Zyklus auf Daten zugegriffen wird.
Wenn man sich der Situation bewusst ist, dann kann man es z.B. durch Puffer kompensieren.

Vielen Dank für die Hintergrundinfos! Den Ansatz mit dem Puffer verstehe ich, und ich kann das auch für "meinen" Bereich machen. Das gesamte Programm ist allerdings recht umfangreich (kommt vom Anlagenlieferanten, den kann ich am Montag aber mal anrufen); da habe ich halt die Sorge, dass dort was gemacht wird, wo die sich auf ein konsistentes Prozessabbild verlassen.

Betrifft das BuB dann nur die Daten, welche über die S7 Kommunikation geschrieben/gelesen werden (also PUT/GET, BSEND/BRECV, etc.) und hat sonst nichts mit dem Prozessabbild zu tun? Da hängt halt noch eine WinCC (?) dran (müsste bei der SINUMERIK so sein, dass die Visu incl. Panel damit machen).

VG, Jürgen
 
Versuche auch mal den OB35 z.B. auf 100 oder 200ms hochzusetzen, und dann in jedem Aufruf einen Zähler um 1 zu erhöhen und diesen mitzuschicken. Dann kannst du zumindest sehen ob das mit deinem doppelten BSEND-Aufruf zuverlässig funktioniert, wenn beim Empfänger auch jeder Wert des Zählers fortlaufend ankommt.


das funktioniert definitiv!! ich lese sowohl den Zeitstempel mit (wird im OB35 neu erzeugt und in den Sendepuffer geschrieben), als auch einen Zähler; damit kann ich genau feststellen, ob alle Daten aus dem BSEND Aufruf im OB35 ankommen, oder ob welche "übersprungen" werden, weil der BSEND noch "busy" / nicht "done" ist.
 
Zurück
Oben