Datenübertragung von SPS zum PC

quant81

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

ich möchte Daten (400 - 800 Bit) von einer SPS(CPU 315-2DP mit CP 343-1 IT) zu einem PC senden, dazu verwende ich auf der SPS Seite den Baustein AG_SEND (FC 5). Ich habe das Ganze mit TCP und UDP ausprobiert. Hier ist der Code – Ausschnitt, der für das Senden verantwortlich ist:

U DB3.DBX 0.0
S DB3.DBX 4.0

UN DB3.DBX 0.0
R DB3.DBX 4.0


CALL "AG_SEND"
ACT :=DB3.DBX4.0
ID :=1
LADDR :=W#16#100
SEND :=P#DB6.DBX0.0 BYTE 50
LEN :=50
DONE :=DB3.DBX0.0
ERROR :=DB3.DBX0.1
STATUS:=DB3.DBW2

Folgende Frage habe ich:

Wenn ich die Zykluszeit künstlich verlängere, so wird ab einer bestimmten Zyklusdauer (etwa 10 ms) konstant alle zwei Zyklen ein Telegramm übertragen. Wählt man die Zykluszeit sehr groß, etwa 1 s, so wird trotzdem alle zwei Zyklen ein Wert übertragen. Zuerst dachte ich, dass das am TCP liegt, weil nach dem Senden der Nachricht eine Quittung erwartet wird. Als ich die Kommunikation mit UDP realisiert habe, wurde immer noch nur alle zwei Zyklen ein Datenpacket übertragen. Da die Kommunikation als nebenläufiger Prozess ausgeführt wird, müsste es doch möglich sein jeden Zyklus ein Wert zu senden.

Kennt jemand vielleicht die Ursache, warum die Übertragung eines Telegramms genau 2 Zyklen dauert?

Für Eure Hilfe wäre ich sehr dankbar.
 
Ich denke, dass das durch deinen Code am Anfang kommt.

Im ersten Zyklus ist DB3.DBX0.0 auf 0
4.0 wird gesetzt
Das Telegramm wird gesendet.
Nun wird im nächsten Zyklus "done" gesetzt und "act" zurückgenommen, aber dadurch wird in diesem Zyklus kein Telegramm gesendet, sondern erst wieder im Nächsten. Und dann beginnt der Kreis von neuem.

Ich habe leider noch nicht das Vergnügen mit Bussystemen und Vernetzung gehabt, würde aber behaupten wollen, dass es daher kommt.

Bis denn die Freaks anrücken und es genauer wissen :ROFLMAO:

Gruß, Tobias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
TobiasA hats ja schon beschrieben, das es so wie es programmiert wird immer jeden zweiten Zyklus geschieht.
ACT reagiert so wie ich mich erinnere ja auf eine positive Flanke für den Start, deshalb benötigtst du immer zwei Zyklen.
Eine Lösung wären zweimal den Baustein aufrufen , jeweils immer um einen Zyklus versetzt.
Die richtige Art ist aber die schon vorhanden, erst senden wenn der letzte AUftrag zu Ende ist.
 
Hallo Jabba,

danke für Eure Antworten. Wenn man zwei AG_SEND Bausteine verwendet, bei denen einer um einen Zyklus versetzt ist, dann funktioniert es tatsächlich die Daten von jedem Zyklus zu übertragen.
 
Zurück
Oben