Step 7 S7-Kommunikation SFB14 GET

ReiterHorst

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Forum,

eine Frage zum Wochenende bevor ich ins Selbige verschwinde. :D

Software: S7 V5.5 SP4 HF8
Hardware: CPU 416-2 DP (6ES7 416-2XK02-0AB0 V3.1) und CPU 315-2 PN/DP (6ES7 315-2EH14-0AB0 V3.2)

Oben besagte Steuerungen befinden sich aktuell auf meinem Teststand und sollen Daten austauschen über eine S7-Verbindung und MPI.

Also vorgehen war:

1. HW-Konfig. beider Steuerungen angelegt (CPU 416 erhielt MPI-Adresse 6 und CPU 315 erhielt MPI-Adresse 4)
2. Steuerungen über MPI Verbunden.
3. S7-Verbindunge angelegt mit der Lokalen-Adresse 1

habe euch für die Punkte 1-3 mal eine Übersicht aus NetPro angehängt.

Die Grundlagen waren geschaffen und ich konnte einige DB's erstellen in die ich beliebe Daten packen kann um diese über den SFB14 GET von der CPU 315 auf die CPU 416 zu holen.

Teile des OB1 mit dem Aufruf des SFB14 seht ihr ebenfalls im Anhang.

Im OB1 rufe ich nun 4 mal den SFB 14 auf aber immer nur einen gleichzeitig. Der erste Aufruf im Bild "BIT" zu sehen funktioniert auch wie erwartet. Also einen Haken dran. Im zweiten Bild "INT1" funktioniert das selbe vorgehen nicht.
Um sicherzustellen, dass immer nur ein SFB 14 ausgeführt wird habe ich Testweise das negierte NDR-Signals eines SFB's auf selbigen REQ-Eingang gegeben. Also um den SFB zu deaktivieren habe ich die Negation entfernt und neu in die CPU gespielt.

Ich habe das negierte NDR auf den REQ gegeben um eine dauerhafte Datenübertragung zu erhalten.
Wenn NDR=0, da nicht bearbeitet oder noch bearbeitet, liegt ein 1 Signal an REQ an.
Wenn NDR=1 ist, die Übermittlung abgeschlossen, fällt REQ für einen Zyklus auf 0 und geht dann wieder auf ein 1-Signal und die Datenübertragung beginnt erneut.
So meine Vorstellung für den Test.

Wie gesagt für den Teil im BILD "BIT" in welchem 40 Word variablen übermittelt werden Funktioniert es.
Im Teil aus Bild "INT1" in welchem 118 INT Variablen übermittelt werden sollen funktioniert es nicht, obwohl ich der Meinung bin, dass alles gleich ist.
Habe vermutet, dass 118 Integer zu viel sind und bin auch einmal auf einen Integer runter gegangen. Leider kein Erfolg. Auch in diesem fall konnte ich keine Datenübertragung feststellen.

Ich habe euch mein Testprogramm archiviert in den Anhang gepackt. Evtl. hilft dies einigen schnell weiter mir zu Helfen.


Danke schon mal und sollten noch Fragen sein möchte ich diese schnell beantworten :)

Schönes Wochenende

RH
 

Anhänge

  • NetPro.jpg
    NetPro.jpg
    56,5 KB · Aufrufe: 57
  • BIT.PNG
    BIT.PNG
    20,2 KB · Aufrufe: 68
  • INT1.PNG
    INT1.PNG
    20,3 KB · Aufrufe: 56
  • S7_pro1.zip
    S7_pro1.zip
    1 MB · Aufrufe: 2
Aus welchem Grund nutzt du nicht den SFC67 X_Get. Der ist speziell für MPI Kommunikation gedacht?



Gesendet von iPad mit Tapatalk
 
Habe es schon mit X_PUT und X_GET probiert. Es zeigte sich aber das Problem, dass man eine abgebrochene aber nicht getrennte Verbindung erkennen müsste und mit X_ABORT trennen muss. Schon am Teststand trat dieser Fehler auf. Des Weiteren wird schon an anderer Stelle bei mir in der Firma mit den FB's READ und WRITE gearbeitet und daher wollte ich mich mit PUT und GET anpassen. Im Systemhandbuch steht zumindest "PUT(SFB15)/GET(SFB14) entspricht READ/WRITE".
 
Ganz verstehe ich nicht wie das mit den EN und NDR funktionieren soll... Der erste Aufruf "BIT" kann ja nie bearbeitet werden oder ?

Richtig, so wie das Bild es aktuell darstellt kann der erste Aufruf "BIT" nie funktionieren.
Dafür müsste die verknüpfung im vorherigen NW negiert werden.

Dies habe ich wie gesagt gemacht um zu garantieren, dass immer nur ein SFB bearbeitet wird. Ähnlich war es mit dem EN. Das war nur ein Test, sodass der SFB gar nicht bearbeitet wird. Habe vermutet, dass er evtl die Verbindung belegt obwohl er am REQ-Eingang keine steigende Flanke hatte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin etwas weiter gekommen. Mir ist es heute morgen wie ein Blitz gekommen, dass die Error-Meldung evtl. auch nur einen Zyklus lang ansteht, sowie die NDR-Meldung. Darauf hin habe ich mir mal die Fehlermeldung des SFB's gesichert und siehe da es liegt die Fehlermeldung

| 0x0002 | Negative Quittierung vom Partnergerät. Die Funktion ist nicht ausführbar |

an.

Nun ist diese Fehlermeldung aber nicht genauer beschrieben. Ich bemühe jetzt mal Google aber vlt. kann mir ja jemand von euch schneller helfen?
 
Danke ducati, für deine Antwort.

Einen ähnlichen Link hatte ich schon betrachtet. Dort war das Programm lediglich für 2 S7 1200er Steuerungen geschrieben. Ich habe versucht mich an dem Beispielprogramm zu orientieren.

Ich programmiere in der 400er Steuerung, da ich die SFB's 14/15 (Get/Put) nutzen möchte. Eigentlich nur den Baustein SFB 14 GET.

Erste Information habe ich unter diesem Link gesammelt:

https://support.industry.siemens.co...ten-der-kommunikation-über-mpi?dti=0&lc=de-WW

Aus dem ging für mich hervor, dass ich die SFB's nur in der 400er verwenden kann, da die 300er bei einer MPI-Verbindung nur als Server eingesetzt werden kann. Im NetPro war es mir dementsprechend auch nicht möglich eine S7-verbindung über MPI in der 300er zu projektieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erste Information habe ich unter diesem Link gesammelt:

https://support.industry.siemens.co...ten-der-kommunikation-über-mpi?dti=0&lc=de-WW

Aus dem ging für mich hervor, dass ich die SFB's nur in der 400er verwenden kann, da die 300er bei einer MPI-Verbindung nur als Server eingesetzt werden kann. Im NetPro war es mir dementsprechend auch nicht möglich eine S7-verbindung über MPI in der 300er zu projektieren.

OK, das wusste ich nicht.

ich würde jetzt erstmal nicht sequenzieren/multiplexen sondern erstmal EINE GET-Abfrage ordentlich zum laufen bringen:

https://support.industry.siemens.com/cs/ww/de/view/18610307

die verwenden nen Taktmerker für REQ und nicht direkt den NDR...

wenn das ordentlich läuft dann mal an das Sequenzieren rantasten...

Gruß.
 
Ich bin nun mittlerweile soweit, dass mir auch die Integerwerte übertragen werden. Allerdings feuert mir der GET-Baustein nun abwechselnd die Fehlerwörter

0x0002 Negative Quittung vom Partnergerät. Die Funktion ist nicht ausführbar,
0x0004 Fehler in den Empfangsbereichszeigern RD_i bezüglich der Datenlänge oder des Datentyps und
0x0008 Zugriffsfehler bei der Partner-CPU

um die Ohren. Für mich sind diese Fehler nicht wirklich verständlich geschweige den reproduzierbar.

Ich werde nun erste einmal so vorgehen, dass ich von vorne beginne und versuchen werde den SFB 14 GET zu verstehen indem ich mir jeden einzelnen Datenberiech separat holen werde. Mal schauen wie ich voran komme.
 
Bei der 400er gibt es noch das Verhalten, dass der interne Puffer der Get/Put Bausteine beim ersten Aufruf festgelegt wird. D.h. im laufenden Betrieb kannst du den Bereich nur verkleinern, aber nicht vergrößern. Das geht nur durch Run/Stop/Run.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
rufst Du die verschiedenen GET parallel auf? Das geht so nicht, Du musst sequenzieren wie in dem Siemens FAQ beschrieben!

also der REQ von einem GET darf nur gestartet werden wenn alle anderen GET fertig sind!

Gruß.

PS: ansonsten hat der 400er GET ja 4 Beriche die er lasen kann, da weiss ich aber nicht, ob das auch mit ner 300er zusammen funktioniert...
 
Zuletzt bearbeitet:
Die 4 Bereiche funktionieren, es ist nur zu beachten, dass die Summe der angefragten Daten nicht die PDU-Größe (bei der S7-300 = 240 Bytes) überschreitet.
Von den 240 Bytes sind 14 Bytes pauschal und 4 Bytes pro Datenbereich abzuziehen. D.h. wenn du 4 Bereiche nutzt, dürfen deine reinen Nutzdaten 210 Bytes in Summe nicht überschreiten.

Das gilt nur für Get, bei Put ist das noch weniger.
 
Bei der 400er gibt es noch das Verhalten, dass der interne Puffer der Get/Put Bausteine beim ersten Aufruf festgelegt wird. D.h. im laufenden Betrieb kannst du den Bereich nur verkleinern, aber nicht vergrößern. Das geht nur durch Run/Stop/Run.

Bedeutet wenn ich als erstes eine Instanz über 40 Byte aufrufe und danach eine neue Instanz über 160 Byte dann funktioniert das nicht? Oder bezieht sich das immer nur auf eine Instanz, dass diese während der Laufzeit nicht vergrößert werden darf?

rufst Du die verschiedenen GET parallel auf? Das geht so nicht, Du musst sequenzieren wie in dem Siemens FAQ beschrieben!

also der REQ von einem GET darf nur gestartet werden wenn alle anderen GET fertig sind!

Gruß.

PS: ansonsten hat der 400er GET ja 4 Beriche die er lasen kann, da weiss ich aber nicht, ob das auch mit ner 300er zusammen funktioniert...

Ich rufe zeitgleich immer nur eine Instanz auf.


Die 4 Bereiche funktionieren, es ist nur zu beachten, dass die Summe der angefragten Daten nicht die PDU-Größe (bei der S7-300 = 240 Bytes) überschreitet.
Von den 240 Bytes sind 14 Bytes pauschal und 4 Bytes pro Datenbereich abzuziehen. D.h. wenn du 4 Bereiche nutzt, dürfen deine reinen Nutzdaten 210 Bytes in Summe nicht überschreiten.

Das gilt nur für Get, bei Put ist das noch weniger.

hast du hierzu evtl. Handbücher in denen ich dies nachlesen kann?




Großen Dank schon einmal!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hast du hierzu evtl. Handbücher in denen ich dies nachlesen kann?

Im Simatic Manager die Hilfe des SFB mit F1 aufrufen, und dort gibt es einen Link zu "Gemeinsame Parameter der SFBs/FBs und der SFC/FC der S7-Kommunikation".

Ich wundere mich dort nur gerade über den Eintrag mit max. 160 Bytes bei Put/Get und S7-300, irgendwas war da...
 
Sieht aber in dem Screenshot vom Post #1 nicht so aus, oder überseh ich da was?

Gruß.

Der NDR-Ausgang wurde nur von einer Instanz negiert auf den REQ-Eingang gegeben. Somit wollte ich eine dauerhafte Übertragung realisieren. Wenn der NDR auf "1"-Signal geht (Fertig) setzt er den REQ auf ein "0"-Signal und im nächsten Zyklus geht NDR wieder auf ein "0"-Signal und somit erhält man an REQ eine steigende Flanke nach der abgeschlossenen Datenübertragung. Alle anderen Instanzen bekommen das direkte NDR-Signal auf den REQ-Eingang, also eine dauerhafte 0.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was lange währt wird endlich gut!


Ich habe es schließlich doch noch geschafft. Mit Hilfe des Beispiels https://support.industry.siemens.co...-160-byte-daten-zu-übertragen-?dti=0&lc=de-WW . Danke dafür nochmal, ducati!

Problem waren die limitierten Datenbereiche die übermittelt werden können, dafür nochmal ein Dank an Thomas. Zur Info es können max 222 Bytes übermittelt werden, wenn nur eine Adresse am SFB genutzt wird! Bei 4 Adressen singt es auf 210 Bytes bei der Konfiguration S7 400 als Client und S7 300 als Server über eine 7-Verbindung (MPI). Die 160 Bytes habe ich nun so interpretiert, dass dies die minimal garantierte "Obergrenze" ist. Also 160 Byte kann man Absolut immer in allen Konfigurationen einer S7 300 übertragen.


Ein weiteres Problem war wohl ein kleiner Programmwust. Man sollte doch immer strukturiert vorgehen! Mir ist es passiert das ich eine Instanz-DB heute 2x instanziiert habe, dass das in die Hose geht ist ja klar. :roll:

mehrere Instanzen können dann natürlich auch unterschiedliche viele Daten übertragen aber immer unter der Prämisse, dass eine Übertragungslänge nicht während des RUN verändert wird.


Also abschließend nochmal ein lieben Dank an alle Helfer :)
 
Bei der 400er gibt es noch das Verhalten, dass der interne Puffer der Get/Put Bausteine beim ersten Aufruf festgelegt wird. D.h. im laufenden Betrieb kannst du den Bereich nur verkleinern, aber nicht vergrößern. Das geht nur durch Run/Stop/Run.
Bedeutet wenn ich als erstes eine Instanz über 40 Byte aufrufe und danach eine neue Instanz über 160 Byte dann funktioniert das nicht?
Ja, das würde nicht funktionieren. Der erste Aufruf PUT bzw. GET muß die größte Datenmenge aller Aufrufe haben.

Harald
 
Zurück
Oben