Sfc67(x_get) / sfc68(x_put)

Lordheru

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin aus dem hohem Norden!

Ich habe gerade ein kleines Problem und hoffe ihr könnt mir helfen.
Ich habe 3 CPU´s die über MPI diverse Daten austauschen sollen.

Dabei dachte ich an SFC 67/68.

Ich habe auch eine schöne Beschreibung von Siemens gefunden: hier .

Nach dem Vorbild habe ich die SFC´s eingestellt.

Ich habe 2 CPU´s (MPI 30 und 31 ) als Versuch aufgebaut. In meinem Programm soll 31 mit 30 Kommunizieren.
In diesem Fall 2 BYTE PUT vom 31er DB2 zum 30er DB20 und 2 BYTE GET vom 30er DB10 zum 31er DB1.

Sollte ja nicht so schwer sein, dachte ich. Ich hab die Programme in die Baugruppen geladen und in die DB´s ein paar Einsen reingeschrieben, aber jeweils auf der anderen Seite kommt nichts an...
Ich habe mal ein Bild von den SFC´s angehängt, evtl. seh ich ja den Wald vor lauter bäumen nicht.

MB100 ist Taktmerker.


Unbenannt.PNG
 
Also was steht in den Ret_val?
Kommt bzw ändert sich das busy?
Warum gehst du bei MW Zugriffen auf ungerade Adressen? (kann funktionieren muss aber nicht und ist kein so echt guter Stil)
Du solltest starten und den Start so lange anstehen lasen bis busy vorbei ist oder du an ret_val erkennst, dass etwas schief gelaufen ist.
Ich habe gerade kein S7 da, doch kann es sein, dass die Bausteine mehr als einen Zyklus brauchen.


bike

P.S: ich hoffe es sind die richtigen Bausteine die dir ausgesucht hast ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da das Programm ansonsten leer ist und ich nur die Kommunikation testen wollte, hab ich einfach irgendwelche Merker genommen.

Ich hab die Auch gerad nicht da, aber ich werde morgen dann mal den Start anstehen lassen und melden was der ret_val sagt.

zu den Bausteinen: Das waren die ersten, die ich im Zusammenhang mit MPI Kommunikation gefunden habe. Gibt es denn ne bessere Lösung um Daten aus verschiedenen Projekten zu tauschen? (über MPI)
 
Beschalte mal einen Eingang anstatt des Taktmerkerbytes und auf Cont den gleichen Eingang. (nicht vergessen den Eingang zu betätigen)
Ansonsten versuche mal den Cont mit "True" zu belgen.
Vielleicht hilft es schon.

Gruß wolder

P.S.: Blinkt den dein Taktmerker?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja der Taktmerker hat geblinkt :)

habe nun einen Eingang beschaltet, Ergebniss:

REQ und CONT sind 0:

BUSY = 0

RET_VAL springt zwischen 28672 und 32960


REQ und CONT sind 1

BUSY springt immer zwischen 1 und 0

Während BUSY = 1 ist am RET_VAL 28674
Während BUSY = 0 ist am RET_VAL 32690

Aber die Daten im Empfangs DB bleiben unverändert.

Laut SIEMENS sind 28672 und 28674 einfach nur Statusmeldungen aber 32960 bedeutet: "Die Baugruppe hat die zu lesenden Daten noch nicht bereit."

Wie geht das den? Ich hab doch Einsen und Nullen rein geschrieben und sehe diese auch mit ner Variablentabelle :confused:
 
32960?
Schalte mal die Darstellung auf Hex um und drücke bei dem Baustein mal auf F1.
In Hex wäre das 7FB2 und den Fehlercode gibt es nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast nen Zahlendreher gehabt. Du hast 32690 umgerechnet.

Fehlercode ist aber 32960, dies ist in HEX 80C0.

MPI Verbindung steht, Ich sehe beide über "Erreichbare Teilnehmer" und kann auch auf beide zugreifen von einem Stecker aus.
 
Sorry.

Hast du noch andere Bausteine aktiv?
X_Send / X_Recv z.B.

Stell doch mal beide CPU´s auf Stop und starte sie neu.
Da scheint noch irgendwas auf deine CPU zuzugreifen.

Gruß wolder
 
Gibt es denn ne bessere Lösung um Daten aus verschiedenen Projekten zu tauschen? (über MPI)

Ich hab mir auch schon die Ohren gebrochen mit X_SEND/X_RECEIVE. Für meinen Geschmack ist die Hilfe zu den Bausteinen etwas dürftig. Dann braucht man noch X_ABORT falls eine Verbindung mal hängen bleibt.
Das finde ich zu kompliziert. Wenn Du mit den 22 Byte auskommst empfehle ich Dir die Globaldatenkommunikation.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe den X_GET 4x hintereinander zur selben Station im Einsatz. Alle "Req" Eingänge wird mit demselben Taktmerker angesteuert. Funktioniert soweit. Wenn ich jedoch ein X_PUT dazuschalte, dann bekomme ich für alle eine Fehlerinformation "80C0 Die angegebene Verbindung ist durch einen anderen Auftrag bereits belegt." und es wird nichts mehr übertragen.
Nur durch CPU stopp kann ich dann wieder im Ursprungszustand (also nur X_GET) herstellen.
Was mache ich falsch? Jeden Req dauerhaft ansteuern?
Auch bei alleinigem X_GET wird 80C0 zurückgegeben.
 
Naja, du musst genau das tun was im Handbuch steht ... und auch in sämtlichen Beispielen für gewöhnlich so ausgeführt ist.
REQ muss solange 1 sein bis Busy wieder 0 ist ... IMMER, das schließt die Methode einfach so Taktmerker an REQ also schon mal kategorisch aus.
 
Zurück
Oben